【背景】
想要在Docbook中实现word中的缩略词的效果:
【解决过程】
1.之前是记得docbook中有对应的关键词的,后来找到了,是acronym,但是去试了试:
1 | < acronym >NVM</ acronym > |
结果,生成的HTML和PDF中,均没有生成我所期望的那个缩略词列表。
2.后来也找到了另外一个相关的此glossterm,后参考glossary,添加了如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | < 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中的效果:
HTML中的效果:
3.后来又参考:glosslist,添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | < glosslist > < glossentry >< glossterm >C</ glossterm > < glossdef > < para > A procedural programming language invented by K&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的下面,否会出现错误:
1 2 3 4 5 6 7 8 9 10 | 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中:
HTML中:
貌似pdf中的列表,基本接近所需要的效果了,就是少了表格。
4.后来参考了这个:
Subject: RE: [docbook-apps] acronyms, abbreviations, definitions
知道了glossterm.auto.link和glossentry.show.acronym set,然后就去先尝试关于缩略词自动链接的功能。
然后参考这里:
然后去添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | < glosslist > < glossentry >< glossterm >C</ glossterm > < glossdef > < para > A procedural programming language invented by K&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中:
HTML中:
然后继续折腾,自动链接的生成,代码换为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | < glosslist > < glossentry >< glossterm >C</ glossterm > < glossdef > < para > A procedural programming language invented by K&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文件中:
1 | < 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的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | < 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之前:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <? 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中添加对应的缩略词,其相关有很多个关键字,但是只要就是两大类:
glossary和glosslist,(链接中包含具体示例)
此处选择看起来更加专业点的glossary。
2.如果想要缩略词这个页面,放在正文之前,目录(即各种表格,图片等索引)之后,那么只需要把glossary部分的源码内容,移至相应的位置即可。此处即把glossary部分源码放到bookinfo之后,XInclude其他各个章节之前,就可以了。
转载请注明:在路上 » 【已解决】给Docbook中添加缩略词 + 自动链接到缩略词表项 + 将缩略词单独放置一页,且位于目录之后,正文之前