Chinesisch, Japanisch und Koreanisch schreibt man traditionell in Kolonnen von oben nach unten, wobei die Kolonnen von Rechts nach Links angeordnet werden. PDF bietet hierfür einen entsprechenden Modus an. Dabei wird logischerweise eine vertikale Grundlinie verwendet. Diese verläuft mittig durch die Kolonne. Die Kolonnenbreite und der Kolonnenabstand sind beide grundsätzlich identisch mit der gewählten Schriftgrösse. Für den Textsatz werden die normalen Anweisungen verwendet, wobei Td
den Punkt ganz oben auf der Grundlinie definiert (oberhalb des ersten Zeichens).
Unterschneidung und Ligaturen werden bei der vertikalen Schreibrichtung nicht verwendet. Zwar ist es möglich, eine Unterschneidung in der Schrift zu definieren, aber dies wird in der Regel ignoriert, da ostasiatische Schriftsysteme grundsätzlich keine Unterschneidung kennen. Alternativzeichen können hingegen ganz normal verwendet werden.
Es gibt zwei Schriftfeatures, welche alternative Zeichen für die vertikale Schreibrichtung definieren: „vert“ enthält nur ein paar Anpassungen wie umpositionierte Satzzeichen. „vrt2“ enthält alle Einträge des „vert“ Features, und zusätzlich rotierte Formen für lateinische Zeichen. Sind beide Features vorhanden, so sollte logischerweise nur eines verwendet werden.
Anstelle der Zeichenbreite benötigen wir natürlich die Zeichenhöhe. Diese wird als negative Zahl angegeben, da ja nach von oben nach unten geschrieben wird. Darüber hinaus müssen wir für jedes Zeichen noch zwei weitere Werte ermitteln, und im PDF ablegen. Der Grund dafür ist eine Eigenheit von TrueType und OpenType:
Die einzelnen Buchstaben in der Schrift sind als Vektorgrafik definiert, und deren Koordinaten sind relativ zur horizontalen Grundlinie und der linken Kante des Zeichens. Damit der PDF Interpreter die Zeichen korrekt platzieren kann, muss er darum wissen, wie weit die Oberkante von der horizontalen Grundlinie, und wie weit die linke Kante von der Kolonnenmitte entfernt ist. Bei für die vertikale Schreibweise ausgelegten TrueType/OpenType Schriften sind diese Angaben vorhanden, ansonsten müssen wir mit Standardwerten arbeiten.
Für vertikale Schreibrichtung ausgelegte TrueType/OpenType Schriften haben zwei zusätzliche Blöcke „vhea“ und „vmtx“. Diese sind ähnlich aufgebaut, wie „hhea“ und „hmtx“. Sind die Tabellen nicht vorhanden, so können wir für alle Zeichen eine Zeichenhöhe von -1000‰, und einen Abstand vom linken Rand zur Kolonnenmitte von 500‰ annehmen.
Dieser Block enthält unter anderem folgende Daten:
Postion | Grösse | Typ | Wert |
---|---|---|---|
6 | 2 Byte | int16 | linker Rand |
34 | 2 Byte | uint16 | Anzahl GIDs mit expliziter Zeichenhöhe |
Der linke Rand ist relativ zur Grundlinie angegeben, und folglich eine negative Zahl. In PDF wird eine positive Promillezahl erwartet, der Wert muss also in Promille umgerechnet und negiert werden.
Dieser Block enthält einen Eintrag für jede GID mit expliziter Zeichenhöhe. Ähnlich wie beim „hmtx“ Block gilt auch hier der letzte Eintrag implizit für die restlichen Zeichen. Die Einträge sind folgendermassen aufgebaut:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 2 Byte | uint16 | Zeichenhöhe |
2 | 2 Byte | int16 | Weissraum oben |
Davon interessiert uns nur die Zeichenhöhe. Wie man sieht, ist die Zahl vorzeichenlos, und somit immer positiv. Für die Verwendung in PDF müssen wir sie in Promille umrechnen und negieren.
OpenType Schriften mit Type1 oder CID Zeichenbeschreibungen (sprich: diejenigen mit „CFF “ Block) können einen „VORG“ Block enthalten, welcher für jedes Zeichen den Abstand der Grundlinie zur Oberkante des Zeichens definiert. Fehlt dieser, so kann man statt dessen die Oberlänge verwenden.
TrueType Schriften (einschliesslich OpenType Schriften mit TrueType Zeichenbeschreibungen) haben die Position der Oberkante relativ zur horizontalen Grundline im „glyf“ Block abgelegt. Leider ist es etwas umständlich, an diese Information heranzukommen. Die Position der Zeicheninformationen ist nämlich nicht im „glyf“ Block selbst, sondern im „loca“ Block abgelegt. Dieser wiederum kann in zwei Formaten sein, und das Format ist im „head“ Block abgelegt.
Hinweis: Fehlt der „vhea“ und/oder „vmtx“ Block (und verwenden wir dementsprechend dort Standardwerte), so ist es oft besser, auch hier mit einem Standardwert zu arbeiten. Die Oberlänge bietet sich an.
Dieser Block beginnt folgendermassen:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 2 Byte | uint16 | Version |
2 | 2 Byte | uint16 | Unterversion |
4 | 2 Byte | int16 | Standardabstand horizontale Grundlinie |
6 | 2 Byte | uint16 | Anzahl Zeichen mit anderem Abstand |
Danach folgt ein Eintrag für jedes Zeichen mit anderem Abstand:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 2 Byte | uint16 | GID |
2 | 2 Byte | int16 | Abstand horizontale Grundlinie |
Für alle Zeichen, bei denen nichts angegeben wurde, gilt logischerweise der Standardabstand. Der Abstand muss noch anhand der Skala in Promille der Schriftgrösse umgerechnet werden.
Neben der schon bekannten Informationen ist auch das Format der „loca“ Tabelle abgelegt:
Position | Grösse | Typ | Wert |
---|---|---|---|
50 | 2 Byte | int16 | Format „loca“ Block |
Das Format kann 0 oder 1 sein.
Dieser Block hat einen Eintrag für jede GID, mit der Position der Zeichenbeschreibung im „glyf“ Block. Bei Format 0 sehen die Einträge so aus:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 2 Byte | uint16 | Position Zeichenbeschreibung |
Bei Format 1 sehen die Einträge so aus:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 4 Byte | uint32 | Position Zeichenbeschreibung |
Die Position ist jeweils relativ zum Anfang des „glyf“ Blocks.
Dieser Block enthält alle Zeichenbeschreibungen. An der aus dem „loca“ Block ermittelten Position finden sich zunächst folgende Angaben:
Position | Grösse | Typ | Wert |
---|---|---|---|
0 | 2 Byte | int16 | Anzahl Pfade |
2 | 2 Byte | int16 | linke Kante |
4 | 2 Byte | int16 | Unterkante |
6 | 2 Byte | int16 | rechte Kante |
8 | 2 Byte | int16 | Oberkante |
Davon interessiert uns nur die Oberkante. Sie ist relativ zur horizontalen Grundlinie angegeben, und entspricht somit dem von uns gesuchten Abstand. Die Zahl muss nur noch in Promille der Schriftgrösse umgerechnet werden.
Wird hauptsächlich in der vertikalen Schreibrichtung geschrieben, und die Kolonnen von Rechts nach Links angeordnet, so sollte man im Darstellungsparameter /Direction
die Schreibrichtung als „von Rechts nach Links“ angeben. Grund dafür ist, dass in diesem Fall auch die Seiten von Rechts nach Links angeordnet werden.
Um den vertikalen Modus verwenden zu können, muss die Schrift über das Kompositschriftsystem eingebunden werden. Dabei muss das Kompositschrifobjekt und das Teilschriftobjekt leicht unterschiedlich definiert werden:
Im Kompositschriftobjekt muss der Eintrag /Encoding
auf /Identity-V
gesetzt werden. Dies bewirkt, dass der PDF Interpreter bei der Auswahl der Schrift in den vertikalen Modus umschaltet.
Im Teilschriftobjekt werden die Einträge /DW
und /W
weggelassen. Statt dessen gibt es zwei andere Einträge, von denen mindestens einer gesetzt sein muss:
/DW2 | Standardmetriken (vertikal) |
---|---|
/W2 | Zeichenmetriken (vertikal) |
/DW2
erwartet als Wert ein Array mit zwei Ganzzahlen. Die erste ist die standardmässige Distanz zwischen Oberkante und Grundlinie. Die zweite ist die standardmässige Zeichenhöhe. Es ist nicht möglich, eine standardmässige Distanz der linken Kante zur Kolonnenmitte festzulegen. Hierfür wird immer 500‰ angenommen.
/W2
erwartet ein Array, das gleich aufgebaut ist, wie das /W
Array. /W2
unterscheided sich von /W
nur insofern, dass anstelle der Ganzzahl mit der Zeichenbreite jeweils drei Ganzzahlen mit der Zeichenhöhe, dem Abstand der linken Kante von der Kolonnenmitte, und dem Abstand der Oberkante von der horizontalen Grundlinie erwartet werden.
Beispiel:
/DW2 [750 -1000] /W2 [32 255 -800 500 700 256 [-1000 500 800 -900 500 750]]
Damit definieren wir, das die Zeichenhöhe grundsätzlich -1000‰ ist, und der Abstand zwischen Oberkante und horizontaler Grundlinie grundsätzlich 750‰ beträgt. Für die Zeichen 32 bis 255 definieren wir statt dessen eine Zeichenhöhe von -800‰ und einen Abstand von 700‰. Beim Zeichen 256 wird die Zeichenhöhe belassen, aber 800‰ als Abstand eingetragen, und beim Zeichen 257 schliesslich wird die Zeichenhöhe auf -900‰ gesetzt, während der Abstand belassen wird. Die Differenz zwischen linker Kante und Kolonnenmitte wird überall auf 500‰ gesetzt.
Diskussion