Передача параметров в \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использует \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

Связанный контент