Welches genaue Verfahren verwendet der TeX-Zeilenumbruch-Algorithmus, wenn er überfüllte Kästchen setzen muss?

Welches genaue Verfahren verwendet der TeX-Zeilenumbruch-Algorithmus, wenn er überfüllte Kästchen setzen muss?

Das TeXbook beschreibt (in Kapitel 14) ausführlich, wie TeX die Gesamtfehler berechnet, die mit dem Aufteilen eines Absatzes in Zeilen verbunden sind, und dass TeX die Sequenz von Haltepunkten wählt, die die geringsten Gesamtfehler ergibt (in einem Prozess mit drei Durchläufen). Es beschreibt jedoch nur kurz, was genau passiert, wenn keine Sequenz von Haltepunkten existiert, die die Anforderungen erfüllt:

Grob gesagt unterteilt \TeX\ Absätze folgendermaßen in Zeilen: Zwischen Wörtern oder nach Bindestrichen werden Haltepunkte eingefügt, um Zeilen zu erzeugen, deren Fehler die aktuelle ^|\Toleranz| nicht überschreiten. Wenn es keine Möglichkeit gibt, solche Haltepunkte einzufügen, wird ein ^{überfülltes Feld} gesetzt.

Es folgen keine weiteren Details zum Szenario mit dem überfüllten Feld. Mich interessieren diese Details: Kann man in einfachen Worten beschreiben, welche Wörter TeX in einem solchen Fall in den Rand hineinragen lässt? (Oder muss man den TeX-Quellcode lesen, um das zu verstehen?) Da TeX einen Absatz als Ganzes betrachtet, wird das Problem, dass es keine zulässige Abfolge von Haltepunkten gibt, nicht wirklich durch ein einzelnes Wort verursacht.

Außerdem glaube ich, dass die obige Aussage aus dem TeXbook nicht ganz korrekt ist: Wenn ein Absatz ein enthält \linebreak, kann es stattdessen mit nicht vollen Zeilen gesetzt werden. Dieses Szenario erfüllt im Grunde die Prämisse „es gibt keine Möglichkeit, solche Haltepunkte einzufügen“, aber TeX setzt nicht volle Zeilen statt übervolle Zeilen, wie oben angegeben.

(Diese Frage dient hauptsächlich dem Interesse. Es gibt jedoch tatsächlich ein Szenario, in dem in einem fertigen Dokument ein Absatz mit übervollen Zeilen enthalten sein kann, nämlich dann, wenn die Übergröße der übervollen Zeilen nicht mehr als beträgt \hfuzz.)

Antwort1

TeX wählt Zeilenumbrüche basierend auf einer Berechnung von Zeilenfehlern, die zu einem Betrag namensGesamtpunkte.

Ein erster Durchgang, der die Silbentrennungsfunktion von TeX nicht anwendet, hält möglicherweise die durch einen Integer-Parameter festgelegten Grenzen nicht ein \pretolerance. Der zweite Durchgang von TeX ist jedoch immer erfolgreich. Er ist möglicherweise nicht in dem Sinne erfolgreich, dass TeX übervolle Zeilen erstellen muss. Untervolle Zeilen werden nur erstellt, wenn der Benutzer dies wünscht.

Was ich meine. Sie können \parfillskip=0ptTeX eine kurze Zeile mit beispielsweise nur einem Leerzeichen geben und TeX meldet eine nicht vollständige Zeile. Der Autor ist immer für den letzten Zeilenumbruch verantwortlich; in einem einzeiligen Absatz wird von TeX nichts eingefügt. Ähnlich \penalty-10000 zwingt ein ausgegebener Zeilenumbruchbefehl TeX, dem Wunsch des Autors nachzukommen, die Zeile an dieser Stelle umzubrechen. Es ist ein erzwungener Zeilenumbruch, der von TeX nichts einfügt.

