Macro com sintaxe \afterassignment?

Macro com sintaxe \afterassignment?

Digamos que, por algum motivo, eu queira criar uma macro com comportamento de fluxo de entrada imitando o de \afterassignmente \aftergroup. Ou seja, eu quero absorverexatamente umtoken do fluxo de entrada seguindo a macro, sem expandi-lo, independentemente de ser uma chave incomparável, e armazená-lo em algum lugar onde eu possa vê-lo. Isto é quase como, \[future]letmas não exatamente: considere

\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

que produz “Certo, Errado”.

Responder1

Aqui está uma definição de \saveque faz tudo, exceto distinguir colchetes explícitos e implícitos. (O que eu acho que não é possível e nem necessário para personalizar \afterassignment.) Acontece que isso é realmente muito fácil. Eu uso \globalporque é assim que \afterassignmentfunciona, mas não é essencial.

\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}}

informação relacionada