TeX은 항상 매크로 \par를 삽입합니까?

TeX은 항상 매크로 \par를 삽입합니까?

입력 프로세서가 범주 코드 5가 포함된 문자 두 개를 연속해서(즉, 빈 줄) 발견하면 매크로 를 삽입합니다 \par.

끝나면 \vbox{Abc.}TeX는 현재 단락을 종료하지만 매크로를 삽입하여 종료하지는 않습니다 \par. TeX가 대신 기본 요소를 삽입하는 것 같습니다 \par. 이 경우 TeX가 수행하는 작업을 올바르게 이해하고 있습니까? TeX가 삽입되는 다른 장소는 어떻습니까 \par? 매크로는 언제이고 \par, 프리미티브는 언제인가요?

\catcode`@=11
\let\@@par\par
\def\par{\typeout{Macro!}\@@par}

Abc.

\vbox{Abc.\tracingall}

답변1

TeX 프로그램에는 TeX가 내부적으로 단락 작성기를 실행하는 곳이 정확히 7군데 있습니다. 즉, 수평 목록(구성 중인 경우)을 단락으로 바꾸는 것입니다. 이런 일이 일어난다~ 아니다\par입력 스트림에 토큰을 삽입하고 프로시저를 실행하여end_grafTeX 프로그램의 모듈 §1096에서 구현되었습니다.

이 프로시저는 TeX가 수평 모드가 아닌 경우에는 아무 작업도 수행하지 않으며, 수평 모드에 있지만 빈 목록이 있는 경우(TeX에서는 널 문단이 무시됨) 거의 아무것도 수행하지 않으며 프로시저를 실행합니다.줄 바꿈그렇지 않은 경우(그리고 parfillskip 페널티를 추가하는 등의 모든 마법을 수행합니다).

일곱 곳은

  • a의 닫는 중괄호와 같은 내부 수직 구조의 끝 또는 \vboxor \noalign또는 \vcenter정렬 셀
  • 원시적일 때파_엔드감지됩니다(처음에는 토큰의 의미로 매크로 수준에서 사용 가능 \par).
  • 출력 루틴(OR)이 종료된 직후(따라서 OR에서 시작된 수평 목록은 교정쇄의 자료로 계속되지 않고 자체적으로 단락을 형성합니다)

이러한 경우에는 삽입된 토큰이 없습니다 \par(재정의가 적용될 수 있음). 대신에end_graf절차가 실행됩니다!

\par토큰은 수평 모드에 있을 때만 삽입되며 수평 모드와 호환되지 않는 프리미티브(예 \vskip: , \hrule, ...의 전체 목록은 TeX 코드의 §1094입니다)가 발견됩니다. 물론 TeX가 두 개의 끝줄 문자를 대체하는 경우 \par(즉, 빈 줄을 와 동일하게 만드는 \par) 토큰화 프로세스에서도 마찬가지입니다.

답변2

에 따르면TeXbook, 줄 끝 규칙은 다음과 같습니다.

TeX가 줄 끝 문자(범주 5)를 보면 현재 줄에 남아 있을 수 있는 다른 정보를 모두 버립니다. 그런 다음 TeX가 상태에 있으면N(새 줄), 줄 끝 문자는 제어 시퀀스 토큰 \par(단락 끝)으로 변환됩니다. TeX가 상태에 있는 경우(중간 줄), 줄 끝 문자는 범주 10(공백)의 문자 32( )에 대한 토큰으로 변환됩니다. 그리고 TeX가 상태에 있다면에스(공백 건너뛰기) 줄 끝 문자는 단순히 삭제됩니다.

여기서 TeX는 기본 요소 \par가 아닌 토큰을 삽입한다는 점에 유의하는 것이 중요합니다 \par. 이는 \par모든 상황에서 정의되어야 함을 의미합니다. Knuth는 수평 모드를 강제하는 명령을 논의할 때 이 점을 설명합니다.

<의 등장수직 명령> 제한된 수평 모드에서는 금지되지만 일반 수평 모드에서는 TeX가 \par입력에 토큰을 삽입하게 됩니다. 이 토큰을 읽고 확장한 후에 \parTeX는 <수직 명령> 다시 토큰. (제어 시퀀스의 현재 의미가 \par사용됩니다. \par더 이상 TeX의 프리미티브를 나타내지 않을 수도 있습니다 \par.)

자, 어디에도 언급되지 않은 것 같은 것은 내부 수직 모드가 끝날 때 일어나는 일입니다. 분명히 위의 규칙은 \par처리할 줄 끝 표시가 없기 때문에 토큰 삽입을 허용하지 않습니다 . (상자 의 마지막 자료와 상자 끝 \par사이에 빈 줄이 있으면 가 삽입됩니다 .)\vbox

\par추적 출력을 읽으면 상자 끝에 기본 요소 에 대한 언급이 없지만 출고가 표시됩니다.

....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil

물론 분명히 작성된 단락이 있습니다. 따라서 내 결론은 내부 수직 모드의 끝이 암시적으로 \par기본 요소를 삽입하여 일반적인 단락 끝 자료를 삽입한 다음 단락 작성기를 실행한다는 것입니다.

답변3

\parTeX가 "원래 의미"를 a 끝에 넣는 이유가 있습니다 \vbox. 다음 어리석은 입력을 고려하십시오.

\vbox{\let\par\empty a}

TeX가 를 찾으면 }이를 백업하고 "원본 \par"을 삽입하여 수평 모드를 종료한 다음 }내부 수직 모드를 닫는 를 다시 읽습니다.

우리는 TeX가 by \par를 다시 읽기 전에 현재의 의미를 삽입했다면 어떤 일이 일어날지 에뮬레이트할 수 있습니다.}

\vbox{\let\par\empty a\vskip0pt}

\vskip(현재)를 삽입 \par하고 TeX가 를 다시 읽기 때문입니다 \vskip. 결과는 무한루프입니다!

(에서 발견1993년 토론comp.text.tex.)

관련 정보