\afterassignment 構文を使用したマクロですか?

\afterassignment 構文を使用したマクロですか?

\afterassignment何らかの理由で、入力ストリームの動作をとに似せたマクロを作成したいとします\aftergroup。つまり、ちょうど1つマクロに続く入力ストリームからトークンを抽出し、それが不一致の括弧かどうかに関係なく、展開せずに、私が見ることができる場所に保存します。これは次のようになります\[future]letが、完全に同じではありません。

\def\x{\message{Wrong}}
\afterassignment\x
\def\x{\message{Right}}

\def\save{\let\recall=}
\def\x{\message{Wrong}}
\save\x
\def\x{\message{Right}}
\recall

「正しい 間違っている」を出力します。

答え1

明示的な中括弧と暗黙的な中括弧を区別すること以外はすべて行うの定義を次に示します\save。( をカスタマイズするには、これは不可能であり、いずれにせよ必要ではないと思います。) これは実際には非常に簡単であることがわかりました。それが機能する方法であるため を\afterassignment使用していますが、必須ではありません。\global\afterassignment

\def\save{\futurelet\next\s@ve}
\def\s@ve
 {\ifx\next\bgroup \let\next=\s@veopn
  \else\ifx\next\egroup \let\next=\s@veclo
  \else \let\next=\s@vetok \fi\fi\next}
\def\s@veopn  {\global\def\recall{\iftrue {\else}\fi} \let\next=}
\def\s@veclo  {\global\def\recall{\iffalse{\else}\fi} \let\next=}
\def\s@vetok#1{\global\def\recall{#1}}

関連情報