다른 명령을 다른 이름으로 복사하는 명령을 어떻게 정의합니까?

다른 명령을 다른 이름으로 복사하는 명령을 어떻게 정의합니까?

아래에서 이 프로세스를 자동화하는 명령을 만들고 싶습니다.

\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}}

관련 정보