將參數傳遞給 \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巨集仍然為空,因此條件為 true 且\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#1\testB\test

在正文中,我們使用\testA和 以及\testB相同的兩個參數:#1 = {1}{2}#2 = 3

由於\testA在 周圍使用方括號,因此它按照預期#1擴展為,並綁定到 的第一個參數。 相反,擴展為which 意味著將作為第一個參數和第二個參數;不被消耗並在擴充後進行排版。A \test{{1}{2}}{3} A{1}{2}\test\testBB \test{1}{2}{3} B\test12{3}\test\test

因此輸出是

A 這 12 是 3 測試 A

B 這個 1 是 2 a test3 B

相關內容