LaTeX: Wie ein erforderlichen arg als Standard für ein optionales eines benutzen?
-
22-08-2019 - |
Frage
Ich versuche, einen LaTeX-Befehl mit zwei Argumenten zu erstellen, einer von ihnen optional. Normalerweise würde ich dies als
\newcommand{\whatever}[2][default]{first #1 second #2}
Dabei gilt default
ist der Standardwert für das erste Argument. Aber für diesen Befehl möchte ich der Wert des zweiten Arguments für das erste Argument als Standardwert verwendet werden - das heißt, ich will
\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}
als äquivalent zu
\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}
Wer weiß, wie dies zu tun? Ich kann in einfachen TeX Dropdown, wenn nötig.
Lösung
Der LaTeX-Kern hat eine eingebaute Methode, dies zu tun, obwohl es ist nicht weit verbreitet. Hier ein Beispiel:
\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother
\foo{same}
\foo[hello]{world}
Natürlich können die \makeatletter
Befehle gelöscht werden, wenn Sie diese in einer .sty
oder .cls
Datei tun.
Andere Tipps
Eine hässliche Hack:
\usepackage{ifthen}
...
\newcommand{\whatever}[2][uniquenonesense]{
...
\ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
...
}
Vermutlich wollte man etwas sauberer, aber das ist, was ich habe.
auf der Semantik Je, uniquenonesense
könnte leer sein.
\newcommand{\haha}[2]{\backslash whatever \left[ #1 \right]
\left[ #1 \right] }
\begin{document}
$\haha{blah}{blah}$\\
$\haha{stupid}{Idiot}$
\end{document} % This works very well.