macros - chamando um comando usando uma variável de entrada

macros - chamando um comando usando uma variável de entrada

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 ...\endcsnameconstrução e ela não está restrita a LaTeX, já que ambas as macros são, TeXna verdade, primitivas.

Observação: \AAjá 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#1não estiver definido , \csname A#1\endcsnameexpande 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 \AAestá definido) e \caller{Z}não faz nada (já que \AZnão está definido)

insira a descrição da imagem aqui

informação relacionada