
В процессе работы над проектом я понял, что было бы полезно, если бы я мог сделать следующее. Допустим, у меня есть список различных команд (упрощенно):
\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
не определено)