The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<!-- ==================================================================== -->
<xsl:template name="setup.pagemasters">
<fo:layout-master-set>
<!-- one sided, single column -->
<fo:simple-page-master master-name="blank"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.outer}"
margin-right="{$page.margin.inner}">
<fo:region-body
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-blank"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-blank"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- one sided, single column -->
<fo:simple-page-master master-name="simple1"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.outer}"
margin-right="{$page.margin.inner}">
<fo:region-body
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before extent="{$region.before.extent}"/>
<fo:region-after extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- for left-hand/even pages in twosided mode, single column -->
<fo:simple-page-master master-name="left1"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.outer}"
margin-right="{$page.margin.inner}">
<fo:region-body
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-left"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-left"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- for right-hand/odd pages in twosided mode, single column -->
<fo:simple-page-master master-name="right1"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.inner}"
margin-right="{$page.margin.outer}">
<fo:region-body
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-right"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-right"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- special case of first page in either mode, single column -->
<fo:simple-page-master master-name="first1"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.inner}"
margin-right="{$page.margin.inner}">
<fo:region-body
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-first"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-first"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- for pages in one-side mode, 2 column -->
<fo:simple-page-master master-name="simple2"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.outer}"
margin-right="{$page.margin.inner}">
<fo:region-body
column-count="{$column.count}"
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before extent="{$region.before.extent}"/>
<fo:region-after extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- for left-hand/even pages in twosided mode, 2 column -->
<fo:simple-page-master master-name="left2"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.outer}"
margin-right="{$page.margin.inner}">
<fo:region-body
column-count="{$column.count}"
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-left"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-left"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- for right-hand/odd pages in twosided mode, 2 column -->
<fo:simple-page-master master-name="right2"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.inner}"
margin-right="{$page.margin.outer}">
<fo:region-body
column-count="{$column.count}"
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-right"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-right"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- special case of first page in either mode -->
<fo:simple-page-master master-name="first2"
page-width="{$page.width}"
page-height="{$page.height}"
margin-top="{$page.margin.top}"
margin-bottom="{$page.margin.bottom}"
margin-left="{$page.margin.inner}"
margin-right="{$page.margin.inner}">
<fo:region-body
column-count="1"
margin-bottom="{$body.margin.bottom}"
margin-top="{$body.margin.top}"/>
<fo:region-before region-name="xsl-region-before-first"
extent="{$region.before.extent}"/>
<fo:region-after region-name="xsl-region-after-first"
extent="{$region.after.extent}"/>
</fo:simple-page-master>
<!-- setup for title-page, 1 column -->
<fo:page-sequence-master master-name="titlepage1">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="first1"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<!-- setup for single-sided, 1 column -->
<fo:page-sequence-master master-name="oneside1">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="simple1"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<!-- setup for double-sided, 1 column -->
<fo:page-sequence-master master-name="twoside1">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="blank"
blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-name="right1"
odd-or-even="odd"/>
<fo:conditional-page-master-reference master-name="left1"
odd-or-even="even"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<!-- setup for title-page, 2 column -->
<fo:page-sequence-master master-name="titlepage2">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="first2"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<!-- setup for single-sided, 2 column -->
<fo:page-sequence-master master-name="oneside2">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="simple2"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<!-- setup for double-sided, 2 column -->
<fo:page-sequence-master master-name="twoside2">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-name="blank"
blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-name="right2"
odd-or-even="odd"/>
<fo:conditional-page-master-reference master-name="left2"
odd-or-even="even"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<xsl:call-template name="user.pagemasters"/>
</fo:layout-master-set>
</xsl:template>
<!-- ==================================================================== -->
<xsl:template name="user.pagemasters"/> <!-- intentionally empty -->
<!-- ==================================================================== -->
<!-- $double.sided, $column.count, and context -->
<xsl:template name="select.pagemaster">
<xsl:param name="element" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="$double.sided != 0">
<xsl:choose>
<xsl:when test="$column.count &gt; 1">
<xsl:call-template name="select.doublesided.multicolumn.pagemaster">
<xsl:with-param name="element" select="$element"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="select.doublesided.pagemaster">
<xsl:with-param name="element" select="$element"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$column.count &gt; 1">
<xsl:call-template name="select.singlesided.multicolumn.pagemaster">
<xsl:with-param name="element" select="$element"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="select.singlesided.pagemaster">
<xsl:with-param name="element" select="$element"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="select.doublesided.multicolumn.pagemaster">
<xsl:param name="element" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="$element='set' or $element='book' or $element='part'">
<xsl:text>titlepage2</xsl:text>
</xsl:when>
<xsl:otherwise>twoside2</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="select.doublesided.pagemaster">
<xsl:param name="element" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="$element='set' or $element='book' or $element='part'">
<xsl:text>titlepage1</xsl:text>
</xsl:when>
<xsl:otherwise>twoside1</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="select.singlesided.multicolumn.pagemaster">
<xsl:param name="element" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="$element='set' or $element='book' or $element='part'">
<xsl:text>titlepage2</xsl:text>
</xsl:when>
<xsl:otherwise>oneside2</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="select.singlesided.pagemaster">
<xsl:param name="element" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="$element='set' or $element='book' or $element='part'">
<xsl:text>titlepage1</xsl:text>
</xsl:when>
<xsl:otherwise>oneside1</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- ==================================================================== -->
<xsl:template match="*" mode="running.head.mode">
<xsl:param name="master-name" select="'unknown'"/>
<!-- by default, nothing -->
<xsl:choose>
<xsl:when test="$master-name='titlepage1'">
</xsl:when>
<xsl:when test="$master-name='oneside1'">
</xsl:when>
<xsl:when test="$master-name='twoside1'">
</xsl:when>
<xsl:when test="$master-name='titlepage2'">
</xsl:when>
<xsl:when test="$master-name='oneside2'">
</xsl:when>
<xsl:when test="$master-name='twoside2'">
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="chapter|appendix" mode="running.head.mode">
<xsl:param name="master-name" select="'unknown'"/>
<xsl:variable name="head">
<fo:block font-size="{$body.font.size}">
<xsl:apply-templates select="." mode="object.title.markup"/>
</fo:block>
</xsl:variable>
<xsl:choose>
<xsl:when test="$master-name='titlepage1'"></xsl:when>
<xsl:when test="$master-name='oneside1'">
<fo:static-content flow-name="xsl-region-before">
<fo:block text-align="center">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='twoside1'">
<fo:static-content flow-name="xsl-region-before-left">
<fo:block text-align="right">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-before-right">
<fo:block text-align="left">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='titlepage2'"></xsl:when>
<xsl:when test="$master-name='oneside2'">
<fo:static-content flow-name="xsl-region-before">
<fo:block text-align="center">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='twoside2'">
<fo:static-content flow-name="xsl-region-before-left">
<fo:block text-align="right">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-before-right">
<fo:block text-align="left">
<xsl:copy-of select="$head"/>
</fo:block>
</fo:static-content>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="running.foot.mode">
<xsl:param name="master-name" select="'unknown'"/>
<xsl:variable name="foot">
<fo:page-number/>
</xsl:variable>
<!-- by default, the page number -->
<xsl:choose>
<xsl:when test="$master-name='titlepage1'"></xsl:when>
<xsl:when test="$master-name='oneside1'">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="center" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='twoside1'">
<fo:static-content flow-name="xsl-region-after-left">
<fo:block text-align="left" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-after-right">
<fo:block text-align="right" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='titlepage2'"></xsl:when>
<xsl:when test="$master-name='oneside2'">
<fo:static-content flow-name="xsl-after-before">
<fo:block text-align="center" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
</xsl:when>
<xsl:when test="$master-name='twoside2'">
<fo:static-content flow-name="xsl-region-after-left">
<fo:block text-align="left" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-after-right">
<fo:block text-align="right" font-size="{$body.font.size}">
<xsl:copy-of select="$foot"/>
</fo:block>
</fo:static-content>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="set|book|part|reference" mode="running.foot.mode">
<!-- nothing -->
</xsl:template>
<!-- ==================================================================== -->
</xsl:stylesheet>