4. Rahmen, Ränder, Abstände und Co.

In XSL-FO gibt es mehrere Konzepte zur Positionierung von Inhalten in Blöcken und zur Erzeugung von Abständen, Rahmen, Einrückungen und Rändern. Diese Konzepte können oft alternativ eingesetzt werden. In diesem Kapitel werden die unterschiedlichen Möglichkeiten und ihre Zusammenhänge vorgestellt und auch einige Empfehlungen für die Praxis gegeben, da die unüberlegte Anwendung der Konzepte eine Fehlerquelle ersten Ranges sein kann.

In der folgenden Grafik sind einige der zur Inhaltspositionierung innerhalb eines Blocks geeigneten Konzepte illustriert:

Rahmen und Abstände

Rahmen und Abstände

4.1. Ränder

 

Ränder, die mit den margin-Attributen erzeugt werden, stellen die gebräuchlichste Form zur Erzeugung von Abständen dar. Die Abstände beziehen sich auf die Flächen zwischen den Bereichsgrenzen (Satzspiegelgrenze) und die darin liegenden Blöcken sowie Flächen zwischen Blöcken.

Die fünf möglichen Attribute für Ränder sind:

  • margin-top (oben)

  • margin-bottom (unten)

  • margin-left (links)

  • margin-right (rechts)

  • margin (oben, unten, links und rechts)

Der Formatierer setzt die Ränder für Blöcke nach folgenden Regeln:

  • Werden keine Ränder spezifiziert, erstreckt sich der Block auf Satzspiegelbreite. Aufeinanderfolgende Blöcke werden ohne Abstand untereinander geschichtet. Diese Regel gilt, weil der in XSL-FO vorgegebene Wert für alle Ränder auf 0pt gesetzt ist.

  • Wird für Links bzw. Rechts ein Rand mit einem positiven Wert spezifiziert, wird der Block links bzw. rechts entsprechend eingezogen.

  • Wird für Oben bzw. Unten ein Rand mit einem positiven Wert spezifiziert, entsteht eine entsprechende Fläche über bzw. unter dem Block. Ein ggf. nachfolgender Block wird entsprechend weiter nach unten verschoben.

  • Die Werte für Ränder werden nicht vererbt, d. h. untergeordnete Blöcke übernehmen die Werte übergeordneter Blöcke nicht.

  • Untergeordnete Blöcke gehen immer von den Rändern des übergeordneten Blocks aus.

  • Negative Werte für Ränder links bzw. rechts führen ggf. zur entsprechenden Überschreitung der Satzspiegelgrenzen. Negative Werte für oben bzw. unten werden ignoriert und sollten deshalb nicht gesetzt werden.

Beispiel:

<fo:block margin-left="20mm">                              (1)
   INHALT INHALT  INHALT INHALT INHALT INHALT INHALT
   <fo:block margin-left="20mm">                           (2)
      INHALT INHALT INHALT INHALT INHALT INHALT INHALT
   </fo:block>
</fo:block>
<fo:block margin-top="20mm" margin-left="-10mm">           (3)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT
</fo:block>

(1) Das Attribut margin-left erzeugt einen Rand zur linken Satzspiegelgrenze. Der Inhalt wird somit um 20mm eingezogen.

(2) Da dieser Block ein Kindelement des ersten ist, ist der Ausgangspunkt der um 20mm nach rechts verschobene linke Rand des Elternblocks. Hinzu kommen wiederum 20mm Rand, sodass der Block insgesamt um 40mm vom Satzspiegelrand eingezogen ist.

(3) Dieser Block hat einen Rand nach oben hin. Es wird so ein Abstand zum oberen Block erzeugt. Der negative Wert von margin-left erweitert den Block um 10mm nach links und lässt den Block außerhalb der linken Satzspiegelgrenze beginnen.

Formatierer-Ansicht

Formatierer-Ansicht

4.2. Innenabstände

 

Mit Hilfe der padding-Attribute lassen sich Abstände von den Blockgrenzen nach innen festlegen. Der Block wird durch die padding-Attributwerte entsprechend vergrößert.

Die padding-Attribute sind:

  • padding-start (bei Schreibrichtung lr-tb – die für europäische Sprachen übliche: links)

  • padding-end (bei Schreibrichtung lr-tb: rechts)

  • padding-left (links)

  • padding-right (rechts)

  • padding-before (bei Schreibrichtung lr-tb: oben)

  • padding-after (bei Schreibrichtung lr-tb: unten)

  • padding-top (oben)

  • padding-bottom (unten)

  • padding (Kurzform für oben, rechts, unten und links)

