
Im Laufe eines Projekts wurde mir klar, dass es hilfreich wäre, wenn ich Folgendes tun könnte. Angenommen, ich habe eine Liste verschiedener Befehle (vereinfacht):
\newcommand{\AA}{...}
\newcommand{\AB}{...}
\newcommand{\AC}{...}
...
\newcommand{\AZ}{...}
Jetzt möchte ich einen Befehl, der einen dieser Befehle aufrufen kann (basierend auf der Eingabe):
\newcommand{\caller}[1]{\A#1}
Das obige Beispiel funktioniert nicht, aber wie würde ich etwas erreichen, das über eine solche Funktionalität verfügt?
Antwort1
Den Makronamen müssen Sie mit konstruieren \csname A#1\endcsname
.
Tatsächlich wird diese Konstruktion in vielen Paket- oder Klassencodes verwendet. \csname ...\endcsname
Sie ist nicht darauf beschränkt LaTeX
, da es sich bei beiden Makros TeX
tatsächlich um Primitive handelt.
Bitte beachten: \AA
ist bereits definiert und stellt ein skandinavisches Zeichen bereit, also so etwas wie Å (Aber da die Befehlsnamen vereinfacht zu sein scheinen, wird das, denke ich, kein Problem sein)
Wenn \A#1
nicht definiert ist , \csname A#1\endcsname
wird es zu erweitert \relax
, d. h. es geschieht nichts.
\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}
Wie Sie sehen, \caller{A}
funktioniert es (da \AA
es definiert ist) und \caller{Z}
tut nichts (da \AZ
es nicht definiert ist).