von Patrick Gundlach |

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:

  1. 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?

    Arabischer Text wird von rechts nach links geschrieben

  2. 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.

    Der Buchstabe U+0645 ARABIC LETTER MEEM (م). sieht unterschiedlich aus, je nach dem ob er isoliert steht oder ob er in der Mitte, am Ende oder am Anfang des Wortes steht.

  3. Mehrere Zeichen werden zusammengezogen und verändern ihr Aussehen, vergleichbar mit fi-Ligaturen bei uns.

    Dieselben Buchstaben, aber einmal als einfache Aneinanderreihung einzelner Zeichen (falsch!) und einmal als zusammenhängendes Wort. Man kann erahnen, dass es nicht einfach ist, aus den Buchstaben eine solche Kette zu formen.

  4. 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.

    Die Unicode-Konferenz 1997 hat vom 10.-12. März stattgefunden. Die Zahlen stehen von rechts nach links, aber für uns lesbar im Text. In einem persischsprachigen Text wäre das andersherum: 10-12 und nicht 12-10.

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.

  1. Es muss eine Verbindung auf Lua-Ebene zu den C-Funktionen der Bibliothek hergestellt werden und
  2. 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:

Aus dem Beispiel von oben. Man sieht sofort, dass kein Unterschied zwischen RTL und LTR gemacht wird. Ansonsten scheint der Text in Ordnung zu sein.

Die Mischung zwischen RTL und LTR Text muss manuell gemacht werden: {\textdir TLT ...} ist das Mittel der Wahl um vorübergehend auf LTR umzustellen.

Nun ist es richtig.

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:

Allgemeine Erklärung der Menschenrechte in arabischer Sprache (Anfang).

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.