带有 \afterassignment 语法的宏?

带有 \afterassignment 语法的宏?

假设出于某种原因,我想制作一个宏,其输入流行为模仿\afterassignment\aftergroup。也就是说,我想吸收恰好一个从宏后面的输入流中取出 token,不展开它,不管它是否是不匹配的括号,然后把它存储在我可以查看的地方。这几乎像\[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}}

相关内容