Passando parâmetros para \g@addto@macro

Passando parâmetros para \g@addto@macro

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 \addtoDBchamada, a macro \alistdefinida por \newDBainda está vazia, então a condicional é verdadeira e

\g@addto@macro\alist{fig167}

É executado. Na segunda chamada de macro, \alistnão está vazio, então

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

é executado, resultando na \alistexpansã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@macrodevem ser iguais, exceto a vírgula extra anexada ao segundo argumento no segundo caso. Na verdade, como o primeiro argumento de \g@addto@macropretende 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 \testmacro recebe dois argumentos, \testAusa \testcomo no primeiro caso (com colchetes #1) enquanto \testBusa \testcomo no segundo caso.

No corpo usamos \testAand \testBcom os mesmos dois argumentos: #1 = {1}{2}e #2 = 3.

Como \testAusa 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} Bo que significa que \testserá obtido 1como primeiro argumento e 2como segundo argumento; {3}não é consumido \teste fica formatado após \testser expandido.

Portanto a saída é

A este 12 é 3 um teste A

B este 1 é 2 um teste3 B

informação relacionada