2. Das Seiten-Layout

 

Im vorangegangenen Beispiel wurden schon einige Elemente, die zur Seitengestaltung gebraucht werden, vorgestellt. An dieser Stelle soll das Konzept des Seitenaufbaus und der Seitenreihenfolge eingehend unter die Lupe genommen werden. Die möglichen Elemente eines Seiten-Layouts werden in der folgenden Grafik aufgezeigt und in den folgenden Kapiteln erläutert:

Seiten-Elementstruktur

Seiten-Elementstruktur

2.1. Der Seitenaufbau

In den folgenden Grafiken ist der Aufbau der Seiten zu sehen:

Seitenaufbau

Seitenaufbau

Für die Definition einer Seite in XSL-FO werden folgende Angaben benötigt:

  • Seitenbreite (page-width)

  • Seitenhöhe (page-height)

  • Ränder (optional) in vier Bereiche unterteilt:

    • oben (margin-top)

    • unten (margin-bottom)

    • links (margin-left)

    • rechts (margin-right)

Alle diese Angaben sind im Element fo:simple-page-master mit Hilfe von Attributen zu machen.

Diese Angaben könnten wie folgt lauten:

<fo:simple-page-master master-name="HelloWorld"
 page-height="297mm"
 page-width="210mm"
 margin-left="12mm"
 margin-right="12mm"
 margin-top="20mm"
 margin-bottom="20mm">

Weitere wichtige Attribute des Elements <fo:simple-page-master> zur Ausrichtung des Textes sind:

 

2.2. Die Druckbereiche

Die Druckbereiche dienen zur weiteren Unterteilung der Seite. Hier werden, wie in der Grafik gezeigt, fünf verschiedene Bereiche unterschieden. Zu beachten ist, dass die Platzierung dieser Bereiche an unsere gewohnte Schreibrichtung gebunden ist (von links nach rechts und von oben nach unten).

Bereiche

Druckbereiche

Jeder dieser Bereiche ist ein Kindelement von <fo:simple-page-master> und dient dazu, die Eigenschaften dieser Bereiche zu spezifizieren.

Auch hier ein kleines Beispiel:

<fo:simple-page-master master-name="HelloWorld">
   <fo:region-before extent="20mm"/>                         (1)
   <fo:region-after extent="20mm"/>                          (1)
   <fo:region-body margin-top="10mm" margin-bottom="10mm"/>  (2)
</fo:simple-page-master>

(1) Das hier verwendete Attribut extent gibt die Ausdehnung dieses Bereiches an, im Falle des Kopf- und Fußbereichs also die Höhe.

(2) Der Hauptbereich bildet insofern eine Ausnahme, als seine Ausdehnung nicht angegeben wird. Er ist vielmehr derjenige Bereich, der in der Mitte einer Seite übrig bleibt, nachdem alle Ränder und Bereiche definiert wurden. Für die Seitengestaltung im Ganzen und in vielen möglichen Block-Elementen gibt es die Möglichkeit, Rahmen bzw. Randflächen zu reservieren. In diesem Beispiel wird ein 10 mm hoher Rand am unteren und oberen Hauptbereich spezifiziert. Zusammen mit dem Kopf- und Fußbereich bedeutet dies, dass der Inhalt innerhalb des Hauptbereichs jeweils 30 mm vom oberen und unteren Seitenrand entfernt beginnt bzw. endet, aber direkt an die Seitenränder angrenzt, weil die Start- und End-Regionen nicht spezifiziert sind.

Weitere wichtige Attribute der region-Elemente für ihre Bezeichnung, Rahmen bzw. Ränder, Füllungen und Hintergründe sind:

 

2.3. Die Schreibrichtung

