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.
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.
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.
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:
fribidi_get_bidi_types
aufrufen. Diese Funktion ermittelt die BiDi Zeichenkategorien.fribidi_get_par_direction
aufrufen. Diese Funktion ermittelt die Hauptschreibrichtung.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 |
---|---|---|
0x200E | LRM | left to right mark |
0x200F | RLM | right to left mark |
0x202A | LRE | left to right embedding |
0x202B | RLE | right to left embedding |
0x202C | pop directional formatting | |
0x202D | LRO | left to right override |
0x202E | RLO | 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).
Diskussion