Makro mit \afterassignment-Syntax?

Makro mit \afterassignment-Syntax?

Angenommen, ich möchte aus irgendeinem Grund ein Makro mit einem Eingabestromverhalten erstellen, das dem von \afterassignmentund 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]letaber 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 , \savedie 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 , \globalweil es so \afterassignmentfunktioniert, 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}}

verwandte Informationen