root/docs/docbook-xsl/fo/autotoc.xsl

Revision 23dea7e00df87480acb58bb3398283c2bb227949, 20.4 kB (checked in by Theo Schlossnagle <jesus@omniti.com>, 3 years ago)

pull docs into master

  • Property mode set to 100644
Line 
1 <?xml version='1.0'?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 xmlns:fo="http://www.w3.org/1999/XSL/Format"
4                 xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
5                 version='1.0'>
6
7 <!-- ********************************************************************
8      $Id: autotoc.xsl,v 1.26 2005/03/08 07:48:33 bobstayton Exp $
9      ********************************************************************
10
11      This file is part of the XSL DocBook Stylesheet distribution.
12      See ../README or http://nwalsh.com/docbook/xsl/ for copyright
13      and other information.
14
15      ******************************************************************** -->
16
17 <!-- ==================================================================== -->
18
19 <xsl:template name="set.toc">
20   <xsl:param name="toc-context" select="."/>
21
22   <xsl:variable name="id">
23     <xsl:call-template name="object.id"/>
24   </xsl:variable>
25
26   <xsl:variable name="cid">
27     <xsl:call-template name="object.id">
28       <xsl:with-param name="object" select="$toc-context"/>
29     </xsl:call-template>
30   </xsl:variable>
31
32   <xsl:variable name="nodes" select="book|setindex"/>
33
34   <xsl:if test="$nodes">
35     <fo:block id="toc...{$id}"
36               xsl:use-attribute-sets="toc.margin.properties">
37       <xsl:if test="$axf.extensions != 0">
38         <xsl:attribute name="axf:outline-level">1</xsl:attribute>
39         <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
40         <xsl:attribute name="axf:outline-title">
41           <xsl:call-template name="gentext">
42             <xsl:with-param name="key" select="'TableofContents'"/>
43           </xsl:call-template>
44         </xsl:attribute>
45       </xsl:if>
46       <xsl:call-template name="table.of.contents.titlepage"/>
47       <xsl:apply-templates select="$nodes" mode="toc">
48         <xsl:with-param name="toc-context" select="$toc-context"/>
49       </xsl:apply-templates>
50     </fo:block>
51   </xsl:if>
52 </xsl:template>
53
54 <xsl:template name="division.toc">
55   <xsl:param name="toc-context" select="."/>
56
57   <xsl:variable name="cid">
58     <xsl:call-template name="object.id">
59       <xsl:with-param name="object" select="$toc-context"/>
60     </xsl:call-template>
61   </xsl:variable>
62
63   <xsl:variable name="nodes"
64                 select="$toc-context/part
65                         |$toc-context/reference
66                         |$toc-context/preface
67                         |$toc-context/chapter
68                         |$toc-context/appendix
69                         |$toc-context/article
70                         |$toc-context/bibliography
71                         |$toc-context/glossary
72                         |$toc-context/index"/>
73
74   <xsl:if test="$nodes">
75     <fo:block id="toc...{$cid}"
76               xsl:use-attribute-sets="toc.margin.properties">
77       <xsl:if test="$axf.extensions != 0">
78         <xsl:attribute name="axf:outline-level">1</xsl:attribute>
79         <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
80         <xsl:attribute name="axf:outline-title">
81           <xsl:call-template name="gentext">
82             <xsl:with-param name="key" select="'TableofContents'"/>
83           </xsl:call-template>
84         </xsl:attribute>
85       </xsl:if>
86       <xsl:call-template name="table.of.contents.titlepage"/>
87       <xsl:apply-templates select="$nodes" mode="toc">
88         <xsl:with-param name="toc-context" select="$toc-context"/>
89       </xsl:apply-templates>
90     </fo:block>
91   </xsl:if>
92 </xsl:template>
93
94 <xsl:template name="component.toc">
95   <xsl:param name="toc-context" select="."/>
96
97   <xsl:variable name="id">
98     <xsl:call-template name="object.id"/>
99   </xsl:variable>
100
101   <xsl:variable name="cid">
102     <xsl:call-template name="object.id">
103       <xsl:with-param name="object" select="$toc-context"/>
104     </xsl:call-template>
105   </xsl:variable>
106
107   <xsl:variable name="nodes" select="section|sect1|refentry
108                                      |article|bibliography|glossary
109                                      |appendix|index"/>
110   <xsl:if test="$nodes">
111     <fo:block id="toc...{$id}"
112               xsl:use-attribute-sets="toc.margin.properties">
113       <xsl:call-template name="table.of.contents.titlepage"/>
114       <xsl:apply-templates select="$nodes" mode="toc">
115         <xsl:with-param name="toc-context" select="$toc-context"/>
116       </xsl:apply-templates>
117     </fo:block>
118   </xsl:if>
119 </xsl:template>
120
121 <xsl:template name="component.toc.separator">
122   <!-- Customize to output something between
123        component.toc and first output -->
124 </xsl:template>
125
126 <xsl:template name="section.toc">
127   <xsl:param name="toc-context" select="."/>
128   <xsl:param name="toc.title.p" select="true()"/>
129
130   <xsl:variable name="id">
131     <xsl:call-template name="object.id"/>
132   </xsl:variable>
133
134   <xsl:variable name="cid">
135     <xsl:call-template name="object.id">
136       <xsl:with-param name="object" select="$toc-context"/>
137     </xsl:call-template>
138   </xsl:variable>
139
140   <xsl:variable name="nodes"
141                 select="section|sect1|sect2|sect3|sect4|sect5|refentry
142                         |bridgehead[$bridgehead.in.toc != 0]"/>
143
144   <xsl:variable name="level">
145     <xsl:call-template name="section.level"/>
146   </xsl:variable>
147
148   <xsl:if test="$nodes">
149     <fo:block id="toc...{$id}"
150               xsl:use-attribute-sets="toc.margin.properties">
151
152       <xsl:if test="$toc.title.p">
153         <xsl:call-template name="section.heading">
154           <xsl:with-param name="level" select="$level + 1"/>
155           <xsl:with-param name="title">
156             <fo:block space-after="0.5em">
157               <xsl:call-template name="gentext">
158                 <xsl:with-param name="key" select="'TableofContents'"/>
159               </xsl:call-template>
160             </fo:block>
161           </xsl:with-param>
162         </xsl:call-template>
163       </xsl:if>
164
165       <xsl:apply-templates select="$nodes" mode="toc">
166         <xsl:with-param name="toc-context" select="$toc-context"/>
167       </xsl:apply-templates>
168     </fo:block>
169   </xsl:if>
170 </xsl:template>
171
172 <xsl:template name="section.toc.separator">
173   <!-- Customize to output something between
174        section.toc and first output -->
175 </xsl:template>
176 <!-- ==================================================================== -->
177
178 <xsl:template name="toc.line">
179   <xsl:variable name="id">
180     <xsl:call-template name="object.id"/>
181   </xsl:variable>
182
183   <xsl:variable name="label">
184     <xsl:apply-templates select="." mode="label.markup"/>
185   </xsl:variable>
186
187   <fo:block text-align-last="justify"
188             text-align="start"
189             end-indent="{$toc.indent.width}pt"
190             last-line-end-indent="-{$toc.indent.width}pt">
191     <fo:inline keep-with-next.within-line="always">
192       <fo:basic-link internal-destination="{$id}">
193         <xsl:if test="$label != ''">
194           <xsl:copy-of select="$label"/>
195           <xsl:value-of select="$autotoc.label.separator"/>
196         </xsl:if>
197         <xsl:apply-templates select="." mode="titleabbrev.markup"/>
198       </fo:basic-link>
199     </fo:inline>
200     <fo:inline keep-together.within-line="always">
201       <xsl:text> </xsl:text>
202       <fo:leader leader-pattern="dots"
203                  leader-pattern-width="3pt"
204                  leader-alignment="reference-area"
205                  keep-with-next.within-line="always"/>
206       <xsl:text> </xsl:text>
207       <fo:basic-link internal-destination="{$id}">
208         <fo:page-number-citation ref-id="{$id}"/>
209       </fo:basic-link>
210     </fo:inline>
211   </fo:block>
212 </xsl:template>
213
214 <!-- ==================================================================== -->
215
216 <xsl:template match="book|setindex" mode="toc">
217   <xsl:param name="toc-context" select="."/>
218
219   <xsl:variable name="id">
220     <xsl:call-template name="object.id"/>
221   </xsl:variable>
222
223   <xsl:variable name="cid">
224     <xsl:call-template name="object.id">
225       <xsl:with-param name="object" select="$toc-context"/>
226     </xsl:call-template>
227   </xsl:variable>
228
229   <xsl:call-template name="toc.line"/>
230
231   <xsl:variable name="nodes" select="glossary|bibliography|preface|chapter
232                                      |reference|part|article|appendix|index"/>
233
234   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
235
236   <xsl:if test="$toc.section.depth > 0
237                 and $toc.max.depth > $depth.from.context
238                 and $nodes">
239     <fo:block id="toc.{$cid}.{$id}">
240       <xsl:attribute name="margin-left">
241         <xsl:call-template name="set.toc.indent"/>
242       </xsl:attribute>
243
244       <xsl:apply-templates select="$nodes" mode="toc">
245         <xsl:with-param name="toc-context" select="$toc-context"/>
246       </xsl:apply-templates>
247     </fo:block>
248   </xsl:if>
249 </xsl:template>
250
251 <xsl:template match="part" mode="toc">
252   <xsl:param name="toc-context" select="."/>
253
254   <xsl:variable name="id">
255     <xsl:call-template name="object.id"/>
256   </xsl:variable>
257
258   <xsl:variable name="cid">
259     <xsl:call-template name="object.id">
260       <xsl:with-param name="object" select="$toc-context"/>
261     </xsl:call-template>
262   </xsl:variable>
263
264   <xsl:call-template name="toc.line"/>
265
266   <xsl:variable name="nodes" select="chapter|appendix|preface|reference|
267                                      refentry|article|index|glossary|
268                                      bibliography"/>
269
270   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
271
272   <xsl:if test="$toc.section.depth > 0
273                 and $toc.max.depth > $depth.from.context
274                 and $nodes">
275     <fo:block id="toc.{$cid}.{$id}">
276       <xsl:attribute name="margin-left">
277         <xsl:call-template name="set.toc.indent"/>
278       </xsl:attribute>
279      
280       <xsl:apply-templates select="$nodes" mode="toc">
281         <xsl:with-param name="toc-context" select="$toc-context"/>
282       </xsl:apply-templates>
283     </fo:block>
284   </xsl:if>
285 </xsl:template>
286
287 <xsl:template match="reference" mode="toc">
288   <xsl:param name="toc-context" select="."/>
289
290   <xsl:variable name="id">
291     <xsl:call-template name="object.id"/>
292   </xsl:variable>
293
294   <xsl:variable name="cid">
295     <xsl:call-template name="object.id">
296       <xsl:with-param name="object" select="$toc-context"/>
297     </xsl:call-template>
298   </xsl:variable>
299
300   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
301
302   <xsl:call-template name="toc.line"/>
303
304   <xsl:if test="$toc.section.depth > 0
305                 and $toc.max.depth > $depth.from.context
306                 and refentry">
307     <fo:block id="toc.{$cid}.{$id}">
308       <xsl:attribute name="margin-left">
309         <xsl:call-template name="set.toc.indent"/>
310       </xsl:attribute>
311              
312       <xsl:apply-templates select="refentry" mode="toc">
313         <xsl:with-param name="toc-context" select="$toc-context"/>
314       </xsl:apply-templates>
315     </fo:block>
316   </xsl:if>
317 </xsl:template>
318
319 <xsl:template match="refentry" mode="toc">
320   <xsl:param name="toc-context" select="."/>
321
322   <xsl:call-template name="toc.line"/>
323 </xsl:template>
324
325 <xsl:template match="preface|chapter|appendix|article"
326               mode="toc">
327   <xsl:param name="toc-context" select="."/>
328
329   <xsl:variable name="id">
330     <xsl:call-template name="object.id"/>
331   </xsl:variable>
332
333   <xsl:variable name="cid">
334     <xsl:call-template name="object.id">
335       <xsl:with-param name="object" select="$toc-context"/>
336     </xsl:call-template>
337   </xsl:variable>
338
339   <xsl:call-template name="toc.line"/>
340
341   <xsl:variable name="nodes" select="section|sect1
342                                      |simplesect[$simplesect.in.toc != 0]
343                                      |refentry"/>
344
345   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
346
347   <xsl:if test="$toc.section.depth > 0
348                 and $toc.max.depth > $depth.from.context
349                 and $nodes">
350     <fo:block id="toc.{$cid}.{$id}">
351       <xsl:attribute name="margin-left">
352         <xsl:call-template name="set.toc.indent"/>
353       </xsl:attribute>
354              
355       <xsl:apply-templates select="$nodes" mode="toc">
356         <xsl:with-param name="toc-context" select="$toc-context"/>
357       </xsl:apply-templates>
358     </fo:block>
359   </xsl:if>
360 </xsl:template>
361
362 <xsl:template match="sect1" mode="toc">
363   <xsl:param name="toc-context" select="."/>
364
365   <xsl:variable name="id">
366     <xsl:call-template name="object.id"/>
367   </xsl:variable>
368
369   <xsl:variable name="cid">
370     <xsl:call-template name="object.id">
371       <xsl:with-param name="object" select="$toc-context"/>
372     </xsl:call-template>
373   </xsl:variable>
374
375   <xsl:call-template name="toc.line"/>
376
377   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
378
379   <xsl:if test="$toc.section.depth > 1
380                 and $toc.max.depth > $depth.from.context
381                 and sect2">
382     <fo:block id="toc.{$cid}.{$id}">
383       <xsl:attribute name="margin-left">
384         <xsl:call-template name="set.toc.indent"/>
385       </xsl:attribute>
386              
387       <xsl:apply-templates select="sect2" mode="toc">
388         <xsl:with-param name="toc-context" select="$toc-context"/>
389       </xsl:apply-templates>
390     </fo:block>
391   </xsl:if>
392 </xsl:template>
393
394 <xsl:template match="sect2" mode="toc">
395   <xsl:param name="toc-context" select="."/>
396
397   <xsl:variable name="id">
398     <xsl:call-template name="object.id"/>
399   </xsl:variable>
400
401   <xsl:variable name="cid">
402     <xsl:call-template name="object.id">
403       <xsl:with-param name="object" select="$toc-context"/>
404     </xsl:call-template>
405   </xsl:variable>
406
407   <xsl:call-template name="toc.line"/>
408
409   <xsl:variable name="reldepth"
410                 select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
411
412   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
413
414   <xsl:if test="$toc.section.depth > 2
415                 and $toc.max.depth > $depth.from.context
416                 and sect3">
417     <fo:block id="toc.{$cid}.{$id}">
418       <xsl:attribute name="margin-left">
419         <xsl:call-template name="set.toc.indent">
420           <xsl:with-param name="reldepth" select="$reldepth"/>
421         </xsl:call-template>
422       </xsl:attribute>
423              
424       <xsl:apply-templates select="sect3" mode="toc">
425         <xsl:with-param name="toc-context" select="$toc-context"/>
426       </xsl:apply-templates>
427     </fo:block>
428   </xsl:if>
429 </xsl:template>
430
431 <xsl:template match="sect3" mode="toc">
432   <xsl:param name="toc-context" select="."/>
433
434   <xsl:variable name="id">
435     <xsl:call-template name="object.id"/>
436   </xsl:variable>
437
438   <xsl:variable name="cid">
439     <xsl:call-template name="object.id">
440       <xsl:with-param name="object" select="$toc-context"/>
441     </xsl:call-template>
442   </xsl:variable>
443
444   <xsl:call-template name="toc.line"/>
445
446   <xsl:variable name="reldepth"
447                 select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
448
449   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
450
451   <xsl:if test="$toc.section.depth > 3
452                 and $toc.max.depth > $depth.from.context
453                 and sect4">
454     <fo:block id="toc.{$cid}.{$id}">
455       <xsl:attribute name="margin-left">
456         <xsl:call-template name="set.toc.indent">
457           <xsl:with-param name="reldepth" select="$reldepth"/>
458         </xsl:call-template>
459       </xsl:attribute>
460              
461       <xsl:apply-templates select="sect4" mode="toc">
462         <xsl:with-param name="toc-context" select="$toc-context"/>
463       </xsl:apply-templates>
464     </fo:block>
465   </xsl:if>
466 </xsl:template>
467
468 <xsl:template match="sect4" mode="toc">
469   <xsl:param name="toc-context" select="."/>
470
471   <xsl:variable name="id">
472     <xsl:call-template name="object.id"/>
473   </xsl:variable>
474
475   <xsl:variable name="cid">
476     <xsl:call-template name="object.id">
477       <xsl:with-param name="object" select="$toc-context"/>
478     </xsl:call-template>
479   </xsl:variable>
480
481   <xsl:call-template name="toc.line"/>
482
483   <xsl:variable name="reldepth"
484                 select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
485
486   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
487
488   <xsl:if test="$toc.section.depth > 4
489                 and $toc.max.depth > $depth.from.context
490                 and sect5">
491     <fo:block id="toc.{$cid}.{$id}">
492       <xsl:attribute name="margin-left">
493         <xsl:call-template name="set.toc.indent">
494           <xsl:with-param name="reldepth" select="$reldepth"/>
495         </xsl:call-template>
496       </xsl:attribute>
497              
498       <xsl:apply-templates select="sect5" mode="toc">
499         <xsl:with-param name="toc-context" select="$toc-context"/>
500       </xsl:apply-templates>
501     </fo:block>
502   </xsl:if>
503 </xsl:template>
504
505 <xsl:template match="sect5|simplesect" mode="toc">
506   <xsl:param name="toc-context" select="."/>
507
508   <xsl:call-template name="toc.line"/>
509 </xsl:template>
510
511 <xsl:template name="set.toc.indent">
512   <xsl:param name="reldepth"/>
513
514   <xsl:variable name="depth">
515     <xsl:choose>
516       <xsl:when test="$reldepth != ''">
517         <xsl:value-of select="$reldepth"/>
518       </xsl:when>
519       <xsl:otherwise>
520         <xsl:value-of select="count(ancestor::*)"/>
521       </xsl:otherwise>
522     </xsl:choose>
523   </xsl:variable>
524
525   <xsl:choose>
526     <xsl:when test="$fop.extensions != 0 or $passivetex.extensions != 0">
527        <xsl:value-of select="concat($depth*$toc.indent.width, 'pt')"/>
528     </xsl:when>
529     <xsl:otherwise>
530       <xsl:value-of select="concat($toc.indent.width, 'pt')"/>
531     </xsl:otherwise>
532   </xsl:choose>
533 </xsl:template>
534
535
536 <xsl:template match="section" mode="toc">
537   <xsl:param name="toc-context" select="."/>
538
539   <xsl:variable name="id">
540     <xsl:call-template name="object.id"/>
541   </xsl:variable>
542
543   <xsl:variable name="cid">
544     <xsl:call-template name="object.id">
545       <xsl:with-param name="object" select="$toc-context"/>
546     </xsl:call-template>
547   </xsl:variable>
548
549   <xsl:variable name="depth" select="count(ancestor::section) + 1"/>
550   <xsl:variable name="reldepth"
551                 select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
552
553   <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
554
555   <xsl:if test="$toc.section.depth &gt;= $depth">
556     <xsl:call-template name="toc.line"/>
557
558     <xsl:if test="$toc.section.depth > $depth
559                   and $toc.max.depth > $depth.from.context
560                   and section">
561       <fo:block id="toc.{$cid}.{$id}">
562         <xsl:attribute name="margin-left">
563           <xsl:call-template name="set.toc.indent">
564             <xsl:with-param name="reldepth" select="$reldepth"/>
565           </xsl:call-template>
566         </xsl:attribute>
567                
568         <xsl:apply-templates select="section" mode="toc">
569           <xsl:with-param name="toc-context" select="$toc-context"/>
570         </xsl:apply-templates>
571       </fo:block>
572     </xsl:if>
573   </xsl:if>
574 </xsl:template>
575
576 <xsl:template match="bibliography|glossary"
577               mode="toc">
578   <xsl:param name="toc-context" select="."/>
579
580   <xsl:call-template name="toc.line"/>
581 </xsl:template>
582
583 <xsl:template match="index" mode="toc">
584   <xsl:param name="toc-context" select="."/>
585
586   <xsl:if test="* or $generate.index != 0">
587     <xsl:call-template name="toc.line"/>
588   </xsl:if>
589 </xsl:template>
590
591 <xsl:template match="title" mode="toc">
592   <xsl:apply-templates/>
593 </xsl:template>
594
595 <!-- ==================================================================== -->
596
597 <xsl:template name="list.of.titles">
598   <xsl:param name="titles" select="'table'"/>
599   <xsl:param name="nodes" select=".//table"/>
600   <xsl:param name="toc-context" select="."/>
601
602   <xsl:variable name="id">
603     <xsl:call-template name="object.id"/>
604   </xsl:variable>
605
606   <xsl:if test="$nodes">
607     <fo:block id="lot...{$titles}...{$id}">
608       <xsl:choose>
609         <xsl:when test="$titles='table'">
610           <xsl:call-template name="list.of.tables.titlepage"/>
611         </xsl:when>
612         <xsl:when test="$titles='figure'">
613           <xsl:call-template name="list.of.figures.titlepage"/>
614         </xsl:when>
615         <xsl:when test="$titles='equation'">
616           <xsl:call-template name="list.of.equations.titlepage"/>
617         </xsl:when>
618         <xsl:when test="$titles='example'">
619           <xsl:call-template name="list.of.examples.titlepage"/>
620         </xsl:when>
621         <xsl:when test="$titles='procedure'">
622           <xsl:call-template name="list.of.procedures.titlepage"/>
623         </xsl:when>
624         <xsl:otherwise>
625           <xsl:call-template name="list.of.unknowns.titlepage"/>
626         </xsl:otherwise>
627       </xsl:choose>
628       <xsl:apply-templates select="$nodes" mode="toc">
629         <xsl:with-param name="toc-context" select="$toc-context"/>
630       </xsl:apply-templates>
631     </fo:block>
632   </xsl:if>
633 </xsl:template>
634
635 <xsl:template match="figure|table|example|equation|procedure" mode="toc">
636   <xsl:call-template name="toc.line"/>
637 </xsl:template>
638
639 <!-- ==================================================================== -->
640
641 </xsl:stylesheet>
642
Note: See TracBrowser for help on using the browser.