
Ich hoffe, einen Befehl zu erstellen, der diesen Prozess unten automatisiert
\let\oldhat\hat
mit etwas in diesem Format:
\let\old(ARGUMENT)\(ARGUMENT)
Ich habe es versucht
\newcommand{\makeold}[1]{
\expandafter\let\csname old#1\endcsname\csname#1\endcsname}
\makeold{hat} %This should rename \hat to \oldhat
aber das gibt mir eine Fehlermeldung, dass ich zu viele habe \endcsname
. Verstehe ich den Zweck von falsch \csname
?
Edit: Das hatte ich \let
bei meinem Versuch vergessen.
Antwort1
Dir fehlt ein \let
und ein zusätzliches \expandafter
. Diese Definition funktioniert:
\newcommand{\makeold}[1]{%
\expandafter\let
\csname old#1\expandafter\endcsname
\csname#1\endcsname
}
Die Ausführung eines solchen Befehls ist etwas verwirrend, deshalb möchte ich beschreiben, wie dieser Befehl funktioniert:
\makeold{hat}
erweitert sich zu
\expandafter\let\csname oldhat\expandafter\endcsname\csname#1\endcsname
\expandafter
Als nächstes springt der erste über den \let
und erweitert den \csname
. Das Erweitern von \csname
erweitert rekursiv alle Makros, bis es auf trifft \endcsname
und aus den so gefundenen Token ein Makro bildet. Insbesondere erweitert es den zweiten \expandafter
, der über den springt, \endcsname
um den zweiten zu erweitern \csname
, der sich \csname hat\endcsname
in verwandelt \hat
. Was übrig bleibt, sind die Token \let\oldhat\hat
, was Sie tun wollten.
Antwort2
Einfacher geht es mit etoolbox
:
\usepackage{etoolbox}
\newcommand{\makeold}[1]{\csletcs{old#1}{#1}}