最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】给Docbook中添加缩略词 + 自动链接到缩略词表项 + 将缩略词单独放置一页,且位于目录之后,正文之前

Docbook crifan 3311浏览 0评论

【背景】

想要在Docbook中实现word中的缩略词的效果:

word中的缩略词

【解决过程】

1.之前是记得docbook中有对应的关键词的,后来找到了,是acronym,但是去试了试:

<acronym>NVM</acronym>

结果,生成的HTML和PDF中,均没有生成我所期望的那个缩略词列表。

2.后来也找到了另外一个相关的此glossterm,后参考glossary,添加了如下代码:

<glossary><title>Example Glossary</title>
    <para>This is not a real glossary, it's just an example.</para>

    <glossdiv><title>E</title>
        <glossentry id="xml"><glossterm>Extensible Markup Language</glossterm>
          <acronym>XML</acronym>
        <glossdef>
          <para>Some reasonable definition here.</para>
          <glossseealso otherterm="sgml">SGML</glossseealso>
        </glossdef>
        </glossentry>
    </glossdiv>

    <glossdiv><title>N</title>
        <glossentry id="nvm"><glossterm>Non-Volatile Memory</glossterm>
            <acronym>NVM</acronym>
            <glossdef>
              <para>Non-Volatile Memory</para>
            </glossdef>
        </glossentry>
    </glossdiv>

    <glossdiv><title>S</title>
        <glossentry><glossterm>SGML</glossterm>
            <glosssee otherterm="sgml"/>
        </glossentry>

        <glossentry id="sgml"><glossterm>Standard Generalized Markup Language</glossterm><acronym>SGML</acronym>
            <abbrev>ISO 8879:1986</abbrev>
            <glossdef>
              <para>Some reasonable definition here.</para>
              <glossseealso otherterm="xml">XML</glossseealso>
            </glossdef>
        </glossentry>
    </glossdiv>
</glossary>

效果如下:

PDF中的效果:

glossary example

HTML中的效果:

glossary example in html

3.后来又参考:glosslist,添加如下代码:

<glosslist>
    <glossentry><glossterm>C</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by K&amp;R.
            </para>
        </glossdef>
    </glossentry>
    <glossentry><glossterm>NVM</glossterm>
        <glossdef>
            <para>Non-Volatile Memory</para>
        </glossdef>
    </glossentry>
    <glossentry><glossterm>Pascal</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by Niklaus Wirth.
            </para>
        </glossdef>
    </glossentry>
</glosslist>

注意不能直接放在book的下面,否会出现错误:

javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}list-block" is not a valid child of "fo:root"! (See position 75:14203)
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
        at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
        at org.apache.fop.cli.Main.startFOP(Main.java:174)
        at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}list-block" is not a valid child of "fo:root"! (See position 75:14203)
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
        ... 3 more
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}list-block" is not a valid child of "fo:root"! (See position 75:14203)

意思是,不能将glosslist直接放到root标签,此处为book,所以就去改变代码位置,将其放到我的第一章的内容中,就可以了,效果如下:

PDF中:

glosslist的例子 pdf

HTML中:

glosslist的例子 html

貌似pdf中的列表,基本接近所需要的效果了,就是少了表格。

4.后来参考了这个:

Subject: RE: [docbook-apps] acronyms, abbreviations, definitions

知道了glossterm.auto.link和glossentry.show.acronym set,然后就去先尝试关于缩略词自动链接的功能。

然后参考这里:

Linking to a glossary entry

然后去添加如下代码:

<glosslist>
    <glossentry><glossterm>C</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by K&amp;R.
            </para>
        </glossdef>
    </glossentry>
    <glossentry id="NVM"><glossterm>NVM</glossterm>
        <glossdef>
            <para>Non-Volatile Memory</para>
        </glossdef>
    </glossentry>
    <glossentry><glossterm>Pascal</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by Niklaus Wirth.
            </para>
        </glossdef>
    </glossentry>
</glosslist>

<sect1 xml:id="related_term"><title>一些相关的名词的解释</title>
    <sect2><title>Non-Volatile Memory非易失性存储器</title>
        <para><glossterm linkend="NVM">NVM</glossterm>,即NV (RAM)Memory,断电数据也不会丢失的存储器,比如Nand Flash,Nor Flash,硬盘等等。于此相对的是,断电了数据会丢失的存储器,比如DRAM等。</para>
    </sect2>

对应的效果如下:

PDF中:

自动链接到NVM pdf

HTML中:

自动链接到NVM html

然后继续折腾,自动链接的生成,代码换为:

