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.

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top