如何定義將另一個命令複製到不同名稱的命令?

如何定義將另一個命令複製到不同名稱的命令?

我希望創建一個命令來自動執行下面的此過程

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

相關內容