
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 ...\endcsname
construcción y no se limitan aLaTeX
, ya que ambas macros son TeX
en 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#1
no está definido \csname A#1\endcsname
se 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 \AA
está definido) y \caller{Z}
no hace nada (ya que \AZ
no está definido)