\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}

が実行されます。2回目のマクロ呼び出しでは\alist空ではないので、

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

が実行され、\alistに展開されますfig167,fig168。以降の呼び出しでも同様です。

答え2

この特定のケースでは、 の 2 つの使用法は、\g@addto@macro2 番目のケースの 2 番目の引数の先頭に追加される余分なコンマを除けば、同じ意味であると考えられます。実際、 の最初の引数は\g@addto@macro単にマクロの名前であるため、最初のケースの括弧は厳密には必要ありません。ただし、後で説明する理由により、括弧は適切な予防策であり、私の意見では、2 番目のケースでも使用する必要があります。

一般的にこれらがもたらす違いを説明するために (最初の引数が必ずしもマクロ名ではない場合)、次の例を考えてみましょう。

\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マクロは 2 つの引数を取ります。最初のケースでは のように\testA使用し( は括弧で囲みます)、2 番目のケースでは のように使用します。\test#1\testB\test

本文では、と という同じ 2 つの引数とともに\testAと を使用します。\testB#1 = {1}{2}#2 = 3

\testAは を括弧で囲んでいるため#1、 は に展開されA \test{{1}{2}}{3} A、予想どおり{1}{2}の最初の引数にバインドされます\test\testBは に展開され、は最初の引数として、 は2 番目の引数として取得されるB \test{1}{2}{3} Bことを意味します。は によって消費されず、が展開された後にタイプセットされます。\test12{3}\test\test

したがって出力は

この12は3テストAです

B これは1は2テスト3 B

関連情報