TeX가 무제한 인수로 사용하지 않는 토큰은 무엇입니까({와 } 사이에 있지 않은 경우)?

TeX가 무제한 인수로 사용하지 않는 토큰은 무엇입니까({와 } 사이에 있지 않은 경우)?

TeX가 무제한 인수로 사용하지 않는 토큰은 무엇입니까(범주 코드 1의 명시적 문자 토큰과 범주 코드 2의 명시적 문자 토큰 사이에 중첩되지 않은 경우)?

TeXbook의 연습 20.4 이전의 마지막 위험한 굽힘 단락에서 다음 문장을 찾을 수 있습니다.

' '라고 말한 후에 \def\row#1#2{...}인수 사이에 공백을 넣을 수 있습니다(예: '\row x n '). 왜냐하면 TeX는 사용하지 않기 때문입니다.단일 공백무제한 인수로.

TeXbook의 연습 20.5 이전의 double dangerus bent 단락에서 다음 문장을 찾을 수 있습니다.

TeX는 논쟁이 끝나는 위치를 어떻게 결정합니까? 답변:[...]무제한 매개변수는 바로 다음과 같습니다.⟨매개변수 텍스트⟩매개변수 토큰에 의해 발생하거나 매개변수 텍스트 맨 끝에서 발생합니다. 이 경우 해당 인수는 다음입니다.비어 있지 않은 토큰, 해당 토큰이 ' '가 아닌 한 인수는 다음의 {전체 그룹이 됩니다 .{...}

TeXbook에서 나는 "단일 공백"이라는 용어나 "공백이 아닌 토큰"이라는 용어에 대한 정확한 정의를 찾지 못했습니다.

TeX가 무제한 인수로 사용하지 않는 모든 토큰을 열거하십시오(범주 코드 1의 명시적 문자 토큰과 범주 코드 2의 명시적 문자 토큰 사이에 중첩되지 않는 한).

이제 나는 TeX가 카테고리 코드 10과 문자 코드 32의 명시적 문자 토큰을 무제한 인수로 사용하지 않는다는 것을 발견했습니다. TeX가 의 \macro두 번째 인수로 취하는 것에 집중해야 합니다:

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A B 
\show\macrob
\bye

범주 코드 10 및 문자 코드 32의 암시적 문자 토큰은 무제한 매크로 인수로 사용됩니다.

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\X=13
\uppercase{\let\space= } %
\uppercase{\letX= } %
\macro A\space B 
\show\macrob
\macro AXB
\show\macrob
\bye

명시적인 재미있는 공백은 무제한 매크로 인수로 사용됩니다.

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\uccode`\ =`\a
\uppercase{\macro A B}%
\show\macrob
\bye

암시적인 재미있는 공백은 무제한 매크로 인수로 사용됩니다.

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\def\letcs#1#2{\let#1= #2}%
\catcode`\X=13
\uccode`\ =`\a
\uppercase{\letcs\space{ }}%
\uppercase{\letcsX{ }}%
\macro A\space B 
\show\macrob
\macro AXB
\show\macrob
\bye

범주 코드 12 및 문자 코드 32의 암시적/명시적 문자 토큰은 무제한 매크로 인수로 사용됩니다.

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\catcode`\ =12\relax%
\let\space= %
\macro{A} {B}%
\show\macrob
\macro{A}\space{B}%
\show\macrob
\bye

제어 공간은 무제한 매크로 인수로 사용됩니다.

\def\macro#1#2{\def\macrob{Arg 1:(#1) Arg 2:(#2)}}
\macro A\ B
\show\macrob
\bye

그래서 몇 가지 사례를 테스트했지만 엣지 사례 테스트는 "단일 공간"이라는 용어에 대한 정확한 정의로 이어지지 않으며 "공백이 아닌 토큰"이라는 용어에 대한 정확한 정의로 이어지지 않습니다. ;-)

즉, TeX가 무제한 인수로 사용하지 않는 토큰이 무엇인지 정확히 알 수 없습니다(범주 코드 1의 문자 토큰과 범주 코드 2의 문자 토큰 사이에 중첩되지 않는 한).

