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

但你可能希望对第三种情况发出警告,或者什么也不输出。

\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_...名称系列中。

相关内容