![latex3 名前による関数の使用](https://rvso.com/image/420048/latex3%20%E5%90%8D%E5%89%8D%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%AE%E4%BD%BF%E7%94%A8.png)
同様の方法で定義された関数がいくつかあり、それらは後で名前で使用されます基数 + 引数。
は見つかりませんが、と は\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:c
expl3 のごく初期の頃からのもので、まさにこのタスクのためにあります (名前が有効であることがわかっている状況では、チェックは不要です)。\cs_use:c
別名として名前を付けることもできたかもしれませんが、トークン リスト変数にも同様に使用できるため、名前のファミリーに追加されました\use_...
。