Digamos que, por algum motivo, eu queira criar uma macro com comportamento de fluxo de entrada imitando o de \afterassignment
e \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]let
mas 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 \save
que 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 \global
porque é assim que \afterassignment
funciona, 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}}