양이 많은 것 같아요⟨우주 토큰⟩"단일 공백"/"공백이 아닌 토큰"과 동일하지 않습니다.

TeXbook은 24장: 수직 모드 요약에서 다음과 같이 말합니다.

수량⟨우주 토큰⟩, 이는 다음 구문에 사용되었습니다.⟨선택적 공간⟩위에서는 명시적 또는 암시적 공간을 나타냅니다. 즉, 카테고리 10의 문자 토큰 또는 현재 의미가 \let또는 에 의해 해당 토큰과 동일하게 만들어진 제어 시퀀스 또는 활성 문자를 나타냅니다 \futurelet.

언급된 "제어 시퀀스 또는 활성 문자"는 아래에 포함 가능합니다.⟨우주 토큰⟩,는 무제한 매크로 인수로 사용되며 위의 예에서는 이를 보여줍니다. 반면 "단일 공백"/"공백이 아닌 토큰"은 무제한 매크로 인수로 사용되지 않습니다.

아마도 "단일 공백"/"공백이 아닌 토큰"은 다음의 엄격한 하위 집합일 것입니다.⟨우주 토큰⟩?

그렇다면 정확히 어떤 하위 집합인가요?

답변1

TeXbook의 스타일은 종종 정확하지만 완전한 진실은 아닌 것을 말하는 것입니다.

"단일 공간"은 필요하지 않기 때문에 공식적인 정의는 없습니다.

실제로, 시도해 보면

\begingroup\def\\{\global\let\spacetoken= }\\ \endgroup

\def\foo#1#2{(First is #1)(Second is #2)}

\foo AB

\foo A B

\edef\two{\space\space}
\expandafter\foo\expandafter A\two B

\foo A\spacetoken B

\bye

당신은 세 가지 인스턴스를 얻게 될 것입니다

(첫 번째는 A)(두 번째는 B)

마지막 줄은 대신 생성됩니다

(첫 번째는 A)(두 번째는 )B

이 트릭은 과 \expandafter사이에 여러 개의 공백을 삽입하는 데 사용됩니다 . 따라서 다음 연습이 "더 정확"하다는 것을 알 수 있습니다. TeX는 모든 항목을 건너뜁니다.AB명백한무제한 인수를 찾을 때 공간 토큰.

