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}

Вы получаете

*абв* +абв+ абв

но, вероятно, вы хотите быть предупреждены о третьем случае или, может быть, вообще ничего не выводить. С

\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_...семейство имен.

Связанный контент