我有几个以类似方式定义的函数,它们稍后将以名称使用基数+参数。
我没有找到\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
但你可能希望对第三种情况发出警告,或者什么也不输出。
\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_...
名称系列中。