Допустим, по какой-то причине я хочу создать макрос с поведением входного потока, имитирующим поведение \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}}