TeX 줄 바꿈 알고리즘이 초과 상자를 설정해야 할 때 사용하는 절차는 정확히 무엇입니까?

TeX 줄 바꿈 알고리즘이 초과 상자를 설정해야 할 때 사용하는 절차는 정확히 무엇입니까?

TeXbook은 TeX가 단락을 줄로 나누는 것과 관련된 총 단점을 계산하는 방법과 TeX가 (3개의 패스를 사용하는 프로세스에서) 가장 적은 총 단점을 생성하는 중단점 시퀀스를 선택하는 방법을 자세히 설명합니다(14장). 그러나 요구 사항을 충족하는 중단점 시퀀스가 ​​없는 경우 정확히 어떤 일이 발생하는지 간략하게 설명합니다.

대략적으로 말하면, \TeX\는 다음과 같은 방법으로 단락을 줄로 나눕니다. 단어 사이나 하이픈 뒤에 중단점을 삽입하여 현재 ^|\tolerance|를 초과하지 않는 나쁜 상태의 줄을 생성합니다. 이러한 중단점을 삽입할 방법이 없으면 ^{overfull box}가 설정됩니다.

가득 찬 상자 시나리오에 대한 자세한 내용은 다음과 같습니다. 나는 이러한 세부 사항에 관심이 있습니다. 이러한 경우 TeX가 여백에 튀어나오기 위해 선택하는 단어를 간단한 용어로 설명할 수 있습니까? (아니면 그것을 이해하기 위해 TeX 소스 코드를 읽어야 합니까?) TeX는 단락을 전체적으로 고려하기 때문에 허용되는 중단점 시퀀스가 ​​없는 문제는 실제로 단일 단어로 인해 발생하지 않습니다.

게다가 나는 TeXbook의 위 진술이 완전히 정확하지 않다고 생각합니다. 단락에 a가 포함되어 있으면 \linebreak대신에 부족한 줄로 설정될 수 있습니다. 이 시나리오는 기본적으로 "이러한 중단점을 삽입할 방법이 없습니다"라는 전제를 충족하지만 TeX는 위에서 설명한 것처럼 가득 찬 줄 대신 가득 찬 줄을 설정하지 않습니다.

(이 질문은 주로 관심이 없습니다. 그러나 실제로 줄이 너무 많은 단락이 완성된 문서에서 끝날 수 있는 시나리오가 있습니다. 즉, 줄이 너무 많은 경우 초과된 줄의 크기가 \hfuzz.

답변1

TeX는 다음과 같은 금액으로 합산되는 라인 벌점 계산을 기반으로 줄 바꿈을 선택합니다.총 단점.

TeX의 하이픈 넣기 기능을 적용하지 않는 첫 번째 단계는 정수 매개변수로 설정된 제한을 준수하지 못할 수 있습니다 \pretolerance. 그러나 TeX의 두 번째 패스는 항상 성공합니다. TeX가 전체 라인을 생성해야 한다는 점에서 성공하지 못할 수도 있습니다. 가득 찬 줄은 사용자가 원하는 경우에만 생성됩니다.

내 말은. \parfillskip=0pt예를 들어 단 하나의 공백과 TeX 보고서 및 전체 줄이 포함된 짧은 줄을 TeX에 설정하고 제공할 수 있습니다 . 작성자는 항상 마지막 줄 바꿈에 대한 책임이 있습니다. TeX에서는 한 줄짜리 문단에 아무것도 삽입하지 않습니다. 마찬가지로, 출력하는 줄바꿈 명령은 \penalty-10000 TeX가 이 시점에서 줄바꿈을 원하는 작성자의 바람을 따르도록 강제합니다. TeX가 삽입하는 것은 강제 중단 없음입니다.

TeX의 작동 방식은 다음과 같습니다. 나는 간단한 단어를 사용하려고 노력하지만 이는 기술적인 주제입니다. TeX는 글루에서 줄을 끊습니다(kern 다음에 glue가 따르고 인라인 수학의 끝에서 glue가 오는 경우 포함). 또는 페널티(예: 텍스트의 하이픈)에서 줄을 끊습니다. 두 번째 단계에서 TeX에 의해 삽입된 하이픈, 수학 모드의 관계 뒤에 삽입된 하이픈 및 \penalty-10000위에서 설명한 a.

물론 TeX는 텍스트의 시작 부분을 초기 중단점으로 계산합니다. 단락을 생성하기 위해 TeX는 구분이 가능한 위치에서 시작됩니다. 두 번째 패스에서는 삽입된 하이픈을 통해 TeX에 의해 해당 위치가 생성될 수 있습니다. 축소 또는 축소를 포함하여 수집된 자료의 너비까지 다음으로 이동합니다. 신축성을 통해 TeX는 이전에 발견된(또는 강제된) 중단점 중 하나와 함께 현재 허용오차를 준수하는 불량한 라인을 구축할 수 있습니다. TeX는 이러한 위치를 중단점으로 표시하고 관련 이전 중단점을 기억하여 나중에 전체 단점을 최소화하는 줄을 사용하여 단락 끝에서 시작으로 다시 이동할 수 있도록 합니다.

TeX은 또한 사용자가 삽입된 것을 보면 중단점을 만듭니다 \penalty-10000. 그런 다음 단락 시작 부분에 있는 것처럼 프로세스를 시작합니다. 다음 중단점은 이 중단점 위에 도달할 수 없습니다. 즉, 다음 중단점은 이 사용자 강제 중단점을 이전 중단점으로 기록해야 합니다.

현재 허용 오차만큼 큰 불량이 있는 라인을 구축할 장소를 찾을 수 없는 경우 TeX는 첫 번째 패스에 있는 경우 처리를 중지한 다음 두 번째 패스를 시작합니다. 그렇지 않고 TeX가 두 번째 패스에 있으면 언더풀 라인을 구축하지 않고 중단이 가능한 다음 위치를 찾습니다. 줄이 너무 많아도 이는 중단점이 됩니다. 다음으로 TeX는 프로세스를 계속합니다. 따라서 두 번째 패스는 전체 단락을 통과합니다. 한 단락에는 한 줄 이상의 전체 줄이 있을 수 있습니다.

\emergencystretch0pt가 아니고 두 번째 패스가 요청한 작업을 수행할 수 없는 경우, 즉 라인이 가득 찬 중단점을 찾거나 라인 수를 줄이는 경우 \looseness=-1, TeX는 두 번째 패스처럼 작동하는 세 번째 패스를 시작합니다. 차이점은 TeX가 \emergencystretch모든 라인의 신축성에 차원을 추가한다는 것입니다. 따라서 TeX는 수집된 재료의 폭과 재료의 신축성이 현재 허용 오차 이하의 나쁜 상태로 라인을 채울 수는 없지만 중단점으로 한 위치를 허용합니다. 그러나 너비와 신축성, 치수는 \emergencystretch그렇게 하기에는 충분합니다. 시각적으로 그러한 라인은 가득 차 있지 않습니다.

보고 및 표시에 영향을 미치는 여러 매개변수가 있습니다. 말씀하신 것처럼 \hfuzz치수는 전체 규칙을 생략할 수 있지만 사실은 바뀌지 않습니다. 즉, 초과 라인이 있습니다. \hbadness경고가 발생하는 경우 호출되는 또 다른 매개변수가 담당합니다.

따라서 TeXbook의 인용 텍스트가 높은 수준의 비공식 설명이므로 왜 잘못된지 알 수 없습니다.

관련 정보