Fliesstext

Ein paar einzelne Worte zu setzen, ist einfach. Fliesstext ist da schon schwieriger. Nun ist aber Fliesstext das wohl häufigste Element in einem PDF. Es wird also Zeit, dass wir uns dies mal genauer anschauen.

linksbündig, rechtsbündig und zentriert

Einen Text linksbündig zu setzen, ist simpel. Die X-Koordinate der Anweisung Td bezeichnet schliesslich die horizontale Position, von der aus nach rechts geschrieben werden soll. Folglich brauchen lediglich alle Zeilen dieselbe X-Koordinate.

Rechtsbündiger Text ist etwas schwieriger. Hierfür müssen wir für jede Zeile die Länge bestimmen. Diese ziehen wir dann von der X-Koordinate ab, an der die Zeile rechts ausgerichtet werden soll. Das Ergebnis ist die Zahl, welche wir Td übergeben müssen.

Auch für zentrierten Text müssen wir erst für jede Zeile die Länge bestimmen. Dies teilen wir dann durch zwei, und ziehen es von der X-Koordinate der gewünschten Textmitte ab. Das Ergebnis übergeben wir wiederum als X-Koordinate an Td.

Blocksatz

Beim Blocksatz wird die X-Koordinate genau gleich gesetzt, wie bei linksbündigem Text. Zusätzlich müssen wir die Leerräume zwischen den Worten verbreitern, damit die Zeile die volle Blockbreite ausfüllt. Dafür gibt es die Anweisung Tw. Sie betrifft alle folgenden Zeilen, und sollte dementsprechend nach getaner Arbeit auf 0 gesetzt werden. Alternativ kann man Gruppierung verwenden. Die q und Q Anweisungen müssen dann aber gemäss Standard komplett ausserhalb des BT ET Blocks sein.

Die Tw Anweisung hat einen Parameter, der angibt, um wieviele Point die Leerschläge verbreitert werden sollen. Um die entsprechende Zahl zu erhalten, müssen wir erst die Zeilenlänge mit normalen Leerschlägen berechnen. Danach ziehen wir von der Blockbreite die so errechnete Zeilenlänge ab, und dividieren das Ergebnis durch die Anzahl der Leerschläge in der Zeile.

Falls eine Zeile keine Leerschläge enthält, so bleibt nichts anderes übrig, als den Abstand zwischen den normalen Buchstaben zu erhöhen. Hierfür dient die Tc Anweisung. Sie erwartet einen Parameter mit dem zusätzlichen Zeichenabstand in Point. Die Berechnung dieser Zahl erfolgt wie bei Tw, ausser, dass wir durch die Anzahl Zeichen statt durch die Anzahl Leerschläge dividieren.

Es ist üblich (und meist besser), die letzte Zeile eines Absatzes ganz normal linksbündig zu setzen. Dies, weil sie meist deutlich kürzer ist, als die vorhergehenden Zeilen, und die Leerräume somit über Gebühr gedehnt würden.

oberer und unterer Rand

Die Y-Koordinate von Td legt bekanntlich nicht den oberen oder unteren Rand der Zeile fest, sondern die Höhe der Grundlinie. Das macht es einfach, unterschiedliche Schriftgrössen auf einer Zeile zu mischen, aber es macht es etwas schwierig, wenn wir eine Zeile an einem oberen oder unteren Seitenrand ausrichten wollen.

Hierfür brauchen wir die Oberlänge und Unterlänge (/Ascent und /Descent aus dem Schriftdeskriptor). Wie so häufig in der Typographie ist die Bedeutung dieser Begriffe nicht allumfassend normiert, aber die Adobe Definition lautet wie folgt: Die Oberlänge ist der ideale Abstand der Grundlinie zum oberen Rand. Die Unterlänge ist der ideale Abstand der Grundlinie zum unteren Rand. Nicht vergessen: Die Unterlänge ist ein negativer Wert (da sie „nach unten“ geht).

Falls wir aus irgend einem Grund keine Ober- und Unterlänge haben, können wir als Daumenregel 750‰ als Oberlänge und -250‰ als Unterlänge verwenden.

Zeilenabstand

Platzieren wir eine Zeile unter einer anderen, so sollte der Abstand der Grundlinien 1200‰ der Zeilenhöhe der unteren Zeile entsprechen.

Bei TrueType- und OpenType-Schriften kann der Schriftdesigner einen von der Norm abweichenden Zeilenabstand festlegen. Wenn wir dies beachten wollen, so müssen wir den entsprechenden Wert extrahieren. Er befindet sich im „OS/2“ Block der Schriftdatei an Position 72, und es handelt sich um eine int16 Zahl. Dieser Wert muss wie üblich in Promille der Schriftgrösse umgerechnet werden. Der so errechnete Wert ist der Durchschuss, nach Adobe Definition die Distanz zwischen dem unteren Rand der oberen Zeile, und dem oberen Rand der unteren Zeile. Indem wir 1000 addieren, erhalten wir die Distanz der Grundlinien in Promille der Schriftgrösse.

