Wie können überfüllte Zeilen in ConTeXt unbedingt vermieden werden?

Wie können überfüllte Zeilen in ConTeXt unbedingt vermieden werden?

Ich arbeite jetzt schon seit einigen Jahren mit ConTeXt und bin mir durchaus bewusst, dass der Algorithmus zur Bestimmung von Zeilenumbrüchen nicht jede einzelne Zeile isoliert betrachtet, sondern grundsätzlich versucht, die „Schlechtigkeit“ im gesamten Absatz zu minimieren. Daher sind übervolle Zeilen manchmal einfach „Teil des Spiels“ und müssen durch die Verwendung von oder hz, fullhz, hangingoder tolerantusw. minimiert werden.verytolerantstretch

Jetzt stehe ich jedoch vor der Situation, dass ichWirklichwürde gerneabsolut, total, letztendlich und immerÜberfüllte Zeilen in einem Abschnittskopf vermeiden. Das heißt, egal wie "schlecht" die Zeile nach dem TeX-Algorithmus wird, sie sollteniemalsauf überfüllte Zeilen zurückgreifen. Ich habe ein MWE erstellt, das mein Problem veranschaulicht:

\definefontsize[e]
\definefontsize[f]

\definebodyfontenvironment[default][
  a=1.200,
  b=1.400,
  c=1.728,
  d=2.0,
  e=4.0,
  f=24.0,
  x=0.9,
  xx=0.8,
  big=1.2,
  small=0.8]

\setuphead[section][
  style=\tfe\em,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
  ]


\starttext

\section{Test overfull headings}

\input{knuth}

\input{knuth}

\stoptext

das wie folgt aussieht:

Bildbeschreibung hier eingeben

Wie kann ich dem Algorithmus sagen,brechendie Zeile vor dem Wort „Überschriften“, anstatt auf ein überfülltes Feld zurückzugreifen. Keine der Optionen alignscheint hier irgendeine Wirkung zu haben.

Ich wäre für jede Hilfe sehr dankbar.

Antwort1

Um überfüllte Zeilen mit unregelmäßigem Text zu vermeiden, die beim Deaktivieren der Silbentrennung auftreten können, können Sie broadder alignOption zum Verbessern des Zeilenumbruchs das Schlüsselwort hinzufügen.

\definefont [SectionFont] [Italic sa 4]

\setuphead
  [section]
  [ style=SectionFont,
    align={flushleft,broad,nothyphenated},
   number=no]

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

Antwort2

Ich stehe jetzt jedoch vor der Situation, dass ich übervolle Zeilen in einem Abschnittskopf unbedingt, total, endgültig und immer verhindern möchte. Das heißt, egal wie „schlecht“ die Zeile laut TeX-Algorithmus wird, sie sollte niemals auf übervolle Zeilen zurückgreifen.

Sie haben die in ConTeXt für dieses Problem verfügbaren Optionen ziemlich ausgeschöpft. In Wolfgangs Kommentar unten finden Sie eine viel bessere Lösung. Originalantwort unten:

Glücklicherweise gibt es noch einige Plain TeX-Optionen, die wir verwenden können. Mir fallen hier 4 Optionen ein:

\tolerance=10000

Dies wird im TeXbook vorgeschlagen:

Leider gibt es immer wieder überfüllte Kartons. Versuchen Sie also,

\tolerance=10000
\input story

um zu sehen, was passiert. TeX behandelt 10000 als eine "unendliche" Toleranz und lässt beliebig viel Platz zu; daher wird eine Toleranz von 10000niemalsein überfülltes Feld erzeugen, es sei denn, es tritt etwas Seltsames auf, wie z. B. ein nicht trennbares Wort, das breiter ist als die Spalte selbst.

\emergencystretch=\maxdimen

Nochmals aus dem TeXbook:

Wenn Sie überfüllte Boxen um jeden Preis vermeiden möchten, ohne zu versuchen, sie manuell zu reparieren, könnten Sie versucht sein, zu setzen \tolerance=10000; dies ermöglicht es, in schwierigen Situationen beliebig schlechte Zeilen zu akzeptieren. Aber eine unendliche Toleranz ist keine gute Idee, da TeX nicht zwischen furchtbar schlechten und absurd schlechten Zeilen unterscheidet. Tatsächlich ermutigt eine Toleranz von 10000 TeX dazu, alle schlechten Seiten an einer Stelle zu konzentrieren und eine wirklich unansehnliche Zeile statt zwei mäßig schlechten zu erstellen, da eine einzelne „Abschreibung“ gemäß den Regeln die wenigsten Gesamtfehler erzeugt. Es gibt eine viel bessere Möglichkeit, den gewünschten Effekt zu erzielen: TeX hat einen Parameter namens , \emergencystretchder zur angenommenen Dehnbarkeit jeder Zeile hinzugefügt wird, wenn schlechte Seiten und Fehler berechnet werden, in Fällen, in denen überfüllte Boxen sonst unvermeidbar sind. Wenn \emergencystretchpositiv ist, führt TeX einen dritten Durchlauf über einen Absatz durch, bevor die Zeilenumbrüche gewählt werden, wenn die ersten Durchläufe keine Möglichkeit gefunden haben, die \pretoleranceund zu erfüllen \tolerance. Der Effekt von \emergencystretchbesteht darin, die schlechten Seiten zu verkleinern, sodass große Unendlichkeiten von kleineren unterscheidbar sind. Durch eine \emergencystretchausreichend hohe Einstellung (basierend auf \hsize) können Sie sicher sein, dass \tolerancenie überschritten wird. Daher kommt es nie zu überfüllten Boxen, es sei denn, der Zeilenumbruch ist wirklich unmöglich.

\rightskip=0pt plus 1fil

Noch einmal aus dem TeXbook:

Beispielsweise kann eine Person festlegen \rightskip=0pt plus1fil, und jede Zeile wird rechts mit Leerzeichen gefüllt. Dies ist jedoch keine besonders gute Methode, um unregelmäßige rechte Ränder zu erstellen, da die unendliche Dehnbarkeit sehr kurzen Zeilen keine Ungültigkeit zuweist.

Hier sind wir mit sehr kurzen Zeilen zufrieden und können daher gerne das tun, was wir nicht tun sollen.

\spaceskip=\fontdimen2\font plus \maxdimen minus \fontdimen4\font

Dies hat zur Folge, dass sich die Wortabstände unendlich weit ausdehnen können, und erzeugt einen ganz anderen Effekt als die anderen Optionen.


In diesem Beispiel erzielen die ersten drei Optionen alle den gleichen Effekt:

(Bild wird nicht hochgeladen, wird später bearbeitet)

wobei die letzte Option einen ganz anderen Effekt hat:

(Bild wird nicht hochgeladen, wird später bearbeitet)

styleSie können diese Befehle an beliebiger Stelle im Dokument platzieren, aber für diesen Zweck ist es am einfachsten, wenn Sie sie wie folgt zum Schlüssel hinzufügen :

\setuphead[section][
  style=\tfe\em\emergencystretch=\maxdimen,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
]

Generell würde ich die Verwendung \emergencystretch=\maxdimenallen anderen Optionen vorziehen, da sie nur dann wirksam wird, wenn Kartons überfüllt sind.

verwandte Informationen