So funktioniert TeX; ich versuche, einfache Worte zu verwenden, aber es handelt sich um ein technisches Thema: TeX umbricht Zeilen an der Verbindungsstelle (einschließlich an der Kernstelle, auf die eine Verbindungsstelle folgt, und am Ende einer Inline-Mathematik, auf die eine Verbindungsstelle folgt) oder an einer Strafstelle, d. h. einem Bindestrich im Text, einem von TeX im zweiten Durchgang eingefügten Bindestrich, nach einer Relation im Mathematikmodus usw. sowie wie \penalty-10000oben erläutert.

Natürlich zählt TeX den Anfang des Textes als ersten Umbruchpunkt. Um einen Absatz zu erstellen, geht TeX von einer Stelle, an der ein Umbruch möglich ist – im zweiten Durchgang könnte die Stelle von TeX durch einen eingefügten Bindestrich erstellt werden – zur nächsten, bis die Breite des gesammelten Materials einschließlich der Schrumpf- oder Streckbarkeit es TeX ermöglicht, zusammen mit einem der zuvor gefundenen (oder erzwungenen) Umbruchpunkte eine Zeile mit einer Fehlerhaftigkeit zu erstellen, die der aktuellen Toleranz entspricht. TeX markiert eine solche Stelle als Umbruchpunkt und merkt sich dafür den zugehörigen vorherigen Umbruchpunkt, sodass es später vom Ende des Absatzes mit den Zeilen, die die Gesamtfehler minimieren, zum Anfang zurückkehren kann.

TeX erstellt auch einen Haltepunkt, wenn es einen vom Benutzer eingefügten Haltepunkt sieht \penalty-10000. Dann startet es den Vorgang, als wäre er am Anfang des Absatzes. Kein nachfolgender Haltepunkt kann diesen Haltepunkt überschreiten, d. h. der nächste Haltepunkt muss diesen vom Benutzer erzwungenen Haltepunkt als den vorherigen Haltepunkt aufzeichnen.

Wenn keine Stelle gefunden werden kann, an der eine Zeile mit einer Fehlerhaftigkeit von höchstens der aktuellen Toleranz erstellt werden kann, stoppt TeX die Verarbeitung, wenn es sich im ersten Durchgang befindet, und startet dann den zweiten Durchgang. Andernfalls sucht TeX im zweiten Durchgang nach der nächsten Stelle, an der ein Umbruch möglich ist, ohne eine nicht voll gefüllte Zeile zu erstellen. Dies wird zu einem Umbruchpunkt, obwohl die Zeile überfüllt ist. Anschließend setzt TeX den Prozess fort. Der zweite Durchgang durchläuft also den gesamten Absatz. Beachten Sie, dass ein Absatz mehr als eine übervolle Zeile haben kann.

Wenn \emergencystretchnicht 0pt ist und der zweite Durchgang nicht das gewünschte Ergebnis erzielen konnte, d. h. Haltepunkte ohne übervolle Zeile finden oder die Anzahl der Zeilen reduzieren, wenn \looseness=-1, dann startet TeX einen dritten Durchgang, der wie der zweite funktioniert. Der Unterschied besteht darin, dass TeX die Dimension von \emergencystretchzur Dehnbarkeit jeder Zeile hinzufügt. Daher akzeptiert TeX eine Stelle als Haltepunkt, obwohl die Breite des gesammelten Materials und die Dehnbarkeit im Material die Zeile nicht mit einer Unvollständigkeit füllen können, die kleiner oder gleich der aktuellen Toleranz ist. Aber die Breite plus die Dehnbarkeit plus die Dimension \emergencystretchsind groß genug, um das zu tun; visuell ist eine solche Zeile untervoll.

Es gibt mehrere Parameter, die die Meldung und die Markierung beeinflussen. Wie Sie sagten, \hfuzzkann die Dimension die Überfüllregel weglassen, aber das ändert nichts an der Tatsache: Es gibt eine Überfüllzeile. Ein anderer Parameter \hbadnessist verantwortlich, ob eine Warnung ausgegeben wird.

Daher verstehe ich nicht, warum der zitierte Text des TeXbooks falsch sein sollte, da es sich um eine informelle Beschreibung auf hohem Niveau handelt.

verwandte Informationen