
プロジェクトの過程で、次のようにできれば便利だと気づきました。たとえば、さまざまなコマンドのリストがあるとします (簡略化):
\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
定義されていないため)