
Я надеюсь создать команду, которая автоматизирует этот процесс ниже.
\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}}