Harfbuzz & arabischer Textsatz mit LuaTeX
Immer wieder wünschen sich Anwender des speedata Publishers Textsatz in anderen Schriftsystemen, z.B. das Arabische.
Textsatz im Arabischen
Doch was ist so besonders im arabischen Textsatz? Die Seiten Text Layout Requirements for the Arabic Script vom W3C und Arabic script summary von Richard Ishida gehen sehr ausführlich auf die Thematik ein. Ich erlaube mir ein paar Bilder daraus zu »klauen«.
Einige Punkte:
- Die Sprache läuft von rechts nach links und fängt am rechten Seitenrand an. Abgekürzt wird dies oft mit RTL im Gegensatz zu den westlichen Sprachen mit LTR. Gibt es Blocksatz im Arabischen? Was ist mit Silbentrennung?
-
Im Arabischen gibt es viele verschiedene Zeichen, die je nach Stellung im Wort unterschiedlich aussehen. Es gibt 36 Buchstaben, aber typischerweise mehr als hundert Zeichen in einem Font.
-
Mehrere Zeichen werden zusammengezogen und verändern ihr Aussehen, vergleichbar mit fi-Ligaturen bei uns.
-
Beim Zusammenspiel RTL und LTR Schreibsystemen gibt es besondere Regeln, die sogenannten BIDI-Regeln (bi-directional typesetting). Wann wird von RTL auf LTR umgeschaltet? Werden Zahlen (z.B. 42) von links nach rechts geschrieben oder als 24? Werden arabische oder persische Texte geschrieben? Hier gibt es zwar definierte Verfahren, aber nur wenige (freie) Implementierungen.
Harfbuzz
Am besten programmiert man die Regeln nicht selber, sondern bedient sich externer und gut getesteter Bibliotheken. Die beiden Aspekte Zeichenänderungen (auch bekannt als »Text-Shaping«, Punkte 2 und 3) sowie BIDI (Punkt 4) werden meist getrennt behandelt. Auf BIDI gehe ich hier nicht weiter ein, das ist (leider) ein Kapitel für sich.
Harfbuzz ist die verbreitetste OpenSource Text-Shaping Bibliothek. Sie ist für alle bekannten Plattformen verfügbar und wird möglicherweise Bestandteil von LuaTeX 1.11 / TeXlive 2020 sein.
Aber auch jetzt ist es schon möglich, die Bibliothek zu LuaTeX hinzuzufügen.
Dazu reicht ein einfaches require("harfbuzz")
auf Lua-Ebene aus, um harfbuzz zur Verfügung zu stellen.
Schnittstellen notwendig
Ganz so einfach ist es natürlich nicht, denn es müssen noch mehrere Anpassungen gemacht werden.
- Es muss eine Verbindung auf Lua-Ebene zu den C-Funktionen der Bibliothek hergestellt werden und
- der eigentliche Shaping-Prozess muss gestartet werden.
Für diese Punkte gibt es auch etliche Beispiele und Projekte im Netz, die sich fast alle auf LaTeX beziehen. Ich muss mir dann für den Fontloader im speedata Publisher die relevanten Punkte selber heraus suchen.
Bibliotheken für LaTeX & co.
Low-Level: luaharfbuzz
luaharfbuzz ist eine Bibliothek für alle TeX-Varianten, die mit LuaTeX laufen. Sie stellt Lua-Funktionen zur Verfügung, die die C-Funktionen der Harfbuzz-Bibliothek kapseln. So kann man zwar die Text-Shaping Funktion aufrufen, muss aber vorher alle notwendigen Variablen initialisieren und Schriftarten laden. Damit ist die Bibliothek eher nicht für den »normalen Anwender« gedacht, eher für Paketautoren. Diese Bibliothek wird auch Bestandteil von LuaTeX 1.11 sein.
Alternativer Fontloader für TeX/LaTeX/ConTeXt: luatex-harfbuzz
luatex-harfbuzz von Kai Eigner ist eine Sammlung von Beispielen, die auf verschiedenen Wegen (luaharfbuzz - s.o., swiglib und ffi) mit verschiedenen Formaten (ConTeXt, LaTeX, TeX) Texte in verschiedenen Sprachen setzen kann. Ein Beispiel für Arabisch (https://r12a.github.io/scripts/tutorial/summaries/arabic), gesetzt mit luatex-harfbuzz:
Die Mischung zwischen RTL und LTR Text muss manuell gemacht werden: {\textdir TLT ...}
ist das Mittel der Wahl um vorübergehend auf LTR umzustellen.
luatex-harfbuzz-shaper
Diese Bibliothek (Github) von Michal Hoftich nutzt auch luaharfbuzz, scheint jedoch veraltet zu sein. Die letzten wesentlichen Änderungen sind von 2015 / 2016. Ein Eintrag in der Fehlerdatenbank lässt darauf vermuten, dass diese Version inkompatibel zu den aktuellen Entwicklungen von luaharfbuzz sind. So endet mein Test mit dem Fehler
! error: (font): lua-loaded font '16' has no name!
Harftex
Harftex fällt etwas aus dem Rahmen, denn es ist eine neue Engine, basierend auf LuaTeX.
Diese bindet sowohl harfbuzz als auch luaharfbuzz mit ein, so dass sich der Benutzer nicht mehr darum kümmern muss.
Außerdem gibt es mit harfload
ein Paket, das sich in fontspec einklinkt, so dass man einfach (nach der Installation) wie folgt loslegen kann:
\documentclass{article}
\usepackage{harfload}
\usepackage{fontspec}
\defaultfontfeatures{RawFeature={mode=harf}}
\setmainfont{Amiri}[Script=Arabic]
\begin{document}
\pardir TRT\textdir TRT
المادة 1 يولد جميع الناس أحرارًا متساوين في الكرامة والحقوق. وقد وهبوا عقلاً وضميرًا وعليهم أن يعامل بعضهم بعضًا بروح الإخاء.
\end{document}
Das Ergebnis ist wie erwartet:
Der Vorteil von harftex ist, dass es von Khaled Hosny entwickelt wird, der sich hervorragend mit Harfbuzz und Arabisch auskennt.
Leider (und das ist für mich ein k.o.-Kriterium) wird LuaJITTeX nicht unterstützt, so dass ich es nicht für den speedata Publisher nutzen kann.
Auch ist hier keine automatische Unterstützung für BIDI enthalten, so dass man mit \textdir TLT
vorübergehend auf LTR umschalten muss.
Fazit
Arabischer Textsatz ist schwer, das sollte man Profis überlassen. Zum Glück gibt es mir harfbuzz eine OpenSource Bibliothek, die den schwierigsten Teil übernimmt. Mit LuaTeX gibt es nun diverse Möglichkeiten, den Text ordentlich zu setzen, auch wenn es noch an der einen oder anderen Stelle hakt (Installation, BIDI).
Sollten die LuaTeX-Entwickler ihr Vorhaben verwirklichen, Harfbuzz in das Binary zu integrieren, wäre das ein großer Schritt nach vorne. Dann könnte mit TeXLive 2020 moderner arabischer Textsatz »out of the box« funktionieren.
speedata Publisher
Das ist dann auch für mich interessant, weil es dann offizielle LuaTeX-Binaries gibt, die ich mit dem speedata Publisher ausliefern kann.
Bis dahin werde ich auch die Anpassungen entwickelt haben, die ich für meinen Fontloader brauche, der ja nicht auf fontspec
oder luaotfload
basiert.