[Trennmuster] Knotenmanipulationen in LuaTeX usw. (was: Woerter mit zwei und drei Buchstaben)
Stephan Hennig
mailing_list at arcor.de
Do Jul 31 23:06:20 CEST 2014
[neues Thema, da mir das Ergebnis der Diskussion einigermaßen wichtig
erscheint]
Am 29.07.2014 12:59, schrieb Guenter Milde:
>> Reguläre Ausdrücke stehen in LuaTeX für Knotenlistenmanipulationen
>> leider nicht zur Verfügung. Da muss alles von Hand gemacht werden.
>
> Aber die Unterscheidung Stringmitte oder Stringende müßte doch auch
> mit den Lua-Pattern möglich sein. Oder sind die Wörter in
> LuaTeX-Knoten keine Strings? Können sie dann wenigstens für die
> Verarbeitung in Strings gewandelt werden?
Wenn Knoten druckbare Informationen enthalten, dann in Form einzelner
Glyphen. Ein Wort in einer Knotenliste besteht grob aus
aufeinanderfolgenden Glyphknoten mit \lccode > 0 in derselben Sprache.
Dazwischen können sich aber auch nicht-darstellbare Knoten mogeln, wie
Kerns, Discretionarys oder Whatsit-Knoten.
Während der Musteranpassung (Liang-Algorithmus) werden die Indizes aller
Glyphknoten des aktuellen Wortes vermerkt (die anderen oben erwähnten
Knoten werden übergangen) und die UTF-8-kodierten Zeichen, die den
Glyphknoten entsprechen, nacheinander gegen eine Datenstruktur Trie
getestet, die die bekannten Muster enthält. Manchmal ist das Ergebnis
dieses Tests (der sehr schnell geht), dass gerade ein oder mehrere
bekanntes Muster erkannt wurden. Diese Muster werden notiert und wenn
das Ende des aktuellen Wortes erkannt wurde, werden daraus die Spots im
Wort berechnet. Das Ergebnis ist dann schließlich eine Tabelle mit
Indizes der Knoten, an denen Spots im aktuellen Wort angezeigt werden.
Auf die interessierenden Knoten in der Umgebung eines Spots kann daher
schnell zugegriffen werden. Das bisher gesagte, passiert alles im
Padrinoma-Paket. Ein Anwender (Paket) muss neben geeigneten Mustern nur
noch den Kode für die eigentliche Knotenmanipulation liefern. Daher
auch der Name padrinoma: pattern driven node manipulation.
Als String liegen die Wörter des Absatzes bei dem ganzen Vorgang
jedenfalls nie vor. Wollte man einen regulären Ausdruck auf die
Stringsrepräsentation eines Wortes anwenden, hätte man außerdem das
Problem, herauszufinden, welche Zeichen denn nun geändert wurden, um
diese Änderungen wieder in die Knotenliste zu übertragen. Machbar ist
vieles, aber das wird weder schnell, noch elegant.
> Wie schon oben gesagt, die Lang-S-Schreibung hat noch viele
> zusätzliche Fälle, wo nach "normalen" Trennstellen geschaut werden
> muß sowie eine Reihe von "Ausnahmeregeln", die sinnvollerweise vor
> dem patgen-Lauf berücksichtigt werden.
OK, ich denke, dann sind wir uns einig. Ligaturen werden per
Haupttrennstellenmuster aufgebrochen (die auch für ästhetische
Worttrennungen genutzt werden können), s-ſ-Wandlung und
Spezialtrennungen erfolgen mit jeweils eigenen Mustersätzen. (Hatte ich
schon erwähnt, dass sich für letzteres bereits ein Beispiel im
Padrinoma-Repositorium[1] befindet? :-) Ich werde mich demnächst mal an
die Ligaturen wagen. Welches Make-Ziel darf ich für
Haupttrennstellenmuster verwenden?
Viele Grüße,
Stephan Hennig
[1] Erst
<URL:https://github.com/sh2d/padrinoma/blob/master/examples/README>, dann
<URL:https://github.com/sh2d/padrinoma/tree/master/examples/luatex/non-standard-hyphenation-german>
Mehr Informationen über die Mailingliste Trennmuster