[Trennmuster] Callbacks
Keno Wehr
wehr at abgol.de
Mo Okt 12 22:10:09 CEST 2020
Am 01.10.20 um 02:38 schrieb Stephan Hennig:
> Am 30.09.20 um 15:36 schrieb Keno Wehr:
>
>> Es gibt in LuaTeX callbacks, mit denen zusätzliche Funktionen eingefügt
>> werden können (z. B. pre_linebreak_filter) und andere, die eine
>> bestimmte TeX-Funktion ersetzen (z. B. hyphenate). Für den zweiten
>> callback-Typ kann nur *eine* Funktion hinterlegt werden.
>> Falls also zwei Pakete den hyphenate-callback beanspruchten, könnte auch
>> ein Verwaltungsmechanismus nur eine Fehlermeldung ausgeben. Gleichzeitig
>> so und so trennen, geht nicht.
> 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.
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.
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?
Eher überraschend ist dagegen die Tatsache, dass keinerlei Fehlermeldung
auftaucht, auch nicht in der Log-Datei. Die zweite Funktion, die für den
Callback registriert wird, wird einfach ignoriert.
Am 02.10.20 um 09:55 schrieb Guenter Milde:
>> Es gibt in LuaTeX callbacks, mit denen zusätzliche Funktionen eingefügt
>> werden können (z. B. pre_linebreak_filter) und andere, die eine bestimmte
>> TeX-Funktion ersetzen (z. B. hyphenate). Für den zweiten callback-Typ kann
>> nur *eine* Funktion hinterlegt werden.
>> Falls also zwei Pakete den hyphenate-callback beanspruchten, könnte auch ein
>> Verwaltungsmechanismus nur eine Fehlermeldung ausgeben. Gleichzeitig so und
>> so trennen, geht nicht.
> Dann ist es Zeit für einen Master callback: ein "Ersatz-callback" (z.B.
> hyphenate) kann weitere callbacks bereithalten.
>
> Statt eines komplexen Gesamtpakets schwebt mir da eher ein plug-in
> Mechanismus vor.
Das scheint mir ein Holzweg zu sein. So einen „Master-Callback“ zu
implementieren wäre vermutlich komplizierter als das „komplexe
Gesamtpaket“, das gerade einmal zwei verschiedene Arten der
Trennstelleneinfügung kombinieren müsste.
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.
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).
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.
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.
Man kann zwar auch erst mal alles separat implementieren, aber dann ist
es Essig mit der Kombinierbarkeit.
Oder sehe ich das ganz falsch?
Keno
Mehr Informationen über die Mailingliste Trennmuster