Pasar parámetros a \g@addto@macro

Pasar parámetros a \g@addto@macro

Soy un completo novato pero tengo un poco de experiencia en programación. He estado mirando unMWE ubicado aquíproporcionado porYiannis Lazarides.

En la definición de macro, tenemos

%% add an image to the DB, use the LaTeX macro
%% \g@addto@macro to store them at the DB location
\def\addtoDB#1#2{%
    \ifx\@empty#1
        \g@addto@macro{#1}{#2}
    \else
        \g@addto@macro#1{,#2}
    \fi
}

¿Cuál es la diferencia entre \g@addto@macro{#1}{#2}y \g@addto@macro#1{,#2}?

Respuesta1

La macro tiene como objetivo construir incrementalmente una macro de lista; en el documento encuentras algo como

\def\alist{fig167,fig168,fig169,fig176,%
  fig180,fig181,fig182,fig183,fig185,fig186,fig187,fig188}

Bueno, se puede obtener el mismo resultado

\newDB{alist}

y luego

\addtoDB\alist{fig167}
\addtoDB\alist{fig168}
\addtoDB\alist{fig169}
\addtoDB\alist{fig176}

etcétera.

En la primera \addtoDBllamada, la macro \alistdefinida por \newDBtodavía está vacía, por lo que el condicional es verdadero y

\g@addto@macro\alist{fig167}

es ejecutado. En la segunda llamada de macro, \alistno está vacío, por lo que

\g@addto@macro\alist{,fig168}

se ejecuta, lo que da como resultado \alistla expansión a fig167,fig168. Y así sucesivamente para las sucesivas convocatorias.

Respuesta2

En este caso particular, creo que los dos usos de \g@addto@macrodeben ser los mismos, aparte de la coma adicional antepuesta al segundo argumento en el segundo caso. De hecho, dado que el primer argumento de \g@addto@macropretende ser simplemente el nombre de una macro, los corchetes del primer caso no son estrictamente necesarios. Sin embargo, por razones que veremos en un segundo, son una buena precaución y, en mi opinión, deberían usarse también en el segundo caso.

Para ilustrar la diferencia que hacen en general (cuando el primer argumento no es necesariamente un nombre de macro), consideremos el siguiente ejemplo:

\documentclass{article}

\def\test#1#2{this #1 is #2 a test}
\def\testA#1#2{A \test{#1}{#2} A}
\def\testB#1#2{B \test#1{#2} B}

\begin{document}
 \testA{{1}{2}}{3}

 \testB{{1}{2}}{3}
\end{document}

La \testmacro toma dos argumentos, \testAlos usa \testcomo en el primer caso (con corchetes #1) mientras que \testBlos usa \testcomo en el segundo caso.

En el cuerpo usamos \testAy \testBcon los mismos dos argumentos: #1 = {1}{2}y #2 = 3.

Dado que \testAutiliza corchetes alrededor de #1, se expande a A \test{{1}{2}}{3} A, como se esperaba, vinculando {1}{2}el primer argumento de \test. \testB, en cambio, se expande a B \test{1}{2}{3} Blo que significa que \testse obtendrá 1como primer argumento y 2como segundo argumento; {3}no se consume \testy se compone después de \testexpandirse.

Por lo tanto la salida es

A este 12 es 3 una prueba A

B este 1 es 2 una prueba3 B

información relacionada