
Ich bin ein kompletter Neuling, habe aber ein wenig Hintergrund in der Programmierung. Ich habe mir einMWE befindet sich hierzur Verfügung gestellt vonYiannis Lazarides.
In der Makrodefinition haben wir
%% 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
}
Was ist der Unterschied zwischen \g@addto@macro{#1}{#2}
und \g@addto@macro#1{,#2}
?
Antwort1
Das Makro dient dazu, schrittweise ein Listenmakro aufzubauen. Im Dokument finden Sie etwas wie
\def\alist{fig167,fig168,fig169,fig176,%
fig180,fig181,fig182,fig183,fig185,fig186,fig187,fig188}
Dasselbe Ergebnis kann man erreichen, indem man
\newDB{alist}
und dann
\addtoDB\alist{fig167}
\addtoDB\alist{fig168}
\addtoDB\alist{fig169}
\addtoDB\alist{fig176}
und so weiter.
Beim ersten \addtoDB
Aufruf ist das \alist
durch definierte Makro \newDB
noch leer, daher ist die Bedingung wahr und
\g@addto@macro\alist{fig167}
ausgeführt wird. Beim zweiten Makroaufruf \alist
ist nicht leer, so
\g@addto@macro\alist{,fig168}
wird ausgeführt, was zu \alist
einer Erweiterung auf führt fig167,fig168
. Und so weiter für die nachfolgenden Aufrufe.
Antwort2
In diesem speziellen Fall sind die beiden Verwendungen von meines Erachtens \g@addto@macro
gleich, abgesehen von dem zusätzlichen Komma, das dem zweiten Argument im zweiten Fall vorangestellt wird. Da das erste Argument von eigentlich \g@addto@macro
nur der Name eines Makros sein soll, sind die Klammern im ersten Fall nicht unbedingt erforderlich. Aus Gründen, die wir gleich sehen werden, sind sie jedoch eine gute Vorsichtsmaßnahme und sollten meiner Meinung nach auch im zweiten Fall verwendet werden.
Um den Unterschied zu veranschaulichen, den sie im Allgemeinen machen (wenn das erste Argument nicht unbedingt ein Makroname ist), betrachten wir das folgende Beispiel:
\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}
Das \test
Makro nimmt zwei Argumente an, \testA
verwendet \test
„as“ in Ihrem ersten Fall (mit Klammern um #1
), während es in Ihrem zweiten Fall „as“ \testB
verwendet .\test
Im Hauptteil verwenden wir \testA
und \testB
mit denselben beiden Argumenten: #1 = {1}{2}
und #2 = 3
.
Da \testA
Klammern um verwendet werden #1
, wird es A \test{{1}{2}}{3} A
wie erwartet zu erweitert und ist {1}{2}
an das erste Argument von gebunden \test
.
\testB
wird stattdessen zu erweitert, B \test{1}{2}{3} B
was bedeutet, dass als erstes und als zweites Argument \test
erhalten wird ; wird nicht von verwendet und wird nach der Erweiterung gesetzt.1
2
{3}
\test
\test
Daher ist die Ausgabe
A diese 12 ist 3 ein Test A
B das 1 ist 2 ein Test3 B