Der Formatierer setzt die padding-Attributwerte für Blöcke nach folgenden Regeln um:

  • Sind links bzw. rechts Ränder (margin) gesetzt, geht der Innenabstand von den Rändern aus.

  • Sind links bzw. rechts keine Ränder gesetzt, wird der Block entsprechend auch über die Satzspiegelgrenzen links bzw. rechts vergrößert.

  • padding oben bzw. unten führt zu einem entsprechenden Abstand vom vorausgehenden bzw. nachfolgenden Block. Dafür sollte padding nicht verwendet werden, an dieser Stelle sind margin oder space zu bevorzugen.

  • padding zur Satzspiegelgrenze führt nicht zu einer Einrückung des Inhalts, aber zu einer Vergrößerung des Blocks über den Satzspiegel hinaus.

  • Die Werte für padding werden nicht vererbt, d. h. untergeordnete Blöcke übernehmen die Werte übergeordneter Blöcke nicht.

  • Negative Werte für padding werden ignoriert.

Beispiel:

<fo:block padding="10mm 10mm 10mm 10mm">                  (1)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT 
   <fo:block padding="10mm 10mm 10mm 10mm">               (2)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT                         
   </fo:block>                                            (2)
</fo:block>                         
<fo:block padding="10mm 10mm 10mm 10mm">                  (3)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT
</fo:block>

 

Formatierer-Ansicht

Formatierer-Ansicht

(1) Das padding-Attribut erzeugt einen Abstand nach oben und unten zum nächsten Block. In diesem Fall zum dritten Block, da der zweite sich innerhalb der Blockgrenzen des ersten befindet. Die padding-Abstände nach links und rechts führen zu keiner Einrückung des Inhalts, da sie auf die Satzspiegelgrenzen treffen.

(2) Das padding-Attribut erzeugt einen Abstand zum oberen und unteren Block. Die padding-Abstände nach links und rechts führen zu keiner Einrückung des Inhalts, da sie auch hier auf die Satzspiegelgrenzen treffen.

(3) Das padding-Attribut erzeugt einen Abstand zum oberen Block. Der Abstand beträgt 30mm, da hier die Abstände der beiden oberen Blöcke auf den des unteren treffen und aufaddiert werden.

In der Praxis wird das padding häufig für mikrotypografische Feinheiten eingesetzt. Hierfür ein Beispiel (die Seitenzahlen in diesem Buch):

...
<fo:block line-height="6pt" text-align="left" border-start-style="solid" 
border-before-style="solid" border-before-width="1pt" border-start-width="1pt" margin-top="10.7mm" margin-bottom="0.7mm">     (1)                        
   <fo:block padding-top="0.7mm" padding-left="1mm">     (2)                            
      <fo:page-number/>
   </fo:block>
</fo:block>
...

(1) Dieser äußere Block dient zur Positionierung des Inhaltsblocks, der einen Block mit den Seitenzahlen enthält. Ebenfalls wird der sichtbare Rahmen (border-start-style="solid" border-before-style="solid") an dieser Stelle festgelegt und dessen Linienstärke (border-before-width="1pt" border-start-width="1pt") bestimmt.

(2) Der innere Block enthält die automatisch generierten Seitenzahlen und die Angaben zum Innenabstand zu dem Rahmen. Es wäre ebenso möglich, diesen inneren Block wegzulassen und auch die Innenabstände im äußeren Block zu spezifizieren. Die Spezifikation des inneren Blocks mit seinen padding-Attributen erleichtert die Übersicht.

Seitenzahl im Kopfbereich

Seitenzahl im Kopfbereich

 

4.3. Rahmen

Rahmen umfassen Blöcke. Entsprechend ihrer Breite fügen sie dem Block, den sie umfassen, außerhalb eine Fläche hinzu. Rahmen werden mit den border-Attributen spezifiziert.

Zur Festlegung der Rahmen in den vier Richtungen stehen die folgenden vier Attribute zur Verfügung. Die deutschsprachigen Bezeichnungen gehen von der Schreibrichtung von links nach rechts und von oben nach unten aus.

  • border-before (oben)

  • border-after (unten)

  • border-start (links)

  • border-end (rechts)

