Angenommen, ich möchte aus irgendeinem Grund ein Makro mit einem Eingabestromverhalten erstellen, das dem von \afterassignment
und entspricht \aftergroup
. Ich möchte nämlich absorbierengenau eineToken aus dem Eingabestrom nach dem Makro, ohne es zu erweitern, unabhängig davon, ob es eine nicht übereinstimmende Klammer wäre, und es irgendwo speichern, wo ich es ansehen könnte. Das ist fast so, \[future]let
aber nicht ganz: bedenken Sie
\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
die „Richtig Falsch“ ausgibt.
Antwort1
Hier ist eine Definition von , \save
die alles tut, außer explizite und implizite Klammern zu unterscheiden. (Was meiner Meinung nach nicht möglich und für die Anpassung auch nicht erforderlich ist \afterassignment
.) Es stellt sich heraus, dass dies eigentlich ganz einfach ist. Ich verwende , \global
weil es so \afterassignment
funktioniert, aber es ist nicht unbedingt erforderlich.
\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}}