2. 样式模板

样式表的设定除了前面的参数修改以外,还有一些需要修改模板,比如“titlepage”这个部分,在标题页上显示哪些内容、用什么样的样式来显示,都需要重新定义或修改相应的模板,而非仅仅调整几个参数。在这个部分我们仅介绍titlepage的定义方法。

titlepage,就是标题页。比如book的titlepage,就像这本书,它有书的“右页(recto,可以向左翻)”,我只让它显示标题、副标题及作者;还有“左页(verso)”,这上面显示的信息要多一些,还包括版本信息、摘要、版权信息等。要定义这个模板,需要三步:

  1. 修改 titlepage.templates.xml

    titlepage.templates.xml就是titlepage的模板文件,这个文件在目录docbook-xsl-1.79.1/fo下面。首先我们需要对里面的“book”部分进行修改,修改成如下的样子:

      1 <t:titlepage t:element="book" t:wrapper="fo:block">
      2     <t:titlepage-content t:side="recto">
      3       <mediaobject/>
      4       <title
      5              t:named-template="division.title"
      6              param:node="ancestor-or-self::book[1]"
      7              text-align="left"
      8              font-size="&hsize5;"
      9              space-before="&hsize5space;"
     10              font-weight="normal"
     11              font-family="{$title.fontset}"/>      
     12       <subtitle
     13              text-align="left"
     14              font-size="&hsize2;"
     15              font-weight="normal"
     16              space-before="&hsize4space;"
     17              font-family="{$title.fontset}"/>  
     18       <corpauthor font-size="&hsize0;"
     19              text-align="left"
     20              font-weight="normal" 
     21              keep-with-next.within-column="always"
     22              space-before="2in"/>  
     23       <authorgroup space-before="2in"/>
     24       <author font-size="&hsize0;"
     25              text-align="left"
     26              font-weight="normal" 
     27              space-before="&hsize2space;"
     28              keep-with-next.within-column="always"/> 
     29       <itermset/>
     30     </t:titlepage-content>
     31 
     32   <t:titlepage-content t:side="verso">
     33       <title
     34              t:named-template="book.verso.title"
     35              font-size="&hsize2;"
     36              font-weight="bold"
     37              font-family="{$title.fontset}"/>
     38       <corpauthor/>
     39       <authorgroup t:named-template="verso.authorgroup"/>
     40       <author/>
     41 
     42       <othercredit/>
     43       <copyright/>
     44       <pubdate/> 
     45       <releaseinfo/>         
     46       <revhistory/>       
     47       <abstract/>
     48       <legalnotice font-size="7pt" background-color="#f5f5f5" space-before="1em"/>
     49   </t:titlepage-content>
     50   <t:titlepage-separator>
     51       <fo:block break-after="page"/>
     52   </t:titlepage-separator>
     53   <t:titlepage-before t:side="recto">
     54   </t:titlepage-before>
     55   <t:titlepage-before t:side="verso">
     56       <fo:block break-after="page"/>
     57   </t:titlepage-before>
     58 </t:titlepage>

    上面的代码虽然有点长,但很容易阅读,基本就说了两个事:在recto或verso页上显示哪些内容、用什么样的样式显示。

  2. 生成模板文件

    模板文件的生成需要刚才修改过的titlepage.templates.xml文件,及docbook-xsl-1.79.1/template/titlepage.xsl文件,还需要xsltproc这个命令。先将titlpage.templates.xsl做备份保存,然后执行如下的命令:

    xsltproc --output titlepage.templates.xsl template/titlepage.xsl titlepage.templates.xml

    这样,新的titlepage.templates.xsl文件就生成了。

    我总感觉这里有点奇怪,用xsl生成xsl? 但docbook官方就是这么定义的。

    除了titlepage外,inline和pagesetup也需要定义模板,但不用修改xml文件了,可以参考fo/inline.xslfo/pagesetup.xsl文件和前面提到的相关站点。