
在一個專案的過程中,我意識到如果我能做到以下幾點將會很有幫助。假設我有一個不同命令的清單(簡化):
\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
未定義)