1<?xml version="1.0" encoding="UTF-8"?> <!-- -*- sgml -*- -->
2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3     xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
4
5<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
6
7<!-- set indent = yes while debugging, then change to NO -->
8<xsl:output method="xml" indent="no"/>
9
10
11<!-- passivetex fo extensions: PDF bookmarks and index terms -->
12<xsl:param name="use.extensions" select="'1'"/>
13<xsl:param name="passivetex.extensions" select="1"/>
14<!-- turn draft mode off -->
15<xsl:param name="draft.mode" select="'no'"></xsl:param>
16<!-- be extra sure we are using single sided -->
17<xsl:param name="double.sided" select="'0'"/>
18<!-- output in 'block' mode -->
19<xsl:param name="variablelist.as.blocks" select="1"/>
20<!-- don't show url separately in ulinks -->
21<xsl:param name="ulink.show" select="0"/>
22<!-- control generation of tocs -->
23<xsl:param name="generate.toc">
24set       toc,title
25book      toc,title
26part      toc,title
27chapter   nop,title
28section   nop
29sect1     nop
30sect2     nop
31sect3     nop
32sect4     nop
33sect5     nop
34article   nop
35book/article nop
36article/sect1 nop
37appendix  toc,title
38preface   toc,title
39reference toc,title
40qandadiv  toc
41qandaset  toc
42</xsl:param>
43
44<!-- properties common to html + fo ................................... -->
45
46<!-- we like '1.2 Title' -->
47<xsl:param name="section.autolabel" select="'1'"/>
48<xsl:param name="section.label.includes.component.label" select="'1'"/>
49
50<!-- Do not put 'Chapter' at the start of eg 'Chapter 1. Doing This' -->
51<xsl:param name="local.l10n.xml" select="document('')"/>
52<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
53  <l:l10n language="en">
54    <l:context name="title-numbered">
55      <l:template name="chapter" text="%n.&#160;%t"/>
56    </l:context>
57  </l:l10n>
58</l:i18n>
59
60<!-- per Bob Stayton: turn off xml:base processing pro tem -->
61<!-- should hopefully be fixed in next docbook stylesheets release (1.70) -->
62<!-- ensures correct source paths, eg. images/my_img.png -->
63<xsl:template match="@fileref">
64  <xsl:value-of select="."/>
65</xsl:template>
66
67<!-- end properties common to html + fo ............................... -->
68
69
70<!-- Bug-fix for Suse 10 PassiveTex version -->
71<!-- Precompute attribute values 'cos PassiveTex is too stupid: -->
72<xsl:attribute-set name="component.title.properties">
73  <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
74  <xsl:attribute name="space-before.optimum">
75    <xsl:value-of select="concat($body.font.master, 'pt')"/>
76  </xsl:attribute>
77  <xsl:attribute name="space-before.minimum">
78    <xsl:value-of select="$body.font.master * 0.8"/>
79    <xsl:text>pt</xsl:text>
80  </xsl:attribute>
81  <xsl:attribute name="space-before.maximum">
82    <xsl:value-of select="$body.font.master * 1.2"/>
83    <xsl:text>pt</xsl:text>
84  </xsl:attribute>
85  <xsl:attribute name="hyphenate">false</xsl:attribute>
86</xsl:attribute-set>
87
88<!-- show links in color -->
89<xsl:attribute-set name="xref.properties">
90  <xsl:attribute name="color">blue</xsl:attribute>
91</xsl:attribute-set>
92
93<!-- colored background for programlisting and screen -->
94<!-- setting param shade.verbatim=1 screws up literallayout -->
95<!-- something chronic, so have to go this route -->
96<xsl:template match="programlisting|screen|synopsis">
97  <xsl:param name="suppress-numbers" select="'0'"/>
98  <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
99  <xsl:variable name="content">
100    <xsl:choose>
101      <xsl:when test="$suppress-numbers = '0'
102                      and @linenumbering = 'numbered'
103                      and $use.extensions != '0'
104                      and $linenumbering.extension != '0'">
105        <xsl:call-template name="number.rtf.lines">
106          <xsl:with-param name="rtf">
107            <xsl:apply-templates/>
108          </xsl:with-param>
109        </xsl:call-template>
110      </xsl:when>
111      <xsl:otherwise>
112        <xsl:apply-templates/>
113      </xsl:otherwise>
114    </xsl:choose>
115  </xsl:variable>
116  <fo:block id="{$id}" white-space-collapse='false' white-space-treatment='preserve'
117            linefeed-treatment="preserve"  background-color="#f2f2f9"
118            xsl:use-attribute-sets="monospace.verbatim.properties">
119    <xsl:choose>
120      <xsl:when test="$hyphenate.verbatim != 0
121                      and function-available('exsl:node-set')">
122        <xsl:apply-templates select="exsl:node-set($content)"
123                             mode="hyphenate.verbatim"/>
124      </xsl:when>
125      <xsl:otherwise>
126        <xsl:copy-of select="$content"/>
127      </xsl:otherwise>
128    </xsl:choose>
129  </fo:block>
130</xsl:template>
131
132
133<!-- customised set title-page template -->
134<xsl:template name="set.titlepage">
135  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
136    <xsl:variable name="recto.content">
137      <xsl:apply-templates mode="set.titlepage.recto.auto.mode"
138                           select="setinfo/title"/>
139      <xsl:apply-templates mode="set.titlepage.recto.auto.mode"
140                           select="setinfo/releaseinfo"/>
141      <xsl:apply-templates mode="set.titlepage.recto.auto.mode"
142                           select="setinfo/copyright"/>
143      <xsl:apply-templates mode="set.titlepage.recto.auto.mode"
144                           select="setinfo/legalnotice"/>
145    </xsl:variable>
146    <xsl:variable name="recto.elements.count" select="1"/>
147      <fo:block>
148        <xsl:copy-of select="$recto.content"/>
149      </fo:block>
150    <xsl:call-template name="set.titlepage.separator"/>
151  </fo:block>
152</xsl:template>
153
154<!-- put some extra space after the set title -->
155<xsl:template match="title" mode="set.titlepage.recto.auto.mode">
156  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
157            xsl:use-attribute-sets="set.titlepage.recto.style"
158            text-align="center" font-size="24.8832pt" space-before="18.6624pt"
159            space-after="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
160    <xsl:call-template name="division.title">
161      <xsl:with-param name="node" select="ancestor-or-self::set[1]"/>
162    </xsl:call-template>
163  </fo:block>
164</xsl:template>
165
166<!-- put release-info + copyright centered and bold -->
167<xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode">
168  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
169            font-size="14pt" font-weight="bold" font-family="{$title.fontset}">
170    <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
171  </fo:block>
172</xsl:template>
173
174<xsl:template match="copyright" mode="set.titlepage.recto.auto.mode">
175  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
176            font-size="12pt" font-weight="bold" font-family="{$title.fontset}">
177    <xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
178  </fo:block>
179</xsl:template>
180
181
182<!-- customised book title-page template -->
183<xsl:template name="book.titlepage">
184  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
185    <xsl:variable name="recto.content">
186      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
187                           select="bookinfo/title"/>
188      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
189                           select="bookinfo/subtitle"/>
190      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
191                           select="bookinfo/releaseinfo"/>
192      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
193                           select="bookinfo/copyright"/>
194      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
195                           select="bookinfo/author"/>
196      <xsl:apply-templates mode="book.titlepage.recto.auto.mode"
197                           select="bookinfo/legalnotice"/>
198    </xsl:variable>
199    <xsl:variable name="recto.elements.count" select="1"/>
200    <fo:block>
201      <xsl:copy-of select="$recto.content"/>
202    </fo:block>
203    <xsl:call-template name="book.titlepage.separator"/>
204  </fo:block>
205</xsl:template>
206
207<!-- put some extra space after the book title -->
208<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
209  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
210            xsl:use-attribute-sets="book.titlepage.recto.style"
211            text-align="center" font-size="24.8832pt" space-before="18.6624pt"
212            space-after="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
213    <xsl:call-template name="division.title">
214      <xsl:with-param name="node" select="ancestor-or-self::book[1]"/>
215    </xsl:call-template>
216  </fo:block>
217</xsl:template>
218
219<!-- center subtitles -->
220<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
221  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
222            font-size="14pt" font-weight="bold" font-family="{$title.fontset}">
223    <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
224  </fo:block>
225</xsl:template>
226
227<!-- no docbook template for bookinfo/releaseinfo, so make one -->
228<xsl:template match="releaseinfo" mode="book.titlepage.recto.auto.mode">
229  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
230           font-size="12pt" font-weight="bold" font-family="{$title.fontset}">
231    <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
232  </fo:block>
233</xsl:template>
234
235<!-- no docbook recto template for bookinfo/copyright, so make one -->
236<xsl:template match="copyright" mode="book.titlepage.recto.auto.mode">
237  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
238            font-size="11pt" font-weight="bold" font-family="{$title.fontset}">
239    <xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
240  </fo:block>
241</xsl:template>
242
243<!-- customised email for titlepages -->
244<xsl:template match="author" mode="book.titlepage.recto.auto.mode">
245  <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" text-align="center"
246            font-size="10pt" font-family="{$title.fontset}">
247    <xsl:if test="email">
248      <xsl:text>Email: </xsl:text>
249      <xsl:apply-templates select="(email)[1]"/>
250    </xsl:if>
251  </fo:block>
252</xsl:template>
253
254
255<!-- show only book titles in the top-level set toc -->
256<xsl:template match="book|setindex" mode="toc">
257  <xsl:param name="toc-context" select="."/>
258  <xsl:variable name="id">
259    <xsl:call-template name="object.id"/>
260  </xsl:variable>
261  <xsl:variable name="cid">
262    <xsl:call-template name="object.id">
263      <xsl:with-param name="object" select="$toc-context"/>
264    </xsl:call-template>
265  </xsl:variable>
266  <xsl:call-template name="toc.line"/>
267  <xsl:variable name="nodes" select="glossary|bibliography|preface|chapter
268                                     |reference|part|article|appendix|index"/>
269  <xsl:variable name="depth.from.context"
270                select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
271  <xsl:if test="$toc.section.depth > 0 and not($toc-context/self::set)
272                and $toc.max.depth > $depth.from.context and $nodes">
273    <fo:block id="toc.{$cid}.{$id}">
274      <xsl:attribute name="margin-left">
275        <xsl:call-template name="set.toc.indent"/>
276      </xsl:attribute>
277      <xsl:apply-templates select="$nodes" mode="toc">
278        <xsl:with-param name="toc-context" select="$toc-context"/>
279      </xsl:apply-templates>
280    </fo:block>
281  </xsl:if>
282</xsl:template>
283
284
285<!-- TODO: don`t generate a TOC at all for Quick-Start and FAQ -->
286
287
288
289<!-- page headers: -->
290<xsl:template name="header.table">
291  <xsl:param name="pageclass" select="''"/>
292  <xsl:param name="sequence" select="''"/>
293  <xsl:param name="gentext-key" select="''"/>
294  <xsl:variable name="candidate">
295    <fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black">
296    <fo:table-column column-number="1" column-width="100%"/>
297    <fo:table-body>
298      <fo:table-row height="14pt">
299        <fo:table-cell text-align="right" display-align="before" relative-align="baseline">
300          <fo:block>
301            <xsl:apply-templates select="." mode="titleabbrev.markup"/>
302          </fo:block>
303        </fo:table-cell>
304      </fo:table-row>
305    </fo:table-body>
306    </fo:table>
307  </xsl:variable>
308  <xsl:choose>
309    <xsl:when test="$pageclass='titlepage' or $sequence='blank'
310                   or ($sequence='first' and $gentext-key='chapter')">
311      <!-- noop on titlepages, first chapter page or blank pages -->
312    </xsl:when>
313    <xsl:otherwise>
314      <xsl:copy-of select="$candidate"/>
315    </xsl:otherwise>
316  </xsl:choose>
317</xsl:template>
318
319
320
321<!-- page footers: two 80|20 cols w/right-aligned page numbers -->
322<xsl:template name="footer.table">
323  <xsl:param name="pageclass" select="''"/>
324  <xsl:param name="sequence" select="''"/>
325  <xsl:param name="gentext-key" select="''"/>
326  <xsl:variable name="candidate">
327    <fo:table table-layout="fixed" width="100%">
328    <fo:table-column column-number="1" column-width="80%"/>
329    <fo:table-column column-number="2" column-width="20%"/>
330    <fo:table-body>
331      <fo:table-row height="14pt">
332        <fo:table-cell text-align="left" display-align="after"
333                       relative-align="baseline">
334          <fo:block/>
335<!--
336          <fo:block>
337            <xsl:text>Pageclass: </xsl:text>
338            <xsl:value-of select="$pageclass"/>
339            <xsl:text>  Sequence: </xsl:text>
340            <xsl:value-of select="$sequence"/>
341            <xsl:text>  Gentext-Key: </xsl:text>
342            <xsl:value-of select="$gentext-key"/>
343          </fo:block>
344-->
345        </fo:table-cell>
346        <fo:table-cell text-align="right" display-align="after"
347                       relative-align="baseline">
348          <fo:block>
349            <fo:page-number/>
350          </fo:block>
351        </fo:table-cell>
352      </fo:table-row>
353    </fo:table-body>
354    </fo:table>
355  </xsl:variable>
356  <xsl:choose>
357    <xsl:when test="$pageclass='titlepage' or $sequence='blank'">
358      <!-- noop on titlepages or blank pages -->
359    </xsl:when>
360    <xsl:otherwise>
361      <xsl:copy-of select="$candidate"/>
362    </xsl:otherwise>
363  </xsl:choose>
364</xsl:template>
365
366
367<!-- workaround bug in passivetex fo output for itemizedlist -->
368<xsl:template match="itemizedlist/listitem">
369  <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
370  <xsl:variable name="item.contents">
371    <fo:list-item-label end-indent="label-end()">
372      <fo:block>
373        <xsl:call-template name="itemizedlist.label.markup">
374          <xsl:with-param name="itemsymbol">
375            <xsl:call-template name="list.itemsymbol">
376              <xsl:with-param name="node" select="parent::itemizedlist"/>
377            </xsl:call-template>
378          </xsl:with-param>
379        </xsl:call-template>
380      </fo:block>
381    </fo:list-item-label>
382    <fo:list-item-body start-indent="body-start()">
383      <xsl:apply-templates/>    <!-- removed extra block wrapper -->
384    </fo:list-item-body>
385  </xsl:variable>
386  <xsl:choose>
387    <xsl:when test="parent::*/@spacing = 'compact'">
388      <fo:list-item id="{$id}" xsl:use-attribute-sets="compact.list.item.spacing">
389        <xsl:copy-of select="$item.contents"/>
390      </fo:list-item>
391    </xsl:when>
392    <xsl:otherwise>
393      <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
394        <xsl:copy-of select="$item.contents"/>
395      </fo:list-item>
396    </xsl:otherwise>
397  </xsl:choose>
398</xsl:template>
399
400<!-- workaround bug in passivetex fo output for orderedlist -->
401<xsl:template match="orderedlist/listitem">
402  <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
403  <xsl:variable name="item.contents">
404    <fo:list-item-label end-indent="label-end()">
405      <fo:block>
406        <xsl:apply-templates select="." mode="item-number"/>
407      </fo:block>
408    </fo:list-item-label>
409    <fo:list-item-body start-indent="body-start()">
410      <xsl:apply-templates/>    <!-- removed extra block wrapper -->
411    </fo:list-item-body>
412  </xsl:variable>
413  <xsl:choose>
414    <xsl:when test="parent::*/@spacing = 'compact'">
415      <fo:list-item id="{$id}" xsl:use-attribute-sets="compact.list.item.spacing">
416        <xsl:copy-of select="$item.contents"/>
417      </fo:list-item>
418    </xsl:when>
419    <xsl:otherwise>
420      <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
421        <xsl:copy-of select="$item.contents"/>
422      </fo:list-item>
423    </xsl:otherwise>
424  </xsl:choose>
425</xsl:template>
426
427
428</xsl:stylesheet>
429