Übergeben von Parametern an \g@addto@macro

Übergeben von Parametern an \g@addto@macro

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 \addtoDBAufruf ist das \alistdurch definierte Makro \newDBnoch leer, daher ist die Bedingung wahr und

\g@addto@macro\alist{fig167}

ausgeführt wird. Beim zweiten Makroaufruf \alistist nicht leer, so

\g@addto@macro\alist{,fig168}

wird ausgeführt, was zu \alisteiner 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@macrogleich, abgesehen von dem zusätzlichen Komma, das dem zweiten Argument im zweiten Fall vorangestellt wird. Da das erste Argument von eigentlich \g@addto@macronur 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 \testMakro nimmt zwei Argumente an, \testAverwendet \test„as“ in Ihrem ersten Fall (mit Klammern um #1), während es in Ihrem zweiten Fall „as“ \testBverwendet .\test

Im Hauptteil verwenden wir \testAund \testBmit denselben beiden Argumenten: #1 = {1}{2}und #2 = 3.

Da \testAKlammern um verwendet werden #1, wird es A \test{{1}{2}}{3} Awie erwartet zu erweitert und ist {1}{2}an das erste Argument von gebunden \test. \testBwird stattdessen zu erweitert, B \test{1}{2}{3} Bwas bedeutet, dass als erstes und als zweites Argument \testerhalten wird ; wird nicht von verwendet und wird nach der Erweiterung gesetzt.12{3}\test\test

Daher ist die Ausgabe

A diese 12 ist 3 ein Test A

B das 1 ist 2 ein Test3 B

verwandte Informationen