Макрос с синтаксисом \afterassignment?

Макрос с синтаксисом \afterassignment?

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

Связанный контент