Stellen Sie sich vor, ich habe mehrere Brüche in dieser Form geschrieben $\frac{V+W}{U}$
und entscheide später, dass ich sie stattdessen als durchgestrichene Brüche anzeigen lassen möchte. In der Gruppe, in der ich dies möchte, kann ich immer Folgendes tun \renewcommand\frac[2]{#1/#2}
. Ich möchte jedoch dem Zähler (oder dem Nenner) Klammern hinzufügen.nur wennes enthält ein mathop
. Zumindest scheint mir dies eine geeignete erste Heuristik zu sein, um zu entscheiden, ob der Zähler (Nenner) eingeklammert werden soll oder nicht.
Weiß jemand, wie das erreicht wird?
Antwort1
Hier suche ich nach +
, -
, \bullet
, und \cdot
, aber Sie können der \setsepchar
Liste weitere Operatoren hinzufügen.
Wenn der Operator am Anfang steht, wie zum Beispiel -3
, füge ich auch keine Klammern hinzu. Sie können das ändern, indem Sie die Zeile kommentieren \ignoreemptyitems
.
BEARBEITET, um einen seltsamen Fehler zu umgehen, wenn \sim
allein als Argument für erscheint \inlinefrac
.
\documentclass{article}
\usepackage{listofitems}
\newcommand\inlinefrac[2]{
\setsepchar{+||-||\bullet||\cdot||\oplus}
\ignoreemptyitems
\readlist*\xator{ #1}
\ifnum\listlen\xator[]>1\relax(#1)\else{#1}\fi
/
\readlist*\xator{ #2}
\ifnum\listlen\xator[]>1\relax(#2)\else{#2}\fi
}
\begin{document}
\[
\frac{2}{3}\quad\let\frac\inlinefrac\frac{2}{3}
\]
\[
\frac{2}{-3}\quad\let\frac\inlinefrac\frac{2}{-3}
\]
\[
\frac{2+x}{3}\quad\let\frac\inlinefrac\frac{2+x}{3}
\]
\[
\frac{2\bullet x}{3\cdot y}\quad\inlinefrac{2\bullet x}{3\cdot y}
\]
\centering$\inlinefrac{M\oplus N}{\sim}$
\end{document}
Antwort2
Ich schlage einen \ifrac
Befehl vor. Wenn *
er mit angegeben wird, wird aufgerufen \inlinefrac
, er befolgt aber auch die durch \fractionsinline
(lokale Einstellung) vorgenommene Einstellung.
Auf diese Weise können Sie ganz einfach von einer Form zur anderen wechseln, indem Sie hinzufügen oder entfernen *
. Sie können auch \inlinefrac
direkt verwenden.
Die Symbole, die die Klammern auslösen, müssen im Zähler und im Nenner nicht dieselben sein: Multiplikationssymbole sollten Klammern nur im Nenner auslösen.
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ifrac}{smm}
{
\IfBooleanTF { #1 }
{ \inlinefrac { #2 } { #3 } }
{
\bool_if:NTF \l_bubaya_frac_inline_bool
{
\inlinefrac { #2 } { #3 }
}
{
\frac { #2 } { #3 }
}
}
}
\bool_new:N \l_bubaya_frac_inline_bool
% extend the regex at will; \+ and \- stand for + and -,
% \c{command name} for a control sequence
\regex_const:Nn \c_bubaya_frac_num_regex { \+ | \- | \c{sin} | \c{cos} }
\regex_const:Nn \c_bubaya_frac_den_regex { \c{cdot} | \c{times} | \c{bullet} }
\NewDocumentCommand{\fractionsinline}{}
{
\bool_set_true:N \l_bubaya_frac_inline_bool
}
\NewDocumentCommand{\inlinefrac}{mm}
{
\regex_match:NnTF \c_bubaya_frac_num_regex { #1 } { (#1) } { #1 }
/
\regex_match:NnTF \c_bubaya_frac_num_regex { #2 }
{
(#2)
}
{
\regex_match:NnTF \c_bubaya_frac_den_regex { #2 } { (#2) } { #2 }
}
}
\ExplSyntaxOff
\begin{document}
\begin{gather*}
\ifrac{2}{3}\qquad\ifrac*{2}{3}
\\
\ifrac{2}{-3}\qquad\ifrac*{2}{-3}
\\
\fractionsinline
\ifrac{2}{-3}\qquad\ifrac{2}{-3}
\\
\inlinefrac{2+x}{3}
\\
\ifrac{\sin x}{x}\qquad\ifrac*{\sin x}{x}
\\
\end{gather*}
\fractionsinline
\begin{gather*}
\ifrac{2+x}{3}
\\
\ifrac{2\bullet x}{3\cdot y}
\\
\ifrac{\sin x}{x}
\end{gather*}
\end{document}
Antwort3
Eine Alternative mit der gleichen Idee wie die Lösung von @Steven, aber durch Verwendung xstring
eines Pakets.
\documentclass{article}
\usepackage{xstring}
\renewcommand\frac[2]{\IfSubStr{#1}{+}{(#1)}{\IfSubStr{#1}{-}{(#1)}{#1}}/\IfSubStr{#2}{+}{(#2)}{\IfSubStr{#2}{-}{(#2)}{#2}}}
\begin{document}
\(\frac{5}{10}=0.5\) but \(\frac{5+1}{10}=0.6\) and \(\frac{7}{10+4}=0.5\) but \(\frac{14+1}{6+1.5}=2\)
\end{document}
PS: Ich schlage Stevens Lösung vor, da sie für mehr Fälle einfacher zu erweitern ist, hatte diesen Code aber bereits erstellt, bevor ich seine Antwort gesehen und ihn deshalb gepostet habe.