У меня есть несколько функций, определенных похожим образом, и они будут использоваться позже под этим именембаза + аргумент.
Я не нахожу \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}
Вы получаете
*абв* +абв+ абв
но, вероятно, вы хотите быть предупреждены о третьем случае или, может быть, вообще ничего не выводить. С
\NewDocumentCommand { \test } { m m }
{
\cs_if_exist_use:cF { my_test_#1:n } { \use_none:n } { #2 }
}
выход будет
*абв* +абв+
поскольку \my_test_c:n
не существует, поэтому TeX получает указание поместить \use_none:n
входной поток, который поглощает следующий n
аргумент. Вы можете добавить соответствующее предупреждение или сообщение об ошибке перед \use_none:n
.
решение2
Это \use:c
имя появилось в самом начале expl3 и предназначено именно для этой задачи (без проверки в ситуациях, когда вы знаете, что ваше имя является допустимым). Возможно, его можно было бы использовать \cs_use:c
в качестве псевдонима, но его можно с тем же успехом использовать для переменных списка токенов, поэтому его поместили в \use_...
семейство имен.