Wenn überfüllte Kästchen nicht durch Umformulierungen, Layoutänderungen o. ä. beseitigt werden können, gibt es grundsätzlich zwei Strategien zur Beseitigung:
- Steigern Sie den Wert von
\tolerance
- Steigern Sie den Wert von
\emergencystretch
Ein oft genannter Vorteil der zweiten Strategie besteht darin, dass die Erhöhung \emergencystretch
nur „schlechte“ Absätze (also Absätze, die nicht zufriedenstellend gesetzt werden können \tolerance
) betrifft und „gute“ Absätze (also Absätze, die zufriedenstellend gesetzt werden können) nicht ändert \tolerance
.
Andererseits \emergencystretch
scheint mir die Art und Weise, wie sich der Zeilenumbruchprozess ändert, nicht ganz richtig: \emergencystretch
wird bei der Berechnung der Badnesses zur Dehnbarkeit jeder Zeile addiert. Eine Erhöhung von \emergencystretch
reduziert also die Badnesses im dritten Durchgang, lässt aber die anderen Parameter, die in die Berechnung der Gesamt-Demerits ( \hyphenpenalty
, \adjdemerits
, \doublehyphendemerits
, ...) einfließen, unverändert. Dadurch verringert sich der Einfluss der Badnesses, während der Einfluss von Zeilen, die mit einem Bindestrich etc. enden, zunimmt. Außerdem wirkt sich die zusätzliche Dehnbarkeit bei Zeilen mit nur vier Leerzeichen anders aus als bei Zeilen mit zehn Leerzeichen.
(Mir ist bewusst \emergencystretch
, dass dies beispielsweise für den automatischen Schriftsatz nützlich sein kann, weil Sie durch eine \emergencystretch
ausreichend hohe Einstellung in Abhängigkeit von \hsize
sicherstellen können, dass niemals überfüllte Kästchen auftreten [es sei denn, die Eingabe enthält etwas Seltsames wie ein nicht trennbares Wort, das breiter als die Zeile ist]. \tolerance=10000
führt ebenfalls niemals zu überfüllten Kästchen, kann aber zu schrecklichen Zeilenumbruchentscheidungen führen.)
Ich frage mich, warum es keinen Parameter \emergencytolerance
(oder wie auch immer ein passender Name lauten würde) gibt, mit dem man optional einen Wert angeben kann, den der Zeilenumbruch-Algorithmus von TeX im dritten Durchgang als Toleranz verwendet. Der dritte Durchgang würde dann ungefähr so funktionieren:
- Es gibt einen Parameter
\emergencytolerance
mit dem Standardwert-1
. - Wenn der zweite Durchgang fehlschlägt und
\emergencystretch
positiv oder\emergencytolerance
nicht negativ ist, wird der dritte Durchgang ausgeführt. - Das Verfahren für den dritten Durchgang ist wie folgt: Wenn
\emergencystretch
positiv ist, wird dieser Wert bei der Berechnung der Schlechtigkeiten zur Dehnbarkeit jeder Linie hinzugefügt. Wenn\emergencytolerance
nicht negativ ist, wird dieser Wert anstelle von als Grenzwert für die Schlechtigkeiten verwendet\tolerance
, andernfalls\tolerance
wird wie im zweiten Durchgang verwendet.
Dies würde es Ihnen ermöglichen, „schlechte“ Absätze ohne überfüllte Kästchen zu setzen, ohne die „guten“ Absätze zu ändern und ohne die Nachteile der \emergencystretch
oben beschriebenen Vergrößerung. Warum ist diese (vermutlich leicht zu implementierende) Funktion zumindest in neueren Engines wie eTeX oder pdfTeX nicht verfügbar (Knuths TeX ist im Grunde eingefroren)?
Antwort1
Um auf meinen Kommentar zurückzukommen (vielleicht nicht wirklich eine Antwort auf Ihre Frage, aber ich denke, es könnte den Leuten nützen, wenn sie Bescheid wüssten).
Wie David im Kommentar schreibt, ist es nicht so einfach zu beantworten, warum etwas nicht hinzugefügt wurde. Ich habe gehört, dass LuaTeX eingefroren ist, also wird es dort wahrscheinlich nicht hinzugefügt, aber ich hoffe, Sie fühlen sich durch die Information bestätigt, dass es heutzutage in LuaMetaTeX möglich ist.
Wie im Kommentar angegeben, ist es möglich, viel mehr zu tun, als nur die Toleranz zu erhöhen. Das folgende Minimalbeispiel fügt jedoch nur zwei weitere Parpasses mit erhöhter Toleranz hinzu.
\setuppapersize[A6]
\showmakeup[page]
\startsetups align:pass:test
\pretolerance 100
\tolerance 200
\parpasses 2
threshold 0.025pt
tolerance 400
next
threshold 0.025pt
tolerance 800
\relax
\stopsetups
\starttext
\samplefile{hawking}
\page[yes]
\setupalignpass[test]
% \tracingonline2
% \tracingpasses2
\samplefile{hawking}
\stoptext
Die beiden Seiten nebeneinander:
Wenn Sie die Tracing-Makros auskommentieren, werden im Terminal weitere Informationen angezeigt.
Dies verlängert die Laufzeit übrigens kaum. Bei einem 300-seitigen Buch haben 4 zusätzliche Durchläufe (einschließlich Erweiterung) meiner Meinung nach weniger als eine Sekunde verlängert. (Das ist also nicht wirklich der Punkt, an dem TeX seine Zeit verbringt...)