
我是一個完全的新手,但有一點程式設計背景。我一直在看一個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
\testB
B \test{1}{2}{3} B
\test
1
2
{3}
\test
\test
因此輸出是
A 這 12 是 3 測試 A
B 這個 1 是 2 a test3 B