Die Schreibrichtung für den Text ist – wie bekannt – in vielen Sprachen anders als in den europäischen. XSL-FO unterstützt die für alle Weltsprachen üblichen Schreibrichtungen. Die Schreibrichtung kann für ganze Seiten im Element <fo:simple-page-master> oder in Textblöcken oder sogar im inzeiligen Text mit dem Attribut writing-mode bestimmt werden. So ist es z. B. möglich, ein arabisch-deutsches Wörterbuch zu erstellen, für das die Schreibrichtung innerhalb einer Zeile variiert. Das Attribut writing-mode besitzt drei mögliche Werte: lr-tb (leftright-topbottom), rl-tb (rightleft-topbottom) und tb-rl (topbottom-rightleft). Die erste Buchstabenkombination gibt hierbei die Schreibrichtung innerhalb von Zeilen vor, die zweite die Richtung der Aneinanderreihung für die Textblöcke.

Schreibrichtung

Schreibrichtung

Wie in der Darstellung der Schreibrichtungen zu sehen, bestimmt die Schreibrichtung auch die Positionierung der Seitenbereiche.

Die Schreibrichtung kann zusätzlich durch das Ausrichtungs-Attribut reference-orientation gesteuert werden.

 

2.4. Die Ausrichtung

Mit Hilfe des reference-orientation-Attributs lässt sich die Ausrichtung ändern, beispielsweise um Texte zu stürzen. Es kann sieben Werte einnehmen: 0, 90, 180, 270, -90, -180, -270. Der Wert 0 ist hierbei der Vorgabewert. Bei den Werten handelt es sich um Gradangaben, die das Drehen von Textblöcken oder Zeilen in jeweils 90°-Winkeln erlaubt. Dadurch bedingt, drehen sich ebenso die Bereiche eines Textblocks (z. B. oberer oder linker Rand).

Ausrichtung

Ausrichtung

Zur Verdeutlichung der Funktionsweise ein kleines Beispiel:

...
<fo:block-containerreference-orientation="90">      (1)                   
   <fo:blockfont-size="8pt">
      Beispiel für die Textausrichtung.
   </fo:block>
</fo:block-container>

(1) Die Änderung der Ausrichtung ist lediglich in dem Container-Element fo:block-container zulässig, nicht beispielsweise innerhalb von einfachen Blöcken (fo:block). Das Attribut reference-orientation sorgt hier für eine 90°-Drehung des Textes.

2.5. Maßeinheiten

Die von XSL-FO unterstützten Maßeinheiten sind:

Maßeinheit Erläuterung
cm Zentimeter
mm Millimeter
in Inch (1 in = 2,54 cm)
pt DTP-Punkte (1 pt = 1/72 in = 0,353 mm); geringfügig abweichend von Didot-Punkten (= 0,376 mm)
pc Picas (1 pc = 12 pt)
px Pixel
em von der Schriftart und -größe abhängige Einheit (Breite eines M); in der Praxis entspricht 1em der Fonthöhe


Der Antenna House XSL-Formatierer unterstützt alle diese Einheiten einschließlich der ersten Nachkommastelle.

2.6. Seitenfolgen-Vorlagen definieren

Das <fo:page-sequence-master>-Element ist neben dem bereits eingeführten <fo:simple-page-master> das zweite Kindelement des Elements <fo:layout-master-set>. Das Element <fo:page-sequence-master> legt fest, in welcher Reihenfolge die Seitengestaltungen (Vorgabeseiten) oder Sequenzen von Seitengestaltungen in das Dokument eingefügt werden. Bei den Seitenfolgen (<fo:page-sequence-master>) handelt es sich letztlich um eine Bündelung von Einzelseiten oder von ganzen Sequenzen. In welcher Reihenfolge diese anschließend im Dokument erscheinen, wird mit dem Element <fo:page-sequence> festgelegt.

In diesem Buch, wie in vielen anderen, müssen beispielsweise linke und rechte Seiten unterschiedlich behandelt, das Vorwort mit einer römischen Seitennummerierung versehen und das Inhaltsverzeichnis in einem spezifischen Layout generiert werden.

