別のコマンドを別の名前でコピーするコマンドを定義するにはどうすればよいでしょうか?

別のコマンドを別の名前でコピーするコマンドを定義するにはどうすればよいでしょうか?

私は以下のプロセスを自動化するコマンドを作成したいと考えています

\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、このようにして見つかったトークンからマクロが形成されます。特に、 は 2 番目を展開し\expandafter、 を飛び越えて\endcsname2 番目の を展開し、になります\csname。残っているのはトークンであり、これが目的のことです。\csname hat\endcsname\hat\let\oldhat\hat

答え2

次のようにすると簡単になりますetoolbox:

\usepackage{etoolbox}

\newcommand{\makeold}[1]{\csletcs{old#1}{#1}}

関連情報