Anweisungen für Fliesstext

Es gibt ein paar Anweisungen in PDF, die das Setzen von Fliesstext erleichtern, der linksbündig oder in Blocksatz ist. Um diese zu nutzen, müssen wir die zusammengehörigen Zeilen des Absatzes in einen gemeinsamen BT ET Block packen, statt einen Block pro Zeile zu schreiben.

Die Td Anweisung

Diese Anweisung ist nichts neues, aber sie verhält sich etwas anders, wenn wir alle Zeilen in einem Block haben. In diesem Fall interpretiert nur die erste Td Anweisung des Blocks die Koordinaten relativ zum Nullpunkt. Die nachfolgenden Anweisungen interpretieren die Koordinaten relativ zu den Startkoordinaten der letzten Zeile. Für Fliesstext sollte ab der zweiten Zeile folglich die X-Koordinate 0, die Y-Koordinate die Distanz der Grundlinien in Point sein. Letzteres muss negativ sein, da wir ja nach unten gehen.

Vorsicht bei rechtsbündigen und zentriertem Text: Nicht nur die Y-Koordinate ist relativ zur vorherigen Zeile, sondern auch die X-Koordinate. Darum ist es für diese Formatierungen oft einfacher, wie gehabt jede Zeile einzeln zu setzen.

Die TL Anweisung

Diese Anweisung erwartet einen Parameter mit der ab dieser Position im Block gewünschte Distanz der Grundlinien in Point. Anders als bei der Td Anweisung muss der Parameter positiv sein. Die Anweisung selbst hat keine direkte Auswirkung, beeinflusst aber den Effekt der T*, ' und “ Anweisungen.

Die T* Anweisung

Diese Anweisung kann ab der zweiten Zeile anstelle von Td genutzt werden. Sie hat keine Parameter, und platziert den nachfolgenden Text auf der nächsten Zeile. Damit diese Anweisung funktioniert, muss zuvor mit TL der Zeilenabstand definiert werden.

Die TD Anweisung

Diese Anweisung kann erst ab der zweiten Zeile verwendet werden. Sie funktioniert grundsätzlich gleich wie die Td Anweisung, setzt aber zusätzlich automatisch den Zeilenabstand anhand der Höhendifferenz zur letzten Zeile. Die TD Anweisung ist vor allem praktisch für Absätze mit Erstzeileneinzug, da dort die Position der zweiten Zeile ohnehin explizit gesetzt werden muss, und man sich so die TL Anweisung sparen kann.

Die ' Anweisung

Dies ist eine Kombination der Anweisungen T* und Tj. Erwartet wird ein Parameter mit dem Text, der auf der nächsten Zeile gesetzt werden soll.

Die " Anweisung

Dies ist eine Kombination der Anweisungen Tw, Tc, T* und Tj. Erwartet werden drei Parameter mit der Verbreiterung des Wortabstands, der Verbreiterung des Zeichenabstands, und dem Text, der auf der nächsten Zeile gesetzt werden soll.

Zeilenumbrüche

Oft passt ein Text nicht auf eine Zeile, und PDF bricht den Text leider nicht für uns um. Wir müssen selbst bestimmen, wie der Text auf die einzelnen Zeilen aufgeteilt werden soll.

"first-fit" Algorithmus

Dies ist der am Häufigsten verwendete Algorithmus. Er ist sehr einfach, liefert aber nicht immer das beste Ergebnis.

Bei diesem Algorithmus wird der Text von vorne bis hinten durchgearbeitet. Bei jedem Wort wird geprüft, ob es noch auf die Zeile passt. Falls ja, wird es an die bestehende Zeile angehängt. Falls nein, wird mit diesem Wort eine neue Zeile begonnen.

Das Resultat ist, dass immer so viel Text wie möglich auf einer Zeile landet. Dies kann leider zu deutlich unterschiedlich langen Zeilen innerhalb des Textes führen.

"total-fit" Algorithmus

Bei „total-fit“ werden die Absätze als Ganzes betrachtet, um möglichst regelmässige Zeilenlängen zu erhalten. Das Ergebnis wirkt optisch deutlich angenehmer. Es gibt hierfür verschiedene Methoden, aber am bekanntesten ist wohl der Knuth/Plass Algorithmus (auch bekannt als TeX Algorithmus). Ich stelle hier eine etwas vereinfachte Variante davon vor:

Im Grundsatz werden verschiedene mögliche Varianten, den Text umzubrechen, durchprobiert, und jeweils die Qualität bewertet. Die beste Variante wird dann genommen. Die Qualität errechnet sich folgendermassen:

Für jede Zeile wird die „Badness“ (Schlechtheit) ermittelt. Zunächst wird errechnet, wie lange die Zeile würde (mit normalen Wort- und Zeichenabständen), und dies mit der Breite des Textblocks verglichen. Sind beide Zahlen identisch, so ist die Badness 0. Ist die Zeile kürzer, so ist die Badness die Differenz hoch zwei. Ist die Zeile länger, so ist die Badness unendlich. Eine Ausnahme besteht für die letzte Zeile des Absatzes. Ist diese Zeile zu kurz, so ist die Badness trotzdem 0. Eine zu lange Zeile ergibt weiterhin eine Badness von unendlich.