Das <fo:page-sequence-master>-Element enthält lediglich ein Attribut, das dessen Referenznamen festlegt (master-name). Die Seitenfolgen selbst werden durch die enthaltenen Elemente <fo:repeatable-page-master-reference>, <fo:repeatable-page-master-alternatives>, <fo:conditional-page-master-reference> und <fo:single-page-master-reference> definiert.

Hierzu als Beispiel die Seitenfolgen für den Hauptteil dieses Buches:

<fo:page-sequence-master master-name="Inhalt-Seiten">             (1)
   <fo:repeatable-page-master-alternatives>                       (2)
      <fo:conditional-page-master-reference                       (3)
      master-reference="PageMaster.Inhalt-rechts-start" 
      page-position="first" odd-or-even="odd"/>
      <fo:conditional-page-master-reference                       (4)
      master-reference="PageMaster.Inhalt-links" 
      page-position="rest" odd-or-even="even"/>
      <fo:conditional-page-master-reference                       (4)
      master-reference="PageMaster.Inhalt-rechts" 
      page-position="rest" odd-or-even="odd"/>
      <fo:conditional-page-master-reference                       (5)
      master-reference="PageMaster.Teil-links" 
      page-position="last" odd-or-even="even" blank-or-not-blank="blank"/>
      <fo:conditional-page-master-reference                       (6)
      master-reference="PageMaster.Inhalt-links" 
      page-position="last" odd-or-even="even"/>
      <fo:conditional-page-master-reference                       (6)
      master-reference="PageMaster.Inhalt-rechts" 
      page-position="last" odd-or-even="odd"/>
   </fo:repeatable-page-master-alternatives>
   <fo:single-page-master-reference master-reference="PageMaster.Referenz"/> (7)
</fo:page-sequence-master>

(1) Das Attribut master-name legt hier, wie auch in den <fo:simple-page-master>-Elementen, den Namen der Seitenfolge fest, die im <fo:page-sequence-master>-Element definiert wird.

(2) Das Element <fo:repeatable-page-master-alternatives> gibt die Möglichkeit, in <fo:simple-page-master>-Elementen definierte Seiten oder in <fo:page-sequence-master>-Elementen festgelegte Seitenfolgen zu wiederholen oder unter bestimmten Bedingungen ablaufen zu lassen. Zur Festlegung der Anzahl der Wiederholungen steht das maximum-repeat-Attribut bereit.

(3) <fo:conditional-page-master-reference> gibt eine Alternative an. Das Attribut master-reference referenziert die Seitendefinition bzw. Seitenfolge, die eingesetzt werden soll, wenn es sich um die erste Seite handelt (page-position="first"). Außerdem wird festgelegt, dass die erste Seite immer auf einer Seite mit ungerader Seitenzahl stehen soll (odd-or-even="odd"). Sollte der Inhalt der vorangegangenen Seiten in einer ungeraden Seite enden, so wird automatisch eine leere Seite eingefügt, damit die neue Seitenfolge mit einer ungeraden Seite beginnen kann. In diesem Buch betrifft dies u. a. alle Kapitel der ersten Ebene. Sie beginnen jeweils auf einer rechten Seite.

(4) An dieser Stelle wird für die übrigen Seiten (page-position="rest") das Aussehen einer geraden bzw. ungeraden Seite festgelegt.

(5) Hier wird das Aussehen einer geraden (linken) letzten und leeren Seite festgelegt (page-position="last" odd-or-even="even"blank-or-not-blank="blank").

(6) Sollte die letzte Seite nicht leer sein, kommen die hier definierten Seitendefinitionen zum Zug.

(7) Das Element <fo:single-page-master-reference> legt eine Seite oder Seitenfolge fest, die in jedem Fall an dieser Stelle (hier nach allen anderen Seitenfolgen) eingesetzt wird.

Die folgende Grafik veranschaulicht den Ablauf der Seiten und Seitenfolgen entsprechend der obigen Definition:

Seitenfolgen

Seitenfolgen

