Následující text stručně popisuje nejpoužívanější formátovací objekty. Jejich úplný přehled najdete ve standardu [1].
Běžné formátovací objekty můžeme rozdělit do několika skupin. První skupinu tvoří blokové objekty. Ty se do stránky skládají jeden za druhým ve směru postupu blokových objektů – obvykle od shora dolů. Druhou skupinu tvoří inline elementy, které lze použít uvnitř blokových elementů, a skládají se do nich postupně ve směru definovaném pro inline objekty – typicky zleva doprava. Pro vkládání plovoucích objektů a poznámek pod čarou existuje další skupina pro tzv. out-of-line formátovací objekty. Poslední skupinou jsou různé speciální objekty, které nepatří do předchozích kategorií.
Vytváří samostatný blok textu. Používá se proto pro odstavce, nadpisy a podobné druhy objektů.
Nejpoužívanější vlastnosti
Zarovnání odstavce.
Zarovnání poslední řádky odstavce
Velikost odstavcové zarážky.
Mezera před odstavcem.
Mezera za odstavcem.
Odsazení celého odstavce zleva.
Odsazení celého odstavce zprava.
Zakázání stránkového zlomu odstavce.
Zakázání zlomu mezi odstavcem a následujícím blokem.
Formátovací objekt umožňuje sdružit několik blokových formátovacích objektů a změnit některé vlastnosti – typicky tok směru textu nebo orientaci.
Nejpoužívanější vlastnosti
Otočení orientace bloku oproti nadřazenému bloku. Přípustné hodnoty: 0, 90, 180, 270, -90, -180 a -270.
Hodnota absolute
umožní blok umístit na
souřadnice vztažené k začátku stránky, formátování ostatních objektů
není ovlivněno.
Příklad 3.1. Ukázka otočení textu o 90°
<fo:block> ... </fo:block> <fo:block-container reference-orientation="90" width="8cm"> <fo:block> ... otočený odstavec ... </fo:block> </fo:block-container> <fo:block> ... </fo:block>
Pro vytváření seznamů existuje sada formátovacích objektů. Celý
seznam je uložen v fo:list-block
. Každá
položka seznamu je ohraničena pomocí fo:list-item
.
Položka seznamu pak má své návěstí (jako je odrážka, číslo, text)
fo:list-item-label
a tělo
fo:list-item-body
. Obsahem těla i návěstí musí
být fo:block
.
Nejpoužívanější vlastnosti
Místo vyhrazené pro odrážku. Musí být nastaveno
u fo:list-block
.
Odsazení návěstí i těla. Zase by mělo být nastaveno všude.
Tělo položky seznamu by mělo používat hodnotu
body-start()
.
Odsazení návěstí zprava. Typicky se používá hodnota
label-end()
.
Příklad 3.2. Ukázka seznamu s odrážkami
<fo:list-block provisional-distance-between-starts="1em"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>•</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>První položka seznamu</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>•</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()"> <fo:block>Druhá položka seznamu</fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block>
Příklad 3.3. Ukázka paralelního překladu
<fo:list-block provisional-distance-between-starts="52%" provisional-label-separation="4%" font-size="9pt" text-align="justify"> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>My, občané České republiky v Čechách, na Moravě a ve Slezsku, ...</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()" language="en"> <fo:block>We, the citizens of the Czech Republic in Bohemia, Moravia, and Silesia, ...</fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label end-indent="label-end()"> <fo:block>Česká republika je ...</fo:block> </fo:list-item-label> <fo:list-item-body start-indent="body-start()" language="en"> <fo:block>The Czech Republic is ...</fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block>
Model tabulek ve FO je podobný jako v HTML – tabulka
(fo:table
, fo:table-and-caption
)
se skládá z buněk (fo:table-cell
), které jsou
součástí řádky (fo:table-row
) a řádka je součástí
nějaké skupiny v tabulce (fo:table-body
,
fo:table-footer
,
fo:table-header
). Pomocí vlastností pak můžeme
nastavovat takové věci jako slučování buněk, rámečky okolo buněk a
celé tabulky, barvy, pozadí, zarovnání obsahu buněk apod.
Příklad 3.4. Ukázka jednoduché tabulky
<fo:table> <fo:table-body> <fo:table-row> <fo:table-cell> <fo:block>A</fo:block> </fo:table-cell> <fo:table-cell> <fo:block>B</fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell> <fo:block>C</fo:block> </fo:table-cell> <fo:table-cell> <fo:block>D</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table>
Nejpoužívanější vlastnosti table
:
Použitý algoritmus pro formátování tabulky
(fixed
/auto
). Při fixním layoutu
je potřeba určit šířku sloupců pomocí fo:table-column
.
Šířka tabulky.
Nejpoužívanější vlastnosti table-column
:
Šířka sloupce.
Nejpoužívanější vlastnosti table-cell
:
Počet sloučených buněk.
Počet buněk sloučených vertikálně.
Vzdálenost obsahu buňky od mřížky tabulky.
Vlastnosti pro tvorbu rámečků:
Druh rámečku.
Šířka rámečku.
Barva rámečku.
Hodnota collapse
způsobí, že rámečky se
v místech setkání sloučí, nebudou se zdvojovat.
Hodnota retain
způsobí, že se při rozdělení
tabulky přes hranici stránky vykreslí v místě rozdělení rámeček
Formátovací objekt se používá pro změnu formátování části textu uvnitř odstavce a dalších formátovacích objektů.
Formátovací objekt se používá pro sdružení více blokových objektů do jednoho inline, obvykle z důvodu rozdílného směru sázení textu v jednotlivých blocích.
Při vkládání obrázků je potřeba mít obrázek ve formátu podporovaném použitým procesorem FO. Většina procesorů podporuje bitmapové formáty PNG a JPEG. Podporované vektorové formáty se liší procesor od procesoru. Dobrou zprávou je, že většina procesorů si dnes poradí s SVG.
Nejpoužívanější vlastnosti
URL adresa obrázku. Musí být ve tvaru
url(
.URL
)
Velikost plochy vyhrazené pro obrázek.
Skutečná šířka a výška obrázku
Způsob horizontálního umístění obrázku uvnitř vyhrazené plochy.
Způsob vertikálního umístění obrázku uvnitř vyhrazené plochy.
Způsob zvětšování obrázku (uniform
/non-uniform
).
Příklad 3.5. Ukázka vloženého obrázku
<fo:external-graphic src="url(foto.jpg)" content-width="5cm" width="40%" text-align="center" display-align="center"/>
Formátovací objekt umožňuje dané místo vyplnit libovolným
znakem. Pokud chceme nějaký prostor vyplnit celý, musí být zarovnání
do bloku. Pro poslední řádku odstavce proto použijeme nastavení
text-align-last="justify"
.
Nejpoužívanější vlastnosti:
Druh výplně (dots
, space
,
rule
, use-content
).
Délka výplně.
Druh výplně, pokud se používá čára (dotted
,
dashed
, solid
,
double
, groove
, ridge
).
Síla čáry.
Příklad 3.6. Ukázka výplně
<fo:block text-align-last="justify"> Úvod <fo:leader leader-pattern="dots"/> 1 </fo:block>
Stále větší počet druhů dat lze reprezentovat nějakým XML
formátem. Formátovací objekt
fo:instream-foreign-object
umožňuje přímo mezi FO
zařadit fragment dat v jiném formátu – nejčastěji MathML nebo
SVG. Záleží pak samozřejmě na schopnostech procesoru FO, zda daný druh
dat podporuje.
Příklad 3.7. Vložení obrázku SVG přímo mezi formátovací objekty
<fo:instream-foreign-object content-width="16cm"> <svg viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg"> <desc>This is a blue circle with a red outline</desc> <g> <circle style="fill: blue; stroke: red" cx="200" cy="200" r="100"/> <text x="150" y="160" stroke="yellow" fill="white" font-weight="bold" font-size="20">Hello World</text> </g> </svg> </fo:instream-foreign-object>
Používá se uvnitř fo:block
a umožňuje určit
odlišné formátovací vlastnosti pro první řádek odstavce.
Příklad 3.8. Formátování první řádky
<fo:block> <fo:initial-property-set font-weight="bold"/> Text odstavce, jehož první řádka bude zobrazena tučným písmem... </fo:block>
Aktuální číslo strany lze do dokumentu vložit pomocí
fo:page-number
. Způsob číslování se přitom
nastavuje na sekvenci stránek (fo:page-sequence
)
pomocí vlastností initial-page-number a
format.
Každý FO může mít přiřazen jedinečný identifikátor ve vlastnosti
id. Objekt
fo:page-number-citation
pak vrací stránku
s výskytem objektu, jehož identifikátor zadáme ve vlastnosti
ref-id.
Každý FO může mít přiřazen jedinečný identifikátor ve vlastnosti
id. Objekt
fo:page-number-citation-last
pak poslední stránku
oblasti, na které se vykreslil objekt, jehož identifikátor zadáme ve vlastnosti
ref-id.
Formátovací objekt je v XSL-FO od verze 1.1.
Obsah těchto objektů se obvykle zobrazuje na jiném místě, než je uveden.
Poznámky pod čarou se vytvářejí pomocí objektů
fo:footnote
a fo:footnote-body
.
Poznámky pod čarou nejsou standardně odděleny čarou, ta se musí
vygenerovat pomocí statického obsahu pro oblast
xsl-footnote-separator
.
Příklad 3.9. Ukázka poznámky pod čarou
<fo:footnote> <fo:inline font-size="70%" baseline-shift="super">1</fo:inline> <fo:footnote-body> <fo:block> <fo:inline font-size="70%" baseline-shift="super">1</fo:inline> Text poznámky </fo:block> </fo:footnote-body> </fo:footnote>
Pokud symbol poznámky rozbije řádkování, je možné použít na
rodičovském objektu vlastnost
line-stacking-strategy s hodnotou
font-height
.
Plovoucí objekty (fo:float
) umožňují
obtékání obrázků, případně umístění nějakého většího objektu na první
volné místo.
Příklad 3.10. Ukázka plovoucího objektu
<fo:float float="end"> <fo:block> ...plovoucí obsah... </fo:block> </fo:float>
Nejpoužívanější vlastnosti:
Druh plovoucího objektu (end
,
start
, before
). Některé
implementace podporují i hodnoty inside
a outside
pro vnitřní a vnější okraj
u oboustranného svázaného tisku. Tyto hodnoty jsou standardní součástí
XSL-FO 1.1.
Odkazy se vytvářejí pomocí objektu
fo:basic-link
. Ten může ukazovat buď na jiné místo
dokumentu určené pomocí internal-destination,
nebo na externí dokument pomocí
external-destination.
V mnoha dokumentech chceme mít v záhlaví/zápatí kromě
čísla strany např. název kapitoly nebo podkapitoly. K dosažení
tohoto efektu můžeme použít objekty fo:marker
a
fo:retrieve-marker
. První umožňuje do dokumentu
vložit značku a druhý zjistit aktuální značku.
Můžeme mít přitom libovolný počet kategorií značek a u každé zjišťovat první či poslední výskyt značky apod.
Příklad 3.11. Ukázka značek
<!-- Vytvoření značky --> <fo:marker marker-class-name="kapitola">Úvod</fo:marker> <!-- Zjištění aktuální značky --> <fo:retrieve-marker retrieve-class-name="kapitola" retrieve-position="first-including-carryover"/> <fo:retrieve-marker retrieve-class-name="kapitola" retrieve-position="last-starting-within-page"/>
Význam jednotlivých hodnot u retrieve-position:
first-starting-within-page
Vrátí první značku, jejíž objekt na dané stránce začíná.
first-including-carryover
Vrátí značku odpovídající prvnímu objektu na stránce (může to tedy být značka objektu, který začal na předchozí straně).
last-starting-within-page
Vrátí značku odpovídající poslednímu objektu, který začíná na stránce.
last-ending-within-page
Vrátí značku odpovídající poslednímu objektu, který se ještě celý vejde na danou stránku.
Umožňuje implementovat v tabulkách odlišný obsah
fo:table-header
a fo:table-footer
na každé stránce.
Formátovací objekt je v XSL-FO od verze 1.1.
Objekt slouží k seskupení několika formátovacích objektů a k nastavení společných vlastností.
Formátovací objekt fo:bookmark-tree
společně
s objekty fo:bookmark
a fo:bookmark-title
umožňuje do výstupních formátů,
kde to má smysl, vygenerovat záložky.
Formátovací objekt je v XSL-FO od verze 1.1.
Objekty fo:change-bar-begin
a fo:change-bar-end
umožňují vyznačit místa začátku
a konce změny v dokumentu. Lze pak určit, kde a jakým stylem se
má na okraji textu zobrazot vertikální čára vyznačující změnu.
Formátovací objekt je v XSL-FO od verze 1.1.
V XSL-FO 1.1 bylo přidáno několik objektů a vlastností, které umožňují snazší generování rejstříků.
Skoro na každém formátovacím objektu lze nyní použít atribut index-key, do kterého lze uložit název rejstříkového hesla.
Při generování samotného rejstříku pak můžeme snadno získat
seznam všech stránek, kde se dané rejstříkové heslo vyskytuje pomocí
formátovacích objektů
fo:index-page-citation-list
a fo:index-key-reference
.
Příklad 3.12. Ukázka definice rejstříkového hesla a odkazu na něj z rejstříku
<fo:block index-key="opalování">Jak se správně opalovat</fo:block> … <fo:index-page-citation-list> <fo:index-key-reference ref-index-key="opalování"/> </fo:index-page-citation-list>
Rejstříkové heslo může být vyznačeno přímo na formátovacím
objektu pomocí atributu index-key
. Pokud
rejstříkové heslo přesahuje nějaký delší úsek dokumentu, je možné
vyznačit začátek a konec platnosti rejstříkového hesla pomocí objektů
fo:index-range-begin
a fo:index-range-end
.
Formátovací objekt
fo:index-page-citation-list
může pomocí vlastnosti
merge-sequential-page-numbers automaticky
zajistit převod souvislé posloupnosti čísel stránek na rozsah. Uvnitř
objektu se může vyskytovat více objektů
fo:index-key-reference
s různým nastavením
formátovacích vlastností. Formátovač pak správně seřadí čísla stran
a zachová formátovací vlastnosti.
Formátovací objekty jsou v XSL-FO od verze 1.1.
Různé formátovače se samozřejmě liší tím, jaké formátovací objekty a vlastnosti podporují. Navíc mnohdy obsahují rozšíření jdoucí nad rámec standardu. Tato rozšíření jsou dostupná buď jako elementy nebo atributy ve speciálním jmenném prostoru, případně jako instrukce pro zpracování.
Např. formátovač XEP má rozšiřující objekty definovány ve
jmenném prostoru
http://www.renderx.com/XSL/Extensions
. Podporovaná
rozšíření bývají popsána v dokumentaci každého
formátovače.
Příklad 3.13. Použití rozšíření v souboru FO
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:rx="http://www.renderx.com/XSL/Extensions"> <?xep-pdf-crop-mark-width 0.5pt?> <?xep-pdf-crop-offset 24pt?> <?xep-pdf-bleed 6pt?> <?xep-pdf-initial-zoom fit-width?> <rx:meta-info> <rx:meta-field name="author" value="Jiří Kosek"/> <rx:meta-field name="title" value="EU chce použít XML při rozvoji e-businessu"/> </rx:meta-info> … </fo:root>
Nesmíme zapomenout, že instrukce pro zpracování se v jazyce XSLT generují pomocí speciální instrukce.
Příklad 3.14. Generování rozšíření pomocí XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:rx="http://www.renderx.com/XSL/Extensions"> <xsl:template match="/"> <fo:root> <xsl:processing-instruction name="xep-pdf-crop-mark-width">0.5pt</xsl:processing-instruction> <xsl:processing-instruction name="xep-pdf-crop-offset">24pt</xsl:processing-instruction> … <rx:meta-info> <rx:meta-field name="author" value="Jiří Kosek"/> <rx:meta-field name="title" value="EU chce použít XML při rozvoji e-businessu"/> </rx:meta-info> … </fo:root> </xsl:template> </xsl:stylesheet>