![带有 \afterassignment 语法的宏?](https://linux22.com/image/328153/%E5%B8%A6%E6%9C%89%20%5Cafterassignment%20%E8%AF%AD%E6%B3%95%E7%9A%84%E5%AE%8F%EF%BC%9F.png)
假设出于某种原因,我想制作一个宏,其输入流行为模仿\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}}