Unterschneidung

Bei bestimmten Buchstabenpaaren ist es optisch besser, sie etwas zusammenzurücken. Gute Beispiele sind etwa die Kombinationen „Te“ oder „AV“. Dies nennt man Unterschneidung. Der Schriftdesigner kann vorgeben, welche Buchstabenpaare wie stark zusammengerückt werden sollen. Um Unterschneidung anzuwenden, müssen wir also die entsprechenden Informationen ermitteln, und im PDF vermerken. Natürlich müssen wir sie auch bei der Berechnung von Textbreiten berücksichtigen, damit weiterhin alles korrekt formatiert bleibt.

Textsatz

Um einen Text mit Unterschneidung zu schreiben, brauchen wir eine neue Anweisung. TJ setzt – ähnlich wie Tj – Text an der aktuellen Position. Als Parameter wird aber nicht ein String, sondern ein Array erwartet. Dieses kann aus Strings und Ganzzahlen in beliebiger Mischung bestehen. Ein String bedeutet dabei, dass der entsprechende Text gesetzt wird. Eine Zahl bewirkt, dass der „Cursor“, also die Position für den nächsten String, um den angegebenen Wert nach links geschoben wird. Die Angabe ist dabei in Promille der Schriftgrösse, nicht in Point.

Beispiel:

/F1 12 Tf
BT 72 72 Td [(A) 75 (V-Ausgabe)] TJ ET

Dies schreibt den Text „AV-Ausgabe“, wobei das A und das V um 0,9pt zusammengerückt werden.

Postscript Type1

Die AFM-Datei kann einen sogenannten KernData-Block enthalten. Dieser kann Informationen über Unterschneidung, Vertikalversatz und Tracking enthalten. Uns interessiert hier nur die Unterschneidung.

KernData Block

Der KernData Block beginnt mit einer Zeile StartKernData und endet mit einer Zeile EndKernData. Er kann mehrere Unterblocks enthalten. Die Unterblocks sind entweder TrackKern Blocks oder KernPairs Blocks.

TrackKern Blocks enthalten Informationen über Tracking. Sie sind für uns hier nicht interessant, müssen aber allenfalls erkannt und überlesen werden. TrackKern Blocks beginnen mit einer Zeile StartTrackKern x, wobei „x“ für die Anzahl Einträge steht, und sie enden mit einer Zeile EndTrackKern.

KernPairs Block

Diese Blocks können Informationen über Unterschneidung oder Vertikalversatz haben. Sie beginnen mit einer der Zeilen StartKernPairs x, StartKernPairs0 x, oder StartKernPairs1 x, wobei „x“ jeweils für die Anzahl Einträge steht. Mit StartKernPairs sowie StartKernPairs0 beginnen Blocks für horizontale Schreibrichtung, mit StartKernPairs1 Blocks für vertikale Schreibrichtung. Das Ende des Blocks wird auf jeden Fall mit einer Zeile EndKernPairs markiert.

Innerhalb des Blocks hat es eine Zeile für jede Zeichenkombination, bei der Unterschneidung und/oder Vertikalversatz angewandt werden soll. Dabei steht zunächst ein Buchstabencode, gefolgt von drei oder vier weiteren Werten. Code und Werte sind durch Leerschläge und/oder Tabulatoren getrennt. Folgende Codes sind bei einfachen Type1-Schriften möglich:

KP Unterschneidung und Vertikalversatz
KPXnur Unterschneidung
KPYnur Vertikalversatz

Der weitaus häufigste Code ist dabei KPX. Auf ihn folgen drei Werte:

KPX links rechts Unterschneidung

„links“ und „rechts“ sind dabei die Postscript-Namen des linken und rechten Zeichens des Paars. „Unterschneidung“ ist der Wert, um den das rechte Zeichen verschoben werden soll. Der Wert ist bereits in Promille der Schriftgrösse, muss aber noch negiert werden. Dies, weil ein positiver Wert hier für ein Auseinanderschieben der Zeichen steht, während TJ damit ein Zusammenziehen mitgeteilt wird.

Den Code KP kann man unter Umständen auch berücksichtigen. Auf ihn folgen vier Werte:

KP links rechts Unterschneidung Vertikalversatz

Falls der Vertikalversatz 0 ist, so kann man diesen Eintrag entsprechend einem KPX Eintrag verarbeiten.

TrueType/OpenType

TrueType kann eine Definition für Unterschneidung im „kern“-Block haben. Dieser Block ist optional. Bei OpenType kann dieser Block ebenfalls vorhanden sein, aber dort wird statt dessen häufig das Schriftfeaturesystem verwendet. Zu diesem komme ich in einem späteren Kapitel.

Vom „kern“-Block gibt es eine alte und eine neue Version. Microsoft unterstützt aber nur die alte Version, und auch diese nur teilweise. Ausserhalb von reinen Apple-Schriften ist daher nur dieser Minimalstandard verbreitet, weswegen ich mich darauf beschränke.

der "kern" Block

Der Block beginnt mit folgender Struktur:

PositionGrösseTyp Inhalt
02 Byteuint16Version
22 Byteuint16Anzahl Unterblocks

Die Version muss dabei 0 sein. Ist sie 1, so handelt es sich um die neue Version, die nicht kompatibel ist.

Darauf folgen die einzelnen Unterblocks direkt hintereinander. Normalerweise gibt es genau einen. Die Unterblocks beginnen folgendermassen:

PositionGrösseTyp Inhalt
02 Byteuint16Version
22 Byteuint16Unterblocklänge
42 Byteuint16Unterblocktyp
62 Byteuint16Anzahl Einträge
82 Byteuint16Suchrahmen
102 Byteuint16Selektorgrösse
122 Byteuint16Suchüberschuss

Die Version ist hier nicht festgelegt. Die Unterblocklänge ist die Länge des gesamten Unterblocks, einschliesslich dieser 14 Bytes. Der Unterblocktyp muss 0 für vertikale Schreibrichtung oder 1 für horizontale Schreibrichtung sein (also andersrum als im AFM). Andere Werte bedeuten, dass der Unterblock nicht dem von Microsoft unterstützten Format entspricht. Die Anzahl Einträge schliesslich gibt die Anzahl Zeichenpaare an, für die Unterschneidung angewandt werden soll.

Der Rest des Unterblocks enthält eine Liste mit folgenden Angaben für jedes Zeichenpaar:

PositionGrösseTyp Inhalt
02 Byteuint16GID Zeichen links
22 Byteuint16GID Zeichen rechts
42 Byteint16 Unterschneidung

Die ersten beiden Werte definieren das Zeichenpaar. Der dritte Eintrag ist die Verschiebung des zweiten Zeichens nach rechts in Skala-Einheiten. Für die Verwendung in TJ müssen wir den Wert also in Promille der Schriftgrösse umrechnen, und zudem negieren.