![latex3 usa função por nome](https://rvso.com/image/420048/latex3%20usa%20fun%C3%A7%C3%A3o%20por%20nome.png)
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:c
e \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:n
não existe, então o TeX é instruído a colocar \use_none:n
no fluxo de entrada, que engole o seguinte n
argumento. Você pode adicionar um aviso ou mensagem de erro adequada na frente de \use_none:n
.
Responder2
É \use:c
desde 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:c
um apelido, mas pode ser igualmente utilizável para variáveis de lista de tokens e, portanto, foi colocado na \use_...
família de nomes.