
私は完全な初心者ですが、プログラミングの経験は少しあります。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@macro
2 番目のケースの 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
ことを意味します。は によって消費されず、が展開された後にタイプセットされます。\test
1
2
{3}
\test
\test
したがって出力は
この12は3テストAです
B これは1は2テスト3 B