
Я полный новичок, но имею небольшой опыт в программировании. Я рассматривал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
использует \test
как в первом случае (со скобками #1
), а \testB
использует \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 тест А
B это 1 есть 2 тест3 B