如何定义一个将另一个命令复制为不同名称的命令?

如何定义一个将另一个命令复制为不同名称的命令?

我希望创建一个命令来自动执行下面的过程

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

相关内容