假設出於某種原因我想製作一個具有模仿\afterassignment
和 的輸入流行為的巨集\aftergroup
。也就是說,我想吸收正好一個從巨集後面的輸入流中獲取標記,而不擴展它,無論它是否是不匹配的大括號,並將其儲存在我可以查看的地方。這幾乎就像\[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}}