答案1
该宏旨在逐步构建列表宏;在文档中,你会发现类似
\def\alist{fig167,fig168,fig169,fig176,%
fig180,fig181,fig182,fig183,fig185,fig186,fig187,fig188}
嗯,我们可以通过以下方法获得相同的结果
\newDB{alist}
进而
\addtoDB\alist{fig167}
\addtoDB\alist{fig168}
\addtoDB\alist{fig169}
\addtoDB\alist{fig176}
等等。
第一次调用时,定义的\addtoDB
宏仍然为空,因此条件为真,并且\alist
\newDB
\g@addto@macro\alist{fig167}
执行。在第二次宏调用时,\alist
不为空,因此
\g@addto@macro\alist{,fig168}
执行后,结果\alist
扩展为fig167,fig168
。后续调用也是如此。
答案2
在这个特定情况下,我认为\g@addto@macro
除了在第二种情况下在第二个参数前面添加一个额外的逗号外,这两种用法应该是相同的。事实上,由于的第一个参数\g@addto@macro
只是宏的名称,因此第一种情况下的括号并不是必需的。但是,出于我们稍后会看到的原因,它们是一种很好的预防措施,在我看来,在第二种情况下也应该使用。
为了说明它们通常造成的差异(当第一个参数不一定是宏名时),让我们考虑以下示例:
\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}
该\test
宏接受两个参数,在第一种情况下\testA
使用\test
as (带有括号#1
),而在第二种情况下\testB
使用as 。\test
在主体中我们使用\testA
和\testB
相同的两个参数:#1 = {1}{2}
和#2 = 3
。
由于\testA
使用了括号#1
,它会扩展为A \test{{1}{2}}{3} A
,正如预期的那样,绑定{1}{2}
到 的第一个参数\test
。
\testB
,相反,它会扩展为,B \test{1}{2}{3} B
这意味着\test
将1
作为第一个参数和2
第二个参数;{3}
不会被使用\test
并在 扩展后进行排版\test
。
因此输出是
这 12 是 3 测试 A
B 这个 1 是 2 a test3 B