
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 \addtoDB
llamada, la macro \alist
definida por \newDB
todaví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, \alist
no está vacío, por lo que
\g@addto@macro\alist{,fig168}
se ejecuta, lo que da como resultado \alist
la 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@macro
deben 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@macro
pretende 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 \test
macro toma dos argumentos, \testA
los usa \test
como en el primer caso (con corchetes #1
) mientras que \testB
los usa \test
como en el segundo caso.
En el cuerpo usamos \testA
y \testB
con los mismos dos argumentos: #1 = {1}{2}
y #2 = 3
.
Dado que \testA
utiliza 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} B
lo que significa que \test
se obtendrá 1
como primer argumento y 2
como segundo argumento; {3}
no se consume \test
y se compone después de \test
expandirse.
Por lo tanto la salida es
A este 12 es 3 una prueba A
B este 1 es 2 una prueba3 B