具有 \after賦值語法的巨集?

具有 \after賦值語法的巨集?

假設出於某種原因我想製作一個具有模仿\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}}

相關內容