LaTeX: como usar um arg exigido como padrão para um opcional?
-
22-08-2019 - |
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.
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.