Как определить команду, которая копирует другую команду под другим именем?

Как определить команду, которая копирует другую команду под другим именем?

Я надеюсь создать команду, которая автоматизирует этот процесс ниже.

\let\oldhat\hat

с чем-то в этом формате:

\let\old(ARGUMENT)\(ARGUMENT)

Я пытался

\newcommand{\makeold}[1]{
    \expandafter\let\csname old#1\endcsname\csname#1\endcsname}
\makeold{hat} %This should rename \hat to \oldhat

но это дает мне ошибку, что у меня слишком много \endcsname'. Я неправильно понимаю цель \csname?

Редактировать: Я забыл об этом, \letпытаясь это сделать.

решение1

Вы пропустили a \letи дополнительный \expandafter. Это определение работает:

\newcommand{\makeold}[1]{%
   \expandafter\let
       \csname old#1\expandafter\endcsname
       \csname#1\endcsname
}

Выполнение такой команды немного запутанно, поэтому позвольте мне описать, как она работает:

\makeold{hat}расширяется до

\expandafter\let\csname oldhat\expandafter\endcsname\csname#1\endcsname

Затем первый \expandafterперепрыгивает через \letи расширяет \csname. Расширение \csnameрекурсивно расширяет любые макросы, пока не встретится \endcsnameи не сформирует макрос из найденных таким образом токенов. В частности, он расширяет второй \expandafter, который перепрыгивает через , \endcsnameчтобы расширить второй \csname, который превращается \csname hat\endcsnameв \hat. Остаются токены, \let\oldhat\hatчто и было нужно.

решение2

Проще всего с etoolbox:

\usepackage{etoolbox}

\newcommand{\makeold}[1]{\csletcs{old#1}{#1}}

Связанный контент