Das Element <fo:single-page-master-reference> hat lediglich ein Attribut (master-reference).

<fo:conditional-page-master-reference> kann folgende Attribute enthalten:

  • master-reference

  • page-position

  • odd-or-even

  • blank-or-not-blank.

<fo:repeatable-page-master-alternatives> kann lediglich mit dem Attribut maximum-repeat näher bestimmt werden.

 

2.7. Farbprofile

Das optionale Element <fo:declarations> kann ein oder mehrere Kindelemente <fo:color-profile> enthalten, mit denen Farbprofile definiert und referenziert werden. Wenn Sie das im Web gebräuchliche Farbprofil RGB (Rot – Grün – Blau) benutzen wollen, brauchen Sie dieses nicht zu definieren, weil RGB auch ohne jede Deklaration gilt. Im anspruchsvollen Farbdruck kommt man mit dem RGB-Profil jedoch nicht aus. Für die Wahl eines anderen Profils, beispielsweise CMYK, würde die Definition wie folgt aussehen können:

<fo:declarations>
   <fo:color-profile src="..." color-profile-name="CMYK"/>
</fo:declarations>
 

Im Attribut src ist an Stelle der ... auf die extern gespeicherten Farbprofildaten zu verweisen.

 

2.8. Die Seitenfolgen festlegen

Das Element <fo:page-sequence-master> ist, wie oben dargestellt, für die Bündelung der Vorgaben für Seiten und Seitenfolgen zuständig. Wie diese Folgen im Satz der XML-Instanz aufgerufen werden, entscheidet das Element <fo:page-sequence> bzw. die Reihenfolge mehrerer Seitenfolgen, in der diese verarbeitet werden sollen.

Die weitere Aufgabe des <fo:page-sequence>-Elements besteht darin, den im <fo:simple-page-master> definierten Bereichen die Inhalte zuzuordnen. Innerhalb des <fo:page-sequence>-Elements werden die Regionen, die den eigentlichen Inhaltsbereich umfassen (Kopfbereich, Fußbereich, Startbereich, Endbereich) mit ihren statischen Inhalten gefüllt. Außerdem wird für den Inhaltsbereich spezifiziert, welche Inhalte der XML-Instanz in dieser Sequenz zur Verarbeitung importiert werden sollen.

Im folgenden Beispiel handelt es sich um nicht ausführbare, stark vereinfachte Ausschnitte aus dem Stylesheet, das dem Layout dieses Buches zu Grunde liegt. Hier sollen lediglich die prinzipiellen Zusammenhänge der Elemente <fo:layout-master-set>, <fo:simple-page-master>, <fo:page-sequence-master> und <fo:page-sequence> aufgezeigt werden.

