我希望创建一个命令来自动执行下面的过程
\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}}