コマンドに引数を渡す構文

コマンドに引数を渡す構文

一般的なプログラミング言語では、次のように関数を呼び出すことに慣れています。

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}

ここに画像の説明を入力してください

関連情報