Diese Rahmen in ihrer Grundform können durch weitere Spezifikationen einzeln in ihrer Darstellung bestimmt werden. Hierzu stehen zur Verfügung:

  • color (Farbe des Rahmens)

  • style (Erscheinungsform des Rahmens; zulässige Werte sind beispielsweise solid (durchgehende Linie oder Fläche), double (doppelte Linie) oder dotted (punktierte Linie)

  • width (Linienstärke bzw. Breite des Rahmens)

Beispiel:

<fo:block border-style="solid" border-width="1mm" margin-bottom="10mm" padding="12mm 12mm 12mm 12mm">  (1)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT 
   <fo:block border-style="solid" border-width="1mm" padding="10mm 10mm 10mm 10mm">  (2)
      INHALT INHALT INHALT INHALT INHALT INHALT INHALT 
   </fo:block>                         
</fo:block>
<fo:block border-style="solid" border-width="1mm">          (3)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT 
</fo:block> 

(1) Das Attribut border-style mit dem Wert solid erzeugt einen Rahmen mit einer durchgezogenen Linie um den Block herum. Die Liniendicke wird mit dem Attribut border-width festgelegt. Da hier ein padding-Abstand definiert wurde und der Block einen weiteren enthält, umgibt der Rahmen den Inhalt der beiden Blöcke im Abstand von 12mm gemessen vom inneren Rand des Rahmens. Das margin-bottom erzeugt einen Abstand von 10mm zum folgenden dritten Block.

(2) Dieser Block ist in den ersteren verschachtelt und somit auch von diesem umgeben.

(3) Da dieser Block keinen padding-Abstand hat, liegt der erzeugte Rahmen direkt an der Grenze zum Inhalt auf.

Formatierer-Ansicht

Formatierer-Ansicht

Die folgende Abbildung zeigt die Linienausprägungen, die das Attribut style ermöglicht.

Rahmenlinien

Rahmenlinien

Zur Verdeutlichung einige Stylesheet-Beispiele für Rahmen:

...
<fo:block text-align="center"                         
 border-before-style="solid" border-before-width="5mm"              (1)
 border-after-style="double" border-after-width="3mm"               (2)          
 border-start-style="dotted" border-start-width="1mm"               (3)
 border-end-style="dashed" border-end-width="1mm">                  (4)
 Einheitliche Farbe, verschiedene Linienbreiten und verschiedene Linienarten
</fo:block>                         
<fo:blocktext-align="center"                         
 border-width="2mm" border-style="solid"                            (5)
 border-before-color="grey" border-after-color="red"              
 border-start-color="blue" border-end-color="green">                (6)
 Verschiedene Farben, einheitliche Linienbreite und einheitliche Linienart
</fo:block>
...
 

(1) Der Attributwert solid bewirkt das Aussehen einer durchgehenden Linie und ist in diesem Beispiel am oberen Rand (before) des Blockes angesiedelt.

(2) Der Attributwert double erzeugt eine doppelte Linie am unteren Rand.

(3) Der Wert dotted erzeugt eine gepunktete Linie am linken Rand.

(4) Der Wert dashed erzeugt eine gestrichelte Linie am rechten Rand.

(5) Die Attribute border-width, border-style und border-color können eingesetzt werden, wenn alle Rahmenteile des Blockes gleich gestaltet sein sollen.

(6) Mit dem Anhang color wird eine von der Grundfarbe abweichende Farbe spezifiziert.

Formatierer-Ansicht

Formatierer-Ansicht

Der Formatierer setzt die border-Attributwerte für Blöcke nach folgenden Regeln um:

  • Sind links bzw. rechts Ränder (margin) gesetzt, geht die äußere Rahmenbegrenzung von den Rändern aus.

  • Sind links bzw. rechts keine Ränder gesetzt, ragt der Rahmen entsprechend auch über die Satzspiegelgrenzen links bzw. rechts heraus.

  • border oben bzw. unten führt zu einem entsprechenden Abstand vom vorausgehenden bzw. nachfolgenden Block.

  • Die Werte für border werden nicht vererbt, d. h. untergeordnete Blöcke übernehmen die Werte übergeordneter Blöcke nicht.

  • Negative Werte für border werden ignoriert.

 

4.4. Abstände (vertikale Vorschübe)

 

Die space-Attribute geben eine Reihe von Möglichkeiten zur genaueren Spezifikation von vertikalen Abständen (Vorschüben) zwischen Blöcken zur Hand. Mit Hilfe des margin-Attributs lässt sich zwar ebenfalls ein Abstand zu einem folgenden Block erzeugen, jedoch werden die Ränder lediglich aufaddiert, wenn für einen vorausgehenden Block ein Wert margin-bottom und für den nachfolgenden Block ein Wert margin-top spezifiziert ist. Mit den space-Attributen hingegen lassen sich die Abstände aufeinanderfolgender Blöcke vielfältiger und genauer kontrollieren.

Für die Attribute space-after und space-before stehen hierzu folgende Anhänge zur Verfügung:

Der Anhang .precedence bestimmt beim Aufeinandertreffen von after- und before-Werten, welche Spezifikation bevorzugt (mit Priorität) für den Vorschub gewählt wird. Die Größe des Vorschubs wird durch die Attributwerte in space-after bzw. space-before oder in .optimum, .minimum, .maximum vorgegeben.

Mit dem Anhang .conditionality lässt sich das Verhalten von zwei aufeinander bezogenen Vorschub-Spezifikationen bei Seitenumbrüchen (space-after im vorausgehenden Block, space-before im folgenden Block) durch die zwei möglichen Attributwerte discard und retain bestimmen. Wird der Anhang .conditionality nicht verwendet, so gilt der Vorgabewert discard. Dieser bewirkt, dass bei Seitenumbrüchen der Block auf der neuen Seite immer am oberen Satzspiegelrand beginnt. Im Falle von retain hingegen wird der Abstand zum oberen Satzspiegelrand auf der neuen Seite beibehalten.

Einfaches Beispiel:

<fo:block space-after="20mm" border-style="solid" border-color="#0033CC" 
border-width="5mm" font-size="30pt"> (1)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT                         
</fo:block>
<fo:block space-before="20mm" padding="5mm 5mm 5mm 5mm" border-style="solid" border-color="#0033CC" border-width="5mm" font-size="30pt"> (1)
   INHALT INHALT INHALT INHALT INHALT INHALT INHALT 
</fo:block>

 

Formatierer-Ansicht

Formatierer-Ansicht

(1) Die Attribute space-after und space-before erzeugen einen Abstand zwischen den beiden Blöcken. Da sie nicht aufaddiert werden, ist der Abstand 20mm und das Resultat entspricht dem des vorangegangenen Beispiels, in dem ein Rand von 20mm mit Hilfe des margin-bottom-Attributs erzeugt wurde.

Zur Verdeutlichung der Wirkung von Vorschüben ein weiteres, komplexeres Beispiel:

...
<fo:block text-align="center" border-width="2pt" border-style="solid"
 space-after.precedence="force" space-after="10mm">                (1)
   Block mit höchster Priorität
</fo:block>
<fo:block text-align="center" border-width="2pt" border-style="solid"
 space-before="10000mm" space-before.precedence="5"                (1)
 space-after="10mm" space-after.precedence="5">                    (2)
   space-before wird nicht berücksichtigt, space-after wird berücksichtigt
</fo:block>
<fo:block text-align="center" border-width="2pt" border-style="solid"                         
 space-before="10000mm" space-before.precedence="4"                (3)         
 space-after="20mm">
   space-before wird nicht berücksichtigt                         
</fo:block>
<fo:blocktext-align="center" border-width="2pt" border-style="solid" space-before="10mm"> (3)
   Bei gleicher Priorität wird der größere Abstand übernommen 
</fo:block>                         
...

(1) Da der Wert force für das Attribut space-after.precedence der höchstmögliche ist, wird der space-after-Abstand eingehalten und der space-before-Abstand des zweiten Blockes ignoriert.

(2) In diesem Fall entscheidet die höhere Priorität über den Einsatz des Vorschubs. Da die space-after.precedence größer ist als die space-before.precedence des folgenden Blocks, wird der space-after-Abstand des ersteren Blocks verarbeitet.

(3) An dieser Stelle gibt es keine expliziten Angaben zur Priorität. Beide Prioritäten haben folglich den Wert "0" und sind gleich. In diesem Fall wird die Spezifikation des größeren Abstands der beiden benachbarten Blöcke verwendet, in diesem Fall der space-after-Vorschub des oberen Blocks.

Formatierer-Ansicht

Formatierer-Ansicht

<< 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