Pergunta

Eu estou tentando criar um comando LaTeX com dois argumentos, um deles opcional. Normalmente eu faria isso como

\newcommand{\whatever}[2][default]{first #1 second #2}

onde default é o valor padrão para o primeiro argumento. Mas para este comando eu quero que o valor do segundo argumento a ser usado como o valor padrão para o primeiro argumento - ou seja, eu quero

\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}

para ser equivalente a

\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}

Alguém sabe como fazer isso? I pode cair para TeX liso, se necessário.

Foi útil?

Solução

O kernel LaTeX tem um método inerente de fazer isso, embora não seja amplamente utilizada. Aqui está um exemplo:

\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother

\foo{same}
\foo[hello]{world}

Obviamente, os comandos \makeatletter pode ser descartado se você está fazendo isso dentro de um arquivo .sty ou .cls.

Outras dicas

Um corte feio:

\usepackage{ifthen}

...

\newcommand{\whatever}[2][uniquenonesense]{
   ... 
   \ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
   ...
}

Provavelmente você queria algo mais limpo, mas é o que eu tenho.

Dependendo de suas semântica, uniquenonesense pode estar vazio.

    \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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top