latex3 名前による関数の使用

latex3 名前による関数の使用

同様の方法で定義された関数がいくつかあり、それらは後で名前で使用されます基数 + 引数

は見つかりませんが、と は\cs_use:cあります。これはこのようなことを行う正しい方法でしょうか、それとも のような別のものを使用するべきでしょうか?\use:c\cs_if_exist_use:c\str_case:nn

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \my_test_a:n
  {
    *#1*
  }
\cs_new_protected:Nn \my_test_b:n
  {
    +#1+
  }
\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:c { my_test_#1:n } { #2 }
  }
\ExplSyntaxOff

\begin{document}
\test{a}{abc}
\test{b}{abc}
\end{document}

答え1

合成関数が存在しない場合に何をしたいかによって異なります。

関数は\cs_if_exist_use:c本質的に と同じです\use:c。つまり、 のラッパーです\csname...\endcsname。ただし、前者は後者が行わないチェックを行います。

では、その理由は何でしょうか\cs_if_exist_use:c?それはシリーズの一部です

\cs_if_exist_use:c \cs_if_exist_use:cT \cs_if_exist_use:cF \cs_if_exist_use:cTF

もし、するなら

\test{a}{abc}
\test{b}{abc}
\test{c}{abc}

あなたは得る

*abc* +abc+ abc

しかし、おそらく3番目のケースについては警告を発するか、何も出力しないようにしたいでしょう。

\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:cF { my_test_#1:n } { \use_none:n } { #2 }
  }

出力は次のようになる

*abc* +abc+

\my_test_c:nは存在しないため、TeX は\use_none:n入力ストリームに を入れるよう指示されますが、これによって後続のn引数が無視されます。 の前に適切な警告またはエラー メッセージを追加できます\use_none:n

答え2

これは\use:cexpl3 のごく初期の頃からのもので、まさにこのタスクのためにあります (名前が有効であることがわかっている状況では、チェックは不要です)。\cs_use:c別名として名前を付けることもできたかもしれませんが、トークン リスト変数にも同様に使用できるため、名前のファミリーに追加されました\use_...

関連情報