Schreibrichtung rechts nach links

PostScript, TrueType und OpenType sind technisch alle darauf ausgelegt, dass der Text von Links nach Rechts geschrieben wird. Manche Schriftsysteme wie hebräisch oder arabisch schreiben sich aber von Rechts nach Links. Wie also schreibt man einen solchen Text?

Die grundsätzliche Idee ist eigentlich relativ simpel: Die Buchstaben innerhalb des zu schreibenden Textes werden umgedreht, und dann von Links nach Rechts geschrieben. Auch die Informationen für Unterschneidung und Ligaturen, die sich in den Schriften findet, ist darauf ausgelegt: Man spiegelt zunächst den Text, sucht danach nach Ligaturen und Zeichenpaaren mit Unterschneidung, und schreibt den Text schliesslich ganz normal (wobei natürlich eher rechtsbündige als linksbündige Ausrichtung verwendet wird). Es gibt aber noch ein paar Regeln und Fallstricke zu beachten.

Darstellungsparameter

Wird der Text in einem PDF hauptsächlich von Rechts nach Links geschrieben, so sollte man dies im Darstellungsparametern /Direction vermerken. Dies hat keine direkte Auswirkung auf den Text selbst, gibt dem Anzeigeprogramm aber einen Hinweis, wie die Darstellung des Dokuments an sich erfolgen soll. Manche Druckereien verwenden dies auch, um die Seiten korrekt anzuordnen. Bei Sprachen, wo der Text von Rechts nach Links geschrieben wird, sind üblicherweise auch die Seiten von Rechts nach Links angeordnet.

gespiegelte Zeichen

Wenn der Text gespiegelt wird, so reicht es nicht bei allen Zeichen, dass man sie neu platziert. Manche müssen durch eine gespiegelte Form ersetzt werden. Nehmen wir zum Beispiel den Text „I > U“. Drehen wir einfach die Reihenfolge um, so wird daraus „U > I“, und das will nun wirklich niemand. Korrekt ist selbstverständlich „U < I“.

Das Unicode Konsortium stellt eine Liste zur Verfügung, welche Zeichen durch welche anderen Zeichen ersetzt werden müssen. Die jeweils aktuelle Liste ist unter folgender Adresse verfügbar:

http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt

Daneben definiert OpenType ein Feature „rtlm“, welches weitere Zeichen durch gespiegelte Formen ersetzen kann. Laut Standard sollen darin alle Zeichen der Schrift enthalten sein, die über gespiegelte Formen verfügen, und in der Version 5.1 des Unicode-Standards nicht aufgeführt sind. Die Liste nach Version 5.1 findet sich unter folgender Adresse:

http://www.unicode.org/Public/5.1.0/ucd/BidiMirroring.txt

Alternativ kann man auch die aktuelle Liste verwenden. In dem Fall darf man aber natürlich Zeichen, die man bereits anhand der Liste des Unicode-Konsortiums gespiegelt hat nicht nochmals mit dem „rtlm“ Feature spiegeln.

OpenType definiert zudem noch ein Feature „rtla“, welches Alternativzeichen für die umgedrehte Schreibrichtung enthält, die keine Spiegelungen sind.

bidirektionaler Text

Manche Schriftsysteme enthalten Stellen mit abwechselnder Schreibrichtung. Ein ähnliches Problem tritt auf, wenn verschiedene Schriftsysteme gemischt werden (zum Beispiel englische Worte in hebräischem Text). Das Unicode-Konsortium hat ein Verfahren zur Spiegelung des Textes definiert, welches solche Situationen berücksichtigt. Der Algorithmus entscheidet dabei anhand der verwendeten Buchtstaben darüber, welche Stellen in welcher Schreibrichtung sind. Zur feineren Kontrolle sind zudem einige Steuerzeichen definiert.

Der vollständige Algorithmus ist recht kompliziert. Er ist im Anhang 9 des Unicode-Standards detailliert erklärt:

http://www.unicode.org/reports/tr9/

Hier empfehle ich die Nutzung von Fribidi. Dabei handelt es sich um eine freie Programmbibliothek (Lizenz LGPLv2), welche den obigen Algorithmus umsetzt. Um einen mehrzeiligen Absatz damit umzuwandeln, trifft man zunächst folgende Vorbereitungen:

  1. Die Funktion fribidi_get_bidi_types aufrufen. Diese Funktion ermittelt die BiDi Zeichenkategorien.
  2. Die Funktion fribidi_get_par_direction aufrufen. Diese Funktion ermittelt die Hauptschreibrichtung.
  3. Die Funktion fribidi_get_par_embedding_levels aufrufen. Diese Funktion ermittelt, welche Stellen im Absatz welche Schreibrichtung haben.

fribidi_get_bidi_types und fribidi_get_par_embedding_levels liefern je ein Array mit je einem Eintrag für jedes Zeichen des Textes zurück.

Wer will, kann noch die Funktion fribidi_shape_mirroring aufrufen. Diese korrigiert gespiegelte Zeichen nach dem aktuellen Unicode-Standard.

Nun teilen wir den Absatz ganz normal auf mehrere Zeilen auf. Erst danach werden die Texte innerhalb der Zeilen umgestellt. Dies geschieht mit der Funktion fribidi_reorder_line. Neben dem umzustellenden Text erwartet die Funktion auch die passenden Ausschnitte der Arrays, welche fribidi_get_bidi_types und fribidi_get_par_embedding_levels zurückgeliefert haben.

Der von fribidi_reorder_line zurückgelieferte Text kann ganz normal von links nach rechts geschrieben werden. Allerdings können noch gewisse Steuerzeichen enthalten sein, welche der Unicode-Standard zur Feinkontrolle der Schreibrichtung definiert hat. Diese Steuerzeichen sollte man natürlich überspringen, da sie sonst zu der Ausgabe von „Zeichen unbekannt“ Zeichen führen können. Die Steuerzeichen sind:

Code Kürzel voller Name
0x200ELRM left to right mark
0x200FRLM right to left mark
0x202ALRE left to right embedding
0x202BRLE right to left embedding
0x202CPDFpop directional formatting
0x202DLRO left to right override
0x202ERLO right to left override

Das Zeichen „PDF“ hat natürlich nichts mit dem Dateiformat PDF zu tun.

OpenType definiert noch zwei selten gebrauchte Features „ltrm“ und „ltra“. Diese funktionieren ähnlich wie „rtlm“ und „rtla“. Sie sind aber für Zeichen in bidirektionalem Text gedacht, deren Schreibrichtung nicht umgestellt wird (also von Anfang an von Links nach Rechts war).