
다음과 같은 일반 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
뒤의 공백은 \xx
TeX 파서의 관점에서 나온 것이며 전혀 공백이 아니라 단지 매크로 이름의 끝을 의미한다는 것입니다 \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 \?
대신 \xx
with 와 동일한 결과를 얻게 됩니다.
\expandafter\temp\expandafter\xx\space a•b•c
그러면 TeX가 다음과 같이 제공될 것이기 때문입니다.
\temp\xx•a•b•c
실제로 토큰화 프로세스 중에만 제어 단어 뒤의 공백이 무시됩니다.