XSL-FO Praxis
Manfred Krüger, Ursula Welsch
XSL-FO Praxis schnell + kompakt
Manfred Krüger, Ursula Welsch XSL-FO Praxis schnell + kompakt ISBN 978-3-939084-62-4
© 2007 entwickler.press, ein Imprint der Software & Support Verlag GmbH
http://www.entwickler-press.de http://www.software-support.biz Ihr Kontakt zum Verlag und Lektorat:
[email protected] Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detailiierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.
Korrektorat: Sandra Michel Satz: durch die Autoren Umschlaggestaltung: Caroline Butz Belichtung, Druck und Bindung: M.P. Media-Print Informationstechnologie GmbH, Paderborn. Alle Rechte, auch für Übersetzungen, sind vorbehalten. Reproduktion jeglicher Art (Fotokopie, Nachdruck, Mikrofilm, Erfassung auf elektronischen Datenträgern oder andere Verfahren) nur mit schriftlicher Genehmigung des Verlags. Jegliche Haftung für die Richtigkeit des gesamten Werks kann, trotz sorgfältiger Prüfung durch Autor und Verlag, nicht übernommen werden. Die im Buch genannten Produkte, Warenzeichen und Firmennamen sind in der Regel durch deren Inhaber geschützt.
Inhaltsverzeichnis XSL-FO – wovon reden wir?
7
Kapitel 1: XSL-FO – Einsatzszenarien
11
Kapitel 2: XSL-FO – Prozess und Software-Komponenten 2.1 Eingangsdaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Verarbeitungsprozess . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 FO-Formatierer – Standard- plus proprietäre Merkmale . . . 2.4 XSLT-Prozessoren – die Daten-Vorkäuer . . . . . . . . . . . . 2.5 Stylesheet-Designer – nützliche Spezialwerkzeuge? . . . . .
15 15 15 17 24 25
Kapitel 3: Stylesheetdesign 3.1 Das Wurzelelement . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Der Aufbau des Stylesheets . . . . . . . . . . . . . . . . . . . 3.3 Modularer Aufbau des Stylesheets . . . . . . . . . . . . . . 3.4 Attributsätze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Parameter und Variable . . . . . . . . . . . . . . . . . . . . . .
. . . . .
27 27 28 30 32 33
Kapitel 4: Seitenlayout 4.1 Seitenaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Seitenvorlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Seitenfolgevorlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Seitenfolgen als Publikationsabfolge . . . . . . . . . . . . . . .
35 36 37 39 41
Kapitel 5: Typografische Gestaltung 5.1 Defaults, Vererbung, Schachtelung . . . . . . . . . . . . . . 5.2 Das Blockelement . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Das Inline-Element . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Block- und Inline-Container . . . . . . . . . . . . . . . . . . . .
45 45 52 56 58
. . . . .
. . . .
. . . .
Kapitel 6: Besondere Layout-Situationen
63
schnell + kompakt
5
Inhaltsverzeichnis 6.1 6.2 6.3 6.4 6.5
Aufzählungen . . . . . . . . . . . . . . . . . . . . . . . . . . . Kästen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grafiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fußnoten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
63 65 68 71 77
Kapitel 7: Verlinkung, Orientierung 7.1 Verlinkung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Paginierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Kolumnentitel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81 81 84 86
Kapitel 8: Farben für unterschiedliche Ausgabemedien
89
Kapitel 9: Inhaltsverzeichnisse, PDF-Lesezeichen und Register 9.1 Inhaltsverzeichnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 PDF-Lesezeichen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.3 Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93 94 96 98
Kurzreferenz
103
Stichwortverzeichnis
107
6
XSL-FO – wovon reden wir?
Die eXtensible Stylesheet Language – Formatting Objects beruht auf der W3C Recommendation XSL (kurz: XSL-FO-Standard), die in einer Version 1.0 in 2001 und in der Version 1.1 2006 publiziert wurde. Dieser XSL-FO-Standard beschränkt sich auf die Spezifikation von Formatierobjekten. Dies sind spezifische Layouts wie Textblöcke, Aufzählungen, Tabellen oder inzeilige Auszeichnungen, die in Seiten mit festen Dimensionierungen einzufügen sind. In der Praxis hat sich für diesen Standard – anstelle von XSL – die genauere Bezeichnung XSL-FO allgemein durchgesetzt. Damit lässt sich dann auch der XSL-FOStandard klar von dem übergeordneten XSL-Konzept unterscheiden. Es vereint in sich ein Bündel von spezialisierten Standards für die Formatierung der Dokumentinhalte in festen Seitendimensionen (XSL): – zur Transformation der XML-Eingangsdaten (XSLT),
schnell + kompakt
7
XSL-FO – wovon reden wir?
– für den Zugriff auf die Strukturen in den XML-Daten (XPath) und eben – für die Formatierung der Dokumentinhalte in festen Seitendimensionen (XSL). In dieser kompakten Darstellung von XSL-FO verzichten wir auf die detaillierte Behandlung von XSLT. Wir beschränken uns auf die Aspekte des allgemeinen Stylesheet-Designs mit XSLT (Kapitel 3). Kenntnisse in XSLT und XPath werden vorausgesetzt bzw. im Band XSLT dieser Reihe behandelt. XSL-FO ist ein lebender Standard, denn seine Entwicklung setzt sich fort. Ein erster Schritt dieser Entwicklung besteht in der Publikation von Version 1.1. Der Entwicklungscharakter von XSL-FO wird gern missverstanden und man urteilt vorschnell: „Die Version 1.0 ist für komplexe Layouts noch nicht reif! Warten wir ab, was die zukünftige Entwicklung bringt.“ Dabei wird übersehen, dass XSL-FO 1.0 das Ergebnis einer langjährigen Forschung und Entwicklung einer Gruppe von Experten (insbesondere Sharon Adler und Anders Berglund) der automatisierten Dokumentenverarbeitung ist, die sich zuvor schon in dem SGML-bezogenen ISO-Standard Document Style Semantics and Specification Language (DSSSL) niedergeschlagen hat. Version 1.1 ist eine „kleine“ Version, in der lediglich formatiertechnische Details und PDF-bezogene Funktionen der Basisversion hinzugefügt wurden. In der weiteren Behandlung der Formatierobjekte werden wir auf die 1.1Konstrukte als solche hinweisen, diese aber nicht gesondert thematisieren.
8
XSL-FO – wovon reden wir?
Ein weiteres, verbreitetes Missverständnis über die XSLFO-Anwendung besteht darin, den kostenfrei zugänglichen Standard als hinreichend für die Nutzung anzusehen. XSL-FO bezeichnet lediglich die formale Sprachschnittstelle zu Software-Produkten, die den Anspruch erheben, entsprechend strukturierte Dokumente standardkonform zu verarbeiten. Diese Software-Produkte – als XSL-FO-Formatierer bezeichnet – mögen den Standard mehr oder weniger vollständig, konform oder begrenzt konform unterstützen. Es gibt lizenzkostenfreie, kostengünstige und auch hochpreisige, dabei durchaus preiswerte Produkte. Auf diese Produkte wird im Abschnitt 2.3 näher eingegangen. Die Darstellung hier zielt nicht auf eine vollständige Behandlung aller XSL-FO-Konstrukte. Sie soll das Verständnis für den Umgang mit den in diesen Konstrukten formulierten Konzepten wecken und XSL-Stylesheet-Entwickler dazu befähigen, praxisgerechte Anwendungen zu schreiben, wobei man hinsichtlich der Details ggf. auf die W3C-Recommendation XSL selbst oder / und die weiterführende XSL-FO-Literatur zurückgreift. Eine ausführliche Darstellung mit einer kommentierten XSL-FOReferenz ist in „XSL-FO verstehen und anwenden“ von Manfred Krüger gegeben.
schnell + kompakt
9
KAPITEL 1 XSL-FO – Einsatzszenarien
Der Einsatzbereich für XSL-FO liegt ausschließlich in der automatisierten Aufbereitung und Verarbeitung von XML-strukturierten Dokumenten. Die Automatisierung setzt eine zentrale Steuerung (Organisation) voraus, die sich bei XSL-FO in den Stylesheets niederschlägt. Die Formatierung oder Layoutierung beruht auf der XML-Struktur der Eingangsdokumente und wird in allgemein gültigen Regeln im Stylesheet eindeutig formuliert.Variationen der Layoutierung sind möglich, beziehen sich aber auf eindeutig identifizierbare Strukturkonstellationen des Eingangsdokuments. Damit ist die Nutzung von XSL-FO für spontane und interaktiv beeinflussbare Gestaltungen ausgeschlossen. Für derartige Anwendungen gibt es eigene Layoutierungskonzepte, im W3C-Zusammenhang die Cascading Stylesheets (CSS). In dieser Beschränkung des Einsatzbereichs liegt die Stärke von XSL-FO. Es ist deshalb nicht verwunderlich, dass sich XSL-FO im Zeitraum von etwa fünf Jahren gegenüber älteren Konzepten in der Dokumentenverarbeitung
schnell + kompakt
11
1 – XSL-FO – Einsatzszenarien
durchgesetzt hat – nämlich dort, wo die qualitätsgesicherte und automatisiert ablaufende Verarbeitung aus technischen oder / und wirtschaftlichen Gründen zwingend ist. Wie man an den folgenden Beispielen sehen kann, wächst dieser „beschränkte“ Einsatzbereich für XSL-FO kontinuierlich und sogar deutlich progressiv. Dabei ist die Vielfalt der Einsatzszenarien beeindruckend. Sie reicht von literarischen E-Book-Anwendungen mit minimalem Mitteleinsatz bis zu großindustriellen Massenpublikationen mit großen Umfängen und in vielen Weltsprachen, die asiatischen Sprachen eingeschlossen. Die Anwender sind in Verlagen, in der öffentlichen Verwaltung, in der Banken- und Finanzdienstleisterwelt, in der technischen Dokumentation vieler Industriebereiche und – selbstverständlich – in der IT-Industrie beheimatet. Ein kleiner Verlag produziert mit XSL-FO literarische „Zimelien“ als E-Books, für die die konventionelle Druckpublikation unwirtschaftlich wäre, die aber auch eine dem Publikationsmedium entsprechende, typografisch anspruchsvolle Gestaltung erfordern. Eine Krankenkasse produziert individualisierte Formulare für ihre Mitglieder und spart dabei – nach eigener Aussage – 9/10 der Entwicklungs-, Software- und Handhabungskosten gegenüber konkurrierenden Formularverarbeitungssystemen. Etliche Banken und Versicherungen produzieren mit XSLFO Kontoauszüge, schematisierte Korrespondenz und Verträge zu einem Bruchteil der bisherigen Kosten – und dies häufig in überlegener Layout-Qualität.
12
1 – XSL-FO – Einsatzszenarien
Der in Deutschland marktführende Bahnbetreiber lässt seine Online-Kunden jeden Tag etwa 20.000 Online-BahnTickets zentral produzieren und lokal ausdrucken. Ein großer Industrieanlagenbauer produziert von fünf Standorten ausgehend in Europa auf einem zentralen Server bis zu 25.000 Seiten täglich technische Dokumentation in mehr als 12 Sprachen.
schnell + kompakt
13
KAPITEL 2 XSL-FO – Prozess und Software-Komponenten 2.1
Eingangsdaten
15
2.2
Verarbeitungsprozess
15
2.3
FO-Formatierer – Standard- plus proprietäre Merkmale
17
2.4
XSLT-Prozessoren – die Daten-Vorkäuer
24
2.5
Stylesheet-Designer – nützliche Spezialwerkzeuge?
25
2.1 Eingangsdaten Die Verarbeitung von XML-Daten mit XSL-FO ist ein mehrstufiger Prozess, der ohne Eingriffsmöglichkeiten innerhalb der einzelnen Prozessschritte und ohne Schleifenbildung (Wiederholung einzelner Schritte) abläuft. Für jeden dieser Schritte wird ein spezialisiertes Software-Modul bzw. -Produkt benötigt. Neben den zu verarbeitenden XML-Daten bilden die in diesen Daten referenzierten, in externen Dateien gehaltenen Grafiken und selbstverständlich das XSL-FO-Stylesheet, in dem die Verarbeitung und Layoutierung definiert ist, die Eingangsdaten dieses Prozesses.
2.2 Verarbeitungsprozess Den Prozess der Verarbeitung und Layoutierung veranschaulicht die folgende Abbildung:
schnell + kompakt
15
2 – XSL-FO – Prozess und Software-Komponenten
Abb. 2.1: Der XSL-FO-Workflow
Die XML-Daten und das XSL-FO-Stylesheet werden vom XSLT-Prozessor eingelesen. Aus diesen beiden Dokumenten erzeugt der XSLT-Prozessor mit Hilfe der Anweisungen im Stylesheet, die das Namensraum-Präfix xsl haben, das XML-FO-Ergebnisdokument. Das XML-FO-Dokument wird vom FO-Formatierer eingelesen. Die in diesem Dokument referenzierten externen Dateien, typischerweise Grafiken, werden vom Formatierer an der Stelle ihrer Referenz im Textfluss formatspezifisch behandelt und eingefügt. Das Ausgabeformat eines FO-Formatierers ist nicht im Standard festgelegt. Zumeist ist es jedoch PDF. Wenn auch für viele FO-Formatierer die PDF-Generierung die einzige Möglichkeit darstellt, das formatierte Ergebnis, die layoutierten Seiten, sichtbar zu machen, so muss doch dieser Schritt der Verarbeitung als ein eigenständiges und
16
FO-Formatierer – Standard- plus proprietäre Merkmale
bei einigen Formatierern als ein austauschbares Modul angesehen werden. Bei einigen Produkten hat man die Wahl zwischen einem produkteigenen PDF-Modul und einem Fremdprodukt. Manche Formatierer-Produkte bieten auch andere Ausgaben an, beispielsweise das MS-Windows-Zwischenformat, von dem aus man die im lokalen System installierten Druckertreiber (PostScript, PCL etc.) für die Ausgabe nutzen kann. Sogar die Ausgabe der formatierten Seiten in einer XML-Struktur wird angeboten. Eine solche XMLAusgabe bietet wiederum exzellente Möglichkeiten, das Satzergebnis weiter zu transformieren, beispielsweise zu RTF, um den XSL-FO-Satz in MS-Word zu verwerten, oder in eine XML-Struktur, die in Adobe InDesign eingelesen und darin händisch modifiziert werden kann.
2.3 FO-Formatierer – Standard- plus proprietäre Merkmale Für die Konformität von FO-Formatierern spezifiziert der XSL-FO-Standard eine Fülle von FO-Konstrukten, syntaktisch als XML-Elemente und XML-Attribute formuliert, mit denen man im Stylesheet die Layoutierung festlegt. Wie diese Festlegung aussieht und was sie offen lässt, zeigen wir an folgendem Beispiel. Beispiel Wir möchten, dass die Zeilen in Textabsätzen auf gleiche Länge ausgetrieben werden, ggf. am Zeilenende Silbentrennung angewandt werden soll. Die FO-Spezifikation dafür folgt:
schnell + kompakt
17
2 – XSL-FO – Prozess und Software-Komponenten
. . .
Hinweis Diese FO-Spezifikation beschränkt sich auf die schlichte Anweisung, die Inhalte des Blocks als Blocksatz mit Silbentrennung nach den deutschsprachigen Regeln zu layoutieren. Die Silbentrennung wird durch implizite Anweisungen, die im XSL-FO-Standard als Defaults gesetzt sind (z.B. für das zu setzende Silbentrennzeichen und die Mindestzahl von Zeichen im Wort vor und nach der Trennung), genauer spezifiziert. Jedoch bleibt offen, woher der Formatierer die Silbentrennregeln selbst nimmt und welche minimalen und maximalen Wortabstände eingehalten werden sollen. Diese Merkmale sind proprietäre Merkmale eines FO-Formatierers. Das vorangehende Beispiel soll zeigen, dass ein FO-Formatierer ohne proprietäre Funktionalität kein praxistaugliches Werkzeug wäre. Neben dem proprietären Zeilenumbruch- und Silbentrenn-Algorithmus benötigt ein praxistauglicher FO-Formatierer weitere, nicht durch den Standard vorgegebene Funktionalität – allem voran die Generierung eines verwertbaren Ausgabeformats. Weitere proprietäre Funktionen beziehen sich auf die Behandlung von Grafiken, auf direkt in den Formatierer eingelesene XML-Daten (z.B. SVG-Dateien, mathematische Ausdrücke in MathML-Notation), auf die Einbindung von Fonts oder auf die Erweiterung von im Standard definierten Befehlen und Eigenschaften. Diese proprietäre Funktionalität ist zum einen fester Bestandteil des Formatierer-Produkts, zum anderen durch
18
FO-Formatierer – Standard- plus proprietäre Merkmale
den Stylesheet-Entwickler steuerbar. Gesteuert wird diese Funktionalität entsprechend ihrer Charakteristik entweder durch entsprechende Spezifikationen in produktspezifischen Konfigurationsdateien oder durch die Spezifikation von Eigenschaften (XML-syntaktische Attribute) im Stylesheet unter Hinzufügung eines produktspezifischen Namensraum-Präfixes. Die XSL-FOStylesheets bleiben also immer konform zum Standard. Bei Nutzung eines Stylesheets mit einem anderen Formatierer-Produkt ignoriert der Formatierer einfach die Merkmale, die mit einem ihm fremden Namensraum-Präfix gekennzeichnet sind. Es ist also offensichtlich, dass die Leistungsfähigkeit von standardkonformen FO-Formatierern unterschiedlich ist und die Wahl unter den angebotenen Produkten entsprechend der bestehenden Anforderungen zu treffen ist. Eine einfache Gegenüberstellung der FO-Formatierer hinsichtlich der unterstützten Standard-Merkmale – wie sie im Web zu finden ist – taugt nur sehr bedingt für die Wahl eines professionellen Produkts. Die folgenden Beschreibungen verschiedener FO-Formatierer spiegeln unsere eigenen Erfahrungen mit dem Produkt unserer Wahl und Diskussionen mit Anwendern und Präsentationen von Herstellern wider. Sämtliche technischen Angaben zu den Formatierer-Produkten beruhen auf dem Stand der verfügbaren Informationen im Frühjahr 2007. Die Reihenfolge ihrer Behandlung ist zufällig und stellt keinesfalls eine Rangfolge ihrer Wertigkeit dar.
schnell + kompakt
19
2 – XSL-FO – Prozess und Software-Komponenten
FOP der Apache Software Foundation Für die Liebhaber von Open-Source-Software entwickelt die Apache Software Foundation (www.apache.org) den Formatierer FOP. Lange Zeit gab es FOP lediglich in einer Version, deren Funktionalität sehr eingeschränkt und deren Kompatibilität zum Standard ungenügend war. Der Code der aktuellen Version (0.93 von Anfang 2007) ist eine vollständige Neuentwicklung und bringt die Funktionalität auf das Niveau anderer, aktuell angebotener FOFormatierer. Als Java-Software ist FOP multiplattformfähig. Dem Anwender werden für die Installation und Konfiguration Java-Kenntnisse abverlangt. Es existieren nach wie vor funktionale Einschränkungen, die FOP für bestimmte Anwendungen ungeeignet erscheinen lassen. Die aus unserer Sicht gravierendsten sind Einschränkungen des Tabellen-Layouts, der Platzierung von Block-Containern, der fehlenden Unterstützung von Inline-Containern und fließenden Objekten sowie der Schreibrichtungen von rechts nach links und von oben nach unten. Von den neuen Merkmalen in XSL-FO 1.1 werden lediglich die PDF-Lesezeichen unterstützt. Die Erweiterung durch proprietäre Konstrukte, wie sie für die kommerziellen FO-Formatierer typisch ist, gehört nicht zu den Entwicklungszielen.
20
FO-Formatierer – Standard- plus proprietäre Merkmale
XEP von RenderX Inc. XEP der US-amerikanischen Herstellerfirma RenderX (www.renderx.com) ist ein kommerzielles Produkt. Es bietet das gesamte Spektrum von Gestaltungen, die im Fokus des Standards sind – mit Ausnahme von Anwendungen in Sprachen, die nicht in der uns gewohnten Schreibrichtung (von links nach rechts und von oben nach unten) laufen. XEP unterstützt weitgehend komplett die im Standard definierten FO-Konstrukte und bietet darüber hinaus eine Reihe von proprietären Merkmalen für komplexere Layouts. XEP ist Java-basiert und damit ein Multiplattform-Produkt mit der festen Einbindung eines eigenen PDF-Generators. Die neuen Merkmale in XSL-FO 1.1 werden bisher nicht unterstützt. XEP bietet keine grafische Benutzungsoberfläche, ist allerdings in einige XML-Editoren als FO-Formatierer integriert. XEP ist ein kommerzielles Produkt, für das Lizenzen auf unterschiedlichen Leistungsniveaus zu entsprechend differenzierten Preisen angeboten werden.
Ecrion XF Rendering Server von Ecrion Software Inc. Ebenfalls US-amerikanischen Ursprungs ist der Ecrion XF Rendering Server (www.ecrion.com). Diese kommerzielle Software wird ausschließlich für die Microsoft-WindowsPlattformen angeboten, ist also nicht in Java geschrieben. Mit Ausnahme der fehlenden Unterstützung für die
schnell + kompakt
21
2 – XSL-FO – Prozess und Software-Komponenten
Schreibrichtungen von rechts nach links und von oben nach unten scheint die Unterstützung entsprechend der XSL-FO-Version 1.0 ziemlich komplett. Eine Reihe von proprietären Erweiterungen runden die Funktionalität ab. Die neuen Merkmale in XSL-FO 1.1 werden bisher nicht unterstützt. Neben PDF wird als Ausgabeformat XPS, das neue XMLMicrosoft-Print-Format, unterstützt. Damit erweitern sich die Ausgabe- und – wenn gewünscht – die Nachbearbeitungsmöglichkeiten. Eine verschlankte Version des Serverprodukts, XF Desktop Edition genannt, bietet eine grafische Benutzer- bzw. Vorschau-Oberfläche. Das Produkt wird den unterschiedlichen Leistungsniveaus entsprechend zu differenzierten Preisen angeboten.
XML2PDF von Altsoft NV Europäischen Ursprungs ist XML2PDF von Altsoft NV (www.alt-soft.com). Dieses kommerzielle Produkt basiert auf dem Microsoft .NET Framework, ist also ebenfalls an die Microsoft-Windows-Plattform gebunden. Die Konformitätsliste zu XSL-FO ist beeindruckend vollständig, einschließlich der Unterstützung für die asiatischen Schreibrichtungen und einen Großteil der Erweiterungen in XSL-FO 1.1. Proprietäre Erweiterungen betreffen die Einbindung von PDF sowie die PDF-Ausgaben. Neben einer Server- sowie API-Edition gibt es eine Desktop-Edition mit einer grafischen Benutzeroberfläche. Das Produkt wird den unterschiedlichen Leistungsniveaus entsprechend zu differenzierten Preisen angeboten.
22
FO-Formatierer – Standard- plus proprietäre Merkmale
XSL Formatter von Antenna House Der kommerzielle XSL Formatter von Antenna House (www.antennahouse.com) kommt aus Japan. Dieses Produkt ist ein Multiplattform-Produkt, das auf den Microsoft-Windows-Plattformen programmtechnisch spezifisch implementiert, ansonsten auf den meisten Unix-Plattformen als Java-basierte Software angeboten wird. Die Unterstützung für die satzbezogenen XSL-FO-Konstrukte der Versionen 1.0 und 1.1 ist nahezu vollständig. Eine Fülle von proprietären Erweiterungen vervollständigt das Produkt für komplexe Anwendungen in allen Weltsprachen. Besonders hervorzuheben ist die Verarbeitungsmöglichkeit für sehr viele Grafikformate und die differenzierte Steuerung der PDF-Ausgabe für die spezifische Nutzung der resultierenden PDFs. Die Ausgabemöglichkeit ist nicht auf PDF beschränkt. Einzelne Seiten lassen sich als SVG-Grafiken produzieren. Eine Area Tree genannte XML-basierte Ausgabe bietet das Potenzial für weitere Transformationen und den Import in andere XML importierende Layout-Produkte. Auf der Windows-Plattform wird eine ausgefeilte Benutzeroberfläche angeboten, die insbesondere für die Stylesheet-Entwicklung und -Kontrolle gute Dienste leistet. Das Produkt wird den unterschiedlichen Leistungsniveaus entsprechend zu differenzierten Preisen angeboten, wobei das Preisniveau eher oberhalb der Niveaus der Wettbewerberprodukte liegt.
schnell + kompakt
23
2 – XSL-FO – Prozess und Software-Komponenten
2.4 XSLT-Prozessoren – die Daten-Vorkäuer Obwohl den XSLT-Prozessoren im Prozess der FO-Verarbeitung eine mitentscheidende Rolle zufällt (s. Abschnitt 2.2), ist ihre Wahl unter den verschiedenen Produktangeboten eher nebensächlich. Dabei gehen wir davon aus, dass der XML-FO-Code nicht direkt erstellt wird, sondern aufgrund der Spezifikationen in einem XSL-Stylesheet, also die vorangehende Transformation zwingend ist. Wenn aber diese XSLT-Prozessoren standardkonform arbeiten und in der Regel lizenzkostenfrei sind, dann sind eigentlich nur die lokale Verfügbarkeit und die Einbindungsmöglichkeiten in den Gesamtprozess von Bedeutung. Eine gute Übersicht zu XSLT-Prozessoren bietet die Seite http://seaotter.berkeley.edu/xml/parsers.html. Wenn diese unterschiedlichen XSLT-Prozessoren auch gleiche Ergebnisse – den XML-FO-Code – erzeugen (sollten), unterscheiden sie sich doch gelegentlich in ihren Meldungen. Beispielsweise gibt der XSLT-Prozessor von Microsoft, MSXML, keine Warnung aus, wenn man im Stylesheet Templates spezifiziert hat, die nicht eindeutig einem bestimmten Knoten in der Dokumentstruktur zuzuweisen sind. Wie FO-Formatierer können auch XSLT-Prozessoren proprietäre Erweiterungen gegenüber dem Standard enthalten. Die Autoren vermeiden die Nutzung solche Erweiterungen in diesem Verarbeitungszusammenhang. Dies macht die Wahl und Anwendung eines bestimmten XSLT-Prozessors einfacher und erhöht die Portabilität der XML-Verarbeitung.
24
Stylesheet-Designer – nützliche Spezialwerkzeuge?
2.5 Stylesheet-Designer – nützliche Spezialwerkzeuge? XSL-FO-Stylesheets zu schreiben, erscheint Einsteigern in diese Technologie ein mühsames Geschäft. Da fällt der Blick schnell auf Produktangebote, die den Anschein erwecken, man könne solche Stylesheets ohne Kenntnis der XSL-Syntax und performant mit Tastatur und Maus auf einer grafischen Seitenoberfläche zeichnen, wie man dies von Tabellen in MS-Word gewohnt ist. Die Autoren stehen diesen Produktangeboten, die es für die Spezifikation von XSL-Stylesheets in wachsender Zahl gibt, mit Skepsis gegenüber. Unsere Gründe dafür: – Von Ausnahmen einfach strukturierter Anwendungen abgesehen, lassen sich Datentransformation und Gestaltung sowie die Verknüpfung der Daten in den komplexen Seitenfolgen nicht grafisch darstellen. – Einfache Angaben, wie z.B. Seitenmaße, Ränder, Schriften, Größen, lassen sich zwar mit den gewohnten Oberflächen von Desktop-Publishing-Produkten gut und effizient spezifizieren und visuell kontrollieren. Für komplexe Gestaltungen kommt jedoch irgendwann der Punkt, an dem man lieber direkt auf den Code zugreifen möchte. Versteht man dann die ungewohnte Syntax nicht, wird man auch komplexe Spezifikationen nicht professionell bearbeiten können. – Stylesheet-Design-Produkte sind typischerweise auf bestimmte Dokumentgestaltungen spezialisiert, beispielsweise Formular- oder Kataloggestaltung. Für Anwendungen, die sich nicht in solche Beschränkungen
schnell + kompakt
25
2 – XSL-FO – Prozess und Software-Komponenten
einpassen lassen, muss man auf ein anderes EditorWerkzeug zurückgreifen. Ja, gibt es denn überhaupt keine Editor-Unterstützung für die Erstellung von XSL-FO-Stylesheets? Doch schon – und zwar eine, die auf jede Art der Dokumentgestaltung und alle möglichen Dokumentkategorien (Flussdokumente, Kataloge, Formulare u.a.) gleichermaßen anwendbar ist: die Kombination eines einfachen XML-Editors mit Kenntnis der FO-Befehle und FO-Konstrukte und einem FO-Formatierer für die schnelle und genaue visuelle Kontrolle der Stylesheet-Spezifikationen an einem repräsentativen Beispieldokument. In unserer praktischen Arbeit hat sich die Zusammenarbeit von XMLSpy von Altova (www.altova.com) als XMLEditor mit der grafischen Benutzeroberfläche des XSL Formatter von Antenna House (www.antennahouse.com), in der man Maße, Schriften, Schriftgrößen u.a. genau überprüfen kann, bewährt.
26
KAPITEL 3 Stylesheetdesign 3.1
Das Wurzelelement
27
3.2
Der Aufbau des Stylesheets
28
3.3
Modularer Aufbau des Stylesheets
30
3.4
Attributsätze
32
3.5
Parameter und Variable
33
Ein XSL-FO-Stylesheet ist ein XSLT-Stylesheet. Zum XSL-FO-Stylesheet wird es allein dadurch, dass das Zieldokument, das damit erzeugt wird, ein XML-FO-Dokument ist – also ein ganz spezielles XML-Dokument und nicht eines mit einer beliebigen XML-Struktur. Ein XMLFO-Dokument ist ein XML-Dokument, in dem ausschließlich die Elemente und Attribute verwendet werden, die im XSL-FO-Standard definiert werden und die der Beschreibung des zu erzielenden Layouts und seiner typografischen Gestaltung dienen. Ein XSL-FO-Stylesheet ist also ein Stylesheet, in dem die XSL-FO-Elemente und -Attribute als literale Ergebniselemente von Befehlen und Funktionen von XSLT und XPath „umrahmt“ werden.
3.1 Das Wurzelelement Als wohlgeformtes XML-Dokument verfügt das XSL-FOStylesheet zu allererst über eine XML-Deklaration – je-
schnell + kompakt
27
3 – Stylesheetdesign
doch ohne DOCTYPE-Deklaration. Das Wurzelelement – und auch die Toplevel-Elemente – des XSL-FO-Stylesheets sind identisch mit denjenigen eines XSLT-Stylesheets. Allerdings muss für das XSL-FO-Stylesheet zusätzlich zum Namensraum von XSLT auch der Namensraum von XSL-FO angegeben werden: Listing 3.1: Wurzelelement eines XSL-FO-Stylesheets mit den benötigten Namensräumen
...
Bietet der verwendete XSL-FO-Prozessor proprietäre Erweiterungen zum XSL-FO-Standard an und sollen diese benutzt werden, dann muss auch der Namensraum des jeweiligen Prozessors deklariert werden.
3.2 Der Aufbau des Stylesheets Im Gegensatz zu einem XSLT-Stylesheet, dessen interne Organisation sich weitgehend den Vorlieben des Stylesheet-Designers anpassen kann, gibt es für XSL-FO-Stylesheets ein paar Einschränkungen. Diese betreffen vor allem die für die Layoutdefinition notwendigen Angaben zur Seitengestaltung, die innerhalb des Wurzelelements für das zu erzeugende XML-FO-Dokument stehen müssen. Damit kommt der ersten Template-Regel im XSL-FOStylesheet – nämlich derjenigen, mit der das
28
Der Aufbau des Stylesheets
Wurzelelement des XML-FO-Dokuments erzeugt wird – eine besondere Bedeutung zu. In dieser ersten Template-Regel wird also das Wurzelelement für das XML-FO-Dokument angelegt. Als erstes Element innerhalb dieses Wurzelelements muss das LayoutMasterset (fo:layout-master-set) stehen, das die Definition aller benötigten Layoutvorlagen enthält. Als nächstes innerhalb dieses Wurzelelements folgt die Beschreibung der eigentlichen Publikation einschließlich ihrer Inhalte als Abfolge von Publikationsteilen. Für jedes Publikationsteil muss eine eigene Seitenfolge (fo:pagesequence) vorhanden sein. Zwei Typen von Layoutvorlagen müssen im Layout-Masterset festgelegt werden: nämlich Seitenvorlagen (fo:simple-page-master), die jeweils eine einzelne Layoutseite beschreiben, und ggf. Seitenfolgevorlagen (fo:page-sequence-master), die mehrere Seitenvorlagen zu einer Folge zusammenbinden. Diese Folge kann als einzelne Vorlage adressiert werden. Je nach Komplexität des Zielformats bzw. des zu erzeugenden Layouts müssen für eine Publikation mehrere Seitenvorlagen, eine oder mehrere Seitenfolgevorlagen und eine umfangreiche Publikationsabfolge aus mehreren Seitenfolgen definiert werden. Listing 3.2: Die erste XSLT-Template-Regel mit Layout-Masterset und Seitenfolgen
...
schnell + kompakt
29
3 – Stylesheetdesign
... ... ... ... ... ...
Alle weiteren Template-Regeln befassen sich ausschließlich mit der Umsetzung von Knoten des Quelldokuments in die gewünschte Darstellung im Zieldokument. Weitere Informationen zu XSLT- bzw. XPath-Befehlen und Funktionen finden Sie beispielsweise in dem schnell + kompakt Band „XSLT“ bzw. entsprechend umfangreicheren Abhandlungen über XSLT und XPath. In den Kapiteln 5, 6 und 7 wird auf die konkrete Gestaltung der literalen XML-FO-Elemente im Detail eingegangen.
3.3 Modularer Aufbau des Stylesheets Stylesheets für komplexe XML-Anwendungen können einen erheblichen Umfang annehmen. Gewinner ist dabei derjenige, der sein Stylesheet sauber organisiert und kommentiert. Dabei ist es für die Verarbeitung unerheblich, welchem Ordnungsprinzip man folgt – ob man eher Gleiches resp. Ähnliches zusammenfaßt oder ob man der Logik der Struktur folgt. Eine Kommentierung der Template-Regeln bzw. die Änderungshistorie kann mit den üblichen XML-Kommentar-Tags eingefügt werden.
30
Modularer Aufbau des Stylesheets
Steht das Stylesheet jedoch in einer Anwendungsumgebung, in der z.B. die Verantwortung für die verschiedenen Teile des Stylesheets bei unterschiedlichen Personen liegt oder in der mit häufigen Änderungen bzw. reihenspezifischen Anpassungen gerechnet werden muss, dann empfiehlt sich die Modularisierung des Stylesheets, d.h. die Auslagerung sinnvoller Teile des Stylesheets in eine eigene Datei. In das XSL-FO-Stylesheet können diese externen Dateien mit Hilfe der XSLT-Anweisungen oder integriert werden, die jeweils über das hrefAttribut verfügen, um den Pfad zur externen Datei zu benennen. Listing 3.3: Beispiele für das Inkludieren bzw. Importieren eines Stylesheet-Fragments
Hinweis ist mit Vorsicht einzusetzen, da die importierten Templates gegenüber den im Stylesheet vorhandenen Templates nachrangig behandelt werden. Bei mehreren wird stets der letzte höherrangig behandelt als sein Vorgänger. In so ein Stylesheet-Fragment auslagern sollte man z.B. alle die Template-Regeln, die gemeinsam geändert werden müssen. Beziehen sich die Änderungen ausschließlich auf die Eigenschaften, d.h. die Attribute von FO-Elementen, dann sollte man die entsprechenden Attributgruppen in Attributsätze (siehe Abschnitt 3.4) auslagern.
schnell + kompakt
31
3 – Stylesheetdesign
Sollen die Änderungen von Personen durchgeführt werden können, die nicht befugt sind, das Stylesheet zu ändern, empfiehlt sich die Auslagerung von Variablen und Parametern (siehe Abschnitt 3.5).
3.4 Attributsätze Wie wir später noch in aller Ausführlichkeit sehen werden, werden die gestalterischen Festlegungen für jeden Absatz- oder auch Überschriftentyp mit einzelnen Gestaltungsattributen beschrieben. Werden identische Gestaltungsattribute an verschiedenen Stellen im Stylesheet benötigt, dann empfiehlt sich die Festlegung eines entsprechenden Attributsatzes (mit ), der alle diese Attribute () zusammenfasst und mit einem referenzierbaren Namen versieht. Angesprochen werden kann dieser Attributsatz mit Hilfe dieses Namens von allen Stellen aus (xsl:use-attribute-sets). Listing 3.4: Definition eines Attributsatzes
Arial 8pt 9pt Listing 3.5: Nutzung eines Attributsatzes bei einem literalen Ergebniselement
...
32
Parameter und Variable
Der Vorteil von Attributsätzen ist der, dass stets die komplette Kombination aller darin beschriebenen Attribute einschließlich ihrer Werte genutzt wird. Legt man die Attributsätze als externes Stylesheet-Fragment an, dann kann diese Datei leicht durch eine andere Datei ersetzt werden, die die Attributsätze für eine unterschiedliche Gestaltung enthält. Das macht z.B. dann Sinn, wenn eine XML-Struktur und ein Stylesheet für die Produktion verschiedener Buchreihen benutzt werden sollen. Damit hat man ein einfaches Mittel an der Hand, mit einer Verarbeitung unterschiedliche Gestaltungen ohne großen Aufwand zu erzeugen.
3.5 Parameter und Variable Es gibt jedoch Situationen und Gestaltungen, in denen man immer wieder auf einen einzelnen Wert zugreifen will. Ist dies ein fest stehender Wert, so wird man ihn mit der XSLT-Anweisung festlegen. Geht es eher um einen Wert, der nur temporär zur Verfügung stehen soll bzw. mit anderen Werten kombiniert werden soll, wird man dies eher mit tun. Beide XSLT-Befehle haben dieselbe Syntax: Listing 3.6: Definition eines Parameters
10mm 25mm 25mm 10mm
schnell + kompakt
33
3 – Stylesheetdesign Listing 3.7: Definition einer Variablen
... Listing 3.8: Zwei Beispiele für die Nutzung von Parametern und Variablen
Hinweis Prinzipiell muss bei der Nutzung von Parametern und Variablen der Name einschließlich des führenden $Zeichens in geschweiften Klammern stehen. Nur bei der XSLT-Anweisung value-of müssen sie nicht stehen, da die geschweiften Klammern die Abkürzung von xsl:value-of sind. Global wirksame Parameter und Variablen werden praktischerweise zu Beginn des Stylesheets – noch vor der ersten Template-Regel – angelegt, um sie gezielt ändern zu können. Soll z.B. gestattet werden, die Parameterwerte zu ändern, ohne dass das Stylesheet selbst geändert werden kann, dann können die Parameterfestlegungen in ein externes Stylesheet-Fragment ausgelagert werden.
34
KAPITEL 4 Seitenlayout 4.1
Seitenaufbau
36
4.2
Seitenvorlagen
37
4.3
Seitenfolgevorlagen
39
4.4
Seitenfolgen als Publikationsabfolge
41
Bevor man mit dem Stylesheet-Schreiben beginnt, sollte in aller Ruhe geplant werden, wie viele verschiedene Seitenvorlagen und Seitenfolgevorlagen für die gesamte Publikation benötigt werden. Natürlich kann das Stylesheet nachträglich erweitert werden, aber einfacher ist es, wenn von vornherein klar ist, was genau benötigt wird und wie sich die Vorlagen unterscheiden. Da der Formatierungsprozess mit XSL-FO ein vollautomatischer ist, in den nicht eingegriffen werden kann, müssen auch die Seitenvorlagen so angelegt werden, dass sie vollautomatisch zu befüllen sind. Ausnahmen von dieser Regel gibt es nicht. Ausnahmen in der Seitengestaltung müssen mit einer eigenen Seitenvorlage bedacht werden – sofern sie durch eine inhaltlich-logische Struktur bedingt sind. Die wichtigsten Kriterien, die zu unterschiedlichen Seitenvorlagen führen, sind z.B.: – Ausdehnung der Seitenränder bzw. Positionierung des Satzspiegels auf der Seite; d.h. die für Printpublikatio-
schnell + kompakt
35
4 – Seitenlayout
nen übliche unterschiedliche Positionierung von Satzspiegel und Pagina in linken und rechten Seiten führt zu zwei unterschiedlichen Seitenvorlagen – Bestückung der Seitenbereiche mit feststehenden Informationen, wie z.B. Paginierung, Kolumnentitel, Marginalien etc.; d.h. der Verzicht auf Pagina und / oder Kolumnentitel auf einer Kapitelanfangsseite führt zu einer weiteren Seitenvorlage. Gerade bei komplexen Publikationen kann es hilfreich sein, sich jede benötigte Seitenvorlage aufzumalen und mit den konkreten Maßen für Seitenränder und Seitenbereiche bzw. der Positionierung von Inhalten auf der Seite zu versehen. Hinweis Auch für eine Vakatseite empfiehlt es sich, eine eigene Seitenvorlage anzulegen, da man diese in der Publikationsfolge gezielt einsetzen kann.
4.1 Seitenaufbau Bei der Festlegung der konkreten Maße für die Seitenvorlage ist Folgendes zu berücksichtigen: XSL-FO geht davon aus, dass auf ein Blatt gedruckt wird und nicht von der Rolle. In unserem Fall kann man vom Format DIN A4 ausgehen, das von jedem landläufigen Drucker verarbeitet werden kann. Natürlich kann man hier auch jede andere Papiergröße angeben. Hinweis Dieses Vorgehen schließt nicht aus, dass mit XSL-FO produzierte Seiten z.B. mit einer Rollen-Offset-Maschi-
36
Seitenvorlagen
ne gedruckt werden können. Man wird in diesem Fall die Papiergröße mit der definitiven (= beschnittenen) Seitengröße identisch setzen und beim Ausschießen die PDF-Seiten mit Passmarken versehen. Im Abzugsverfahren werden festgelegt: – die Seitengröße, indem für alle vier Seiten Maße festgelegt werden (margins), – der Bereich, in den der Inhalt des zu verarbeitenden XML-Dokuments einfließen soll (fo:region-body), indem die Ausdehnung für die vier äußeren Seitenbereiche (regions) abgezogen wird.
Abb. 4.1: Schematische Darstellung der Seitenaufteilung
4.2 Seitenvorlagen Das geschilderte Konzept des Seitenaufbaus führt also zur Aufteilung des zu bedruckenden Blatt Papiers in
schnell + kompakt
37
4 – Seitenlayout
– einen Margin-Bereich, der nicht bedruckt und ggf. wegschnitten wird, und – fünf Seitenbereiche (regions), die mit Informationen bedruckt werden können. Bei den fünf bedruckbaren Bereichen gibt es nur einen, in den der Inhalt des XML-Dokuments einfließen darf: fo:region-body. Das ist der einzige Bereich, der in jeder Seitenvorlage vorhanden sein muss – und das genau ein Mal! Die übrigen Bereiche (fo:region-before, fo:region-end, fo:region-after, fo:region-start) werden nur dann bei der Definition der Seitenvorlage einbezogen, wenn sie Auswirkungen auf das Seitenlayout haben sollen, ggf. auch ohne mit Informationen gefüllt zu sein. Soll ein Bereich in der entsprechenden Seitenfolge der Publikation mit Inhalt bestückt werden, dann muss der Bereich mit einem Namen versehen werden (Attribut region-name). Listing 4.1: Beispiel für eine Seitenvorlage mit einem Kopfbereich
Hinweis Die beim Attribut margin genannten Werte beziehen sich auf die Außenseiten des jeweiligen Bereichs und sind – beginnend oben – im Uhrzeigersinn zu lesen: oben – rechts – unten – links. Wird nur ein Wert genannt, gilt er gleichermaßen für alle vier Seiten.
4.3 Seitenfolgevorlagen Seitenfolgevorlagen werden dann benötigt, wenn ein inhaltlich bzw. logisch eingrenzbarer Teil des XML-Dokuments, z.B. ein Kapitel, mengenmäßig mehrere Seiten umfasst und wenn dafür verschiedene Seitenvorlagen verwendet werden sollen, z.B. – erste Seite des Kapitels als rechte Seite ohne Pagina, – zweite und jede weitere gerade Seite als linke Seite mit Pagina, – dritte und jede weitere ungerade Seite als rechte Seite mit Pagina. Damit verschiedene Seitenvorlagen zu einer Seitenfolgevorlage kombiniert werden können, müssen die einzelnen Seitenvorlagen mit einem eindeutigen Namen versehen sein. Dies geschieht mit dem Attribut master-name bei fo:simple-page-master (siehe das Listing auf S. 38/39).
schnell + kompakt
39
4 – Seitenlayout Listing 4.2: Beispiel für die Definition einer Seitenfolgevorlage
Das Listingbeispiel zeigt eine Seitenfolgevorlage, die je nach Position der Seite in der formatierten Seitenfolge eine unterschiedliche Seitenvorlage verwendet. Der fo:page-sequence-master im Beispiel ist selbst benannt (siehe master-name), damit die Folgenvorlage in einer Seitenfolge benutzt werden kann. Die in der Seitenfolgevorlage kombinierten Seitenvorlagen werden mit dem Attribut master-reference referenziert. Profitipp Endet ein Kapitel auf einer rechten Seite, so dass eine Vakatseite eingefügt werden muss, um das nächste Kapitel wieder auf einer rechten Seite beginnen zu lassen, so kann dies beim zugehörigen fo:block mit dem Attri-
40
Seitenfolgen als Publikationsabfolge
but page-break-before und dem Wert right erreicht werden. Hinweis Soll nur eine Seitenvorlage zur Anwendung kommen, dann wird fo:repeatable-page-master-reference anstelle von fo:repeatable-page-master-alternatives benutzt. Es muss dann auch nicht in fo:conditional-pagemaster-reference verzweigt werden.
4.4 Seitenfolgen als Publikationsabfolge Sind die Seitenvorlagen in ihrer Geometrie festgelegt und ggf. kombinierte Seitenfolgevorlagen fixiert, dann ist der nächste Schritt die Positionierung von Inhalten in den Vorlagen. Dies geschieht mit Seitenfolgen. Für jeden logisch abgrenzbaren Publikationsteil muss eine eigene Seitenfolge angelegt werden, z.B. für Titelei, Inhaltsverzeichnis, Korpus, Anhang, Register. Für den Korpus einer Publikation, der aus mehreren Kapiteln – oder auch aus Stichwörtern eines Lexikons – besteht, braucht in der Regel nur eine Seitenfolge angelegt werden, die mit einer Seitenfolgevorlage verbunden ist. Wurden für die in der Seitenfolgevorlage kombinierten rechten und linken Seitenvorlagen jeweils ein Kopf- und ein Fußbereich festgelegt, dann müssen in der Seitenfolge alle diese Seitenbereiche mit Inhalt bestückt werden. Neben dem Fließtextbereich (fo:region-body), der den Inhalt
schnell + kompakt
41
4 – Seitenlayout
aus dem XML-Quelldokument aufnimmt, sind also zu befüllen: – Kopfbereich auf der rechten Seite (fo:region-before region-name="Kopfzeile-rechts") – Kopfbereich auf der linken Seite (fo:region-before region-name="Kopfzeile-links") – Fußbereich auf der rechten Seite (fo:region-after region-name="Fusszeile-rechts") – Fußbereich auf der linken Seite (fo:region-after region-name="Fusszeile-links") Die Positionierung der Inhalte erfolgt in der Publikationsfolge (fo:page-sequence) mit den Befehlen: – fo:flow flow-name="xsl-region-body" für die Positionierung des Fließtexts aus der XML-Instanz (der Wert des flow-name ist hier eine feststehende Formulierung) Hinweis Für jede Publikationsfolge darf es nur einen einzigen Flow-Bereich geben. – fo:static-content für die übrigen vier Seitenbereiche, deren Unterscheidung über den Wert des Attributs flow-name erfolgt, die frei vergeben werden können. Listing 4.3: Beispiel für eine Publikationsfolge auf der Basis einer Seitenfolgevorlage mit einem Fließtextbereich und je einem Fußbereich auf den rechten und linken Seiten
42
Seitenfolgen als Publikationsabfolge
Hinweis Jeder Seitenbereich muss mit einem Blockelement – hier: fo:block – begonnen werden. Legt man hier bereits die Angaben für die Grundschrift fest, dann werden diese Eigenschaften auf die untergeordneten Elemente vererbt. Diese Festlegung kann lokal, z.B. für Überschriften, überschrieben werden (siehe Abschnitt 5.1).
schnell + kompakt
43
KAPITEL 5 Typografische Gestaltung 5.1
Defaults, Vererbung, Schachtelung
45
5.2
Das Blockelement
52
5.3
Das Inline-Element
56
5.4
Block- und Inline-Container
58
In diesem Kapitel befassen wir uns mit den Grundlagen der typografischen Gestaltung innerhalb der Seiten bzw. Seitenbereiche, wie sie im vorangehenden Kapitel 4 beschrieben sind. Ehe wir allerdings zu dem Basismaterial der FO-Gestaltung, den Blöcken, Containern für Blöcke und dem InlineElement kommen, müssen wir noch auf Prinzipien im FOKonzept eingehen, die die Spezifikation der Gestaltung abkürzen, vereinfachen und in ihrer Mächtigkeit verstärken.
5.1 Defaults, Vererbung, Schachtelung Es geht um drei Prinzipien: – Defaults (Voreinstellungen) für die meisten FO-Eigenschaften ersparen in vielen Gestaltungssituationen die explizite Setzung einer Eigenschaft.
schnell + kompakt
45
5 – Typografische Gestaltung
– Wo sinnvoll, vererben sich FO-Eigenschaften, die auf einer höheren Ebene der FO-Struktur spezifiziert sind, automatisch in der Dokumenthierarchie nach unten (bis sie ggf. durch eine Spezifikation auf unterer Ebene neu oder abweichend gesetzt werden). – Die FO-Strukturen, das sind die Elemente mit dem Namensraum-Präfix fo: lassen sich – wo aus Anwendungssicht sinnvoll – rekursiv nutzen (verschachteln).
Defaults (Voreinstellungen) Defaults, also bestimmte Ausprägungen von FO-Eigenschaften, die außerhalb des Stylesheets gesetzt sind, können aus unterschiedlichen Quellen bezogen werden: – Einmal sind es Defaults, die im XSL-Standard beschrieben sind und deshalb in standardkonformen FO-Formatierern fest vordefiniert sind. Ein Beispiel ist die Textausrichtung in Blöcken. Wird diese im Stylesheet nicht spezifiziert, gilt fo:block text-align= "start" (start ist in der uns vertrauten Schreibrichtung „links“). Dies führt zu einer linksbündigen und rechts flatternden Zeilenausrichtung. – Der Standard überlässt es bei einer Reihe von Eigenschaften den FO-Formatierer-Produkten, diese Defaults produktspezifisch zu setzen. Dies gilt beispielsweise für die Wahl des Fonts, wenn ein Font im Stylesheet entweder nicht bestimmt ist oder für die Verarbeitung des Formatierers nicht verfügbar ist. – Schließlich können FO-Formatierer-Produkte es auch den Anwendern in gewissem Umfang überlassen, be-
46
Defaults, Vererbung, Schachtelung
stimmte Defaults in Konfigurationsdateien selbst zu bestimmen, die auch Festlegungen enthalten können, die mit den Mitteln des Standards in den Stylesheets nicht spezifiziert werden können. Beispiele sind das Seitenformat und das Ausgabeformat sowie ggf. die Versionsfestlegung des Ausgabeformats (z.B. PDF V. 1.6). Hinweis Auf Grund der Unterschiede in der Default-Konfiguration von verschiedenen FO-Formatierern können also bei gleichem Stylesheet höchst unterschiedliche Ergebnisse entstehen! Kehren wir noch einmal zurück zu den im Standard gesetzten Defaults. Die schlichte Spezifikation ...
wird durch die im Standard bestimmten Defaults zu einer ausgesprochenen Monster-Satzanweisung für den Formatierer (wir ignorieren die Eigenschaften mit den noneoder auto-Werten, die sich auf das Satzergebnis nicht auswirken): Listing 5.1: Im Standard gesetzte Eigenschaften für einfache Textblöcke
...
Damit sind für die Blockgestaltung – ggf. wirkende Vererbungseffekte hier einmal ausgeschlossen – neben vielem anderen bestimmt: – Font, Schriftgröße und Zeilenhöhe sind systembestimmt; – Ausnutzung des vollen Satzspiegels, keine besonderen Vorschübe vor oder nach dem Block; – keine Hintergründe oder Rahmen; – Textausrichtung linksbündig; – keine Silbentrennung; – Hurenkinder- und Schusterjungenkontrolle (jeweils 2 Zeilen); – Zeilenschaltungen im Blockinhalt werden als Leerzeichen behandelt; mehrere Leerzeichen werden zu einem zusammengezogen.
Vererbung Die Vererbung von FO-Eigenschaften ist beschränkt auf die Nachkommenknoten, also nach unten in der Doku-
schnell + kompakt
49
5 – Typografische Gestaltung
menthierarchie. Im Standard ist bestimmt, welche Eigenschaften sich vererben und welche nicht. Zwar wird man auf die Vererbbarkeit einer Eigenschaft intuitiv richtig tippen, also beispielsweise für Font (font-family) oder Schriftgröße (font-size). Aber Vorsicht! Die Randeigenschaften margin-left und margin-right vererben sich nicht, die alternativen Randeigenschaften start-indent und end-indent werden vererbt. In der Stylesheet-Spezifikation sollte man diese Vererbung nutzen, um ein möglichst konsistentes Layout zu erreichen und den Spezifikationsaufwand für untergeordnete Knoten zu verringern. Das folgende Beispiel macht deutlich, welche Eigenschaften dafür dienen können. Listing 5.2: Beispiel für die Vererbung von Blockeigenschaften
...
Für den gegebenen Block und die darunter geordneten FO-Elemente werden festgelegt: Font, Schriftgröße, Zeilenhöhe, Textausrichtung und Silbentrennung nach deutschen Regeln.
50
Defaults, Vererbung, Schachtelung
Schachtelung Die Vererbbarkeit von FO-Eigenschaften erreicht allerdings erst durch die Möglichkeit der beliebig tiefen Schachtelung von Block-Elementen in XSL-FO seine gegenüber alternativen Layout-Konzepten (z.B. MS-Word) überlegene Wirkung. Das Wurzelelement für die Dokumentinhalte ist fo:flow. Darunter sind die Dokumentinhalte in eines der in XSLFO verfügbaren Blockelemente einzukleiden: Block (fo:block), Block-Container (fo:block-container), Liste (fo:list-block) oder Tabellen (fo:table-and-caption bzw. fo:table). Lediglich in fo:block direkt sind Textinhalte zulässig, allerdings auch – neben allen oben bereits genannten BlockElementen – eine Fülle weiterer blockbildender und inzeiliger Strukturen. Eine mögliche Schachtelung von Blockelementen zeigt folgendes Listing: Listing 5.3: Eine mögliche Schachtelung von Blockelementen
......... ...
schnell + kompakt
51
5 – Typografische Gestaltung
... ... ... ... ... ... ...
Die in Tabellen und Listen notwendigen Zwischenstrukturen sind in diesem Beispiel durch ,,...“ ersetzt!
5.2 Das Blockelement Das Blockelement fo:block, das das Rückgrat einer jeden XSL-FO-Anwendung bildet, haben wir bereits hinsichtlich seines Schachtelungspotenzials und der Vererbungsmöglichkeiten für essentielle Gestaltungsparameter im vorangehenden Abschnitt 5.1 kennen gelernt. Hier wollen wir auf die blockgestaltenden Eigenschaften von Blöcken, ihre relative Platzierung in der Seite sowie Eigenschaften des Teilens beim Spalten- oder Seitenumbruch eingehen. Aus Platzgründen müssen wir uns auf die in der täglichen Praxis gängigen Konstrukte beschränken.
52
Das Blockelement
Zu den blockgestaltenden Eigenschaften gehört zunächst einmal der zu verwendende Font, den man mit der Eigenschaft font-family bestimmt. Setzen Sie als Wert den Schriftnamen ein, wie Sie es aus anderen Textverarbeitungssystemen gewohnt sind. Soll beispielsweise Times New Roman verwendet werden, spezifizieren Sie: ...
Hinweis Für den Fall, dass der bezeichnete Font nicht verfügbar ist, können nach dem Schriftnamen und einem Komma auch weitere Fonts als Ersatz spezifiziert werden. Schriftgröße und Zeilenhöhe werden mit font-size bzw. line-height bestimmt: ... font-size="10pt" line-height="12pt" ...
Hinweis Als Maßeinheiten sind Zentimeter (cm), Millimeter (mm), Inches (in), DTP-Punkte (pt), Picas (pc, 1 pc = 12 pt), Breite eines m (em; nicht von allen Formatierern unterstützt!) und Pixel (px; abhängig von der Auflösung des Wiedergabemediums!) oder Bruchteile davon zulässig. Damit haben Sie schon einmal die wichtigsten Parameter in Ihrem Stylesheet unter Kontrolle und vermeiden die Anwendung ggf. abweichender Produkt-Parameter. Wünschen Sie eine andere als die linksbündige Textausrichtung, spezifizieren Sie diese beispielsweise für Blocksatz mit:
schnell + kompakt
53
5 – Typografische Gestaltung
... text-align="justify" ...
Bei dieser Gestaltung werden Sie, um unschön große Wortabstände zu vermeiden, Silbentrennung wollen. Dafür müssen Sie die Silbentrennung aktivieren und die Sprache bezeichnen, nach deren Regeln getrennt werden soll: ... hyphenate="true" language="de" ...
Für die hier bezeichnete Sprache Deutsch muss allerdings der Formatierer auch die entsprechende Silbentrennung unterstützen! Damit die Blöcke nicht lediglich durch die letzte, ggf. kurze Zeile als solche sichtbar sind, können Sie entweder die erste Zeile (!) eines Blocks etwas einziehen oder die aufeinander folgenden Blöcke durch einen Abstand (Vorschub) trennen. Sie können auch beides zugleich anwenden: ... text-indent="12pt" space-after="3mm" ...
Hinweis Bei den Eigenschaften space-before und space-after handelt es sich um sehr mächtige Konzepte für den Vorschub in der gegebenen Block-Vorschub-Richtung (bei uns von oben nach unten). Die Vorschübe können variabel mit Minimal-, Optimalund Maximalwerten bezeichnet werden. Bei direkt aufeinander treffenden Vorschüben – space-after für den vorangehenden Block und space-before für den nachfolgenden Block – wird nor-
54
Das Blockelement
malerweise der kleinere Wert beider Spezifikationen ignoriert. Es können aber auch Vorrangregeln für diese direkt aufeinander treffenden Vorschub-Spezifikationen gesetzt werden. Wollen Sie einen Block links und rechts einrücken – ausgehend von den Rändern, die durch die Umgebung des Blocks gegeben sind – verwenden Sie dafür startindent bzw. end-indent: ... start-indent="6mm" end-indent="6mm" ...
Hinweis Mit start-indent ziehen Sie alle Zeilen eines Blocks entsprechend links ein, nicht allein die erste Zeile (wie mit text-indent). Die beiden Eigenschaften vererben sich auf untergeordnete Blöcke. Dies werden wir für verschachtelte Listen nutzen (siehe Abschnitt 6.1). Profitipp Verwenden Sie für das Einziehen links und rechts nicht die Eigenschaften margin-left bzw. marginright, da sie nicht vererbt werden! Hintergründe, Innenabstände und Rahmen von Blöcken werden in Abschnitt 6.2 behandelt.
schnell + kompakt
55
5 – Typografische Gestaltung
5.3 Das Inline-Element Innerhalb von Blöcken bietet XSL-FO eine Fülle von Konstrukten, von denen hier nur diejenigen zur inzeiligen typografischen Hervorhebung genannt werden: – Inzeilige Hervorhebung (fo:inline). Dieses Element wird im Folgenden hinsichtlich seiner typografischen Möglichkeiten näher betrachtet. – Inzeilige Gestaltung eines einzelnen Zeichens (fo:character). Unterscheidet sich von fo:inline lediglich durch die zusätzliche Eigenschaft, mit character ein einzelnes Zeichen zur Darstellung zu bestimmen. – Inzeiliger Container für Blockelemente (fo:inline-container). Dieses Element wird im anschließenden Abschnitt 5.4 behandelt. fo:inline kann wiederum verschachtelt genutzt werden. Da die meisten Eigenschaften vererbbar sind, lassen sich dadurch für Teile von Hervorhebungen Eigenschaftskombinationen (z.B. fett innerhalb einer gesperrten Zeichendarstellung) erreichen. Normalerweise wird man aber die Hervorhebungseigenschaften innerhalb eines fo:inlineElements kombinieren. Eine Kursivauszeichnung erhält man durch: ...
Die Fettdarstellung bezeichnet man mit: ... font-weight="bold" ...
56
Das Inline-Element
Für die Kombination fett-kursiv werden die beiden vorbezeichneten Eigenschaften kombiniert: ... font-style="italic" font-weight="bold" ...
Für die Unterstreichung sorgt der Code: ... text-decoration="underline" ...
Eine Überstreichung erhält man durch den alternativen Wert overline, eine Durchstreichung durch den Wert line-through. Die Zeichen innerhalb von Wörtern lassen sich um einen beliebigen Wert sperren: ... letter-spacing="0.5pt" ...
Die Hochstellung braucht zwei Attribute: ... baseline-shift="super" font-size="60%" ....
Durch die zusätzliche Verringerung der Schriftgröße in Relation zu der Schriftgröße der Umgebung werden die Hochstellungen in der vorgegebenen Zeilenhöhe gehalten. Wenn Sie Tiefstellung benötigen, ersetzen Sie den Wert super durch sub. Wollen Sie noch mehr? Hier ist es: ... font-variant="small-caps" ...
Damit werden die Kleinbuchstaben Ihres Textes in Großbuchstaben in der Höhe der normalen Kleinbuchstaben
schnell + kompakt
57
5 – Typografische Gestaltung
transformiert. Diese nennt man Kapitälchen. Großbuchstaben bleiben unverändert. Schließlich: ... font-stretch="condensed" ...
verringert die Laufweite aller Zeichen. Der alternative Wert expanded verbreitert die Laufweite. Hinweis Die meisten der hier beschriebenen Eigenschaften für inzeilige Hervorhebungen lassen sich auch auf das Blockelement fo:block anwenden!
5.4 Block- und Inline-Container Blöcke (fo:block) werden immer in der durch die Schreibrichtung vorgegebenen Blockvorschubachse (bei uns von oben nach unten) aneinander gereiht, ggf. mit Abständen dazwischen. Sie lassen sich weder fest in der Seite positionieren noch in ihrer Breite und / oder Höhe dimensionieren. Um dies beides – wo man es braucht – zu erreichen, bietet XSL-FO das Konstrukt Block-Container (fo:block-container). Dieser Container enthält dann in beliebiger Zahl und Mischung sämtliche Blockelemente einschließlich untergeordneter Block-Container. Analog zu dem Konzept der Block-Container existiert das der Inline-Container (fo:inline-container). Wie der Name schon sagt, werden diese relativ zur Zeile, in der sie positioniert sind, platziert. Höhe und Breite lassen sich
58
Block- und Inline-Container
auch für diese inzeiligen Container festlegen. Und – was das Schönste ist – sie lassen wiederum das gesamte Spektrum der Blockelemente einschließlich untergeordneter Block-Container als Unterstrukturen zu. Wozu braucht man Block-Container? Insbesondere für komplex gestaltete Anzeigen, Umschläge, Titelblätter oder Formulare. Wozu braucht man Inline-Container? Zum Beispiel für Einträge in Wörterbüchern mit komplexen über- oder untergeordneten Akzentuierungen oder Werkausgaben, in denen mehrere Manuskriptfassungen in einer Textzeile vertikal synchronisiert dargestellt werden sollen.
Block-Container Für die Anwendung von Block-Containern sind folgende Aspekte zu berücksichtigen: – die absolute Positionierung in der Seite bzw. den Seitenbereichen, in denen ein Block-Container zur Formatierung aufgerufen wird, – die Platzierungskoordinaten innerhalb der Seite bzw. des Seitenbereichs, – Höhe und / oder Breite des Block-Containers, – im Falle der Überlagerung von Block-Containern ihre Stapelungsebene (wer ist im Vordergrund, wer im Hintergrund). Die absolute Positionierung eines Block-Containers wird mit dem Attribut absolute-position bestimmt.
schnell + kompakt
59
5 – Typografische Gestaltung
Mit dem Default auto fließt der Container im Textfluss wie die anderen Blockelemente. Er dient lediglich als Hülle für die untergeordneten Blockelemente. Mit dem Wert absolute wird der Container in dem gegebenen Seitenbereich fest positioniert. Wenn keine Platzierungskoordinaten angegeben werden, wird der Container in der oberen linken Ecke des Seitenbereichs positioniert. Mit dem Wert fixed wird der Container in der Seite ohne Berücksichtigung der Seitenbereiche fest positioniert. Für die Platzierung auf der Seite bzw. in dem gegebenen Seitenbereich dienen die Attribute top, bottom, left und right. Die Höhen- und Breitenausdehnung des Containers lässt sich mit den Attributen height und width bestimmen. Wird die Breite nicht festgelegt, dann gilt die Breite des gegebenen Seitenbereichs bzw. der Seite. Ist der Container in seiner Ausdehnung fixiert, lässt sich für den Fall des Inhaltsüberflusses das Attribut overflow anwenden, dessen Wert entscheidet, was mit dem überschießenden Inhalt geschehen soll. Mit dem Attribut z-index lässt sich für einander überlagernde Container die Stapelungsebene festlegen (der Container mit dem höheren Indexwert liegt über dem mit einem niedrigeren Wert). Wenn durch Hintergrundeigenschaften nichts Abweichendes bestimmt ist, sind die übereinander gestapelten Container transparent, d.h. man kann die Inhalte des untergeordneten Containers sehen, wenn sie nicht durch Inhalte des übergeordneten verdeckt werden.
60
Block- und Inline-Container
Profitipp Mehrspaltige Layouts sind zweifellos nicht die Stärke von XSL-FO, weil lediglich für eine gesamte Seitenfolge anwendbar (siehe Abschnitt 6.2). Innerhalb von BlockContainern kann bei Anwendung des FO-Formatierers von Antenna House die Mehrspaltigkeit für den gegebenen Block-Container unabhängig von der Spaltigkeit der Seite hergestellt werden (mit dem proprietären Attribut axf:column-count).
Inline-Container Für die Demonstration des Inline-Container-Konzepts soll folgendes Beispiel genügen: Listing 5.4: Inline-Container mit zwei Blöcken
... Kopflinie header
Für die vertikale Ausrichtung des Inline-Containers ist mit dem Attributwert middle bestimmt, dass er sich auf der halben Höhe eines x-Zeichens des gegebenen Fonts und der gegebenen Schriftgröße ausrichten soll. Inhalt sind zwei Blöcke, deren Inhalte horizontal mittig zentriert ausgerichtet werden sollen. Der Block mit dem breiter laufenden Inhalt bestimmt die Breite des Inline-Containers.
schnell + kompakt
61
KAPITEL 6 Besondere Layout-Situationen 6.1
Aufzählungen
63
6.2
Kästen
65
6.3
Grafiken
68
6.4
Tabellen
71
6.5
Fußnoten
77
Mit den Blockelementen, den Containern und dem InlineElement sind die wichtigsten Formatierungen eines Dokuments bereits erklärt und die Dokumente sehen schon weitgehend korrekt aus. In vielen Publikationen gibt es jedoch weitere Layout-Situationen, die häufig benutzt werden.
6.1 Aufzählungen Für Aufzählungen gibt es in XSL-FO ein eigenes Formatierungskonzept, das bei gezählten und ungezählten Listen identisch angewendet wird. Das Konzept setzt im Prinzip auf ein zweispaltiges Layout – eine Spalte für das Aufzählungszeichen und eine Spalte für den Inhalt des Aufzählungselements. Den äußeren Rahmen für das Konstrukt bildet das Blockelement fo:list-block, das die Aufzählung komplett umschließt. Für jedes einzelne Listenelement muss in der nächsten Schachtelungsebene ein fo:list-item vorhan-
schnell + kompakt
63
6 – Besondere Layout-Situationen
den sein, das seinerseits in fo:list-item-label für das Aufzählungszeichen und in fo:list-item-body für den Inhalt unterteilt ist. Die letzte Ebene, bevor der eigentliche Inhalt eingefügt wird, sind – wie schon bei den Seitenbereichen – ein oder mehrere Blockelemente, im einfachsten Fall fo:block, ansonsten aber auch in beliebiger Zahl und Mischung fo:table, fo:block-container oder auch fo:list-block. Listing 6.1: FO-Konstrukt für eine ungezählte Aufzählung
• ...
Der Wert, der beim Attribut provisional-distancebetween-starts angegeben ist, bezeichnet den Abstand, auf den sich die Funktion body-start() bei fo:listitem-body bezieht. Vergrößert man diesen Wert, dann schiebt sich die Linie, an der der Aufzählungstext ausgerichtet wird, nach rechts.
64
Kästen
Gezählte Listen Die Unicode-Zeichenreferenz • im Beispiel steht für einen dicken Punkt als Aufzählungszeichen. Sollten Sie statt eines festen Zeichens eine Nummerierung benötigen, dann benutzen Sie an Stelle der Zeichenreferenz den XSLT-Befehl xsl:number.
Geschachtelte Listen Aufzählungen können auch geschachtelt vorkommen – beliebig viele Ebenen tief, bis zur Grenze der Darstellbarkeit. Dabei muss das FO-Element fo:list-block für die tieferen Ebenen jeweils innerhalb von fo:list-item-body zu stehen kommen. Hinweis Sind Aufzählungen in der XML-Struktur rekursiv verwendet, d.h. Aufzählungen sind gleich strukturiert in beliebigen Ebenen zulässig, genügt für die Aufzählungen in allen Ebenen eine einzige Template-Regel. Probieren Sie es aus!
6.2 Kästen Kästen sind in Ratgebern und Fachinformationen beliebte Gestaltungsmittel, deren konkrete Eigenschaften so vielfältig sind wie die Layoutmöglichkeiten. Deshalb werden wir uns hier auf einige wenige Beispiele beschränken. Die Gestaltung von Kästen mit XSL-FO ist im Prinzip nur eine Variante des Einsatzes von Blockelementen mit zusätzlichen Eigenschaften. So wird z.B. ein grau hinterleg-
schnell + kompakt
65
6 – Besondere Layout-Situationen
ter Kasten, der exakt so breit sein soll wie der Satzspiegel und dessen Text rundherum um 1mm eingezogen sein soll, über folgende Attribute erreicht: – background-color für die Hintergrundfarbe, hier mit dem Wert gray (zu den Farben siehe Kapitel 8), – padding ergänzt den vorhandenen Block nach außen – dehnt also den Hintergrund um den angegebenen Wert nach außen, – start-indent und end-indent ziehen den gesamten Block links und rechts um den angegebenen Wert ein, so dass nun der Hintergrundblock tatsächlich satzspiegelbreit ist und der enthaltene Text eingezogen. Listing 6.2: Kasten mit grauer satzspiegelbreiter Hinterlegung und eingezogenem Text
Hinweis Um einen Hintergrund zu gestalten, ist neben den Farben auch die Nutzung von Bildern möglich – einschließlich des aus HTML bekannten Kachelprinzips. Außerdem kann der Hintergrund mit den Attributen
66
Kästen
background-position-horizontal und backgroundposition-vertical relativ zum Bild verschoben werden. Um einen Kasten mit einem Rahmen zu versehen, der außerhalb des Satzspiegels verläuft und dafür den Textblock genau im Satzspiegel hält, sind folgende Attribute notwendig: – border erweitert – ebenso wie padding – den aktuellen Block nach außen, – padding für den Abstand zwischen dem Text und der Linie. Listing 6.3: Kasten mit Rahmen außerhalb des Satzspiegels
Die Werte bei border und padding addieren sich dabei. Da der Text (nicht der Rahmen außen herum!) satzspiegelbreit stehen soll, sind start-indent und end-indent hier nicht notwendig. Hinweis Das Attribut border bei fo:block ist ein so genanntes Sammelattribut, in dem – getrennt durch Leerschritte – die Werte für mehrere Einzelattribute stehen können: in unserem Fall für border-width, border-style und border-color. Diese drei Attribute sind ihrerseits eben-
schnell + kompakt
67
6 – Besondere Layout-Situationen
falls Sammelattribute, die noch in Attribute für die vier Seiten des aktuellen Blocks aufgeteilt werden können: z.B. border-top-width, border-right-width, border-bottom-width und border-left-width, falls dies benötigt wird. Ansonsten gelten die Sammelattribute für alle vier Seiten gleichermaßen. Profitipp Gelegentlich werden mehrspaltige Grundlayouts verwendet. Die Mehrspaltigkeit ist eine Eigenschaft von fo:region-body und somit bereits in der Seitenvorlage angelegt. Wenn ein Kasten die Spalten überspannen – also satzspiegelbreit sein – soll, dann wird dies mit dem Attribut span und seinem Wert all erreicht. XSL-FO bietet jedoch keine Möglichkeit, z.B. zwei von drei Spalten zu überspannen!
6.3 Grafiken Welche Grafikformate eingebunden werden können, ist eine Frage des XSL-FO-Formatierers (siehe Abschnitt 2.3). Wie sie eingebunden und wie sie gestaltet werden, ist für alle Grafikformate identisch.
Freigestellte Grafiken Der eigentliche FO-Befehl für die Einbindung von Grafikdateien (fo:external-graphic) braucht ein übergeordnetes Element – in der Regel wird das fo:block sein, dem
68
Grafiken
die grundsätzliche Ausrichtung bzw. Positionierung der Grafik mitgegeben werden kann. Die wichtigsten Formatierungsmöglichkeiten für freigestellte Grafiken sind die Sammelattribute background, padding und border (siehe die Beispiele in Abschnitt 6.2), für die Abstände zu den vorherigen und nachfolgen Objekten space-before und space-after und für die Angabe der Höhe bzw. Breite die Attribute content-height und content-width. Listing 6.4: Template-Regel für eine freigestellte Grafik mit Rahmen und einer festen Breite gefolgt von einer Bildlegende
Abb. :
Im Beispiel wird vorausgesetzt, dass die Grafik (grafik) ein Kindelement von bild ist. Der Dateipfad für die Grafik steht in dem Attribut dateiref. Gezählt werden mit xsl:number die Bilder, egal in welcher Ebene der XML-
schnell + kompakt
69
6 – Besondere Layout-Situationen
Struktur sie auftreten. Sollte in der XML-Quelldatei auch die Breite der Grafik angegeben sein, müsste sie analog angesprochen werden. Hinweis Sollen die Bildmaße generell im Maßstab verändert werden, so kann dieser Wert hier mit einfließen, z.B. content-width="{@breite} * 0.7". Profitipp Setzt man bei dem Blockelement, das den Grafikaufruf und die Bildlegende umschließt, das Attribut keeptogether.within-page auf den Wert always, dann werden Bild und Bildlegende beim Seitenumbruch nicht getrennt. Profitipp Gibt man sowohl bei content-height als auch bei content-width einen festen Wert an, wird der FO-Formatierer versuchen, dem gerecht zu werden – und ggf. das Bild verzerrt wiedergeben. Zwar kann man über das Attribut scaling festlegen, ob verzerrt wird, aber einfacher hat man es, wenn man nur eines der beiden Maße angibt.
Inzeilige Grafiken Grafiken können auch als inzeilige Elemente positioniert und gestaltet werden. Zu diesem Zweck müssen sie innerhalb entsprechender Inline-Elemente stehen, wie z.B. fo:inline (siehe Abschnitt 5.3), fo:basic-link (siehe Abschnitt 7.1) oder fo:marker (siehe Abschnitt 7.3).
70
Tabellen
Hinweis Da sich die Höhe von inzeiligen Grafiken auf die Zeilenhöhe auswirkt, sollte hier mit einer festen Höhe (content-height) gearbeitet werden, die der Zeilenhöhe entspricht.
6.4 Tabellen Tabellen dienen im ursprünglichen Sinn der übersichtlichen Darbietung gleich gearteter, kleinteiliger Informationen. In populären Publikationen – insbesondere in Zeitschriften – finden sich oftmals vielfältig gestaltete Tabellen, die unterschiedlichste Informationsarten beinhalten. Da mit XSL-FO voll automatisiert – also ohne manuelle Eingriffe – komplexe Layouts generiert werden, kann diese Gestaltungsvielfalt nur unter hohem Aufwand bewahrt werden. Je nach den Erfordernissen der Publikation sollten ein oder mehrere Tabellentypen festgelegt werden, auf die man sich beschränkt. Die Information, nach welchem Tabellentyp eine Tabelle formatiert werden soll, muss natürlich aus dem XML-Quelldokument kommen. Das Tabellenkonzept von XSL-FO ähnelt in seiner Logik und Stringenz dem HTML-Tabellenmodell. Ausgehend von fo:table werden ein Tabellenkorpus (fo:table-body) und optional ein Tabellenkopf (fo:table-header) bzw. ein Tabellenfuß (fo:table-footer) festgelegt. Tabellenkopf und Tabellenfuß kommen dabei vor dem Tabellenkorpus zu stehen, damit beide Strukturen bei mehrseitigen Tabellen besser greifbar sind. Beide Tabellenbereiche wer-
schnell + kompakt
71
6 – Besondere Layout-Situationen
den nämlich standardmäßig automatisch wiederholt.
bei
Seitenumbrüchen
Innerhalb aller drei Tabellenbereiche kann entweder mit Tabellenzeilen (fo:table-row) oder gleich mit Tabellenzellen (fo:table-cell) weitergearbeitet werden. Soll ohne Tabellenzeile direkt mit Tabellenzellen gearbeitet werden, so ist es erforderlich, dass die erste Zelle einer Zeile mit dem Attribut starts-row="true" ausgestattet wird und die jeweils letzte Zelle mit ends-row="true". Hinweis Es gibt außerdem das FO-Element fo:tableand-caption, das neben einer Tabelle (fo:table) auch eine optionale Tabellenbeschriftung (fo:tablecaption) enthält. Wenn also Tabellen eine Tabellenbeschriftung haben (können), dann ist das Wurzelelement für Tabellen fo:table-and-caption! Hinweis Auf FO-Tabellen (fo:table) lassen sich zwei prinzipielle Tabellen-Layouts anwenden, die mit dem Attribut table-layout="auto" (dies ist der Default) oder table-layout="fixed" festgelegt werden. Mit dem erstgenannten Wert werden die Spaltenbreiten ähnlich wie in HTML-Browsern unter Berücksichtigung der Zelleninhalte automatisch bestimmt. Mit dem Wert fixed bestimmen die Angaben für Tabellenbreite und Spaltenbreiten die Tabellengestaltung, nicht die Zelleninhalte. Darüber hinaus können für die Spalten (fo:tablecolumn) gesondert Eigenschaften definiert werden, wie z.B. Spaltenbreite (column-width) und die Liniengestal-
72
Tabellen
tung mit dem Sammelattribut border. Eine Zählung der Tabellenspalten muss nicht angegeben werden, da sie sich aus der Reihenfolge der Spaltendefinitionen ergibt. Hinweis Gibt man die Spaltenbreite bei fo:table-column mit relativen Werten an, die sich insgesamt zu 100% addieren, dann wird die Tabelle stets auf die volle Satzspiegelbreite gesetzt. Egal ob im XML-Quelldokument bereits ein Tabellenmodell vorhanden ist oder ob aus einer semantischen Tabelle eine gestaltete Tabelle werden soll, der Umsetzungsprozess wird sich immer über mehrere Template-Regeln erstrecken, die die endgültige Tabelle wie ein Mosaik zusammensetzen. Listing 6.5: Das zusammengesetzte Tabellenmodell von XSL-FO
... ... ... ...
schnell + kompakt
73
6 – Besondere Layout-Situationen
... ... ... ...
Für alle diese FO-Elemente ist eine Vielzahl von Attributen zugelassen – auch die Sammelattribute background, border und padding, mit denen höchst unterschiedliche Gestaltungen geschaffen werden können. Bei der Verwendung innerhalb einer Tabellenzelle richtet sich der Wert von padding allerdings nach innen – und nicht nach außen wie sonst. Hinweis Die vertikale Ausrichtung kann mit dem Attribut display-align an die Tabellenzelle gebunden werden, während die horizontale Ausrichtung an das Blockelement gebunden wird, das zwingend in jeder FO-Tabellenzelle vorhanden sein muss. Besonders hingewiesen sei noch auf die Möglichkeit des Überspannens von Spalten, das mit dem Attribut number-columns-spanned bei fo:table-column und fo:table-cell eingesetzt werden kann, und des Überspannens von Zeilen mit dem Attribut number-rowsspanned bei fo:table-cell, die auf die entsprechenden Konstrukte von HTML und CALS rekurrieren.
74
Tabellen Listing 6.6: Tabelle mit zwei Spalten und vier Tabellenzeilen: mit Überspannen beider Spalten (Zeile 1), mit einer Zelle je Spalte (Zeile 2) und mit Überspannen von zwei Zeilen in der ersten Spalte (Zeilen 3 und 4)
... ... ... ... ... ...
schnell + kompakt
75
6 – Besondere Layout-Situationen
Damit das komplette Tabellengitter mit einer Linie versehen wird, müssen die verschiedenen Tabellenbereiche mosaikartig mit den entsprechenden Angaben versehen werden. Begonnen wird mit dem Sammelattribut border bei fo:table, das einen Rahmen um die Tabelle zieht. Dann folgt die erste Tabellenspalte mit border-right, das die erste Spalte auf der rechten Seite mit einer Linie versieht. Danach kommen die erste, zweite und dritte Tabellenzeile mit border-bottom, was jeweils dem unteren Rand jeder Zeile eine Linie hinzufügt.
Abb. 6.1: Tabellengitter des Beispiels auf den vorstehenden Seiten
Hinweis Ein komplexeres Beispiel einer Tabelle, die mit XSL-FO gestaltet wurde, finden Sie im Anhang „Kurzreferenz“ . Profitipp Tabellen können auch ineinander geschachtelt sein. Im Fall von XSL-FO muss die „innere“ Tabelle in einer Tabellenzelle zu stehen kommen. Damit ist eine beliebige
76
Fußnoten
Schachtelung bis zu den Grenzen der Darstellbarkeit möglich. Profitipp Bei einem Seitenumbruch innerhalb der Tabelle werden alle Tabellenköpfe und Tabellenfüße – auch die der geschachtelten Tabellen! – wiederholt, es sei denn, Sie würden dies durch table-omit-header-at-break bzw. table-omit-footer-at-break mit dem Wert true in fo:table ausschließen.
6.5 Fußnoten Das Fußnotenkonzept von XSL-FO hat eine wunderbar einfache und logische Struktur. An derselben Stelle, an der im XML-Quelldokument ausschließlich der Fußnoteninhalt gespeichert ist, wird nun innerhalb des Konstrukts fo:footnote sowohl das Fußnotenzeichen als auch die konkrete Gestaltung der Fußnote samt Inhalt abgelegt.
Gestaltung von Fußnotenzeichen und Fußnote Das Fußnotenzeichen, das ja später innerhalb der Zeile positioniert werden soll, wird mit Hilfe des Inline-Elements und seiner Attribute baseline-shift und font-size und ggf. weiterer Gestaltungsattribute formatiert. Parallel dazu wird – ebenso innerhalb von fo:footnote – die Fußnote selbst formatiert. Dabei wird auf das Aufzählungskonzept (siehe Abschnitt 6.1) von XSL-FO zugegrif-
schnell + kompakt
77
6 – Besondere Layout-Situationen
fen, sofern die Fußnotenziffer am linken Rand freigestellt und der Fußnotentext darunter eingezogen sein soll. Die typografischen Eigenschaften, wie z.B. die Schriftgröße, werden beim Blockelement innerhalb von fo:listitem-label bzw. fo:list-item-body festgelegt. Listing 6.7: Gestaltung einer Fußnote einschließlich der Fußnotenziffer im Text
... wie Aufzählung ...
Fußnotenlinien Typischerweise werden die Fußnoten am Fuß der Seite durch eine Fußnotenlinie vom Fließtext getrennt. Dies erreicht man, indem man für die Seitenfolge (fo:page-sequence), in der sich die Fußnoten befinden können, einen zusätzlichen statischen Inhalt (fo:staticcontent) mit dem standardisierten Flussnamen (flowname="xsl-footnote-separator") spezifiziert. In diesem fo:static-content wird die Trennlinie zwischen dem Fließtext und dem Fußnotenbereich definiert.
78
Fußnoten Listing 6.8: Definition der Fußnotenlinie
Für die Fußnotenlinie selbst wird hier das FO-Konstrukt fo:leader benutzt, das auch im normalen Textfluss als Führungslinie mit variabler oder fester Länge eingesetzt werden kann.
schnell + kompakt
79
KAPITEL 7 Verlinkung, Orientierung 7.1
Verlinkung
81
7.2
Paginierung
84
7.3
Kolumnentitel
86
Mit den bisher behandelten Themen können wir die Inhalte einer Dokumentation oder Publikation gefällig gestalten. Es fehlen noch die Konstrukte zur Verlinkung der Dokumentinhalte bzw. der Dokumentinhalte zu externen Informationen und die Mittel zur Orientierung, dies sind traditionell Seitenzahlen (Pagina) und lebende Kolumnentitel. Dazu mehr im Folgenden.
7.1 Verlinkung In einer gedruckten Publikation spielen aktive Links keine Rolle. Soll aber z.B. ein E-Book im PDF-Format entstehen, dann wird die Linkfunktionalität sehr wohl gebraucht. Der entsprechende Befehl heißt fo:basic-link und kann vielfältigst gestaltet werden, u.a. mit den Sammelattributen background, border und padding.
schnell + kompakt
81
7 – Verlinkung, Orientierung
Externe Links Handelt es sich bei dem Verweis um einen externen Link – also typischerweise ins WWW oder auf eine andere Datei – dann muss als Attribut für die Bezeichnung des Sprungziels external-destination verwendet werden. Der Attributwert beinhaltet die komplette URI. Listing 7.1: Externer Link mit der WWW-typischen Gestaltung
entwickler-press
Interne Links Interne Links – also Links, die auf andere Teile derselben Publikation verweisen – werden mit dem Attribut internal-destination versehen. Damit ein interner Link auch wirklich funktioniert, müssen im XML-Quelldokument zwei Informationsarten gegeben sein: – Am Verweisziel muss eine ID vorhanden sein, die als Sprungziel benutzt wird, z.B. . – An der Verweisquelle muss beim Linkelement ein Attribut vorhanden sein, das das Verweisziel benennt, z.B. .
82
Verlinkung
Dementsprechend muss es auch im XML-FO-Dokument diese beiden aufeinander bezogenen Informationen geben, sonst funktioniert der Link nicht. Ist sichergestellt, dass für jedes ziel auch ein name im Datenbestand vorhanden ist, dann sieht die Template-Regel für das Verweiselement folgendermaßen aus: Listing 7.2: Interner Link
siehe Kapitel
Im Beispiel wird mit dem XSLT-Befehl xsl:for-each für jeden Knoten in der Knotenmenge von der zugehörige Zielknoten selektiert, indem der Wert des aktuellen Attributknotens in der Knotenmenge des Verweisziels gesucht wird. Sodann wird mit Hilfe der XSLT-Funktion generateid() an der Verweisquelle die ID platziert, die mit Hilfe derselben Funktion dort generiert wurde: Listing 7.3: Generieren einer ID beim Verweisziel
schnell + kompakt
83
7 – Verlinkung, Orientierung
Hinweis Das Attribut id kann bei allen wichtigen FO-Elementen platziert werden, u.a. bei Publikationsfolgen und allen Blockelementen, bei Aufzählungen und Tabellen auch in jeder Ebene des Konstrukts, bei Abbildungen, dem Inline-Element und der Paginierung.
7.2 Paginierung Da die Nummerierung von Knoten, wie z.B. Kapiteln oder Abbildungen, bereits vom XSLT-Prozessor geleistet wird, so dass diese Informationen nur noch als Text dargestellt werden müssen, gibt es in XSL-FO an Nummerierungen nur noch die Zählung der generierten Seiten und deren Referenzierung zu leisten. Die eigentliche Zählung ist denkbar einfach mit dem FOElement fo:page-number als leerem Element. Platziert wird es in der Regel in einem der Seitenbereiche oben oder unten. Mit dem Attribut format kann die Art der Zählung festgelegt werden. Im folgenden Beispiel wird römisch gezählt. Für die arabische Zählung kann das Attribut format einfach entfallen, da dies die Voreinstellung ist. Listing 7.4: Paginierung im Kopfbereich einer rechten Seite
84
Paginierung
Beginn der Zählung Die Paginierung zählt prinzipiell von der ersten bis zur letzten Seite einer Publikation durch. Dargestellt werden die Seitenzahlen nur dort, wo sie in einem Seitenbereich platziert sind. Soll die Paginierung z.B. mit dem Korpus neu beginnen, dann muss in der entsprechenden Seitenfolge das Attribut initial-page-number mit dem Wert 1 gesetzt werden. Listing 7.5: Festlegung der Seitenzählung bei einer Publikationsfolge
...
Seitenreferenzierung Auf die soeben generierte Seitenzählung wird vor allem in Inhaltsverzeichnissen und bei Seitenverweisen Bezug genommen. Für die Referenzierung von Seiten steht das FO-Element fo:page-number-citation zur Verfügung. Mit dem Attribut format kann die Art der Zählung festgelegt werden. Die Stelle, die referenziert werden soll, muss als ID im Datenbestand vorhanden sein und in das das Objekt konstituierende Blockelement übernommen sein:
schnell + kompakt
85
7 – Verlinkung, Orientierung Listing 7.6: Übernahme einer Kapitel-ID in den Block, der das Kapitel konstituiert
...
Bei fo:page-number-citation wird mit dem Attribut ref-id auf den Block mit der entsprechenden id Bezug genommen: Listing 7.7: Referenzierung einer Seite in einem Seitenverweis
... (siehe Seite ) ...
7.3 Kolumnentitel Kolumnentitel dienen in einer Publikation der Orientierung. Sie können verschiedene Formen annehmen. Am häufigsten sind jedoch lebende Kolumnentitel, die z.B. bei einem Lexikon entsprechend der auf den Seiten enthaltenen Stichwörter oder bei einer hierarchisch organisierten Publikation entsprechend der jeweiligen hierarchischen Ebenen wechseln. In XSL-FO steht dafür ein eigenes Konzept zur Verfügung, das in zwei Schritten funktioniert: – Formulierung des als Kolumnentitel zu verwendenden Inhalts bei dem Knoten, auf den sich der Kolumnentitel bezieht, mit fo:marker und Festlegung eines eindeutigen Namens dafür mit Hilfe des Attributs marker-class-name,
86
Kolumnentitel
– Abruf des festgelegten Inhalts im dafür vorgesehenen Seitenbereich mit Hilfe der Referenz auf den festgelegten Namen mit fo:retrieve-marker und dem Attribut retrieve-class-name, das als Wert den vorher definierten Namen enthält. Listing 7.8: Formulierung des Inhalts für den Kolumnentitel in der Template-Regel für die Verarbeitung der entsprechenden Überschrift
Listing 7.9: Abruf des vorformulierten Kolumnentitels im Kopfbereich einer rechten Seite
schnell + kompakt
87
KAPITEL 8 Farben für unterschiedliche Ausgabemedien
Möchte man Farben für den Text oder den Hintergrund seines Dokuments abweichend vom normalen Schwarz bestimmen, muss man berücksichtigen, dass diese Farben in unterschiedlichen Ausgabemedien nach unterschiedlichen Konzepten zu spezifizieren sind. Heute übliche Computerbildschirme setzen das gesamte Farbspektrum einschließlich Schwarz aus den drei Grundfarben Rot, Grün und Blau, abgekürzt RGB, zusammen. Auf den mehrere Farben unterstützenden Bürodruckern wird das Farbspektrum ebenfalls aus RGB gebildet. Schwarz wird ggf. aus einem gesonderten Speicher (meist als Patrone bezeichnet) gedruckt. Im professionellen Farbdruck setzt man für die Erzeugung des Farbspektrums typischerweise ein anderes Farbmodell ein, das aus den Grundfarben Cyan (abgekürzt C; Türkis), Magenta (abgekürzt M; Fuchsiarot), Yellow (abgekürzt Y; Gelb) und der Schlüsselfarbe Schwarz (abgekürzt K) besteht.
schnell + kompakt
89
8 – Farben für unterschiedliche Ausgabemedien
Statt des Farbmodells CMYK gibt es Anwendungen, die die Grundfarbe Schwarz mit einer reinen Sonderfarbe (farbherstellerspezifisch) kombinieren. Schließlich muss Schwarz nicht gleich Schwarz sein, sondern kann Grau in einer Skala von Schwarz bis Weiß sein. Im Weiteren beziehen wir uns ausschließlich auf die Spezifikation von Farben für die Gegenstände, die mit XSLFO direkt angefasst werden. Dies sind der Text und die Blockhintergründe. Die Farbspezifikationen in grafischen Darstellungen können in den Grafikformaten, z.B. RGB in JPEG-Grafiken, fest definiert oder in den Grafik erzeugenden Systemen konfigurierbar sein. Selbstverständlich sind die Farbmodelle für den Druck von Text-Bild-Dokumenten abzustimmen! Die XSL-FO-Eigenschaften, mit denen Farben spezifiziert werden, heißen color für die Textfarbe und background-color für die Hintergründe. Diese Eigenschaften lassen sich auf alle FO-Elemente anwenden, die direkt textlichen Inhalt enthalten. Durch die Festlegung des Default-Farbmodells RGB im Standard ist die Farbspezifikation für die Bildschirm- und Bürodruckerausgabe einfach: ...
definiert die Schriftfarbe Orange und die Hintergrundfarbe Pink für den gegebenen Block. So sind Sie es in HTML für die Anzeige im Web-Browser schon gewohnt.
90
8 – Farben für unterschiedliche Ausgabemedien
Genauer lassen sich die drei Farben jeweils auch mit ihren Hexadezimal-Werten bestimmen: ...
entspricht der Bestimmung mit vorgegebenen Farbnamen (siehe www.w3.org/TR/css3-color, dort im Abschnitt 4.3). An Stelle dieser Angabe in Hexadezimal-Werten kann auch die Spezifikation beispielsweise der Farbe Orange mit der XSL-FO-Funktion rgb(255,165,0) treten. Bei der Bestimmung von Farben im CMYK-Modell ist zu beachten, dass man ja auch eine möglichst gute Entsprechung der Druckfarben in der Vorschau auf dem Bildschirm haben möchte. Dafür bietet XSL-FO eine erweiterte Funktion an, die auf dem Farbprofil des International Color Consortium (ICC) aufsetzt. Die Farben beider Farbmodelle werden in dieser Funktion nacheinander spezifiziert, hier wiederum für das Beispiel Orange: color="rgb-icc(255,165,0,#CMYK,0.000,0.353,1.000)"
Der Parametername CMYK ist streng genommen innerhalb der FO-Deklarationen (fo:declarations) mit der Eigenschaft color-profile-name in fo:color-profile zu definieren. Der FO-Formatierer von Antenna House unterstützt dieses Konstrukt allerdings nicht, verlangt lediglich das Vorzeichen # vor dem im Produkt festen Namen CMYK. Den Orange entsprechenden Grauwert würde man für den FO-Formatierer von Antenna House mit der Farbfunktion wie folgt spezifizieren:
schnell + kompakt
91
8 – Farben für unterschiedliche Ausgabemedien
color="rgb-icc(#Grayscale,32.2%)"
Für die Ermittlung der Farbwerte hier haben wir auf die Seite http://web.forret.com/tools/color.asp zurückgegriffen. Verwenden Sie einen anderen Formatierer als den von Antenna House orientieren Sie sich hinsichtlich der Farbspezifikationen an der Produktdokumentation.
92
KAPITEL 9 Inhaltsverzeichnisse, PDF-Lesezeichen und Register 9.1
Inhaltsverzeichnisse
94
9.2
PDF-Lesezeichen
96
9.3
Register
98
Hier geht es um die Sammlung von Überschriften und Registerbegriffen aus den zu verarbeitenden Daten, ihre sequentielle oder alphabetische Ordnung und schließlich die Darstellung in der Form von Verzeichnissen – die PDF-Lesezeichen bilden ein spezielles Inhaltsverzeichnis im PDF-Reader – mit Verweisen auf die Seiten, in denen diese Überschriften oder Registerbegriffe verankert sind. Unter dem Gesichtspunkt der bloßen Gestaltung erfordern diese Verzeichnisse wenig Eigenes. Das eigentlich Schwierige ist die Sammlung und Ordnung der Verzeichnisinhalte. Dies ist eine Arbeit, die den XSLT-Teil der XSLVerarbeitung betrifft, also durch die „DatenVorkäuer“ (siehe Abschnitt 2.4) im ersten Teil der Verarbeitung bereits getan ist und eigentlich nicht im Themenbereich dieses Buches liegt. Die folgenden kommentierten Beispiele zeigen ein Grundgerüst für die Generierung und Gestaltung solcher Verzeichnisse. Vollständigere Anwendungsbeispiele sind dem Buch Manfred Krüger „XSL-FO verstehen und anwenden“ zu entnehmen.
schnell + kompakt
93
9 – Inhaltsverzeichnisse, PDF-Lesezeichen und Register
9.1 Inhaltsverzeichnisse Als Anforderung sei angenommen, dass jedes Kapitel ein Inhaltsverzeichnis der untergeordneten Abschnitte enthalten soll (wie hier in diesem Buch). Das Inhaltsverzeichnis wird also zwischen der Kapitelüberschrift und dem Kapitelinhalt eingefügt. Die Template-Regel für das Kapitel sieht so aus: Listing 9.1: Template-Regel für das Kapitel-Inhaltsverzeichnis
Zunächst wird die Kapitelüberschrift dargestellt. Darunter wird für jeden Abschnitt innerhalb des Kapitels die benannte Template-Regel IVZ-Eintrag aufgerufen. Unterhalb der Inhaltsverzeichniseinträge wird der gesamte Kapitelinhalt mit den entsprechenden Templates verarbeitet. Da die Kapitelüberschrift bereits als Erstes gesondert aus den Kapiteldaten herausgezogen ist, muss mit einer leeren Template-Regel für diese Überschriften die wiederholte Darstellung unterdrückt werden. Was noch hinzukommen muss, ist die benannte Template-Regel für die Inhaltsverzeichniseinträge:
94
Inhaltsverzeichnisse Listing 9.2: Benannte Template-Regel für den Eintrag im Inhaltsverzeichnis
Diese benannte Template-Regel wird aufgerufen, wenn der XSLT-Prozessor auf dem Knoten eines Abschnitt innerhalb des gegebenen Kapitels steht. Die betreffende Überschrift des Abschnitts wird also in den Block eingezogen, dessen letzte Zeile über die gesamte Textbreite geht. Hinweis Mit xsl:for-each select="Abschnitt" in der vorstehenden Template-Regel für Kapitel steht der Prozessor auf dem Knoten Abschnitt. Die XSLT-Anweisung xsl:apply-templates select="Titel" ... in der vorstehenden benannten Template-Regel IVZ-Eintrag bezeichnet demnach den Titel des betreffenden Abschnitts. Zwischen der Überschrift und der zitierten Seitenzahl, auf der der betreffende Abschnitt beginnt, wird mit fo:leader die Zeile ausgetrieben. Der Seitenverweis zielt auf eine ID, die der XSLT-Prozessor durch die Funktion generate-id() generiert hat. Das muss dem XSLT-Prozessor aber auch gesagt werden und zwar in dem Template für die Abschnitte:
schnell + kompakt
95
9 – Inhaltsverzeichnisse, PDF-Lesezeichen und Register Listing 9.3: Template-Regel für die Generierung der IDs bei den Knoten Abschnitt
Die ID für den Abschnitt wird also für den Block generiert, der den gesamten Inhalt des Abschnitts einschließt.
9.2 PDF-Lesezeichen Für die Generierung von PDF-Lesezeichen ist in der Version 1.1 von XSL-FO ein neues, eigenes Konzept eingeführt worden, das noch nicht in allen FO-Formatierern implementiert sein muss! Zur Spezifikation im Stylesheet müssen wir die TemplateRegel erweitern, die in fo:root den fo:layout-masterset und die Seitenfolgen (fo:page-sequence) festlegt: Listing 9.4: Template-Regel für den Aufruf der Template-Regel für PDFLesezeichen
... ...
96
PDF-Lesezeichen
...
Das einzufügende Lesezeichen-Template folgt: Listing 9.5: Template-Regel für das Generieren der PDF-Lesezeichen
Der PDF-Lesezeichenbaum besteht in diesem Beispiel in der ersten Ebene aus dem Werktitel (ohne Link-Funktio-
schnell + kompakt
97
9 – Inhaltsverzeichnisse, PDF-Lesezeichen und Register
nalität im PDF-Reader), in der zweiten Ebene aus den Überschriften der direkt dem Werk untergeordneten Kapitel und in der dritten Ebene aus den Überschriften der direkt den Kapiteln untergeordneten Abschnitte. Damit die Links auf die Anfangsseiten der Kapitel und Abschnitte funktionieren, müssen für diese Blöcke IDs spezifiziert werden, die der XSLT-Prozessor mit der Funktion generate-id() generiert: Listing 9.6: Template-Regeln für das Generieren der IDs bei Kapitel und Abschnitt
9.3 Register Die umfassende Einführung in die Generierung eines Registers oder Indexes würde den Rahmen dieses Büchleins sprengen. Eine kurze, beschreibende Erläuterung soll hier dennoch folgen. Auch das Indexing-Konzept ist wie das vorher behandelte PDF-Lesezeichen-Konzept neu in die XSL-FO-Version 1.1 aufgenommen worden. Im praktischen Einsatz ist also
98
Register
zunächst zu prüfen, ob der benutzte FO-Formatierer dieses Konzept bereits unterstützt! Die Grundlage für die Registergenerierung bilden die an entsprechender Stelle im Textinhalt als Registereinträge strukturierten und für die Darstellung im Register selbst formulierten Registerbegriffe. Soweit diese in mehr als einer Ebene formuliert werden können (typisch in maximal zwei Ebenen), werden die Registerbegriffe in ein Container-Element eingeschlossen. Diese Registereinträge können im Dokumentinhalt mehrfach auftreten. Die Registereinträge im Dokumentinhalt werden typischerweise an der Stelle ihres Eintrags in der Ausgabe nicht dargestellt, müssen aber für die Sammlung und alphabetische Ordnung des Registers dem XSLT-Prozessor zugänglich gemacht werden und dienen dem FO-Formatierer für die Referenzierung der Seitenzahlen im Register. Dazu werden die Registereinträge in ein fo:inline-Element eingekleidet, dem mit der Funktion generate-id() eine eindeutige Kennung gegeben wird. Auf diese Kennung wird im generierten Register zur Ermittlung der Seitenzahl zurückgegriffen. Der Inhalt dieses inzeiligen Elements ist nun allerdings nicht der ggf. an mehreren Stellen gleich formulierte Registereintrag selbst. Vielmehr wird aus dem textlichen Inhalt ein Indexschlüssel gebildet (mehrere textgleiche Registereinträge produzieren einen identischen Schlüssel!). Der Text des Registereintrags wird zum Wert der Eigenschaft index-key, die als Atttribut dem Umschlagelement fo:wrapper zugeordnet wird. Die Registerbegriffe unterschiedlicher Ebenen werden durch ein Separatorenzeichen (;) getrennt.
schnell + kompakt
99
9 – Inhaltsverzeichnisse, PDF-Lesezeichen und Register
Ein Beispiel für einen Registereintrag mit Begriffen in zwei Ebenen folgt: Beispiel Zunächst der Eintrag im Dokumentinhalt: ...Register Ebenen...
Nach der Verarbeitung mit dem XSLT-Prozessor sieht dies so aus: ... ...
Das Ergebnis der Registergenerierung finden Sie im Register dieses Büchleins. Soweit der einfache Teil für die Registerspezifikation. Richtig schwierig wird jetzt die Registergenerierung. An der Stelle in den Seitenfolgen, an der das Register eingefügt werden soll, wird man eine benannte Template-Regel aufrufen, in der folgende Dinge bestimmt werden: – Für die Gleichbehandlung von Klein- und Großbuchstaben in den Begriffen ist eine translate()-Funktion zu formulieren. – Die Registerbegriffe der ersten Ebene sind sprachspezifisch alphabetisch zu sortieren (mit xsl:sort). – In der Regel wird man den Registerbegriffen mit gleichem Anfangsbuchstaben eine entsprechende Buchstaben-Überschrift voranstellen.
100
Register
– Die Registerbegriffe selbst müssen mit FO-Mitteln gestaltet werden (mit fo:block). – Sofern ein Registerbegriff der ersten Ebene keinen Unterbegriff hat, also für sich einen Registereintrag bildet, werden die Seiten, in denen der Registerbegriff verankert ist, referenziert. Dies geschieht innerhalb von fo:index-page-citation-list mit dem Element fo:index-key-reference mit dem Attribut ref-indexkey, dessen Wert einem index-key (siehe oben) entspricht. – Sofern ein Registerbegriff der ersten Ebene durch einen Begriff in der zweiten Ebene genauer qualifiziert wird, wiederholt sich das Procedere der alphabetischen Sortierung, Gestaltung und Seitenreferenzierung auf dieser Ebene. Das Stichwortverzeichnis dieses Buches ist das Resultat der Verarbeitung wie hier beschrieben.
schnell + kompakt
101
Kurzreferenz
Für die wichtigsten Begriffe, die wir in diesem Buch zumeist unkommentiert benutzt haben, folgt hier eine Zusammenstellung mit Erläuterungen. Begriffe in XSL-FO-Anwendungen Begriff / Unterbegriff Blockelemente
schnell + kompakt
variante Bezeichnung
Erläuterung FO-Elemente, die als Blöcke die Basisstruktur eines XML-FODokuments bilden; zu ihnen gehören fo:block, fo:block-container, fo:list-block, fo:table-and-caption und fo:table
103
Kurzreferenz
Begriffe in XSL-FO-Anwendungen Begriff / Unterbegriff
variante Bezeichnung
Sammelattribut
Erläuterung FO-Attribut, das in definierter Form mehrere Einzelattribute in sich vereinen kann, z.B. border, mit dem für alle vier Seiten (z.B. border-top) eines Blocks gleichzeitig die Eigenschaften für Breite (*-width), Farbe (*-color) und Stil (*-style) bestimmt werden können
Seitenbereich
Region
Bereich einer Seite, die in fo:simple-page-master angelegt und in fo:page-sequence mit Inhalt gefüllt wird
Seitenfolge
Publikationsfolge
Publikationsteil, der aus einer einzelnen Seitenvorlage oder einer Seitenfolgevorlage bestehen kann und mit konkretem Inhalt gefüllt ist (fo:page-sequence)
Seitenfolgevorlage
Kombination von mehreren Seitenvorlagen in einer bestimmten Reihenfolge (fo:page-sequence-master)
Seitenvorlage
Aufbau einer Layoutseite in ihrer Geometrie, z.B. Ränder und Seitenbereiche (fo:simple-page-master)
XML-Dokument
104
wohlgeformtes XML
Dokument einer beliebigen XML-Struktur; kann auch ein XSL-Stylesheet oder ein XMLSchema sein
Kurzreferenz
Begriffe in XSL-FO-Anwendungen Begriff / Unterbegriff
variante Bezeichnung
XML-FO-Dokument XSL-FODokument, FODokument
Erläuterung XML-Dokument, in dem ausschließlich XSL-FO-Elemente und -Attribute zur Strukturbeschreibung enthalten sind; Ergebnis des Transformationsprozesses mit einem XSL-FOStylesheet
XMLQuelldokument
XML-Instanz, Dokument mit den XML-Dokument Eingangsdaten für die Verarbeitung; als XML-Instanz bezeichnet, wenn DTD oder Schema basiert; XMLDokument kann auch lediglich wohlgeformt sein
XSL
XSL-Familie
eXtensible Stylesheet Language ist der zusammenfassende Begriff für die Standards XSLT, XPath und XSL(-FO)
XSLT
XSLTransformation
eXtensible Stylesheet Language Transformations; W3C Recommendation; Syntax für die Transformation von XMLDokumenten
XPath
XML Path Language
XML Path Language; W3C Recommendation; Syntax für die Adressierung in XMLStrukturen
XSL
XSL-FO
eXtensible Stylesheet Language (Formatting Objects); W3C Recommendation; Syntax für die Layoutierung von XMLDokumenten in festen Seitendimensionen
schnell + kompakt
105
Kurzreferenz
Begriffe in XSL-FO-Anwendungen Begriff / Unterbegriff
variante Bezeichnung
Erläuterung
XSL-FO-Attribut
FO-Attribut, Attribut, Eigenschaft
im XSL-Standard definiertes XML-Attribut, das einem oder mehreren FO-Elementen zugewiesen ist und für die konkrete Ausgestaltung der Inhalte sorgt
XSL-FO-Element
FO-Element, Element
im XSL-Standard definiertes XML-Element für die Formatierung der Inhalte; diese Elemente haben den Namensraum fo:
XSL-FO-Formatierer FO-Formatierer, Software zur Layout-VerarbeiFormatierer tung von XML-FO-Dokumenten XSL-FO-Konstrukt
FO-Konstrukt
im XSL-FO-Standard definierte Struktur, häufig gebraucht für komplexe Kombinationen von FO-Elementen und / oder FOAttributen, z.B. fo:list-block, fo:table, fo:footnote
XSL-FO-Stylesheet
XSL-Stylesheet, Stylesheet
Stylesheet zur Transformation von XML-Dokumenten in XMLFO-Dokumente
XSLT-Element
XSLT-Befehl
im XSLT-Standard definiertes XML-Element für die Transformation oder Reorganisation der Inhalte; diese Elemente haben den Namensraum xsl:
XSLT-Prozessor XSLT-Stylesheet
106
Software zur Verarbeitung von XSLT-Stylesheets XSL-Stylesheet, Stylesheet
Stylesheet zur Transformation von XML-Dokumenten in ein beliebiges Ausgabeformat, häufig zu HTML
Stichwortverzeichnis A
D
Abbildung freigestellt 68 inzeilig 70 relative Größenänderung 70 Aufzählung 77 geschachtelte 65 gezählte 63 ungezählte 63 Ausgabeformat alternative Ausgabeformate 17 PDF 16
Defaults 45, 46 anwendungsspezifische 46 im XSL-Standard 46 produktspezifische 46
B Block-Container 58 absolute Positionierung 59 Breite 59 Höhe 59 Platzierungskoordinaten 59 Stapelungsebene 59 Blockelemente 103 fo:block 51, 52, 58 fo:block-container 51 fo:list-block 51 fo:table 51 fo:table-and-caption 51 C CSS W3C-Recommendation 11
schnell + kompakt
E Einzüge (horizontal) 54 F Farben Farbnamen 91 Farbwerteermittlung 92 Grauwerte 91 Hintergrundfarbe 90 Schriftfarbe 90 Farbprofile CMYK 89 ICC 91 RGB 89 Fließtextbereich 41 Font-Spezifikation 53 Fußbereich 42 Fußnote 77 Fußnotenzeichen 77 Inhalt 77 Trennlinie 78 G Grafik 70 Grafikformate 68
107
Stichwortverzeichnis H
M
Hervorhebungen durchstrichen 57 fett 56 fo:inline 56 hochstellen 57 Kapitälchen 57 kursiv 56 Laufweiten verändern 58 sperren 57 tiefstellen 57 überstrichen 57 unterstrichen 57 Hintergrund Kasten 66
Maßeinheiten 53 Mehrspaltigkeit 61, 68
I Inhaltsverzeichnisse 94 Kennung der Objekte 95 Referenzierung der Seitenzahlen 94 Verzeichniseinträge 94 Inline-Container 58 horizontale Ausdehnung 61 vertikale Ausrichtung 61 K Kasten 65 Hintergrund 66 Rahmen 67 Kolumnentitel 86 lebende 86 Kopfbereich 38, 42 L Linie border 67 Link 81 Liste 63
108
N Nummerierung Seiten 84 Seiten mit Neubeginn 85 P Paginierung 84 Papiergröße 36 PDF typisches Ausgabeformat 16 PDF-Lesezeichen 96 Lesezeichenbaum 97 Link zum PDF-Inhalt 97 Publikationsfolge 41, 42 R Rahmen Kasten 67 Register Ebenen 100 Generierung 98 inzeilige FO-Struktur 99 Procedere d. Generierung 100 Registerschlüssel 99 Struktur der Registereinträge 99 Rekursivität 46, 51 S Sammelattribute 104 border 67 Satzspiegel 35 Schachtelung 46, 51 Seitenaufbau 36 Seitenaufteilung 36 Seitenbereiche 36–38, 42, 43, 104
Stichwortverzeichnis Seitenfolge 104 Seitenfolgevorlage 39, 40, 104 Seitengestaltung 35 Seitengröße 37 Seitenlayout 35, 38 Seitennummerierung 84 Seitenränder 35 Seitenreferenzierung 85 Seitentitel 86 Seitenumbruch 40 Seitenverweis 86 Seitenvorlage 35, 36, 38, 39, 41, 104 Seitenzählung 84 Silbentrennung 54 Spalten überspannen 68, 74 T Tabelle 71 horizontale Ausrichtung 74 HTML 71 Tabellen-Layout 72 Typen 71 Textausrichtung 53 U Unicode Zeichenreferenz 65 V Vakatseite 36, 40 Vererbung 46, 49 Verweis 81 externer 82 interner 82 Ziel 82 Voreinstellungen (Defaults) 45, 46 Vorschübe (vertikal) 54
schnell + kompakt
X X SL-FO-Attribut baseline-shift 57 XML-Dokument 104 XML-FO-Dokument 105 XML-Quelldokument 105 XMLSpy, Altova 26 XSL XPath 105 XSL-Familie 105 XSL-FO 105 XSLT 105 XSL-FO Einsatzszenarien 11 Indexing, Registergenerierung 98 Verarbeitungsprozess 15 Version 1.0 8 Version 1.1 8 W3C-Recommendation 7 XSL-FO-Attribut 106 absolute-position 59 alignment-baseline 61 background 69, 74, 81 background-color 66 border 67, 69, 74, 81 bottom 60 character 56 column-width 72 content-height 69–71 content-width 69, 70 display-align 74 end-indent 50, 66 ends-row 72 external-destination 82 flow-name 78 region-name 38
109
Stichwortverzeichnis XSL-FO-Attribut (Forts.) font-family 50, 53 font-size 50, 53, 77 font-stretch 58 font-style 56 font-variant 57 font-weight 56 format 84, 85 height 60 hyphenate 50, 54 id 84, 95 index-key 99, 101 initial-page-number 85 internal-destination 82 keep-together.within-page 70 language 50, 54 left 60 letter-spacing 57 line-height 50, 53 margin-left 50 margin-right 50 marker-class-name 86 number-columns-spanned 74 number-rows-spanned 74 overflow 60 padding 66, 67, 69, 74, 81 provisional-distance-betweenstarts 64 ref-id 86, 94 ref-index-key 101 retrieve-class-name 87 right 60 scaling 70 space-after 54, 69 space-before 54, 69 span 68 start-indent 50, 55, 66 starts-row 72 table-omit-footer-at-break 77 table-omit-header-at-break 77
110
XSL-FO-Attribut (Forts.) text-align 46, 53, 61 text-decoration 57 text-indent 54 top 60 width 60 z-index 60 XSL-FO-Element 106 fo:basic-link 81 fo:block 40, 43, 52, 58 fo:bookmark 97 fo:bookmark-title 97 fo:bookmark-tree 97 fo:character 56 fo:conditional-page-masterreference 41 fo:external-graphic 68 fo:flow 42 fo:footnote 77 fo:index-page-citation-list 101 fo:index-page-key-reference 101 fo:inline-container 58, 61 fo:leader 79 fo:list-item 63 fo:list-item-body 64, 78 fo:list-item-label 64, 78 fo:marker 86 fo:page-number 84 fo:page-number-citation 85, 94 fo:page-sequence 42 fo:region-after 38 fo:region-before 38 fo:region-body 37, 38 fo:region-end 38 fo:region-start 38 fo:repeatable-page-masteralternatives 41 fo:repeatable-page-masterreference 41
Stichwortverzeichnis XSL-FO-Element (Forts.) fo:retrieve-marker 87 fo:static-content 78 fo:table-body 71 fo:table-caption 72 fo:table-cell 72, 74 fo:table-column 72, 74 fo:table-footer 71 fo:table-header 71 fo:table-row 72 fo:wrapper 99 XSL-FO-Formatierer 106 Ecrion XF Rendering Server 21 FOP, Apache 20 Standardmerkmale vs. proprietäre Eigenschaften 9, 17 XEP, RenderX 21 XML2PDF, Altsoft 22 XSL Formatter, Antenna House 23, 26 XSL-FO-Funktion body-start() 64
schnell + kompakt
XSL-FO-Konstrukt 106 XSL-FO-Konstrukte Referenz 9 XSL-FO-Stylesheet 106 XSL-FO-Stylesheet-Designer 25 XMLSpy, Altova 26 XSLT-Attribut xsl:use-attribute-sets 32 XSLT-Element 106 xsl:attribute 32 xsl:attribute-set 32 xsl:import 31 xsl:include 31 xsl:number 65 xsl:param 33 xsl:template 29 xsl:value-of 34 xsl:variable 33 XSLT-Prozessoren 24, 106 XSLT-Stylesheet 106
111