
나의 목표는 둘 사이의 관계를 이해하는 것입니다.문자 바이트그리고캐릭터 토큰새 줄 바이트와 관련하여. 나는 사실을 똑바로 알지 못할 것 같습니다.
TeX가 바이트 파일을 읽을 때 인코딩을 고려해야 합니다. 그건 제쳐두고,
우리는 다음을 관찰할 수 있습니다.단일 개행 문자 바이트(LF 및 CRLF 가정)은 공백으로 변환됩니다. 하지만 뒤에서 무슨 일이 일어나는 걸까요? 데이터 쌍(LF 바이트 번호, catcode=10)을 사용하여 토큰이 생성됩니까?
두 개의 연속된 개행 문자 바이트데이터 쌍(공간 바이트 번호, catcode 5)으로 하나의 단일 토큰이 됩니까?
catcode 5 "라인 끝"은 언제 작동합니까?
\par
두 개의 연속적인 줄 끝이 나타나면 LaTeX가 a를 삽입한다는 것을 알고 있습니다 .
암호
\tmp
catcode 5가 있는 토큰을 시각적으로 표시하려고 시도했지만 실제로 catcode 5가 되는지 확실하지 않습니다 .
\documentclass{article}
\usepackage{fontspec}% xelatex
\long\def\scan#1{#1\par\rule{\textwidth}{2pt}\par\xscan#1\relax}
\long\def\xscan{\afterassignment\xxscan\let\tmp= }
\long\def\xxscan{%
\ifx\tmp\relax\else%
\ifcat\tmp\space10 \else%
\ifcat\tmp a11 \else%
\ifcat\tmp 112 \else%...
\ifcat\tmp
5
\else%
\fi\fi\fi\fi
\expandafter\xscan
\fi}
\begin{document}
\scan{ mac::exception ==
a
}
\end{document}
노트
- utf-8을 지원하는 xelatex는 2바이트 줄 끝을 읽는 방법을 알아야 합니다.
- 다음에서 수정된 코드:LaTeX가 매크로(catcode 10)에서 공백을 인식하도록 하려면 어떻게 해야 합니까?
답변1
catcode 5가 포함된 토큰은 없습니다.
이니텍스가 셋업하다
\catcode`\^^M=5
하지만 이는 다음과 비슷한 방식으로 작동합니다.
\catcode`\%=14
이는 %
catcode 14를 생성하지만 해당 catcode가 있는 토큰이 없습니다. catcode 14가 있는 문자가 스캔되면 해당 문자와 줄의 나머지 부분이 삭제됩니다.
catcode 5의 문자는 공백 문자를 생성하고 tex의 스캐너를 특수 모드로 설정하여 catcode 10의 바로 다음 문자가 "줄 시작 부분의 공백"을 버리고 catcode 5의 다음 문자가 공백 문자가 \par
아닌 것으로 토큰화되도록 합니다. 공백 토큰은 "빈 줄은 \par
" 과 같습니다.
따라서 첫 번째 줄 바꿈은 항상 공백을 만들고, 후속 줄 바꿈은 \par
빈 줄을 만들기 때문에 일반적으로 space\par
.
답변2
캐릭터에는 카테고리 코드가 있습니다. 그들~할 수 있다토큰화 단계에서 캐릭터 토큰을 생성하지만그럴 필요는 없다에게.
카테고리 코드는 두 가지 목적으로 사용됩니다. 즉, 토큰화(TeX가 입력 파일이나 터미널에서 텍스트를 흡수할 때) 중에 확인되지만 토큰 목록 처리 중에도 확인됩니다.
카테고리 코드가 있는 문자만
1 2 3 4 6 7 8 10 11 12 13
동일한 카테고리 코드를 사용하여 각각 캐릭터 토큰을 생성할 수 있습니다.
시작 그룹
끝 그룹
수학 이동
정렬
매개변수
위 첨자
아래 첨자
공백
문자
기타 문자
활성 문자
카테고리 코드가 0 5 9 14 15인 캐릭터는절대동일한 범주 코드를 가진 문자 토큰을 생성합니다. 해당 범주 코드를 가진 문자 토큰이 TeX 내부 토큰 프로세서를 통과할 수 있는 방법은 없습니다.
카테고리 코드 0의 문자는 제어 시퀀스의 형성을 트리거합니다.
카테고리 코드 9의 문자는 무시됩니다.
카테고리 코드가 15인 문자는 오류를 발생시킨 후 무시됩니다.
범주 코드 14의 문자는 토큰화 프로세서에게 해당 행의 다른 모든 문자와 함께 해당 문자를 무시하도록 지시합니다.
더 흥미로운 것은 귀하의 질문의 대상인 카테고리 코드 5입니다. TeX가 하나를 찾으면 입력 라인에 남아 있는 모든 것을 버리고 다음을 생성합니다.공백 문자문자 코드 32 및 범주 코드 10을 처음부터 줄에 있었던 것처럼 사용하고 스캐너를 다른 문자가 나타날 때까지 공백(범주 코드 10)을 무시하는 특수 상태로 설정합니다. 이것이 범주 코드의 또 다른 문자인 경우 5, TeX는 \par
토큰을 생성하고 그렇지 않으면 일반 상태로 들어갑니다.
강조하는 점을 참고하세요공백 문자\foo
위: 이 공백 문자는 일반 규칙에 따라 토큰화되므로 제어 단어(예 : ) 뒤에 오지만 제어 기호(예: ) 뒤에 오지 않으면 무시됩니다 \~
.
그 결과 다음과 같은 입력이 발생합니다.
\foo\baz
\foo \baz
\foo \baz
완전히 동일합니다. 마지막 입력의 줄 끝이공간 토큰, 차이가 있을 것입니다. 그러나 실제로는공백 문자(아직 토큰화되지 않음)이 대신 생성됩니다.
메모.무시된 문자에 대해 위에서 말한 내용은 제어 단어 형성에 직면할 때 오해의 소지가 있을 수 있습니다. 제어 단어의 형성은 범주 코드 0 문자로 시작하고 그 뒤에 범주 코드 11 중 하나가 옵니다. 범주 코드가 11과 다른 문자는 스캐닝을 중지하고 형성된 제어 단어의 토큰화를 유발하며 새로 검사됩니다(무시됨). 예를 들어 카테고리 코드가 9인 경우).
XeTeX 및 LuaTeX에 대한 부록입니다.UTF-8로 인코딩된 파일이 유니코드 인식 엔진에 공급되면 UTF-8 표현에서 문자의 길이가 단일, 2, 3, 4바이트인지는 중요하지 않습니다. 이 두 엔진은 UTF-8 조합을 유니코드 엔터티로 변환하는 예비 단계를 수행하므로 토큰화 프로세서가 보는 것은 단 하나의 문자(초기화 테이블에 할당된 범주 코드 포함)입니다. 두 엔진은 UTF-16 또는 UTF-32, 리틀 엔디안 또는 빅 엔디안에도 대처할 수 있습니다.
답변3
TeX는 입력을 한 줄씩 읽습니다. 입력 한 줄을 읽고 처리합니다. 그런 다음 다른 입력 줄을 읽고 처리합니다. ...
입력 줄을 읽은 후 TeX가 수행하는 첫 번째 작업 중 하나는 문자를 컴퓨터 플랫폼의 문자 인코딩 체계에서 TeX 엔진의 내부 문자 인코딩 체계로 변환하는 것입니다. 전통적인 TeX 엔진의 내부 문자 인코딩 체계는 정보 교환을 위한 미국 표준 코드인 ASCII입니다. LuaTeX 또는 XeTeX를 기반으로 하는 TeX 엔진의 경우 내부 문자 인코딩 체계는 유니코드이며 ASCII는 엄격한 하위 집합입니다.
그 후 TeX는 줄 오른쪽 끝에 있는 모든 공백 문자를 삭제합니다. 보다 정확하게는 다음과 같습니다. 그 후 TeX는 문자 코드가 32인 줄의 오른쪽 끝에 있는 모든 문자를 삭제합니다. (. 32는 ASCII와 유니코드 모두에서 공백 문자의 코드 포인트 번호입니다.)
그런 다음 TeX는 문자 코드가 정수 매개변수의 값과 같은 문자를 행의 오른쪽 끝에 삽입합니다.\endlinechar
.
일반적으로 값은 \endlinechar
13이고 문자 13(반환 문자)의 범주 코드는 5(줄 끝)입니다.
이는 일반적으로 TeX가 줄의 끝에 도달하는 줄을 토큰화하는 동안 범주 코드가 5(줄 끝)인 문자를 만난다는 것을 의미합니다.
그런 다음 TeX는 라인을 토큰화하기 시작합니다. 즉, TeX는 라인에 포함된 문자를 "보고" 범주 코드 테이블과 판독 장치의 상태에 따라 제어 시퀀스 토큰과 문자 토큰을 생성합니다.
입력을 읽고 토큰화할 때 TeX의 읽기 장치는 세 가지 상태 중 하나일 수 있습니다.
상태 S:공백을 건너뜁니다. 판독 장치는 상태 S에 있습니다.
- 범주 코드가 10(공백)인 입력에서 문자를 처리한 후.
- 범주 코드 7(위 첨자)의 두 개의 동일한 문자 시퀀스와 범주 코드가 10(공백)인 문자의 소문자 16진수 표기법으로 문자 코드를 형성하는 두 문자의 시퀀스를 처리한 후입니다.
[예: 일반적으로 의 범주 코드는^
7(위 첨자)이고 문자 32(공백 문자, 16진수 20)의 범주 코드는 일반적으로 10(공백)입니다. 따라서 표기법은^^20
일반적으로 범주 코드가 10(공백)인 입력에서 문자 32(공백 문자)를 처리하는 것과 같이 취급됩니다.] - 범주 코드 7(위 첨자)의 두 개의 동일한 문자 시퀀스를 처리한 후 문자가 옵니다. 여기서 문자의 문자 코드가 64~127 범위에 있는 경우 - 문자 코드를 빼서 얻은 문자의 범주 코드 64는 10(공백)입니다.
[예: 의 분류코드는^
보통 7(위 첨자), 의 문자코드는`
96이고, 96-64=32이고, 32(공백문자)의 분류코드는 대개 10(공백)이므로 표기는^^`
보통 취급한다. 일반적으로 범주 코드가 10(공백)인 입력에서 문자 32(공백 문자)를 처리하는 것과 같습니다.] - 범주 코드 7(위 첨자)의 두 개의 동일한 문자 시퀀스를 처리한 후 문자가 오는 경우 - 문자의 문자 코드가 0~63 범위에 있는 경우 - 문자 코드를 더하여 얻은 문자의 범주 코드 64는 10(공백)입니다.
- 제어 단어 토큰을 생성한 후.
- 카테고리 코드 10(공백)의 문자로 이름이 형성된 제어 기호 토큰을 생성한 후. 예를 들어 제어 기호 토큰
\␣
(제어 공간)을 생성한 후입니다.
상태 S에 있는 동안 범주 코드가 10(공백)인 문자를 처리하는 것과 범주 코드 10(공백)의 문자와 동일하다고 간주되는 ^^..
-시퀀스/- <superscript-char><superscript-char>..
시퀀스를 처리하면 토큰이 생성되지 않고 상태도 변경되지 않습니다. 독서 장치.
일반적으로 공백 문자(문자 코드 32)와 가로 탭 문자(문자 코드 9)는 범주 코드가 10(공백)인 유일한 문자입니다.
그렇기 때문에 입력에 여러 개의 연속된 공백 문자 또는 수평 탭 문자가 있을 수 있으며 일반적으로 하나의 공백 토큰만 생성하고 TeX가 공백 토큰을 생성하는 모드 중 하나에 있는 경우 하나의 수평 공백에 대한 수평 접착제를 생성할 수 있습니다. 수평 글루(즉, 수평 모드, 제한된 수평 모드이지만 수직 모드, 내부 수직 모드, 수학 모드, 디스플레이 수학 모드는 아님).
상태 M:줄의 중간. 판독 장치는 상태 M에 있습니다.
- 공백이 아닌 문자 토큰을 생성한 후.
- 카테고리 코드 10(공백)이 아닌 문자로 이름이 형성된 제어 기호 토큰을 생성한 후.
상태 M에 있는 동안 범주 코드가 10(공백)인 문자를 처리하는 것과 범주 코드 10(공백)의 문자와 동일하다고 간주되는 ^^..
-시퀀스/- <superscript-char><superscript-char>..
시퀀스를 처리하면 공백 토큰이 생성됩니다. charcode는 32(공백 문자)이고 catcode는 10(공백)이며, 판독 장치의 상태를 S 상태로 전환합니다.
상태 N:새로운 라인. 판독 장치는 입력의 또 다른 라인을 판독하기 시작하려고 할 때 상태 N에 있습니다. 상태 N에 있는 동안 범주 코드가 10(공백)인 문자를 처리하는 것과 범주 코드 10(공백)의 문자와 동일하다고 간주되는 ^^..
-시퀀스/- <superscript-char><superscript-char>..
시퀀스를 처리하면 토큰이 생성되지 않고 상태가 변경되지 않습니다. 독서 장치.
읽기 장치가 S 상태에 있는 동안 TeX가 범주 코드 5(줄 끝)의 문자를 만나면 TeX는 토큰을 전혀 생성하지 않습니다.
읽기 장치가 상태 M에 있는 동안 TeX가 범주 코드 5(줄 끝)의 문자를 만나면 TeX는 공백 토큰, 즉 문자 코드가 32(공백 문자)이고 catcode가 10(공백)인 문자 토큰을 생성합니다. ).
읽기 장치가 상태 N에 있는 동안 TeX가 범주 코드 5(줄 끝)의 문자를 만나면 TeX는 제어 단어 token 을 생성합니다 \par
.
범주 코드 5(줄 끝) 문자를 만난 후 TeX는- 판독 장치의 상태에 관계없이 -어떤 경우든 현재 줄에 대한 추가 정보를 삭제하고 다른 입력 줄을 읽기 시작하세요. 이에 따라 TeX의 판독 장치는 상태 N으로 전환됩니다.
위에서 언급한 \endlinechar
문제로 인해 일반적으로 비어 있지 않은 줄 다음의 빈 줄은 TeX에서 범주 코드가 5(줄 끝)인 두 개의 연속 반환 문자(문자 코드 13)를 처리하도록 합니다.
비어 있지 않은 줄에 있는 이러한 반환 문자 중 첫 번째를 만날 때 읽기 장치는 상태 S 또는 M에 있을 수 있으므로 첫 번째 반환 문자는 토큰을 전혀 생성하지 않거나 공백 토큰을 생성할 수 있습니다. .
어떤 경우든 첫 번째 반환 문자를 만난 후 판독 장치는 상태 N으로 전환됩니다. 따라서두 번째 반환 문자를 만날 때 판독 장치는 상태 N에 있고 두 번째 반환 문자는 제어 단어 토큰을 생성합니다. \par
.
그렇기 때문에 일반적으로 빈 줄은 "단락 나누기"/제어 단어 토큰처럼 처리됩니다. 제어 단어 토큰 \par
은 일반적으로 (재정의되지 않은 경우) 줄을 나누고 지금까지 수집/수집한 자료를 텍스트 단락으로 조판하기 위한 지시어입니다.
이는 단락 내의 마지막 항목이 수평 접착제를 생성하는 공간 토큰인 경우가 발생할 수 있음을 의미합니다. 단락 끝에 있는 이러한 수평 접착제는 일반적으로 TeX에 의해 폐기되고 \parfillskip
-glue-매개변수 값에 따른 접착제가 단락 끝에 첨부된다는 점에 유의하십시오.