Wie definiert man einen Befehl, der einen anderen Befehl mit einem anderen Namen kopiert?

Wie definiert man einen Befehl, der einen anderen Befehl mit einem anderen Namen kopiert?

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 \letbei meinem Versuch vergessen.

Antwort1

Dir fehlt ein \letund 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

\expandafterAls nächstes springt der erste über den \letund erweitert den \csname. Das Erweitern von \csnameerweitert rekursiv alle Makros, bis es auf trifft \endcsnameund aus den so gefundenen Token ein Makro bildet. Insbesondere erweitert es den zweiten \expandafter, der über den springt, \endcsnameum den zweiten zu erweitern \csname, der sich \csname hat\endcsnamein 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}}

verwandte Informationen