6
1

Kann mir jemand erklären oder Hinweise geben, wie \hyphenation in TeX funktioniert? Ich meine nicht die Anwendung oder den TeX-Code von \hyphenation, sondern die programmtechnische Ebene, wie TeX erkennt, daß ein Wort getrennt werden muss und wie TeX dies durchführt.

The TeXBook, Seite 449 - 455

gefragt 01 Jul '13, 23:44

ctansearch's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

bearbeitet 01 Sep '13, 11:20

saputello's gravatar image

saputello
11.1k154365

1

http://perce.de/pub/Jena2007D.pdf erklärt ab Folie 28 wie so eine Trennmusterdatei erzeugt und angewendet wird.

(04 Jul '13, 11:22) Herbert

Ich erlaube mir die hervorragende Antwort von saputello mit meinen Worten wiederzugeben: die Idee hinter den Trennmustern ist (wie der Name es schon sagt) aufgrund von wiederkehrenden Mustern Trennungen durchzuführen. Beispielsweise wird ein "sch" am Ende eines Wortes quasi nie abgetrennt (Wunsch, Englisch, falsch), aber ein "sche" am Ende schon eher (Wünsche, Aktentasche, Automatische, Deutsche...). Das wird in den Trennmustern wie folgt dargestellt:

...
6sch.
...
3sche.
...

Ungerade heißt "trennen erlaubt", gerade heißt "nicht trennen". Der Punkt (".") heißt Wortanfang/-ende. Die höchste Zahl gewinnt und es wird für alle Teilwörter (im Wort Wunsch z.B. w, u, n, s, c, h, wu, un, ns, sc, ch, wun, uns, nsc, sch, wuns, unsc, nsch, wunsc, unsch, wunsch) in der Trennmusterdatei geschaut, welche Zahlen zwischen den Buchstaben stehen können. Z.B. gibt es ein Trennmuster "un1", d.h. eine Trennung hinter "un" ist durchaus erlaubt und erwünscht. Das Muster "6sch." hat durch die 6 eine höhere Priorität als "un1" und gewinnt (= keine Trennung).

un1      <-- Muster 1, Trennung nach "un" erlaubt
  6sch.  <-- Muster 2, Trennung vor "sch" am Wortende nicht erlaubt
------
un6sch. <-- die höhere Zahl gewinnt
Permanenter link

beantwortet 04 Jul '13, 15:02

topskip's gravatar image

topskip
26614
Akzeptiert-Rate: 75%

1

Die Trennung erfolgt nicht zwingend bei der höchsten Priorität eines einzelnen Wortes. Die Trennung ist Teil des Absatzumbruchs, weshalb der Absatzumbruch mit der insgesamt besten Bewertung gewinnt. Eine weniger gute Bewertung im einen Wort kann dabei durch eine daraus resultierende bessere Bewertung in einem anderen Wort doch den Zuschlag erhalten. Die Erklärung lässt sich eben nicht beliebig verkürzen.

(20 Jan '15, 18:17) saputello

Wie TeX herausfindet, ob ein Wort getrennt werden muss, steht nicht in Anhang H des TeXbook, sondern in Kapitel 14. Dort wird beschrieben, wie TeX in mehreren Beurteilungsdurchläufen oder Runden einen Umbruch für einen Absatz sucht. Ist es dabei im ersten Durchlauf ohne Trennung nicht erfolgreich, führt es einen zweiten Lauf durch, wobei die Wörter getrennt werden.

Die Trennung selbst geschieht aufgrund von Mustern, die außer bei LuaTeX bereits von iniTeX in das Format eingebaut werden müssen. LuaTeX kann hingegen die Muster auch zur Laufzeit nachladen. Diese Musterdateien enthalten allerdings keine kompletten Wörter, sondern Wortteile, in denen jeder Buchstabe in einem Teilwort eine Bewertung hat. Diese Musterdateien werden normalerweise mit einem speziellen Programm, patgen, aus Wortlisten erzeugt. Sie von Hand zu ändern und zu verwalten ist extrem aufwändig.

Um die Trennstellen eines Wortes zu finden, zerlegt TeX das Wort in Unterwörter, die in den Mustern der Sprache definiert sind. So würde beispielsweise Umbruch zunächst in Kleinbuchstaben gewandelt und mit den Markern ».« am Anfang und Ende zu ».umbruch.« erweitert. Dann wird es, wenn die Sprache entsprechend konfiguriert ist, beispielsweise aufgrund der Musterdatei dehypht-x-2013-05-26.pat in die Teile ».um3«, »2m1b2«, »m3b4r«, »b2r4«, »b4ruc« und »1ru« zerlegt, wobei eine fehlende Zahl zwischen zwei Zeichen (Buchstabe oder ».«) für 0 steht. Nun wird für jede Stelle zwischen zwei Zeichen das Maximum gesucht. Das ergibt ».0u2m3b4r0u0c0h0.«. Trennung ist nun nur an Stellen erlaubt, an denen eine ungerade Zahl steht, also »Um-bruch«. Je größer die ungerade Zahl ist, desto positiver wird die Trennung bewertet, je größer die gerade Zahl ist, desto verbotener ist die Trennung. Bei den Trennstellen aus den Mustern kommt jedoch noch hinzu, dass keine Trennung innerhalb der ersten \lefthyphenmin Buchstaben und innerhalb der letzten \righthyphenmin Buchstaben erfolgt. Das Wort wird zunächst im Umbruchalgorithmus komplett getrennt (genauer: es werden discretionaries eingefügt, das sind Regeln, die zum einen besagen, was ausgegeben wird, wenn nicht getrennt wird, und wie dieser Fall bewertet wird und was am Ende der Zeile und am Anfang der Zeile ausgegeben wird, wenn ein Umbruch erfolgt und wie der Umbruch bewertet wird), wobei eben abhängig von den Zahlen eine Bewertung jeder möglichen Trennstelle erfolgt. Am Ende wird dann der Umbruch einschließlich Trennung verwendet, der die beste Bewertung hat. Wobei TeX tatsächlich nicht alle möglichen Umbrüche miteinander vergleicht, sondern aufgrund von Randbedingungen gewisse Umbrüche schnell verwirft.

Wie passt nun \hyphenation in dieses Vorgehen? Noch bevor eine Trennung aufgrund der Muster wie im vorherigen Absatz angegeben erfolgt, wird in den mit \hyphenation angegebenen Trennausnahmen nachgeschaut. Dabei kann ein Wort, das in \hyphenation steht, nur an den dort angegebenen Trennstellen getrennt werden.

Das ist zumindest grob die Beschreibung des Vorgehens von TeX. Ich habe mich bemüht, es in möglichst einfache Worte zu fassen. Wer es ganz genau wissen will, sollte es im TeXbook nachlesen. Auch bin ich mir bewusst, dass ich mich auf die Trennung selbst konzentriert habe und den eigentlich genauso wichtigen Teil des linebreakers sträflich vernachlässigt habe. Der war genau genommen aber auch nicht gefragt. Mit den Erweiterungen von pdfTeX gibt es beim Absatzumbruch übrigens ggf. noch eine zusätzliche Runde mehr als im TeXbook beschrieben, wenn die entsprechenden mikrotypografischen Erweiterungen aktiviert wurden.

Permanenter link

beantwortet 03 Jul '13, 23:21

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 20 Jan '15, 18:14

Jetzt kommentiere ich mich schon selbst, was ja eigentlich kein gutes Zeichen ist, aber es wird Zeit fürs Bett, daher nur ganz kurz: Auf einer DANTE-Tagung in Münster (2006? 2007?) hat Patrick Gundlach einen interessanten Vortrag über eine Erweiterung des Umbruchalgorithmus von TeX gehalten. Keine Ahnung, ob der im Netz zu finden ist. Ist für obige Antwort eigentlich auch irrelevant.

(03 Jul '13, 23:41) saputello
1

„Keine Ahnung, ob der im Netz zu finden ist“ -- @topskip müsste das eigentlich wissen

(03 Jul '13, 23:44) cgnieder

Ah, der ist hier auch! Dann wäre der eigentlich genau der richtige, um den Umbruchalgorithmus zu erklären. Wenn ich jetzt aber daraus eine Frage mache, er sie aber nicht beantwortet, muss ich womöglich einige Stunden TeXbook-Lesen investieren, um mein Wissen aufzufrischen und es selbst zu beantworten …

(03 Jul '13, 23:54) saputello

@saputello Der Vortrag ist nicht online. Letztendlich wurde auch nur schematisch veranschaulicht, wie ein Absatzumbruchalgorithmus funktioniert und meine Ideen zur Flusserkennung wiedergegeben.

(04 Jul '13, 14:38) topskip
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×22
×5

gestellte Frage: 01 Jul '13, 23:44

Frage wurde gesehen: 13,516 Mal

zuletzt geändert: 20 Jan '15, 18:18