
Sou um novato completo, mas tenho um pouco de experiência em programação. Eu estive olhando para umMWE localizado aquifornecido porYiannis Lazarides.
Na definição macro, temos
%% 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
}
Qual é a diferença entre \g@addto@macro{#1}{#2}
e \g@addto@macro#1{,#2}
?
Responder1
A macro tem como objetivo construir incrementalmente uma macro de lista; no documento você encontra algo como
\def\alist{fig167,fig168,fig169,fig176,%
fig180,fig181,fig182,fig183,fig185,fig186,fig187,fig188}
Bem, pode-se obter o mesmo resultado por
\newDB{alist}
e então
\addtoDB\alist{fig167}
\addtoDB\alist{fig168}
\addtoDB\alist{fig169}
\addtoDB\alist{fig176}
e assim por diante.
Na primeira \addtoDB
chamada, a macro \alist
definida por \newDB
ainda está vazia, então a condicional é verdadeira e
\g@addto@macro\alist{fig167}
É executado. Na segunda chamada de macro, \alist
não está vazio, então
\g@addto@macro\alist{,fig168}
é executado, resultando na \alist
expansão para fig167,fig168
. E assim por diante para as chamadas sucessivas.
Responder2
Neste caso específico, acho que os dois usos de \g@addto@macro
devem ser iguais, exceto a vírgula extra anexada ao segundo argumento no segundo caso. Na verdade, como o primeiro argumento de \g@addto@macro
pretende ser simplesmente o nome de uma macro, os colchetes do primeiro caso não são estritamente necessários. Porém, por razões que veremos em breve, são uma boa precaução e, na minha opinião, devem ser utilizadas também no segundo caso.
Para ilustrar a diferença que eles fazem em geral (quando o primeiro argumento não é necessariamente um nome de macro), consideremos o seguinte exemplo:
\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}
A \test
macro recebe dois argumentos, \testA
usa \test
como no primeiro caso (com colchetes #1
) enquanto \testB
usa \test
como no segundo caso.
No corpo usamos \testA
and \testB
com os mesmos dois argumentos: #1 = {1}{2}
e #2 = 3
.
Como \testA
usa colchetes ao redor de #1
, ele se expande para A \test{{1}{2}}{3} A
, como esperado, vinculando-se {1}{2}
ao primeiro argumento de \test
.
\testB
, em vez disso, expande para B \test{1}{2}{3} B
o que significa que \test
será obtido 1
como primeiro argumento e 2
como segundo argumento; {3}
não é consumido \test
e fica formatado após \test
ser expandido.
Portanto a saída é
A este 12 é 3 um teste A
B este 1 é 2 um teste3 B