Warum gibt es keinen Parameter \emergencytolerance?

Warum gibt es keinen Parameter \emergencytolerance?

Wenn überfüllte Kästchen nicht durch Umformulierungen, Layoutänderungen o. ä. beseitigt werden können, gibt es grundsätzlich zwei Strategien zur Beseitigung:

  1. Steigern Sie den Wert von\tolerance
  2. Steigern Sie den Wert von\emergencystretch

Ein oft genannter Vorteil der zweiten Strategie besteht darin, dass die Erhöhung \emergencystretchnur „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 \emergencystretchscheint mir die Art und Weise, wie sich der Zeilenumbruchprozess ändert, nicht ganz richtig: \emergencystretchwird bei der Berechnung der Badnesses zur Dehnbarkeit jeder Zeile addiert. Eine Erhöhung von \emergencystretchreduziert 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 \emergencystretchausreichend hohe Einstellung in Abhängigkeit von \hsizesicherstellen 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=10000fü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 \emergencytolerancemit dem Standardwert -1.
  • Wenn der zweite Durchgang fehlschlägt und \emergencystretchpositiv oder \emergencytolerancenicht negativ ist, wird der dritte Durchgang ausgeführt.
  • Das Verfahren für den dritten Durchgang ist wie folgt: Wenn \emergencystretchpositiv ist, wird dieser Wert bei der Berechnung der Schlechtigkeiten zur Dehnbarkeit jeder Linie hinzugefügt. Wenn \emergencytolerancenicht negativ ist, wird dieser Wert anstelle von als Grenzwert für die Schlechtigkeiten verwendet \tolerance, andernfalls \tolerancewird 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 \emergencystretchoben 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:

Ausgabe, mit zusätzlicher Toleranz

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...)

verwandte Informationen