LaTeX: cómo emplear un argumento requerido como valor predeterminado para uno opcional?

StackOverflow https://stackoverflow.com/questions/707152

  •  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.

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top