
我希望創建一個命令來自動執行下面的此過程
\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}}