
No processo de um projeto, percebi que seria útil se eu pudesse fazer o seguinte. Digamos que eu tenha uma lista de comandos diferentes (simplificado):
\newcommand{\AA}{...}
\newcommand{\AB}{...}
\newcommand{\AC}{...}
...
\newcommand{\AZ}{...}
Agora quero um comando que possa chamar um destes comandos (com base na entrada):
\newcommand{\caller}[1]{\A#1}
O exemplo acima não funcionará, mas como eu realizaria algo que tenha essa funcionalidade?
Responder1
Você deve construir o nome da macro com \csname A#1\endcsname
.
Na verdade, muitos códigos de pacotes ou classes fazem uso dessa \csname ...\endcsname
construção e ela não está restrita a LaTeX
, já que ambas as macros são, TeX
na verdade, primitivas.
Observação: \AA
já está definido, fornecendo um caractere escandinavo, ou seja, algo como Å (mas como os nomes dos comandos pareciam simplificados, isso não será um problema, eu acho)
Se \A#1
não estiver definido , \csname A#1\endcsname
expande para \relax
, ou seja, não faz nada.
\documentclass{article}
\newcommand{\AB}{bar}
\newcommand{\AC}{foobar}
\newcommand{\caller}[1]{%
\csname A#1\endcsname%
}
\begin{document}
\caller{A}
\caller{B}
\caller{C}
\caller{Z}
\end{document}
Como você pode ver \caller{A}
funciona (já que \AA
está definido) e \caller{Z}
não faz nada (já que \AZ
não está definido)