<fo:root>
   <fo:layout-master-set>                                             (1)
      <fo:simple-page-master margin="{$Seitenraender-Inhalt-rechts} 
      "master-name="PageMaster.Inhalt-rechts">                        (2)                        
         <fo:region-body margin="{$Body-Raender-Inhalt-rechts}"/>     (3)
         <fo:region-before region-name="Inhalt-rechts-davor" extent="15mm"/> (4)
         <fo:region-after region-name="Inhalt-rechts-danach"/>        (5)
      </fo:simple-page-master>
      ...
      <fo:page-sequence-master master-name="Inhalt-Seiten">           (6)
         <fo:repeatable-page-master-alternatives>                     (6)                  
            <fo:conditional-page-master-reference                     (6)
            master-reference="PageMaster.Inhalt-rechts-start" 
            page-position="first" odd-or-even="odd"/>                         
            <fo:conditional-page-master-reference 
            master-reference="PageMaster.Inhalt-links" 
            page-position="rest" odd-or-even="even"/>                         
            <fo:conditional-page-master-reference                     (6)
            master-reference="PageMaster.Inhalt-rechts" 
            page-position="rest" odd-or-even="odd"/>                         
            <fo:conditional-page-master-reference                     (6)
            master-reference="PageMaster.Inhalt-links" 
            page-position="last" odd-or-even="even"/>
            <fo:conditional-page-master-reference                     (6)
            master-reference="PageMaster.Inhalt-rechts" 
            page-position="last" odd-or-even="odd"/>
         </fo:repeatable-page-master-alternatives>
      </fo:page-sequence-master>
   </fo:layout-master-set>
   ...
   <fo:page-sequence master-reference="Inhaltsverzeichnis" force-page-count="even"> (7)
   ...                         
   </fo:page-sequence>
   <fo:page-sequence master-reference="Inhalt-Seiten" force-page-count="even"> (8)
      <fo:static-content flow-name="Inhalt-rechts-davor-start">                         
         <fo:block>Erste Seite Kopfbereich</fo:block>                         
      </fo:static-content>                         
      <fo:static-content flow-name="Inhalt-rechts-davor">             (4)                  
         <fo:block>Rechte Seite Kopfbereich</fo:block>
      </fo:static-content>
      <fo:static-content flow-name="Inhalt-links-davor">                         
         <fo:block>Linke Seite Kopfbereich</fo:block>
      </fo:static-content>                         
      <fo:static-content flow-name="Inhalt-rechts-danach">            (5)
         <fo:block>Rechte Seite Fußbereich</fo:block>
      </fo:static-content>
      <fo:static-content flow-name="Inhalt-links-danach">                         
         <fo:block>Linke Seite Fußbereich</fo:block>
      </fo:static-content>                         
      <fo:flow flow-name="xsl-region-body">                           (3)  
         <fo:block>
            <xsl:apply-templates/>                                    (9)
         </fo:block>                         
      </fo:flow>
   </fo:page-sequence>
</fo:root>

(1) Im <fo:layout-master-set> werden alle Vorgaben zu Einzelseiten und Seitenfolgen definiert.

(2) Das Element <fo:simple-page-master> definiert die Größe der Seite, Rahmen und Bereiche. In diesem Fall hat die Vorgabeseite den Namen PageMaster.Inhalt-rechts. Dieser Name wird in dem Beispiel im Element <fo:page-sequence-master> wieder aufgegriffen, um diese Seite in eine Seitenfolge zu integrieren. Tatsächlich fehlen in diesem Beispiel etliche weitere <fo:simple-page-master>, die weggelassen wurden, um die Übersicht zu wahren.

(3) Der Bereich <fo:region-body> hat keinen region-name, weil er den festen, vorgegebenen Namen xsl-region-body hat.

(4) Der Bereich <fo:region-before>, also der Kopfbereich der Seite, hat hier den Namen Inhalt-rechts-davor. Dieser muss später in Element <fo:page-sequence> aufgerufen werden, um diesem Bereich einen Inhalt zuzuweisen. Die Zuordnung von Inhalt erfolgt im Kopfbereich mit dem Element <fo:static-content>, das feste Inhalte in diesen Bereich der Seite einfügt. Der feste Inhalt kann einmal darin bestehen, dass er vollkommen statisch ist (beispielsweise bei einem unveränderbaren Titel in allen Seiten der gegebenen Seitenfolge) oder dass der Inhalt generiert wird, wie im Falle einer fortlaufenden Seitennummerierung oder auch eines lebenden Kolumnentitels (beispielsweise die Wiederholung des aktuellen Abschnitttitels im Kopfbereich).

(5) Für den Fußbereich gilt Gleiches wie für den Kopfbereich der Seite.

(6) Im Element <fo:page-sequence-master> werden nun Seitendefinitionen zu Seitenfolgen unter dem Namen Inhalt-Seiten zusammengefasst. Dieser Name wird im Element <fo:page-sequence> aufgerufen, sodass der Formatierer die im Element <fo:page-sequence-master> definierten Seitenfolgen ausführen und mit Inhalt füllen kann.

