LaTeX: come utilizzare un'arg richiesto come predefinito per un un optional?
-
22-08-2019 - |
Domanda
Sto cercando di creare un comando LaTeX con due argomenti, uno dei quali opzionale. Normalmente avrei fatto questo come
\newcommand{\whatever}[2][default]{first #1 second #2}
dove default
è il valore predefinito per il primo argomento. Ma per questo comando voglio il valore del secondo argomento da utilizzare come valore predefinito per il primo argomento - cioè, voglio
\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}
per essere equivalente a
\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}
Qualcuno sa come fare questo? Posso scendere fino a TeX normale, se necessario.
Soluzione
Il kernel LaTeX ha un metodo integrato di fare questo, anche se non è ampiamente utilizzato. Ecco un esempio:
\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother
\foo{same}
\foo[hello]{world}
Ovviamente, i comandi \makeatletter
può essere eliminato se si sta facendo questo all'interno di un file o di .sty
.cls
.
Altri suggerimenti
Un brutto hack:
\usepackage{ifthen}
...
\newcommand{\whatever}[2][uniquenonesense]{
...
\ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
...
}
Probabilmente si voleva qualcosa di più pulito, ma questo è quello che ho.
A seconda delle semantica, uniquenonesense
potrebbe essere vuoto.
\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.