[Trennmuster] Callbacks
Keno Wehr
wehr at abgol.de
Do Okt 15 20:35:55 CEST 2020
Am 15.10.20 um 00:58 schrieb Stephan Hennig:
> Am 12.10.20 um 22:10 schrieb Keno Wehr:
>> Am 01.10.20 um 02:38 schrieb Stephan Hennig:
>>> Ich dachte, luatexbase bzw. ltluatex würde die Callbacks exklusiv
>>> reservieren (solange niemand dazuwischenfunkt) und dann verschiedenen
>>> Interessenten geordneten Zugriff darauf gestattet. Ist das nicht so?
>>> Ich habe das nicht mehr parat.
>> Im Prinzip ja, aber bei exklusiven Callbacks wie „hyphenate“ und
>> „ligaturing“ kann nur eine Funktion angewandt werden.
> Das würde den Zweck der Callback-Behandlung in ltluatex aber ad absurdum
> führen. Ein Vorteil gegenüber LuaTeX wäre dann ja nicht erkennbar.
Ja, du hast Recht. Ich habe jetzt den passenden Abschnitt in der
ltluatex-Anleitung gefunden:
5.18 Lua callback management
Dort wird allen Callbacks einer der Typen „list“, „data“, „exclusive“,
„simple“, „reverselist“ zugeordnet. Was diese Typen genau bedeuten, wird
leider nicht erklärt, auch in der LuaTeX-Anleitung nicht.
„hyphenate“ und „ligaturing“ sind „simple“ (was auch immer das genau
bedeutet). Jedenfalls war es eine Fehleinschätzung von mir, dass sie
exklusiv sind.
>> Ich habe das mit den Padrinoma-Paketen „pdnm_hyph-mark-by-color.sty“ und
>> „pdnm_hyph-mark-by-glyph.sty“ ausprobiert, die beide den Callback
>> „hyphenate“ brauchen. Man kann zwar beide Pakete laden, wirksam ist aber
>> immer nur das zuerst geladene Paket.
>> Wird „pdnm_hyph-mark-by-color.sty“ zuerst geladen, so werden die
>> Buchstaben um die Trennstelle farbig markiert, wird
>> „pdnm_hyph-mark-by-glyph.sty“ zuerst geladen, so wird an der Trennstelle
>> ein Mittepunkt gesetzt. Beides gleichzeitig passiert nicht.
> Nun sind die Beispiele auch nicht darauf ausgelegt, zusammen verwendet
> zu werden. Warum es nicht funktioniert, kann ich auf die Schnelle aber
> auch nicht sagen.
Ich habe jetzt eine andere Kombination ans Laufen gekriegt:
„pdnm_hyph-mark-by-color.sty“ (farbliche Markierung der Buchstaben um
gewöhnliche Trennstellen, geändert von Latein auf Deutsch) und
„pdnm_non-std-hyph-de-1901.sty“ (Spezialtrennungen für die AR).
Diese Kombination funktioniert in beliebiger Ladereihenfolge. Dass der
Standardtrennalgorithmus dabei zweimal aufgerufen wird, scheint kein
Problem zu sein.
Prinzipiell ist die Kombinierbarkeit also gegeben.
„pdnm_hyph-mark-by-color.sty“ und „pdnm_hyph-mark-by-glyph.sty“
manipulieren die Knotenliste offenbar in einer Weise, dass das jeweils
andere Paket nicht mehr damit klarkommt.
Dass das Einfügen der Mittepunkte an den Trennstellen einen folgenden
Algorithmus zur farblichen Markierung von Trennstellen zerschießt,
leuchtet mir ein, da die Zeichenfolge im Wort verändert wird; bei
umgekehrter Reihenfolge ist mir aber unklar, wo das Problem liegt.
Das konkrete Problem ist aber auch nicht so wichtig, da es zur
Markierung von Trennstellen bereits das Paket „showhyphens“ gibt, das
den Callback „post_linebreak_filter“ nutzt, wobei es sich zunutze macht,
dass die potentiellen Trennstellen (discretionary nodes) beim Umbruch
nicht entfernt werden.
Wird „pdnm_non-std-hyph-de-1901.sty“ geladen, zeigt showhyphens auch die
Spezialtrennstellen an.
Kandidaten zur Veröffentlichung sehe ich in jenen Paketen also nicht.
>> Dass zwei konkurrierende Trennalgorithmen nicht gleichzeitig angewandt
>> werden können, finde ich wenig überraschend, insbesondere wenn man sich
>> vor Augen hält, dass beide zunächst den Standard-TeX-Trennalgorithmus
>> aufrufen. Woher soll die Maschine wissen, wie beide Algorithmen zu
>> kombinieren sind?
> Ich kann das ohne weitere Untersuchung nicht sagen, ob der
> implementierte Weg der einzig mögliche war. Es sind wie gesagt nur
> Beispielanwendungen. Es wäre aber auch denkbar, den Callback dreimal zu
> registrieren, einmal für lang.hyphenate() und danach zweimal für die
> Markierungen. <URL:http://wiki.luatex.org/index.php/Callbacks> scheint
> diese Erinnerung zu stützen.
Ja, aber der doppelte lang.hyphenate()-Aufruf ist nicht das Problem, das
habe ich ausprobiert.
> Keno, könntest du Probleme mit dem Callback-Management auf der
> entsprechenden Liste (lualatex) zur Sprache bringen?
Die Problematik scheint sich erst mal geklärt zu haben.
>> Ich meine, dass wir für das Gesamtprojekt zwei LaTeX-Pakete brauchen:
>> eines für gewichtete Trennung und AR-Spezialtrennung (Callback
>> „hyphenate“) und eines für Ligaturaufbruch und Lang-s-Ersetzung
>> (Callback „ligaturing“).
>> Beide Pakete haben spezifische Anforderungen an die Kombination der
>> beiden Knotenlistenmanipulationen.
Diese Einschätzung kann ich jetzt revidieren.
Für einen ersten CTAN-Upload würde ich ein Bündel namens padrinoma o. ä.
vorschlagen, das vier LaTeX-Pakete für die konkreten Anwendungen
bereitstellt, evtl. noch ein weiteres für die Bindestrichproblematik.
Auf lange Sicht wäre eine Regelung über Optionen von babel und
polyglossia vorzuziehen.
Die Muster sollten dagegen von dehyph bereitgestellt werden.
>> Gewichtete Trennungen auf der Grundlage gewöhnlicher Trennmuster und
>> Spezialtrennungen konkurrieren insofern nicht, als sie sich auf
>> unterschiedliche Stellen im Wort beziehen; doch ist sicherzustellen,
>> dass die durch den einen Algorithmus eingefügten Trennstellen das
>> Einfügen durch den anderen Algorithmus nicht behindert. (Man beachte
>> beispielsweise, dass „Abbauergebnis“ mit unseren Mustern
>> „Ab-bau-ergeb-nis“ getrennt wird, „Abbau"-ergebnis“ mit expliziter
>> Trennstelle hingegen das unerwünschte „Ab-bau-er-geb-nis“ ergibt).
> Bei der Trennung von Wörtern mit Bindestrich sollten sowieso größere
> hyphenmin-Werte verwendet werden.
Du hast mein Beispiel missverstanden. "- ist kein Bindestrich, sondern
eine explizite Trennstelle, die andere nicht ausschließt.
>> Zusätzlich ist bei gewichteter Trennung in „Kontrollücke“ die
>> Spezialtrennung „Kontroll-lücke“ mit weniger Strafpunkten zu versehen
>> als die Spezialtrennung „Kontrollük-ke“. Hier gibt es also
>> Wechselwirkungen, die einen integrierten Ansatz nahelegen.
> Ich werde hinterher testen, ob auch beide Trennungen gleichzeitig gehen. :-)
>
>
>> Beim Lang-s muss sichergestellt werden, dass die Ersetzung vor dem
>> Standardligierungsalgorithmus erfolgt, da ſ und s unterschiedliche
>> Ligaturen bilden können. Wenn erst ein Algorithmus Bindehemmer einfügt
>> und dann die TeX-Ligierung aufruft, und dann ein anderes Paket, das
>> dummerweise zu spät geladen wurde, daherkommt und eine Lang-s-Ersetzung
>> vornehmen will, ist es zu spät. In diesem Fall würden dann die
>> ſ-Ligaturen nicht gesetzt werden, selbst wenn der Algorithmus noch zur
>> Ausführung kommt. Umgekehrt das Gleiche: Wenn erst ein Paket eine
>> Lang-s-Ersetzung vornimmt und dann die Ligierung aufruft, ist es für die
>> ZWNJs zu spät.
> Eine andere Idee, nur weil sie mir einfällt: Man könnte auch
> verschiedene morphologische Trennmuster erstellen und dann mit dieser
> Information die Entscheidung, ob eine Ligatur aufgebrochen werden muss
> oder eine Lang-s-Ersetzung stattfinden muss, Lua-seitig vornehmen. Von
> der Laufzeit her wäre vermutlich kein Gewinn zu erwarten ...
Ich weiß nicht, was du hier sagen willst. Ist das nicht genau das, was
wir ohnehin vorhaben?
>> Man kann zwar auch erst mal alles separat implementieren, aber dann ist
>> es Essig mit der Kombinierbarkeit.
>>
>> Oder sehe ich das ganz falsch?
> Wie gesagt, sollte es technisch möglich sein, Callbacks nacheinander für
> verschiedene Dinge zu verwenden.
Ja, da bin ich jetzt schlauer.
> Wenn du lieber schnelle Ergebnisse
> bevorzugst, lege neuen Code dennoch bitte mit Blick auf eine mögliche
> spätere Auftrennung an.
Nein, es geht mir nicht um schnelle, sondern um korrekte Ergebnisse.
Gruß
Keno
Mehr Informationen über die Mailingliste Trennmuster