将参数传递给 \g@addto@macro

将参数传递给 \g@addto@macro

我完全是个新手,但有一点编程背景。我一直在寻找MWE 位于此处由...提供扬尼斯·拉扎里德斯

在宏定义中,我们有

%% 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
}

\g@addto@macro{#1}{#2}和有什么区别\g@addto@macro#1{,#2}

答案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使用\testas (带有括号#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这意味着\test1作为第一个参数和2第二个参数;{3}不会被使用\test并在 扩展后进行排版\test

因此输出是

这 12 是 3 测试 A

B 这个 1 是 2 a test3 B

相关内容