이 매크로 정의 매크로를 따르는 문자가 왜 먹히나요?

이 매크로 정의 매크로를 따르는 문자가 왜 먹히나요?

다음과 같은 일반 Tex 코드가 있습니다.

\def\xx{ABC}
\def\temp #1 {\def\tempii{#1}}
\temp\xx a b c
\tempii\tempii

다음과 같은 결과가 나올 것으로 예상됩니다. a b c ABCABC

그러나 나는 실제로 이것을 본다: b c ABCaABCa

\tempii의 정의에 왜 'a'가 포함되어 있나요?

답변1

왜 그런지 아직도 생각 중이지만 이번 개정판(포용 \xx)은 원하는 것을 제공합니다.

내 생각에 사용법에서 \temp\xx a b c뒤의 공백은 \xxTeX 파서의 관점에서 나온 것이며 전혀 공백이 아니라 단지 매크로 이름의 끝을 의미한다는 것입니다 \xx. 예를 들어 그냥 \xx A한 줄만 넣으면 ABCA공백 없이 인쇄되는 것을 볼 수 있습니다. 따라서 파서는 후행 "A"를 에 연결된 것으로 빨아들입니다 \xx. \temp\xx{} a b c공백이 구분 기호이며 단지 다음 문자가 아니라는 것을 파서에게 알리는 방법으로 를 사용할 수도 있습니다 \xx.

\documentclass{article}
\begin{document}
\def\xx{ABC}
\def\temp #1 {\def\tempii{#1}}
\temp{\xx} a b c
\tempii\tempii
\end{document}

답변2

명확성을 위해 공간 토큰은 토론에서 매우 중요하므로 으로 표시하겠습니다 . 다음 코드 샘플의 공백은 무시해야 합니다.

매개변수 텍스트는 다음과 \temp같습니다.

#1•

대체 텍스트는

\def\tempii{#1}

귀하의 통화는 \temp다음과 같습니다

\temp\xx a•b•c•\tempii\tempii

그 뒤에는 \xx매크로를 구분하기 위한 공간이 있다는 점에 유의하세요. 그것은~ 아니다공백 토큰: 아무것도 아닙니다. TeX은 항상 제어 다음에 공백을 무시하기 때문입니다.단어(컨트롤 아님기호). 뒤의 공백은 c코드의 줄 끝에서 나옵니다.

다음 토큰은 \temp확장 없이 스캔되어 매개변수 텍스트와 일치하는 항목을 찾습니다. 여기서 인수는 공백으로 구분되므로 #1존재가 끝나고 \xx a입력 스트림의 다음 상태는 다음과 같습니다.

\def\tempii{\xx a}b•c•\tempii\tempii

이제 TeX는 정의를 수행하고 입력 스트림에서 이를 제거합니다.

b•c•\tempii\tempii

그 부분은 b•c•조판 단계로 넘어갑니다. 의 두 복사본을 확장한 후에 \tempii는 다음을 입력한 것과 같습니다.

b•c•\xx a\xx a

또는

b•c•ABCaABCa

그것이 바로 당신이 얻은 것입니다.

마지막 두 줄 \?대신 사용했다면 다음으로 변환되었을 것입니다.\xx

\temp\?•a•b•c•\tempii\tempii

왜냐하면 \?은 제어 기호이고 TeX은 그 뒤의 공백을 무시하지 않습니다. 이 경우 결과는 다음과 같습니다.

a•b•c•ABCABC

참고하세요

\expandafter\temp\xx a•b•c
\tempii\tempii

TeX 의 작업 후에 다음 \expandafter과 같은 결과가 표시되기 때문에 동일한 결과가 생성됩니다.

\temp ABCa•b•c

(물론 이전과 마찬가지로 공간에 대한 규칙도 동일합니다). with \?대신 \xxwith 와 동일한 결과를 얻게 됩니다.

\expandafter\temp\expandafter\xx\space a•b•c

그러면 TeX가 다음과 같이 제공될 것이기 때문입니다.

\temp\xx•a•b•c

실제로 토큰화 프로세스 중에만 제어 단어 뒤의 공백이 무시됩니다.

관련 정보