macros: llamar a un comando usando una variable de entrada

macros: llamar a un comando usando una variable de entrada

En el proceso de un proyecto, me di cuenta de que sería útil si pudiera hacer lo siguiente. Digamos que tengo una lista de diferentes comandos (simplificados):

\newcommand{\AA}{...}
\newcommand{\AB}{...}
\newcommand{\AC}{...}
...
\newcommand{\AZ}{...}

Ahora quiero un comando que pueda llamar a uno de estos comandos (según la entrada):

\newcommand{\caller}[1]{\A#1}

El ejemplo anterior no funcionará, pero ¿cómo podría lograr algo que tenga esa funcionalidad?

Respuesta1

Tienes que construir el nombre de la macro con \csname A#1\endcsname.

De hecho, muchos paquetes o códigos de clases utilizan esta \csname ...\endcsnameconstrucción y no se limitan aLaTeX , ya que ambas macros son TeXen realidad primitivas.

Tenga en cuenta:\AA ya está definido, proporcionando un carácter escandinavo, es decir, algo como Å (pero como los nombres de los comandos parecían estar simplificados, creo que esto no será un problema)

Si \A#1no está definido \csname A#1\endcsnamese expande a \relax, es decir, no hace 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 puede ver, \caller{A}funciona (ya que \AAestá definido) y \caller{Z}no hace nada (ya que \AZno está definido)

ingrese la descripción de la imagen aquí

información relacionada