latex3 usa função por nome

latex3 usa função por nome

Tenho várias funções definidas de forma semelhante, e elas serão usadas posteriormente pelo nomebase + argumento.

Não encontro \cs_use:c, mas existe \use:ce \cs_if_exist_use:c. Esta é a maneira correta de fazer isso ou devo usar algo como \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}

Responder1

Depende do que você deseja fazer quando a função composta não existe.

A função \cs_if_exist_use:cé essencialmente a mesma que \use:c: eles são wrappers \csname...\endcsname. O primeiro, entretanto, verifica que o último não.

Qual é o motivo \cs_if_exist_use:c, então? Faz parte da série

\cs_if_exist_use:c \cs_if_exist_use:cT \cs_if_exist_use:cF \cs_if_exist_use:cTF

Se você fizer

\test{a}{abc}
\test{b}{abc}
\test{c}{abc}

você consegue

*abc* +abc+abc

mas provavelmente você deseja ser avisado sobre o terceiro caso ou talvez não produzir nada. Com

\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:cF { my_test_#1:n } { \use_none:n } { #2 }
  }

a saída seria

*abc* +abc+

porque \my_test_c:nnão existe, então o TeX é instruído a colocar \use_none:nno fluxo de entrada, que engole o seguinte nargumento. Você pode adicionar um aviso ou mensagem de erro adequada na frente de \use_none:n.

Responder2

É \use:cdesde os primórdios do expl3 e é justamente para esta tarefa (sem qualquer verificação em situações em que você sabe que seu nome é válido). Indiscutivelmente, o nome poderia ter recebido \cs_use:cum apelido, mas pode ser igualmente utilizável para variáveis ​​​​de lista de tokens e, portanto, foi colocado na \use_...família de nomes.

informação relacionada