在一个项目的过程中,我意识到如果我能做如下事情会很有帮助。假设我有一个不同的命令列表(简化):
\newcommand{\AA}{...}
\newcommand{\AB}{...}
\newcommand{\AC}{...}
...
\newcommand{\AZ}{...}
现在我想要一个可以调用以下命令之一的命令(基于输入):
\newcommand{\caller}[1]{\A#1}
上面的例子不起作用,但是我该如何实现具有这种功能的功能呢?
答案1
您必须用 构造宏名称\csname A#1\endcsname
。
事实上,许多包或类代码都使用了这种\csname ...\endcsname
构造,并且它并不局限于此LaTeX
,因为这两个宏TeX
实际上都是原语。
请注意:\AA
已经定义,提供斯堪的纳维亚字符,例如 Å(但由于命令名称似乎已简化,所以我认为这不会成为问题)
如果\A#1
没有定义则\csname A#1\endcsname
扩展为\relax
,即它不执行任何操作。
\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}
如您所见,它可以\caller{A}
工作(因为\AA
已定义)并且\caller{Z}
不执行任何操作(因为\AZ
未定义)