
아래에서 이 프로세스를 자동화하는 명령을 만들고 싶습니다.
\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
\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}}