Le découpage et paramétrages des en-têtes et pieds de page

L'attribut pageclass décrit le type général d'une page; il peut avoir les valeurs suivantes :

valeur description
titlepageLa page de titre (la première page)
lotliste des pages, liste des tables, des figures, etc.
frontpréface, dédicace, etc.
bodycontenu principal
backannexes, glossaires, etc.
indextables des index

Les pages de chaque classe (pageclass) sont divisées en position. cette position est définit par l'attribut sequence, avec les valeurs suivantes :

valeur description
firstpremière page de la classe
oddpage impaire, à l'exception de la première page
evenpage paire, à l'exception de la première page
blankpage blanche ajoutée à la suite d'une page paire

et il y a aussi le paramètre double.sided qui détermine si une page est imprimée recto-verso ou pas :

double.sided = 1 : la page est imprimée recto-verso; les marges, les en-têtes et pieds de pages sont en mirroir sur les deux faces de la page.

Par défaut, une page est imprimée en recto simple; double.sided = 0

L'en-tête (header) et le pied de page (footer) sont, par défaut, constitué de 3 champs (case), avec pour position geuche (left), centre (center) et droite (right).

La taille de ces cellules se paramètre avec header.column.widths de la façon suivante :

<xsl:param name="header.column.widths">1 2 1</xsl:param>

ce qui définit la cellule de gauche à 25% ( 1/(1+2+1)), le centre à 50% (2/(1+2+1)) et le droit à 25% ( 1/(1+2+1)) de la largeur de la page.

Ensuite, il ne reste plus qu'à remplir les cellules avec les indications qui conviennent :

Remplissage des cellules

Les cellules sont remplies en surchargeant les paramètres par défaut en redéfinissant header.content ou footer.content :

<xsl:template name="header.content">
...
</xsl:template>

<xsl:template name="footer.content">
...
</xsl:template>

Ces templates ont soumis à des paramètres qu'il faut positionner par défaut :

<xsl:template name="footer.content">
<xsl:param name="pageclass" select="''"/>
<xsl:param name="sequence" select="''"/>
<xsl:param name="position" select="''"/>
<xsl:param name="gentext-key" select="''"/>
...

gentext-key ne sera pas utilisé dans notre exemple.

Ensuite, définissons un bloc :

<fo:block>
...
</fo:block>

Et remplissons ce bloc en fonction de la classe de page :

<xsl:choose>
<xsl:when test="$pageclass = 'titlepage'"></xsl:when><!--pas de pied pour la page de titre-->
<xsl:otherwise>

<xsl:choose>
<xsl:when test="$double.sided = 0"><!-- page recto simple -->
<xsl:choose>
<xsl:when test="$position = 'left'">...</xsl:when>
<xsl:when test="$position = 'center'">...</xsl:when>
<xsl:when test="$position = 'right'">...</xsl:when>
</xsl:choose>
</xsl:when>

<xsl:otherwise><!-- Double-sided = 1 -->
<xsl:choose>

<xsl:when test="$position = 'left'"><!-- cellule de gauche -->
<xsl:choose>
<xsl:when test="$sequence = 'even' or $sequence = 'blank'">...</xsl:when>
<xsl:otherwise><!-- sequence = left|odd -->
...
</xsl:otherwise>
</xsl:choose>
</xsl:when>

<xsl:when test="$position = 'center'"><!-- cellule du centre -->
...
</xsl:when>

The right position on a double-sided page contains the folio on odd pages, the logo on even pages. <xsl:when test="$position = 'right'">
<xsl:choose>
<xsl:when test="$sequence = 'even' or $sequence = 'blank'">
...
</xsl:when>
...
</xsl:otherwise>
</xsl:choose>
</xsl:when>

</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>

Remarque

Si vous n'utilisez que la configuration double.sided = 0, le code est beaucoup plus simple et peut contenter de nombreux cas.

Le code complet permet de tenir compte du plus de paramètres possible.

De la même façon, nous créons un template pour header.content

Il ne reste plus qu'à remplir les cellules avec l'information qui va bien

Informations supplémentaires

Des variable sont déjà définies et prêtes à l'emploi.

titleabbrev.markup, par exemple, faire référence au titre de la partie en cours et s'emploie en l'appelant :

<xsl:apply-templates select="." mode="titleabbrev.markup"/>

Si nous voulons en ajouter d'autres, plus personnalisées, il faudra les définir manuellement.

Le dernier numéro de version

Dans le template, il faut définir la variable suivante :

<xsl:variable name="RevInfo">
<xsl:choose>
<xsl:when test="//revhistory/revision[last()]/revnumber">
<xsl:text>Version </xsl:text>
<xsl:value-of select="//revhistory/revision[last()]/revnumber"/>
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

Il ne restera plus qu'à l'utiliser au bon endroit en l'appelant :

<xsl:value-of select="$RevInfo"/>

Le nom de l'auteur

<xsl:variable name="Author">
<xsl:choose>
<xsl:when test="//authorgroup/author[1]/firstname">
<xsl:value-of select="//authorgroup/author[1]/firstname"/>
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

Le titre du livre

<xsl:variable name="BookTitle">
<xsl:choose>
<xsl:when test="//book/title">
<xsl:value-of select="//book/title"/>
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

Le logo

Pour insérer un logo, il suffit de disposer de l'image correspondante. Les rendus sont meilleurs avec des images de type SVG.

Pour insérer le logo, il suffit d'indiquer :

<fo:external-graphic src="logo.svg"/>

au bon endroit.

Le numéro de la page

<fo:page-number/>