어떤 이유로 입력 스트림 동작을 흉내내는 매크로를 만들고 싶다고 가정해 \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
"Right Wrong"이 출력됩니다.
답변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}}