<glosslist>
    <glossentry><glossterm>C</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by K&amp;R.
            </para>
        </glossdef>
    </glossentry>
    <glossentry><glossterm>NVM</glossterm>
        <glossdef>
            <para>Non-Volatile Memory</para>
        </glossdef>
    </glossentry>
    <glossentry><glossterm>Pascal</glossterm>
        <glossdef>
            <para>
            A procedural programming language invented by Niklaus Wirth.
            </para>
        </glossdef>
    </glossentry>
</glosslist>

<sect1 xml:id="related_term"><title>一些相关的名词的解释</title>
    <sect2><title>Non-Volatile Memory非易失性存储器</title>
        <para><glossterm baseform="NVM">NVM</glossterm>,即NV (RAM)Memory,断电数据也不会丢失的存储器,比如Nand Flash,Nor Flash,硬盘等等。于此相对的是,断电了数据会丢失的存储器,比如DRAM等。</para>
    </sect2>

然后去添加对应的配置到xsl文件中:

<xsl:param name="glossterm.auto.link">1</xsl:param>

然后生成的效果,的确和上面是一样的,即实现了glossary的自动链接。

 

5.继续折腾给缩略图添加表格,以及希望弄成,将缩略图单独生成一页,就像插图清单等那样的效果:

插图清单等的单独一页的效果

希望弄个“缩略词”之类的一个表格,单独放在一页中。

6.关于想把缩略词部分,放到正文之前,目录,列表清单等之后的位置,开始尝试去找对应的xsl配置文件,倒是找到了相关配置显示部分,是在自己的,关于titlepage的配置的titlepage.templates_crl.xml,其是用来生成对应的titlepage.templates_crl.xsl的,而之前就折腾过其中的book的titlepage中各个部分,比如revhistory等。

而现在也发现了其中也有glossary的配置:

  <t:titlepage t:element="glossary" t:wrapper="fo:block">
    <t:titlepage-content t:side="recto">
      <title
	     t:force="1"
	     t:named-template="component.title"
	     param:node="ancestor-or-self::glossary[1]"
	     margin-left="{$title.margin.left}"
	     font-size="&hsize5;"
	     font-family="{$title.fontset}"
	     font-weight="bold"/>
      <subtitle
		font-family="{$title.fontset}"/>
    </t:titlepage-content>
...
  </t:titlepage>

但是后来想明白了,原来其只是配置,glossary页面的显示的效果的,而不是glossary页面本身所放的位置,所以不是我所想要的。

后来又去找,找到了相关的docbook-xsl-ns-1.76.1\fo下面的titlepage.xsl,titlepage.templates.xsl,glossary.xsl等,但好像都只是格式化显示效果的,而不是配置glossary页面所处的位置的。

而且,即使对于显示的效果,由于那一堆代码太复杂,也实在不知道如何改。

后来,继续折腾glossary,把glossary部分的源码,从book的最后,移到了引用其他chapter之前:

<?xml version='1.0' encoding="utf-8"?>
...
<bookinfo>
    <title>【详解】如何编写Linux下Nand Flash驱动</title>
......
</bookinfo>

<glossary><title>缩略词</title>
    <para>常用缩略词如下:</para>

    <glossdiv><title>B</title>
...
    </glossdiv>
......
</glossary>

<xi:include href="preface.xml"/>
<xi:include href="ch01_before_driver.xml"/>
<xi:include href="reference.xml"/>

</book>

然后就可以达到我所需要的,将缩略词部分,放到正文之前的效果了:

缩略图 页面 可以放在正文之前了

最后,基本实现了所需要的效果:

首先能让缩略词用单独一页显示出来

其次是缩略图中的每一项,要方便看,此处是虽然没有实现之前word中的表格形式,但是此处的列表,也算比较清晰可读,也更专业,所以还是可以接受的。

【总结】

1. 想要给docbook中添加对应的缩略词,其相关有很多个关键字,但是只要就是两大类:

glossaryglosslist,(链接中包含具体示例)

此处选择看起来更加专业点的glossary。

2.如果想要缩略词这个页面,放在正文之前,目录(即各种表格,图片等索引)之后,那么只需要把glossary部分的源码内容,移至相应的位置即可。此处即把glossary部分源码放到bookinfo之后,XInclude其他各个章节之前,就可以了。

转载请注明:在路上 » 【已解决】给Docbook中添加缩略词 + 自动链接到缩略词表项 + 将缩略词单独放置一页,且位于目录之后,正文之前

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.184 seconds, using 22.16MB memory