一般的なプログラミング言語では、次のように関数を呼び出すことに慣れています。
myfunction(argument1, argument2, ..., argumentn)
ラテックスではこの構文が必要なようです
\mycommand{argument1}{argument2}...{argumentn}
コマンドを使用するには、通常の関数構文を使用してコマンドを呼び出すことができますか (引数ごとに中括弧を記述する代わりに)? 次の操作を実行できるようにしたいです。
\mycommand{argument1, argument2, ..., argumentn}
答え1
他の回答では、カンマで分割する方法を取り上げていますが、より広い説明も役立つかもしれません。LaTeX は一般的にプログラムできますが、タイプセッティング用の文書準備システムであるという事実から始めることが重要です。基礎となる言語 (TeX) の設計も同じ目的を反映しており、LaTeX はここでは TeX 自体と同じ規則をほぼ使用しています。
引数を渡すという点では、TeX は「バランスのとれたテキスト」を扱います。これは、通常、 で始まり で{
終わる任意の素材です}
。「バランスのとれたテキスト」を区切るために使用される文字は変更できますが、2 つが必要であるという事実と、それらが別個であるという事実は変更できません。つまり、引数を次の形式で渡す必要があります。
\foo{balanced text 1}{balanced text 2}
等TeXではより複雑な「区切られた」引数型が許可されているので、次のように設定することができます(デイビッドがやったように)を使用して、カンマで区切る
\def\foo(#1,#2){Stuff with #1 and #2}
\foo(abc,def) => #1 = abc, #2 = def
しかし、これはプログラミング層で定義する必要があります。単に「コア構文を切り替える」ことはできません。さらに、私が今使った単純な定義では必要入力にカンマがある: 他の一般的な言語をモデル化している場合は、引数がオプションであると想定される可能性があります。より複雑なプログラミングを使用して、可変数のカンマで分割することもできますが、これは常にレイヤーになります。上にコアの。
覚えておくべき重要な点は、TeX には文字列データや関数/変数の分割がなく、「トークン」だけがあるということです。重要なのは、これはコンマがどこでも使用されることが予想されるため、\foo(abc,efg) 構文を使用する場合はコンマを「保護」する必要があることを意味します。
\foo({abc,def},ghi) => #1 = abc,def; #2 = ghi
それは(私にとっては)
\baz{abc,def}{ghi}
また、ここで注目すべきは、 を使用するといくつかの問題が発生するということです。( ... )
問題が発生したり、より複雑なコード設定が行われたりすることなく、 を引数に表示することはできません ( を参照xparse
)。
答え2
コマンドと、引数リストの要素に対して何かを実行する処理コマンドを定義する方法 (xparse から直接使用しない) ですが、このプロセッサ コマンドは基本的にリストの個々の要素に対して同じ操作を実行しますexpl3
。\SplitList
注: 意味が異なる引数が多数ある場合は、key-value
アプローチがより効果的であるか、少なくともエラーが発生しにくくなります。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\newcommand{\foocmd}[1]{%
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_map_inline:Nn \l_tmpa_seq {%
\fooprocessorcmd{##1}%
}
}
\ExplSyntaxOn
\newcommand{\fooprocessorcmd}[1]{\fbox{#1}}
\begin{document}
\foocmd{r,o,f,y,b,i,v}
\end{document}
答え3
ある言語の慣用句を他の言語に押し付けるのは必ずしも良い考えではありませんが、例えば
\documentclass{article}
\def\zz#1{\zzz#1\relax}
\def\zzz#1,#2,#3,#4\relax{\fbox{#1} \fbox{#2} \fbox{#3} \fbox{#4}}
\begin{document}
\zz{a,b,c,d}
\end{document}
カンマ区切りのリストを処理する場合とは異なり、(例えば)
\usepackage{array,color,longtable,booktabs}
上記で定義\zz(z)
した には固定数の引数があり、 としてアクセスされますが、#1
では#4
なくカンマ構文を使用します{}
。
また、4つの引数には含まれていない,
か、\relax
必要であれば保護する必要があると{}
想定しています。\zz{{1,2},{3,4},{5,6},{7,8}}
答え4
非常にシンプルなアプローチを紹介しますlistofitems
。
\documentclass{article}
\usepackage{listofitems}
\newcommand\mycommand[1]{%
\readlist*\myargs{#1}%
The \myargslen{} arguments are \showitems\myargs.
The 4th argument is ``\myargs[4].''
}
\begin{document}
\mycommand{this, is, a, big, test}
\mycommand{What, would, you do, for a, Klondike, bar?}
\end{document}