LaTeX: cómo emplear un argumento requerido como valor predeterminado para uno opcional?
-
22-08-2019 - |
Pregunta
Estoy intentando crear un comando de látex con dos argumentos, uno de ellos opcional. Normalmente me gustaría hacer esto como
\newcommand{\whatever}[2][default]{first #1 second #2}
donde default
es el valor por defecto para el primer argumento. Sin embargo, para este comando Quiero que el valor del segundo argumento que se utiliza como el valor por defecto para el primer argumento - es decir, quiero
\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}
a ser equivalente a
\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}
¿Alguien sabe cómo hacer esto? Puedo bajar a TeX plano si es necesario.
Solución
El núcleo de látex tiene incorporado un método de hacer esto, aunque no se utiliza ampliamente. He aquí un ejemplo:
\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother
\foo{same}
\foo[hello]{world}
Obviamente, los comandos \makeatletter
se pueden caer si está haciendo esto dentro de un archivo o .sty
.cls
.
Otros consejos
Un feo corte:
\usepackage{ifthen}
...
\newcommand{\whatever}[2][uniquenonesense]{
...
\ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
...
}
Es de suponer que quería algo más limpio, pero eso es lo que tengo.
Dependiendo de la semántica, uniquenonesense
podría estar vacío.
\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.