Für Blocksatz empfiehlt sich eine Variation des Verfahrens. Ist die Zeile zu kurz, so soll nicht die Differenz zur maximalen Länge im Quadrat genommen werden. Statt dessen wird die Differenz durch die Anzahl Leerschläge innerhalb der Zeile geteilt, und das Resultat im Quadrat genommen. Dadurch wird dem Umstand Rechnung getragen, dass eine Zeile mit vielen Leerschlägen stärker gedehnt werden kann, ohne das es auffällt.

Die Summe der Badness der einzelnen Zeilen ergibt die Qualität der Umbruchsvariante. Kleinere Werte sind logischerweise besser. Ein Wert von unendlich bedeutet, dass der Text so nicht umgebrochen werden kann.

Die Sache ist grundsätzlich nicht kompliziert. Alle Möglichkeiten durchzuprobieren ginge aber viel zu lange, da deren Zahl mit der Länge des Absatzes exponentiell ansteigt. Hier behilft man sich mit einem „Shortest Path“ Algorithmus, wobei sich der Dijkstra-Algorithmus anbietet. Dabei gilt der Textanfang als Startpunkt, das Textende als Endpunkt, und die Zeilenumbrüche als Zwischenpunkte. Als Distanz zwischen zwei Punkten wird die Badness der Zeile genommen, die aus den jeweiligen Zeilenumbrüchen resultieren würde. Nicht vergessen: Die letzte Zeile (diejenige zum Endpunkt hin) erhält eine Badness von 0, wenn sie zu kurz ist.

geschützte Leerschläge

Der Zeichensatz „ISO Latin-1“, und damit auch „Windows westlich“, definiert absichtlich zwei verschiedene Leerschläge. Der normale Leerschlag (Code 0x20), und der geschützte Leerschlag (Code 0xA0). Letzterer ist vor allem für Leerräume in Abkürzungen oder Namen gedacht, an denen nicht umgebrochen werden sollte.

In PDF werden beide gleich dargestellt, aber Tw verbreitert nur normale Leerschläge. Ansonsten ist es vor allem eine Information für uns, wo umgebrochen werden darf.

Absatztrennung

Die Meisten dürften es sich gewohnt sein, Absätze durch eine Leerzeile voneinander zu trennen. In PDF müssen wir hierfür natürlich keine Leerzeile setzen. Es reicht, die oberste Grundlinie des Absatzes zwei Zeilenabstände unterhalb der untersten Grundlinie des vorherigen Absatzes zu platzieren.

Indem wir die Absätze einzeln platzieren, haben wir natürlich auch mehr Freiheiten. So ist es oft besser, den Abstand auf nur 1,5 Zeilenabstände zu setzen. Das macht den Text kompakter, ohne das er schlechter lesbar wäre.

Noch kompakter ist es, die Absätze mit einem Erstzeileneinzug statt einem Leerraum zu markieren. Der Abstand entspricht in diesem Fall der Zeilenhöhe, die Absätze folgen also direkt aufeinander. Die X-Koordinate der ersten Zeile ist aber etwas grösser, als die X-Koordinate der restlichen Zeilen des Absatzes. Die Differenz der X-Koordinaten ist der Einzug.

Falls man die Variante mit Einzug wählt, so gilt als Daumenregel: Der erste Absatz erhält keinen Einzug; bei den folgenden Absätzen erhält die erste Zeile einen Einzug, welcher der Schriftgrösse entspricht.

Seitenumbrüche

Vor allem bei langen Texten wird es vorkommen, dass dieser auf mehrere Seiten aufgeteilt werden muss. Hier ist vor allem zu beachten, dass in PDF jede Seite für sich steht. Das heisst, auf der nächsten Seite müssen alle Anweisungen zur Einstellung der Schrift neu getroffen werden, und es braucht auch einen neuen BT ET Block. Falls das Dokument Kopf- oder Fusszeilen hat, müssen diese natürlich auch neu geschrieben werden.

Was den Ort des Umbruchs betrifft, so ist dieser idealerweise zwischen Absätzen. Er kann aber auch innerhalb von Absätzen erfolgen, was sich gerade bei langen Absätzen oft nicht vermeiden lässt. Es gibt drei Regeln, die man beachten sollte:

  • Kein Seitenumbruch zwischen einer Überschrift und der ersten Zeile des zugehörigen Textes.
  • Kein Seitenumbruch unmittelbar nach der ersten Zeile eines mehrzeiligen Absatzes.
  • Kein Seitenumbruch unmittelbar vor der letzten Zeile eines mehrzeilgen Absatzes.

In den ersten beiden Fällen sollte man die Überschrift bzw. den Absatz komplett auf die nächste Seite schieben. In letzterem Fall kann man auch den Seitenumbruch eine Zeile „zu früh“ vornehmen.