
私は以下のプロセスを自動化するコマンドを作成したいと考えています
\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
、 を飛び越えて\endcsname
2 番目の を展開し、になります\csname
。残っているのはトークンであり、これが目的のことです。\csname hat\endcsname
\hat
\let\oldhat\hat
答え2
次のようにすると簡単になりますetoolbox
:
\usepackage{etoolbox}
\newcommand{\makeold}[1]{\csletcs{old#1}{#1}}