TeX 확장에 대한 질문
Oct 01 2020
아래 예를 참조하십시오.
\documentclass{article}
\begin{document}
\def\a{1}
\def\b{\def\a{2}}
\def\c{\b}
\c\a
\end{document}
확장 단계에서는 \def매개 변수 텍스트와 대체 텍스트가 확장되지 않습니다. 어떻게 텍 프로세서 알고 그런 다음 \c, \a이 단계에서 매크로는?
그리고 토큰이 하나씩 확장되므로
\c\a ==>
\b 1 ==>
\def\a{2} 1
그러나 출력은 2. 이것에 대해 생각하지 않으면 정확하고 정상적인 출력이지만 분명히 확장 단계와 실행 단계에 대해 오해 한 것 같습니다.
답변
11 egreg Oct 02 2020 at 07:48
TeX가 토큰을 확장하고 매크로를 찾을 때 매크로에 의해 지정된 경우 인수를 흡수 한 후 매크로의 대체 텍스트로 대체합니다. 그런 다음 대체 텍스트의 첫 번째 토큰에서 다시 시작됩니다.
따라서 코드의 단계는 다음과 같습니다.
\c\a
\b\a
\def\a{2}\a
<do the assignment>
\a
2
위의 설명을 보완하기 위해 TeX가 할당을 수행해야한다는 것을 알게되면 (여기에서 \def) 필요한 토큰을 흡수하고 할당을 메모리에 저장하고 해당 토큰을 입력 스트림에서 제거합니다.
따라서 \a확장 순서가로 수정되지 않는 한 입력 스트림의 첫 번째 토큰이 될 때까지 검사되지 않습니다 \expandafter.
당신은 1을 얻을 것입니다
\expandafter\c\a
에 대한 추가 호출 \a은 2를 제공합니다.
6 DonHosek Oct 02 2020 at 02:39
확장은 깊이 우선입니다. 즉, \c확장되기 전에 완전히 확장 \a되므로 다음과 같이 진행됩니다.
\c\a ==>
\b\a ==>
\def\a{2}\a ==>
2