(7) Mit dem Element <fo:page-sequence> wird nun mindestens eine Seitenfolge, bei Aneinanderreihung mehrerer dieser Elemente werden entsprechend viele Seitenfolgen genau entsprechend ihrer sequenziellen Anordnung im Stylesheet erzeugt. Der darin bezeichnete Inhalt (ist in diesem Beispiel durch ... ersetzt) fließt in die Folge der Seiten ein. Dieses Beispiel hat zwei <fo:page-sequence>-Elemente. Das erste bezieht sich auf einen <fo:page-sequence-master> oder <fo:simple-page-master> mit dem Namen Inhaltsverzeichnis, das zweite auf den <fo:page-sequence-master> mit dem Namen Inhalt-Seiten.

(8) Das Element <fo:page-sequence> enthält hier verschiedene <fo:static-content>-Elemente, die die Kopf- und Fußbereiche der verschiedenen linken und rechten Seiten mit einem kurzen Text beschreiben. Dieser Text würde in den jeweiligen Bereichen der Seiten erscheinen. Im Falle des <fo:flow>-Elementes handelt es sich um das Element, welches festlegt, an welcher Stelle der fließende Text eingefügt werden soll. Jedes <fo:page-sequence>-Element darf lediglich ein <fo:flow> enthalten. Dieses muss nach allen <fo:static-content>-Elementen innerhalb von <fo:page-sequence> gesetzt werden.

(9) Mit dem <xsl:apply-templates/>-Element wird nun der gesamte Inhalt der Instanz an dieser Stelle eingefügt, dies deshalb, weil der gegebene Stylesheet-Teil innerhalb des Templates für das oberste Element (das Root-Element) der zu setzenden XML-Instanz platziert ist.

<fo:page-sequence> kann folgende Attribute enthalten:

  • master-name bezeichnet den Namen der Seitenfolge

  • id definiert eine ID für die Seitenfolge

  • language gibt die Sprache des Inhalts der Seitenfolge an

  • country spezifiziert das Land, in dessen Sprache der Inhalt erfasst ist

  • initial-page-number gibt den Startwert für die Seitennummerierung an

  • force-page-count legt fest, ob die Seitenfolge mit einer geraden oder ungeraden Seite enden oder beginnen soll

  • format legt das Seitennummerierungsformat fest

  • grouping-separator, grouping-size erlauben weitere Festlegungen über die Art und das Format der Nummerierung

  • letter-value dient zur Formatierung der Seitennummern bei alphanumerischer Zählung.

 

2.9. Textflüsse und statische Inhalte

Innerhalb des Elements <fo:flow> fließen die Inhalte und werden ggf. zu Seiten umbrochen, wenn der Umfang das Aufnahmevermögen einer Seite übersteigt. Der Inhalt dieses Elements bestimmt den Zeilen- und Sei­ten­um­bruch und damit die Anzahl der generierten Seiten.

Das Element <fo:static-content> bestimmt die statischen Inhalte von Seitenbereichen außerhalb des Bereichs, der den fließenden Inhalt aufnimmt. Der Inhalt dieser Bereiche ist nicht an Seiten- und Zeilenumbrüchen beteiligt. Ist beispielsweise der Inhalt eines <fo:static-content> im Bereich einer Seite zu groß, wird der Formatierer keinen Sei­ten­um­bruch erzeugen, sondern entweder die Formatierung abbrechen oder eine Warnung ausgeben, die den Überfluss (overflow) in dem gegebenen Bereich anzeigt.

Beide Elemente <fo:flow> und <fo:static-content> haben nur ein Attribut, flow-name. Der Attributwert verweist auf das Attribut region-name mit dem gleichen Attributwert in einem <fo:simple-page-master>-Element.

Innerhalb einer <fo:page-sequence> darf es lediglich ein <fo:flow> geben, dies muss nach allen <fo:static-content>-Elementen platziert sein.

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSL-FO bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © dpunkt.verlag GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSL-FO in der Praxis" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, fon 06221-14830, fax 06221-148399, hallo(at)dpunkt.de