마지막 예는 다음을 보여줍니다.절대적인공간 토큰은 건너뛰지 않습니다. 코드의 첫 번째 줄은 \spacetoken암시적 공간 토큰을 만들기 위해 연습 24.6에서 빌려온 것입니다. 왜냐하면 에서 단순히 like를 수행할 수 없기 때문입니다 \let\bgroup={. 추가하면 \show\spacetoken얻는다

> \spacetoken=blank space  .

하지만 이건~ 아니다무제한 인수를 찾을 때는 무시됩니다.

명시적 공백 토큰은 범주 코드 10의 문자 토큰입니다(일반 설정에서는 공백 또는 탭. 관심이 있는 경우 자세한 내용은 나중에 참조). 일반 설정에서는 입력의 공백이나 탭 또는 입력이 토큰화될 때 범주 코드 10이 할당된 문자에 의해 생성될 수 있습니다.


그러나 문제가 있습니다. 항상 하나 있습니다!

TeX는 범주 코드 10의 문자를 흡수하여 원래 문자 코드와 독립적으로 문자 코드 32를 할당한다는 점을 고려해야 합니다. 따라서 탭은 공백과 다르지 않습니다.~이다토큰화가 수행된 후에도 마찬가지입니다.

그렇다면 무엇이 문제인가?

\uccode` =`x \uppercase{\foo A B}

그 웃긴 공간을 무시하지 않는 건가요? 사실 그것과는 다르다

\catcode`*=10 \foo A*B

카테고리 코드가 10이므로 별표를 무시합니다.

사실은 카테고리 코드 10의 문자는 다음과 같습니다.표준화된문자 코드 32를 가지려면토큰화 중. 그러나 가 \uppercase적용되면 이미 토큰화가 수행되었으며 공백에는 문자 코드 32가 있습니다. 그러나 \uppercase문자가 x10 이 된 후에 는 문자 코드 32가 없으므로 더 이상 무시할 수 없습니다.

따라서 문자 코드가 32이고 범주 코드가 10인 문자만 무시된다는 대답은 정확하지만 정규화가 고려되지 않으면 오해의 소지가 있습니다.

답변2

tex.web에는

begin if cur_tok=space_token then

space_token무시된 토큰 을 건너뛰려면

@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}

답변3

문자 코드 32 및 범주 10(공백)의 명시적 문자 토큰 시퀀스는 무제한 인수의 시작을 "찾는" 동안 TeX가 건너뛰는 유일한 항목입니다.


수량⟨우주 토큰⟩실제로 귀하가 인용한 TeXbook 단락의 의미에서 "단일 공백"/"공백이 아닌 토큰"과 동일하지 않습니다.

수량⟨선택적 공간 1개⟩다음과 같이 정의됩니다.

⟨선택적 공간 1개⟩⟨우주 토큰⟩|⟨비어 있는⟩

대체 어디로⟨선택적 공간 1개⟩허용되며 이는 암시적 공간 토큰일 수도 있습니다.

예를 들어,

\lowercase{\let\sptoken = } %
\edef\result{\number1234 }
\show\result
\edef\result{\number1234\sptoken}
\show\result
\let\result\sptoken\sptoken=\sptoken\TeX
\bye

(여기서는 \lowercase 중괄호를 제거하는 것 외에는 아무것도 하지 않습니다. 이렇게 하면 "=" 뒤에 문자 코드 32의 두 개의 명시적인 공백 토큰이 생깁니다. - \let할당을 사용하면 "=" 뒤에 공백 하나가 선택 사항이므로 첫 번째 토큰은 삭제됩니다. 두 번째 토큰은 삭제되지 않습니다. 폐기되지만 에 의미가 할당된 토큰이 됩니다 \sptoken.)

\sptoken암시적 공간 토큰입니다. 이는 명시적인 공간 토큰처럼
TeX 평가 중에 삭제됩니다 . 그것도 다른 것과 마찬가지로 폐기된다\number
⟨선택공간⟩두 번째 \let과제를 수행하는 동안. 그러나 TeX는 무제한 인수의 시작 부분을 "찾는" 동안
건너뛰지 않습니다 .\sptoken

따라서 이 예는 수량이⟨우주 토큰⟩귀하가 인용한 TeXbook 단락의 의미에서 "단일 공백"/"공백이 아닌 토큰"과 동일하지 않습니다.


그런데:

귀하의 질문은 무제한 인수의 시작을 찾는 동안 TeX가 토큰을 처리하는 방법에 초점을 맞추고 있습니다.

귀하의 질문은 토큰화가 이미 완료된 처리 단계를 나타냅니다.

그럼에도 불구하고 .tex-input 토큰화 프로세스와 관련된 사실을 언급할 가치가 있습니다.

.tex-input을 토큰화하는 과정에서 TeX가 읽기 장치가 상태 M(줄 중간)에 있는 동안 범주 코드가 10(공백)인 문자를 발견하면 TeX는 범주 10의 명시적 문자 토큰을 추가합니다. (공백) 및 문자 코드 32를 토큰 스트림에 추가합니다. 즉, 결과 토큰은 해당 입력 문자의 코드 포인트에 관계없이 문자 코드 32를 갖게 됩니다.

예를 들어 수평 탭(수평 탭에는 ASCII의 코드 포인트 번호 9가 있음)에는 일반적으로 범주 코드 10도 할당되어 있습니다. 따라서 가로 탭을 토큰화하면 일반적으로 범주 10(공백) 및 문자 코드 32의 명시적 문자 토큰이 생성됩니다. 즉, 무제한 인수의 시작을 "찾는" 동안 TeX에서 건너뛰는 바로 그 토큰입니다.

관련 정보