Docbook开发手记 版本:v2.4.5 Crifan Li 摘要 本文先简介了什么是Docbook,然后详细介绍了如何搭建中文的Docbook开发环境,再详细记 录了Docbook开发过程中所遇到的各种注意事项和遇到的问题及解决办法,同时给出很多常 见的Docbook中各种元素的示例代码,另外也记录了一些值得参考的Docbook相关的资料。 [提 本文提供多种格式供: 示] 在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP 下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP HTML版本的在线地址为: http://www.crifan.com/files/doc/docbook/docbook_dev_note/release/html/ docbook_dev_note.html 有任何意见,建议,提交bug等,都欢迎去讨论组发帖讨论: http://www.crifan.com/bbs/categories/docbook_dev_note/ 2015-05-12 ┌─────────────────────────────────────────────────────────────────────────────┐ │修订历史 │ ├─────────────────────────────────┬─────────────────────────────────┬─────────┤ │修订 2.4.5 │2015-05-12 │crl │ ├─────────────────────────────────┴─────────────────────────────────┴─────────┤ │ 1. 添加一个问题解答:listitem in namespace encountered in listitem │ │ 2. 添加一个qanda的示例代码 │ │ 3. 添加示例:合并单元格的表格 │ │ 4. 添加示例:chapter的xml域 │ ├─────────────────────────────────┬─────────────────────────────────┬─────────┤ │修订 2.4 │2013-10-09 │crl │ ├─────────────────────────────────┴─────────────────────────────────┴─────────┤ │ 1. 完善了代码示例部分 │ │ 2. 更新整理了appendix附录部分,把最新的所有的book都整理进来了 │ │ 3. 添加了filename,screenco等示例代码 │ │ 4. 更新了所有的xml:id │ │ 5. 添加示例代码:figure内包含2张mediaobject图片 │ │ 6. 添加示例代码:内嵌元素中的keycap │ │ 7. 修正了个别的笔误,修改了部分细节内容,添加了引用reference │ │ 8. 添加整理了:Docbook相关的资源和工具下载 │ │ 9. 添加了:Docbook相关的知识和概念 │ │10. 添加示例:programlisting和screen │ │11. 添加示例:filename是后缀名 │ ├─────────────────────────────────┬─────────────────────────────────┬─────────┤ │修订 1.1 │2012-06-14 │crl │ ├─────────────────────────────────┴─────────────────────────────────┴─────────┤ │ 1. 完成此文的框架 │ │ 2. 各个章节都已添加了一些基本的内容,关于参考资料的部分,已添加大部分内容 │ │ 3. 收集了一些常见问题及解决办法 │ │ 4. 分割成多个文件 │ │ 5. 添加了关于实体定义部分的介绍 │ │ 6. 添加了调试fo部分的内容 │ │ 7. 添加了如何搭建docbook环境 │ │ 8. 添加了什么是Docbook │ │ 9. 添加了代码示例部分 │ └─────────────────────────────────────────────────────────────────────────────┘ 版权 © 2015 Crifan, http://crifan.com 本文章遵从:署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 目录 Docbook介绍 1. 什么是Docbook 1.1. Docbook出现的背景 1.2. Docbook是什么 1.2.1. 截图说明Docbook的:一种(xml)格式输入,多种(html,htmls, chm,pdf,txt,rtf等等)格式输出 1.2.1.1. Docbook的一种输入:xml源码(文件) 1.2.1.2. Docbook的多种输出:HTML,HTMLs,PDF,CHM,RTF,TXT, WEBHELP等格式 2. 我为何选择Docbook 1. Windows下的Docbook的环境搭建 1.1. 搭建Docbook之前需要知道的最基本的事情 1.1.1. 我们的目标 1.1.2. 关于格式转换方面的知识 1.2. 纯Windows环境下的Docbook开发环境的搭建 1.2.1. 建立好文件夹 1.2.2. 下载windos版本的xsltproc 1.2.3. 下载docbook-xsl-ns-1.77.1 1.2.4. 下载fop-1.0并添加fop配置文件 1.2.4.1. 下载fop-1.0 1.2.4.2. 配置FOP的环境变量FOP_HOME 1.2.4.3. 添加fop配置文件fop.xconf 1.2.5. 准备docbook的源码:xml文件 1.2.6. 从xml生成html 1.2.6.1. 为生成html准备配置文件 1.2.6.2. 将xml转换为html 1.2.7. 从xml生成pdf 1.2.7.1. 为生成pdf准备配置文件 1.2.7.2. 将xml转换为fo 1.2.7.3. 将fo转换为pdf 1.3. Windows环境下的,基于Cygwin的Docbook开发环境的搭建 1.3.1. 安装Cygwin 1.3.2. 下载cygwin下使用fop-1.0 2. Docbook开发过程中的注意事项和心得 2.1. Docbook 4和Docbook 5的区别 2.2. 关于实体定义 2.3. qanda系列的用法 2.4. FOP相关注意事项 2.4.1. FOP的字体设置 2.5. Docbook开发过程中的一些有用的提示 2.5.1. Docbook最佳实践 2.5.1.1. Docbook中id的命名规则 2.6. Docbook开发过程中如何调试错误 2.6.1. 举例说明如何实现方便地调试Docbook生成pdf过程中所出现的错误 2.7. Docbook开发过程中的一些感悟 2.7.1. Docbook更关注内容 2.7.2. Docbook与盖楼 2.8. Docbook环境进化过程简单记录 3. Docbook开发过程中的常见问题及解答 常见问题 3.1. ValidationException: Property ID xxx previously used 3.2. ValidationException: xxx is not a valid child of xxx 3.3. ValidationException: xxx is missing child elements 3.4. docbook5中指定表格table中列column的宽度 3.5. 除了章(Chapter)有编号之外,其他不同层级的小节(section)都是没有 编号的,想要给各小节添加索引编号 3.6. 已经include了xsl配置文件了,但是自己添加的参数配置,不起效果 3.7. xsltproc出错:Element xxx in namespace xxx encountered in book, but no template matches 3.8. pdf中没有出现/显示revhistory所对应的历史版本 3.9. 生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx) 3.10. 想要给book中的标题下面添加一个版本号 3.11. 输出的pdf中的revhistory历史版本的内容中的表格无边框,想要添加边框 3.12. 如何去掉docbook中输出的pdf中,除了带链接的文字之外的那个链接地址 3.13. 给docbook生成的pdf中的带链接的文字,添加下划线和设置字体颜色为蓝色 3.14. 如何给docbook的pdf添加bookmark书签的功能 3.15. Docbook的pdf,去除正文对于标题的缩进indent 3.16. 生成的pdf中emphasis无效果,想要实现给pdf中emphasis的文字加粗或斜 体 3.17. 如何给(docbook中的)xsl中定义实体Entity 3.18. 给docbook的pdf中的等式(equation)设置背景色 3.19. 如何将默认的输出单个的HTML页面,改为输入多个HTML页面? 3.20. 如何给docbook中的表格(table)的第一行(firstrow或thead)添加背景 色? 3.21. 如何用docbook生成chm(微软帮助文件)? 3.22. docbook生成的chm的左边目录等内容都是乱码 3.23. 如何将qanda的标题添加到TOC目录中去? 3.24. 如何将docbook转换为(和word兼容的)RTF文档? 3.25. 如何用Docbook生成Webhelp? 3.26. 用fop生成pdf过程中出现警告:warning: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400" 3.27. Docbook中使用fop过程中出错:严重: Couldn’t find hyphenation pattern zh_cn 3.28. cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader /ImageContext 3.29. Docbook中用xsltproc生成HTML过程中出错:runtime error xxx/ chunker.xsl line 226 element document, invalid value for indent,xsltRunStylesheet : run failed 3.30. docbook的xsltproc生成的HTML中Charset的值是空的,不是所设置的UTF-8 3.31. 如何给Docbook中添加abbrev缩略词一项,且放置在目录之后,正文之前? 3.32. 给Docbook的HTML的等式(equation),程序源码(programlisting)等添 加背景色 3.33. PDF中和HTML中的图片显示,始终不能统一,要么HTML中是放大的,要么 PDF中不能完全显示,所以希望PDF和HTML中的图片显示可以用同一套代码来 统一 3.34. 想要设置HTML和PDF中的图片的标题都是居中对齐 3.35. 生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无 法显示 3.36. Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显示,而且 如果内容是多行的,还会显示出多行 3.37. Docbook中的callout图片在programlisting中不显示 3.38. An fo:block is wider than the available room in inline-progression-dimension 3.39. TransformerException: The column-number or number of cells in the row overflows the number of fo:table-columns specified for the table 3.40. 如何通过xref(在别处)引用某个段落(para)? 3.41. WARNING: Content overflows the viewport of the fo:region-body on page 9 in block-progression direction by 99828 millipoints. (See position 2:5700) 3.42. PDF中callout不能点击跳转(而HTML中却可以) 3.43. callout图片在programlisting的源码中不显示 3.44. 如何在(只使用co而没有使用areaspec的)源码中多个位置,指向同一个 co(callout)? 3.45. 新的docbook-xsl-ns-1.77.0生成的html中的revhistory中单元格无边框 3.46. WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei". 3.47. 如何实现给table中(多个)特定位置添加相应的注释? 4. Docbook参考资料 4.1. Docbook相关的资源和工具下载 4.2. 关于对于Docbook的介绍和解释方面的资料 4.3. 关于对于Docbook的开发过程中可以参考和查阅的资料 5. 未解决的问题 5.1. 支持各种语言的代码的语法高亮 5.2. 中文hypernate断字 5.3. 给callout的co重新编号 6. Docbook各种元素用法举例 6.1. chapter, section, sect1-sect5 6.2. 段落 6.3. 图片figure 6.4. 表格,表格嵌套,表格单元格合并 6.5. 注释callout 6.6. 链接,引用 6.7. 等式 6.8. list列表系列 6.9. 简单列表simplelist,literallayout 6.10. xinclude文件,xinclude文件中的其中一部分的内容 6.11. filename:文件,文件夹,后缀名, 6.12. admonitions:note,caution,warning,tip和important 6.12.1. note 6.12.2. caution 6.12.3. warning 6.12.4. tip 6.12.5. important 6.13. 一些inline元素:keycap,guibutton,keycombo 6.13.1. keycap 6.14. programlisting代码和screen屏幕输出 6.14.1. programlisting代码 6.14.1.1. 带CDATA的programinglist示例 6.14.1.2. 不带CDATA的programinglist示例 6.14.2. screen屏幕输出 6.14.2.1. 带CDATA的屏幕输出screen 6.14.2.2. 不带CDATA的屏幕输出screen 6.15. 问题和回答 7. Docbook相关的知识和概念 7.1. 输出类型:html和打印输出print out 7.2. docbook中的条件编译:profiling 7.3. 关于docbook中的图片方面的内容 7.4. docbook的一些变体 7.4.1. 简化版的docbook 7.4.2. docbook(制作)幻灯片 7.4.3. docbook(制作)网站 A. 已通过Docbook发布的资料 A.1. 基础知识相关 A.2. 嵌入式相关 A.3. 上层软件相关 A.4. 其他 参考书目 插图清单 1. 截图举例:Docbook的XML源码 2. 截图举例:Docbook的可以生成多种格式 3. 截图举例:Docbook的XML源码生成的HTML 4. 截图举例:Docbook的XML源码生成的HTMLs 5. 截图举例:Docbook的XML源码生成的PDF 6. 截图举例:Docbook的XML源码生成的CHM 7. 截图举例:Docbook的XML源码生成的TXT 8. 截图举例:Docbook的XML源码生成的RTF 9. 截图举例:Docbook的XML源码生成的WEBHELP 3.1. coref在HTML中的效果 表格清单 2.1. Docbook中id命名规则 范例清单 3.1. co用法示例 3.2. coref用法示例 6.1. chapter,section,sect1-sect5 6.2. 普通的段落:para 6.3. 带标题的正式的段落:formalpara 6.4. 带标题的图片:figure 6.5. figure内包含2张mediaobject图片 6.6. 不带标题的非正式的图片:informalfigure 6.7. 行内图片:inlinemediaobject 6.8. 表格:table 6.9. 带嵌套(embedded)表格:informaltable 6.10. 待单元格合并的表格:namest,nameend,morerows 6.11. programlisting的callout:programlistingco 6.12. screen的callout:screenco 6.13. 没有callout的co实现在任意位置使用co然后在别处使用coref去引用 6.14. 带xlink域名的link 6.15. xref引用 6.16. 等式equation 6.17. itemizedlist 6.18. 带emphasis的itemizedlist 6.19. 带指定编号类型的orderedlist 6.20. 简单列表simplelist 6.21. 简单列举literallayout 6.22. xinclude主文件中使用xinclude 6.23. 被xinclude包含的子文件:preface.xml 6.24. 被xinclude包含的子文件:ch01_build_env.xml 6.25. filename是文件,文件夹的例子 6.26. 示例:filename是后缀名 6.27. note举例 6.28. caution举例 6.29. tip举例 6.30. keycap举例 6.31. 举例:带CDATA的programinglist 6.32. 举例:不带CDATA的programinglist 6.33. 举例:带CDATA的screen 6.34. 举例:不带CDATA的screen 6.35. 举例:问题和解答qanda相关的示例代码 7.1. 添加role参数实现条件编译 Docbook介绍 目录 1. 什么是Docbook 1.1. Docbook出现的背景 1.2. Docbook是什么 1.2.1. 截图说明Docbook的:一种(xml)格式输入,多种(html,htmls,chm, pdf,txt,rtf等等)格式输出 1.2.1.1. Docbook的一种输入:xml源码(文件) 1.2.1.2. Docbook的多种输出:HTML,HTMLs,PDF,CHM,RTF,TXT, WEBHELP等格式 2. 我为何选择Docbook 1. 什么是Docbook 1.1. Docbook出现的背景 想要了解Docbook是啥之前,需要知道一下其出现的大概背景,这样才能更好的理解为何会 有docbook,以及其到底是啥。 随着计算机发展,有很多专业的书籍,技术文章等,需要发布。 这句话需要解释一下: • 专业的书籍,技术文章 此处所说的书籍book和文章article,主要指的是和计算机相关的 当然后面也会提到,docbook的应用,不仅仅局限于发布计算机相关的书籍和文章。 即,其他专业,方向的书籍和文章等,也都可以通过docbook发布。 • 发布 此处的发布,主要包括两种,一种是在线Online的,一种是离线的Offline的。 在线的,多指的是文章通过HTML等网页形式,可以在线浏览。 离线的,也可以是将HTML网页下载下来留作本地阅读,更多的时候指的是,发布为PDF ,CHM等格式,方便本地打开对应的文件,阅读该书籍或文章。 而对于各种书籍和文章的发布,由于没有统一的系统支持,导致想要发布多种格式,多人 同时编辑同一份文档等情况的时候,之前的直接编辑生成相应文档的方法,就显得力不从 心了。 所以才会有Docbook这种东西出现。其统一规划了(尤其是计算机类的)书籍所需要的“单 词”,以及规定了“单词”之间的关系, 作为文档发布者,按照其规定,写好相应的源码 之后,有其他第三方(多数是开源的,免费的)工具,实现格式的定义,再转换为多种格 式。 而在写源码期间,由于是直接写的xml或sgml等文件,属于文本类的文件,所以可以很方便 的实现版本的控制,由此实现了Docbok的优点 1.2. Docbook是什么 根据Docook官网的解释,Docbook是一种schema。 schema,中文一般翻译为模式,但是如此解释,还是很抽象,很难理解。 [提 关于Schema 示] • 关于DTD和XML Schema之间的区别,可以参看w3cschool的解释:DTD vs XML Schema • 关于RELAX NG,可以参看wiki中的举例说明:RELAX NG - XML syntax 此处,可以简单的将Docbook理解为,类似于某种语言,比如英语。 英语,包括了对应的单词,词汇,以及对应的语法,规定了单词和词汇之间的关系,如何 使用它们才是正确的。 对应的Docbook,也规定了一堆基本的单词和相应的语法。 1. Docbook中的单词 == 元素(Element) Docbook中的单词,被称为元素(elment),比如最常见的book,chapter,section等 。 2. Docbook的中语法 == 用其他语言(Relax NG/SGML/XML DTDs/W3C XML Schema)来解 释 Docbook中各个元素之间的关系,是Docbook规定好的。 此所谓的规定,就是用某种方法,解释出来,并且要解释的清楚易懂。 而直接用文字去描述的话,比如book下面可以嵌套多个chapter,chapter下面可以有 多个section等, 首先真容易把Docbook的人累死,因为单纯用文字描述清楚如此复杂的关系,真的需要 太多文字的解释。 其次,用纯文字描述,语义上不是足够明确。 而计算机领域内,有对应的,专门用于描述,类似于Docbook中的各个“单词”之间的关 系的语言。 而Docbook就是采用他们,来解释清楚,Docbook中有哪些元素,以及这些元素之间的 关系又是啥样的。 目前已经实现了的,包括Relax NG,SGML,XML DTDs,W3C XML Schema 通过如此描述,可以简介而精确的描述出Docbook的内容,即有哪些元素和元素之间的 关系。 [提 到底这些描述语言,比如DTD,XML Schema等,都是啥样子的 示] 关于到底这些描述语言,都长的啥样子的,都是如何工作的,可以去看:DTD vs XML Schema 看完后,就可以大概的了解到,这些描述语言,是怎么回事了。 而对于具体的更多的描述语言的细节,作为Docbook使用者来说,我们可以不必太关心 。 我们需要关心的是,docbook中有哪些元素,以及他们之间的关系。然后如何去正确的 使用它们。 所以,简单总结可以理解为: Docbook是一种模式,其规定了包括哪些元素以及这些元素之间的关系。 而包含的元素以及元素之间的关系,是用对应的Schema Language去描述的。 目前已经Docbook实现了的Schema Language有:Relax NG,SGML,XML DTDs,W3C XML Schema Docbook(虽然不仅仅只支持这些,但是)更加适用于计算机(软件和硬件)相关的书籍和 文章。 Docbook的<=4.5的版本,很多都是用SGML语言书写Docbook源码的,现在已不再推荐。 Docbook最新版本是5.0。推荐使用XML语言书写Docbook的源码。 1.2.1. 截图说明Docbook的:一种(xml)格式输入,多种(html,htmls,chm,pdf,txt ,rtf等等)格式输出 第 1 节 “什么是Docbook”中虽然用文字解释了什么是Docbook,但是还是不够直观。 所以,此处专门通过截图来给不熟悉的人具体解释解释,Docbook长啥样,以及什么是一种 输入,多种输出。 1.2.1.1. Docbook的一种输入:xml源码(文件) Docbook的xml源码,就是常见的xml文件。 比如图 1 “截图举例:Docbook的XML源码”中的这段Docbook的xml源码,就是很常见的xml 文件而已。 图 1. 截图举例:Docbook的XML源码 截图举例:Docbook的XML源码 截图举例:Docbook的XML源码 1.2.1.2. Docbook的多种输出:HTML,HTMLs,PDF,CHM,RTF,TXT,WEBHELP等格式 上述的图 1 “截图举例:Docbook的XML源码”,可以通过工具,将其转换为多种输出格式。 我目前暂时只实现了其中的7种格式: 图 2. 截图举例:Docbook的可以生成多种格式 截图举例:Docbook的可以生成多种格式 下面分别简单介绍一下每种格式: • HTML 单一HTML网页 包含了所有的内容 图 1 “截图举例:Docbook的XML源码”所生成的HTML网页的效果: 图 3. 截图举例:Docbook的XML源码生成的HTML 截图举例:Docbook的XML源码生成的HTML • HTMLs 多个HTML页面 每个章(甚至小节)都是一个单个的HTML网页 图 1 “截图举例:Docbook的XML源码”所生成的HTMLs网页的效果: 图 4. 截图举例:Docbook的XML源码生成的HTMLs 截图举例:Docbook的XML源码生成的HTMLs • PDF PDF文档 图 1 “截图举例:Docbook的XML源码”所生成的PDF的效果: 图 5. 截图举例:Docbook的XML源码生成的PDF 截图举例:Docbook的XML源码生成的PDF • CHM docbook对应的是htmlhelp类型 生成的是微软的chm帮助文件 图 1 “截图举例:Docbook的XML源码”所生成的CHM的效果: 图 6. 截图举例:Docbook的XML源码生成的CHM 截图举例:Docbook的XML源码生成的CHM • TXT 纯文本格式 是用工具从HTML网页转换出来的 图 1 “截图举例:Docbook的XML源码”所生成的TXT的效果: 图 7. 截图举例:Docbook的XML源码生成的TXT 截图举例:Docbook的XML源码生成的TXT • RTF RTF文档,和word兼容 可以用微软的word软件打开 图 1 “截图举例:Docbook的XML源码”所生成的RTF的效果: 图 8. 截图举例:Docbook的XML源码生成的RTF 截图举例:Docbook的XML源码生成的RTF • WEBHELP Webhelp格式 图 1 “截图举例:Docbook的XML源码”所生成的WEBHELP的效果: 图 9. 截图举例:Docbook的XML源码生成的WEBHELP 截图举例:Docbook的XML源码生成的WEBHELP 其他docbook还可以生成其他格式,比如website,slide,roundtrip,manpage,xhtml, epub,javadoc,eclipse help等,此处暂时没有去弄而已。 通过上述截图的介绍,相信即使不熟悉的人,也大概知道docbook是个什么东西了。 2. 我为何选择Docbook 主要是之前写的不少帖子,都是用word编辑,然后转换为PDF后发布的,但是此法存在几个 问题 1. 转换后的PDF不完美 此处说的不完美,不是表面看上去的效果不好,而是pdf本身内部所包含的内容,有点 瑕疵。 主要是,当你选择一些内容,然后拷贝出来,粘贴到别的地方,比如word中,你会发 现,几乎每一行的内容,都是对应的两行,第二行是重复第一行的,而且拷贝出来的 内容,格式也是很乱的。 这让我很不爽,因为我要追求的是完美的效果,即你用Word 2007/2010导出的PDF,也 应该是在内部的内容和格式上,都是和原先word一致的才对。 所以,后来有机会知道了Docbook,才决定不用word了 2. word的不爽 □ 稳定性 word作为基本的文字编辑工具,总体上来说,还是挺不错的,至少对于多数人如 此。 而对于我,有时候会遇到单个word文件,包含内容太多,比如99页,而遇到过, 在编辑过程中偶尔死掉,导致差点丢失了一些已经编辑的内容。 需要说明的是,我对于使用word和其他工具,已经养成了够好的习惯了,因为是 编辑了任何地方,都是顺便Ctrl+S去保存一下的。保证不会出现由于没有及时保 存而丢失内容的情况。 但是对于上述所说的word的偶尔死掉而导致文件内容丢失的可能性,却是无法排 除的。 所以,还是觉得不太靠谱。 □ 兼容性 微软的东西,兼容性已经做得足够好了,包括Office系列工具中的word 但是对于之前使用word所遇到的情况,比如2003,2007,和2010等的兼容程度,以 及从长远来看,都无法排除,用之前某个版本的word写的东西,无法用新的版本 正常打开,且完全兼容旧版本,完全保留之前的所有的内容和设置。 所以,保险起见,还是换用Docbook等xml源码的形式,不用担心在未来任何时刻 ,都可以完整的打开原始文档,保留所有原始内容和设置。 □ 格式排版 如果只是写写一般短内容的帖子和文章,word的格式,排版等功能,算是非常好 用的了。 但是如果是写的内容非常多,涉及到各个部分的格式调整,即使用了word的模板 去统一格式,也显得很繁琐。 因此,内容比较多的话,用word去写,而且还要统一风格和设置,就显得效率比 较低了。此时,换用Docbook等,就是很好的选择了。 3. 发布格式单一 之前的做法,都是用word写好,然后再转换为PDF。而新的2007/2010的word,支持直 接导出PDF,而且已经支持页内链接,标签等(详见之前的帖子:【整理】制作pdf文 件后,保持原先word文档中的页内链接和超链接+常见pdf打印机安装使用方法简介) ,已经算是蛮方便的了,但是还是只能发布PDF一种格式。 而发布PDF格式的文件,好处是利于下载阅读,而且无法更改原文内容,坏处是无法方 便的拷贝粘贴所需要的内容,不利于内容的传播和分享。 因此,希望支持更多的格式,尤其是在线的HTML页面。 而后来自从知道了Docbook,才发现,终于找到了我所想要的,同样的原文内容(xml 源码),可以支持多种格式发布,至少包括HTML和PDF,这样就方便发布文章,利于文 章内容传播了。 然后就是遇到了Docbook,基本上完美解决了我之前的所有问题,相对有很多好处: Docbok的优点.  1. 一种输入,多种输出 这个优点,对于我来说,是最看重的。 即,写任何帖子,文章,的时候,只需要写好对应的xml源码,然后用已经搭建好的环 境,编译生成多种格式。 我目前已经搭建好的环境,是在Windows下面的Cygwin,已经自己写好了Makefile,这 样,每次写完xml源码,直接make,就可以生成多种版本了,目前已经实现的有:单个 的HTML网页文件,多个的HTML网页文件,PDF,RTF(即word文档,用word可以直接打 开和编辑的),TXT的纯文本文件,微软的帮助文件CHM 这样,就方便了文章以多种格式发布,和统一设置各种风格(显示效果)了。 此所谓,一种输入,多种输出。 2. 可以实现版本控制 关于版本控制这一点,前面说word的缺点的时候,其实都没提到。那是因为此处我对 写的帖子的版本控制,需求还不是特别高。 但是的确,对于更加专业的人员,多人协作写同一本书,这种时候,版本控制,就显 得尤为重要了。 Docbook是原始输入,就是xml源码,都属于普通的文本Plain Text,所以很方便使用 SVN等版本控制工具,对齐实现版本控制。 这样,任何时候的任何改动,都可以实现追溯和管理了。 当然,相对来说,Docbook,至少对于我来说,也有一些缺点: Docbok的缺点.  1. 前期的入门有点难 此处所说的Docbook入门,指的是两方面 □ 搞懂Docbook是啥,有点难 之前是一直多Docbook是啥,没太搞懂。 其实现在也不是完全清楚,因为想彻底搞清楚,得多花时间去搞懂很多概念,包 括DTD,Schema等等。 不过,想要达到基本了解,够用,其实也就行了。更复杂的东西,可以在折腾的 过程中去多了解了解。 □ 真正完全把Docbook的环境搭建好,也不容易 其实折腾完毕后,才知道,想要搭建最基本的Docbook环境,能生成HTML和PDF, 对于Docbook 5,其实并不难。 但是对于之前最开始接触的那个Docbook 4.5以及之前版本,其实还是蛮麻烦的。 然后搭建了最基本的Docbook 5的环境,在继续定制自己的配置,是需要一点点学 习,了解,才能搞定如何配置的。还是需要花些精力的。 当前,搭建好了自己的Docbook开发环境后,以后写完帖子的发布工作,那就简单 了,直接Make或者输入命令,实现转换即可。 2. 缺少所见即所得(WYSIWYG) [提 WYSIWYG 示] WYSIWYG是What You See Is What You Get的缩写。 意思很清楚,就是,你所看到的,就是你所得到的。 我们常见的微软的很多工具,包括word,就属于WYSIWYG,因为你是在编辑word文 档的时候,所看到的内容,即除了本身输入的文字之外,还有那些已经设置好了 的字体,颜色,排版等,都是和你最终所得到的结果,即你再次打开或别人拿到 你的word文件去打开,所看到的效果是一样的。所以称,所见即所得。 Docbook本身的核心就在于,非所见即所得,内容和形式(显示)分开,即你所输入的 文章的内容,都是在xml源码中,而具体对应的这些内容的显示效果,都是由相关的配 置文件和参数,有工具转换后,才能看到具体显示效果的。即本身就不是所见即所得 的。 而此处之所以把WYSIWYG列为Docbook的缺点之一,就是因为我们很多人,习惯了微软 的Word等所见即所得的环境,突然换成了内容与显示效果分开的Docbook的环境,还真 的需要一段时间的适应。 另外,至于我自己,有时候,也的确想要去控制某些内容的显示效果,而无法很方便 的配置出来,的时候,也偶尔会觉得,Docbook(加上配置文件和转换工具)在(所得 到的)显示效果方面,的确是没有word方便。 举个例子,就比如我想要源码高亮显示,目前所能找到的资料,除了官网的解释,是 除了需要开启相应高亮的参数配置之外,还要添加相应extension,然后还需要是 Saxon等环境和工具才可以,对于我所用的xsltproc+fop,竟然还不支持,所以很悲催 的暂时放弃了代码高亮的功能。详见:【已放弃】给Docbook中代码programlisting实 现高亮显示 不过总的来说,类似于这些显示效果的控制方面,即使有时候没法实现或者不方便实 现,在可以保证内容完整的前提下,没了这些效果,基本也是可以接受的。 第 1 章 Windows下的Docbook的环境搭建 目录 1.1. 搭建Docbook之前需要知道的最基本的事情 1.1.1. 我们的目标 1.1.2. 关于格式转换方面的知识 1.2. 纯Windows环境下的Docbook开发环境的搭建 1.2.1. 建立好文件夹 1.2.2. 下载windos版本的xsltproc 1.2.3. 下载docbook-xsl-ns-1.77.1 1.2.4. 下载fop-1.0并添加fop配置文件 1.2.4.1. 下载fop-1.0 1.2.4.2. 配置FOP的环境变量FOP_HOME 1.2.4.3. 添加fop配置文件fop.xconf 1.2.5. 准备docbook的源码:xml文件 1.2.6. 从xml生成html 1.2.6.1. 为生成html准备配置文件 1.2.6.2. 将xml转换为html 1.2.7. 从xml生成pdf 1.2.7.1. 为生成pdf准备配置文件 1.2.7.2. 将xml转换为fo 1.2.7.3. 将fo转换为pdf 1.3. Windows环境下的,基于Cygwin的Docbook开发环境的搭建 1.3.1. 安装Cygwin 1.3.2. 下载cygwin下使用fop-1.0 摘要 1.1. 搭建Docbook之前需要知道的最基本的事情 1.1.1. 我们的目标 首先要清楚,我们想要得到什么。 我们想要得到的就是,写了符合Docbook规定的xml源文件之后,然后用工具可以生成多种 格式的输出,此所谓”一种输入,多种输出“。 为了达到此目标,所以才要搭建一个docbook环境,配置一些东西,使用一些工具,将xml 文件转换为HTML,PDF等多种格式。 简单的说,此时我们的目的就是,搭建一个最基本的Docbook环境,至少先支持这些基本的 功能: 1. 可以将Docbook的xml文件转换生成为HTML和PDF两种格式 2. 支持中文字体 3. 支持多个分割的(单独的)文件 此种情况主要适用于,当你写了一本内容很多的书籍的话,肯定有必要将其分为多个 章节 而每个章节,希望放在一个单独的xml文件中,然后用一个总的xml,将每个章节包含 进来。 此时,这多个独立的章节所对应的各个xml文件,就称为多个分割的(xml)文件 1.1.2. 关于格式转换方面的知识 将docbook的xml源码,转换为HTML,PDF等格式的话,有多种方法,其中涉及多种工具。 此处暂时不需要理会太多,只需要知道这两点即可: 1. 如何得到HTMl xsltproc可以将xml文件转换为HTML文件 2. 如何获得PDF xsltproc将xml转换为FO文件 然后用fop将FO文件转换为PDF文件 下面要介绍的docbook的环境,也都是关于xsltproc和fop这两方面。 1.2. 纯Windows环境下的Docbook开发环境的搭建 [重 docbook demo所有相关文件下载 要] 和下面纯windows下docbook环境搭建有关的文件,可以在这里下载到: docbook5_demo_noTools.7z 此处介绍如何在纯Windows环境下(即不需要额外安装Cygwin等),而搭建最基本的 Docbook环境。 使得可以生成对应的HTML和PDF。 以下内容,主要参考:一个简单的Docbook 5.0例子和在Windows上安装配置Apache FOP 此处之所以重新介绍一遍,主要目的在于,当前使用的fop 1.0的版本,可以省略关于fop 字体设置的部分,以减少步骤。 1.2.1. 建立好文件夹 为了以后更好的使用和扩展Docbook环境,所以此处专门设计了一个简单的架构。 即,不是为了演示,就随便糊弄一下。 下面的架构搭好之后,真正想要使用docbook的人,就可以在此基础上,一点点的扩展功能 了。 当然,此处搭建的环境,也尽量的保持简洁,此处暂时只支持生成我们所需要的HTML和PDF 。 下面就是要搭建的docbook环境所对应的文件夹结构 请自行在某个文件夹,比如我的是E:\DevRoot\docbook,下面建立对应的文件夹。 books1 | |-- docbook5_demo2 | |-- output3 | | | |-- fo4 | |-- html5 | |-- pdf5 | |-- src6 config7 | |-- docbook-xsl-ns-1.77.18 |-- fop9 tools | |-- docbook-xsl-ns-1.77.110 | | | |-- fo | |-- html | ... | |-- fop-1.011 | | | |-- build | |-- conf | |-- ... | |-- xslt12 | |-- bin |-- include |-- lib 1 用于存放多个Docbook的book(书籍) 后期扩展:可以建更多的book,比如我当前的关于docbook开发笔记,就可以对应新 建一个docbook_dev_note的book了。 2 接下来所要写的docbook 5的demo的book 3 用于存放各种格式的输出。 当前暂时为了演示,只建了fo,html,pdf 后期扩展:可以建更多的文件夹,比如htmls,rtf,chm,txt等存放更多的输出格式 4 用于存放fo文件。其可以被fop等工具转换为PDF,RTF等格式 5 用于存放最终生成的html,pdf等格式的文件。这些,是我们所想要的最终的结果。 6 用与存放docbook的xml源码文件。 后期扩展:当单个xml内容太多,可以考虑用xinclude分出多个xml文件,此时多个 xml文件,都可以都放在此src文件夹下了。 7 用于存放所有的和Docbook相关的配置文件,包括xsl格式stylesheet文件,以及其他 如fop的配置文件等。 后期扩展:其他的,比如,实体定义entity,catalog等等一些内容,也可以放在此 config下。 8 此处之所以文件夹叫做docbook-xsl-ns-1.77.1,是由于最新的stylesheet是1.77.1 版本的。 其作用是,设置对应的参数,可以控制html,pdf等输出的效果,包括显示效果方面 的一些控制参数和输出内容格式组织方面的。 9 此处存放fop的配置。 目前暂时只需要一个fop.xconf文件即可。 10 下载并解压docbook-xsl-ns-1.77.1,然后放到此处即可。 如何下载docbook-xsl-ns-1.77.1参见第 1.2.3 节 “下载docbook-xsl-ns-1.77.1” 11 下载fop 1.0并解压,放到此处即可。 如何下载fop 1.0参见第 1.2.4.1 节 “下载fop-1.0” 12 下载xsltproc及相关文件,并解压,放到此处即可。 如何下载xsltproc及相关文件,参见第 1.2.2 节 “下载windos版本的xsltproc” 顺便贴出后来建立好的docbook环境的文件夹结构的截图: [done_docbo] 安装上述介绍,建立好对应的文件夹后,就可以参考下面的步骤,下载相关文件,添加相 关配置,编译生成html和pdf,然后最终搭建好docbook环境。 1.2.2. 下载windos版本的xsltproc 在:xsltproc主页 ⇒ 下载页面 ⇒ Libxml ⇒ Igor Zlatkovic提供的Windows下二进制版本 的xsltproc中,去下载: 1. xsltproc主程序 libxslt-1.1.26.win32.zip 其中包含我们所需要的xsltproc可执行文件:xsltproc.exe 2. 运行xsltproc所需要的一些库 为了在windows下面运行xsltproc,还需要一些其所依赖的库:libxml2,iconv,zlib 下面依次贴出下载地址和简单的解释: □ libxml2-2.7.8.win32.zip C语言实现的XML解析器。 其支持N多规范或协议,比如XML,XML-NS,XPath,XPointer,XInclude,UTF-8/ UTF-16,XML Catalog,Canonical XML,Relax NG等。 □ iconv-1.9.2.win32.zip 字符编码转换。比如从UTF-8转换为GB18030,就可以用iconv。 □ zlib-1.2.5.win32.zip 压缩工具。 下载了这四个文件后,解压,然后都会得到一个包括bin,include,lib三个文件夹。 全部都合并到一起后,放到上述介绍的12中,即可。 把xsltproc的路径添加到PATH环境变量中.  为了可以在windows的命令行cmd中直接输入 xsltproc就可以执行,而不需要绝对路径,此处需要把xsltproc所在路径,我此处的的是 :E:\DevRoot\docbook\tools\xslt\bin,添加到windows的环境变量PATH中去。 [提 如何设置windows环境变量 示] 关于如何添加相应路径到windows的环境变量中,不熟悉的可以参考: Windows的环境变量 [提 更新版本的xsltproc相关的二进制文件 示] 如果想要用更新版本的xsltproc,即相关的各个所依赖的二进制文件,想要下载更新 版本的话, 可以去参考: 【已解决】docbook中用xsltproc处理xsl文件时用xsl:import引用本地css,js等文件 时,必须加上file:///或file://的前缀才可以 中的"如何组合出来相对比较新的版本的xsltproc"即可。 1.2.3. 下载docbook-xsl-ns-1.77.1 为了将xml源码转换为html,fo等文件的话,需要相应的配置文件,以控制输入的效果和格 式,这就需要相应的配置文件。 此处的配置文件,就是xsl格式的stylesheet(样式表)。 docbook官方网站中,有对应的最新的办法的xsl样式表文件,是放在sourceforge上的:最 新的docbook-xsl-ns所在的页面 截止当前2012-06-10,最新版本的是1.77.1版本的docbook-xsl-ns,下载下来对应的 docbook-xsl-ns-1.77.1.tar.bz2后,解压,放到上面刚建立的10中 1.2.4. 下载fop-1.0并添加fop配置文件 [注 如果没有安装java,请先安装java 意] fop的运行,依赖于java运行环境。 如果你的windows中,还没有安装java,请先安装java运行环境(JRE=java runtime environment)。 关于java的基本知识和如何安装,不了解的请参考:Java java已经安装好前提下,另外记得确保JAVA_HOME环境变量已经正确设置好了。 比如,我的系统中的是: JAVA_HOME=D:\Program Files\Java\jre7 1.2.4.1. 下载fop-1.0 从:fop主页 ⇒ Apache™ FOP Version 1.0 ⇒ fop下载页面 ⇒ FOP Distribution mirror中 ,可以找到第一链接,是官网推荐给你的,然后进去后可以找到binaries文件夹,进去后 ,下载到fop-1.0-bin.tar.gz,比如我这里得到的地址是:bjtu的fop-1.0-bin.tar.gz 下载解压后,放到上面建的11中即可。 1.2.4.2. 配置FOP的环境变量FOP_HOME 为了更好的让fop自动搜索对应的lib库,需要去设置fop的一个环境变量FOP_HOME。 此处即为,设置对应的环境变量为: FOP_HOME=E:\DevRoot\docbook\tools\fop-1.0 1.2.4.3. 添加fop配置文件fop.xconf 将原先的11中的conf文件夹中的fop.xconf拷贝一份出来,放到9下 然后打开该文件,找到fop⇒renderers中的fonts部分,然后添加对应的配置,变成: ... ... ... file:///c:/windows/fonts/ 即完成了对应的配置。 [提 关于FOP的字体配置 示] 关于fop的更多字体配置方面的内容,可以去参考官网的解释:Custom Fonts 1.2.5. 准备docbook的源码:xml文件 将如下内容: Docbook5环境搭建演示 本文主要介绍了如何在纯Windows的环境下搭建Docbook 5开发环境 CrifanLi 2012-06-05 2012 Crifan 本文章遵从:署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5) 第一章的标题 关于更多的Docbook方面的内容,可以去参考:Docbook开发手记 第一章第一小节的标题 可以在这里输入第一章第一小节中的内容 第一章第二小节的标题 第一章第二小节标题 第二章 存为UTF-8编码的docbook5_demo.xml文件。 用于后期演示使用。 [提 如何建立UTF-8编码的文件 示] 可以参考Notepad++的多种编码支持,去用Notepad++建立相应的UTF-8编码的文件。 1.2.6. 从xml生成html 1.2.6.1. 为生成html准备配置文件 将如下内容: Microsoft YaHei Microsoft YaHei Microsoft YaHei Cambria Math 8 1 此处请自行将E:/DevRoot/docbook换为你自己当前的目录。 2 注意,此处的路径中是正斜杠'/',而不是反斜杠'\',否则会导致xsltproc无法识别 。 存为UTF-8格式的docbook_html.xsl 放到前面建的8中。 1.2.6.2. 将xml转换为html 将xml源码转换为html话,只需要用xsltrpoc一步操作就可以了: 打开windows的命令行cmd,切换到上面建的6下 然后运行如下命令: xsltproc -o ../output/html/docbook5_demo.html E:\DevRoot\docbook\config\docbook_html.xsl docbook5_demo.xml 即可生成相应的docbook5_demo.html 截图效果如下: [generated_] 1.2.7. 从xml生成pdf 1.2.7.1. 为生成pdf准备配置文件 将如下内容: Microsoft YaHei Microsoft YaHei Microsoft YaHei Cambria Math 8 1 0pt 存为UTF-8格式的docbook_fo.xsl 同理,不要忘了参考上面的1,把E:/DevRoot/docbook换为你自己当前的目录。 把docbook_fo.xsl放到前面建的8中。 1.2.7.2. 将xml转换为fo 同理,在6下 用下列命令去生成fo: xsltproc -o ../output/fo/docbook5_demo.fo E:\DevRoot\docbook\config\docbook-xsl-ns-1.77.1\docbook_fo.xsl docbook5_demo.xml 相应的屏幕输出为: E:\DevRoot\docbook\books\docbook5_demo\src>xsltproc -o ../output/fo/docbook5_demo.fo E:\DevRoot\docbook\config\docbook-xsl-ns-1.77.1\docbook_fo.xsl docbook5_demo.xml Making portrait pages on USletter paper (8.5inx11in) 1.2.7.3. 将fo转换为pdf 再继续执行下面命令: E:\DevRoot\docbook\tools\fop-1.0\fop.cmd -c E:\DevRoot\docbook\config\fop\fop.xconf -fo ../output/fo/docbook5_demo.fo -pdf ../output/pdf/docbook5_demo.pdf 相应的屏幕输出为: E:\DevRoot\docbook\books\docbook5_demo\src>E:\DevRoot\docbook\tools\fop-1.0\fop.cmd -c E:\DevRoot\docbook\config\fop\fop.xconf -fo ../output/fo/docbook5_d -pdf ../output/pdf/docbook5_demo.pdf 六月 07, 2012 11:28:38 下午 org.apache.fop.apps.FopFactoryConfigurator configure 信息: Default page-height set to: 11in 六月 07, 2012 11:28:38 下午 org.apache.fop.apps.FopFactoryConfigurator configure 信息: Default page-width set to: 8.26in 六月 07, 2012 11:28:41 下午 org.apache.fop.hyphenation.Hyphenator getHyphenationTree 严重: Couldn't find hyphenation pattern zh_cn 如此,就可以正常生成对应的pdf文件了,截图效果如下: [pdf_with_b] [pdf_with_t] [pdf_body_n] 1.3. Windows环境下的,基于Cygwin的Docbook开发环境的搭建 其实如果只是普通的用用docbook去写技术文档,那么上述的纯windows的docbook开发环境 ,即: xsltproc + fop + docbook-xsl-ns 已经够用了,即对于普通的docbook开发者的话,看到此处,已经足够了。 但是如果你也是像我一样,需要用到写更多的技术文档,需要用makefile等去管理各个 book的编译,去传递定制的参数给xsltproc 以及利用Linux下面的一些常用工具,去实现特定的需求的话,那么就要用到cygwin了。 1.3.1. 安装Cygwin 关于什么是Cygwin和如何安装Cygwin,请参考:Cygwin 需要注意的是,安装时候,记得要选择以下几个库/模块: 1. xsltproc 用于将xml转换为HTML和FO等格式 2. xsltproc所依赖的一些库 xsltproc运行的话,需要依赖一些库,所以也要选上这些库。 同时,后期的一些其他处理,比如编码转换等,也需要相关的像iconv等工具,所以要 安装上这些工具,方便后期使用。 □ libxml2 □ zlib □ libxslt □ iconv 3. [docbook-xsl] 如前面第 1.2.3 节 “下载docbook-xsl-ns-1.77.1”中的解释,为了生成各种格式的文 件,是需要对应的xsl配置文件的。 其实这部分配置文件,新版本的cygwin中,也有了,所以可以选择安装,也可以不安 装: □ 安装的话,就是选择对应的模块docbook-xsl 安装的理由是,cygwin自带的xsl,其实版本已经够新了,也基本足够用了。而且 总类也很多,包括docbook-xsl,docbook-xsl-ns等等。 □ 不安装的理由是,可以自己去按照前面的第 1.2.3 节 “下载 docbook-xsl-ns-1.77.1”一样去手动自己下载最新版本的,自己所需要的 docbook-xsl。 因为最新的版本,往往功能上更加全。 所以,是否安装此docbook-xsl的话,可以根据自己的需要决定。 个人更加倾向于后者,自己手动下载最新版本的。 安装完毕cygwin后,可以查看对应的这些工具的版本等信息: CLi@PC-CLI-1 ~/develop/docbook/books/soft_dev_basic/src $ which xsltproc.exe /usr/bin/xsltproc.exe CLi@PC-CLI-1 ~/develop/docbook/books/soft_dev_basic/src $ xsltproc --version Using libxml 20708, libxslt 10126 and libexslt 815 xsltproc was compiled against libxml 20708, libxslt 10126 and libexslt 815 libxslt 10126 was compiled against libxml 20708 libexslt 815 was compiled against libxml 20708 1.3.2. 下载cygwin下使用fop-1.0 按理来说,cygwin下,直接是可以正常使用1.0版本的fop的,但是后来遇到那个很多人都 遇到的NoClassDefFoundError的问题。 所以,要在cygwin下使用fop-1.0之前,去解决掉此问题: 将fop中(大概是189行)的: LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"` 改为: #LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"` # for cygpath has bug, so use follow workaround # edit by admin AT crifan DOT com LCP_TEMP=`cygpath --path --$format "$LOCALCLASSPATH"` LCP_TEMP=`cygpath --path --unix "$LCP_TEMP"` 详情参看:【终极解决】fop错误:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/xmlgraphics/image/loader/ImageContext 的终极解决办法,即cygpath有bug,转换路径出错,导致部分路径被截断 第 2 章 Docbook开发过程中的注意事项和心得 目录 2.1. Docbook 4和Docbook 5的区别 2.2. 关于实体定义 2.3. qanda系列的用法 2.4. FOP相关注意事项 2.4.1. FOP的字体设置 2.5. Docbook开发过程中的一些有用的提示 2.5.1. Docbook最佳实践 2.5.1.1. Docbook中id的命名规则 2.6. Docbook开发过程中如何调试错误 2.6.1. 举例说明如何实现方便地调试Docbook生成pdf过程中所出现的错误 2.7. Docbook开发过程中的一些感悟 2.7.1. Docbook更关注内容 2.7.2. Docbook与盖楼 2.8. Docbook环境进化过程简单记录 摘要 2.1. Docbook 4和Docbook 5的区别 其实对于普通的Docbook的使用者来说,其实不必关心如何从Docbook4转到Docbook5,但是 对于像我之前借鉴别人的docbook的xml去写docbook的源码的话,就需要关注一下了。 因为之前的很多Docbook的元素(Element),其实都是Docbook5之前的,所以现在是在用 Docbook5的框架,但是却使用了部分的之前的元素。因此,需要列出一些需要注意的事项 。 此处列出几个在使用时候需要注意事情: 1. 记得要给book,article等添加命名空间: ... 2. ulink被link取代了 关于交叉引用,link等方面的改变,去看Improved cross-referencing and linking 3. bookinfo,articleinfo等都被info取代了 关于更多的改变了名字的元素,去看Renamed elements 关于更多在docbook5中去除了的元素,去看Removed elements 4. 支持了用alt和annotation给元素添加注释 5. 新加了XSLT 2.0的支持 更多详细的内容,请参考:DocBook 5 differences 2.2. 关于实体定义 如果想要输入一些特殊字符的话,那么可以考虑使用实体(Entity)定义。 比如: • 用⇒来表示双等号右箭头:⇒ • 用™来表示trademark商标:™ • 用↔来表示单横线双向箭头:↔ 而对这类特殊字符,之前是通关使用自己单独定义的crl.ent文件而实现的。其包含如下内 容: 但是实际上,对于这些字符,官网已经有了标准的定义了。 然后在参考了http://docbook.org/docs/howto/#faq-authoring-general-entities,得知 如下地址中有全部的定义: http://www.w3.org/2003/entities/2007/w3centities-f.ent 对应的,http://www.w3.org/2003/entities/2007/中,也有其他相关的ent文件。 其中,也可以看到那个很常见的,包含了全部定义的文件:http://www.w3.org/2003/ entities/2007/w3centities.ent 更多关于实体定义的解释,可以去看:XML Entity Declarations for Characters 而知道了有这么好的资源,就可以直接利用了,即,将上面的那个文件,改成: %allent; 即可包含了全部的各种特殊字符的定义了,这样也就可以随处引用这些特殊字符了。 当然对于上述文件,每次都是需要联网下载w3centities-f.ent的,所以,为了不依赖网络 和加快速度,可以下载w3centities-f.ent到本地,放在和crl.ent同文件夹下,然后 crl.ent就可以再改为这样既可: %allent; 2.3. qanda系列的用法 QA相关的关键字包括:qandaset,qandadiv,qandaentry,question,answer 其相关的用法举例,自己去参考官网的解释:qandaset 此处需要特别提示的是,对于qandadiv和qandaentry等,是不能随便放在某个 section,sect1,para等之下使用的 我就是没注意,结果折腾了半天,始终出现错误: org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! (See position 29:6604) javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! (See position 29:6604) 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}block" is not a valid child of "fo:root"! (See position 29:6604) at org.apache.xalan.transformer.TransformerIdentityImpl.transform(​TransformerIdentityImpl.java:501) at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299) ... 3 more 结果始终不知道错在哪里,调试到最后,终于发现了,原来是qandaset等关键字,只能在 chapter,article等之下使用,不能随便放在某个section,sect1,para等之下使用 所以,不要像我一样,想要在别处使用,导致始终出错,浪费了很长时间。。。 2.4. FOP相关注意事项 2.4.1. FOP的字体设置 关于FOP的字体的设置,对于最新版本的1.0的FOP来说,其设置很简单,参考官网的解释: Apache™ FOP: Fonts - Custom Fonts,只需要在配置文件fop.xconf中的 renderers→renderer→fonts中,添加如下内容即可。 file:///c:/windows/fonts/ 而与此相比,之前旧版本的FOP对于字体的设置,则相对比较繁琐,因为除了要用对应的命 令去生成字体文件所对应的Metric文件之外,还要把相关配置添加到上述fop.xconf中去。 打开windows下面的cmd,然后切换到对应的fop的根目录,执行下面的命令: java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimHei C:\Windows\Fonts\simhei.ttf fonts\simhei.xml java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname msyh C:\Windows\Fonts\msyh.ttf fonts\msyh.xml java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname msyhbd C:\Windows\Fonts\msyhbd.ttf fonts\msyhbd.xml 就可以生成相应的字体的XML Metrics文件了,然后再把相应的如下的设置: file:///c:/windows/fonts/ 添加到fop.xconf中去。 2.5. Docbook开发过程中的一些有用的提示 2.5.1. Docbook最佳实践 此处总结一些,在写docbook源码的时候,一些常见的做法。 这些做法,多数都是我自己总结出来的,仅作参考。 2.5.1.1. Docbook中id的命名规则 在给docbook的元素添加id(或xml:id)属性的时候,名字的命名,我的做法是: 表 2.1. Docbook中id命名规则 Docbook id命名规则 举例 元素 figure fg.xxx
XML文件中的Notepad++的代码折腾功能 table tbl.xxx Docbook中id命名规则 example eg.xxx Notepad++可以查看特殊字符的用途举例 某 xxx Docbook开发过程中的一些有用的提示 section ... <revhistory text-align="left" ... co和 co.xxx和 callout co.note.xxx ... ... 1. 最新的stylesheet:xsl-ns 想要去下载最新的xsl-ns,可以去这里下载:DocBook Project Snapshots,其中有最 新的xsl-ns下载。 2. 参数 docbook-xsl-ns-1.76.1\fo下面,有个param.xsl,该文件是对应的param.xml生成出 来的。 该文件中包括了,所有的参数的默认的设置。而对应的每一个参数,都还有一个对应 的配置文件,都放在了docbook-xsl-ns-1.76.1\params路径下了。 之所以说这个,是因为,关于各种参数的配置,最开始是没有头绪,找不到哪些内容 都有哪些参数去控制输出的效果。现在找到了这些,就可以在遇到问题的时候,来找 找这些参数了。 3. NS=namespace 关于xsl配置文件,之前叫做docbook-xsl-1.76.1,后来又有个 docbook-xsl-ns-1.76.1 其中的ns,意思是namespace的意思,即支持命名空间版本的xsl 4. formal的含义 参考Graphics而知道了之前就想要知道的formal的含义:formal是包含了figure, table, example和equation的 5. 只包含部分内容 根据Using XIncludes with DocBook 5中的描述,如果想要只包含(include)某个 xml文件的其中一部分内容,比如某个章节,也是可以通过include相应的xml:id去实 现的此需求的。 详情参考:Selecting part of a file 6. 关于xml文件中,为何不直接写id而要写xml:id 之前一直没搞懂,为何很多地方,在解释在xml文件中的添加某个id的时候,写成 xml:id,而为何不直接写id,毕竟很多地方,也都是这么写的,为何还非要麻烦地写 成xml:id呢? 后来在学习了xml的命名空间namespace之后,才知道,原来为由于docbook5中,会通 过: 的写法,设置默认的命名空间(default namespace)为http://docbook.org/ns/ docbook,通过也添加了xi和xl的命令空间。 因此,在xml文件中,如果直接写id的话,其实意味着是属于docbook的属性的id,此 处由于id没有和其他关键字冲突,所以,xml:id和id都是可以的,只是前者更加能保 证不会发生关键字冲突。 相应的,如果是别的某个关键字,而多个域名中都可能会出现,则必须要添加对应的 命名空间的前缀了。 比如我之前遇到的,将ulink改为link的时候,在写的时候,如 果写成,即没有加xl的命名空间的话,则生成出来的HTML和PDF中 ,都是没有链接的效果的,必须写成xl:href才可以的。 所以,更好的习惯,还是写成xml:id之类的,添加了命名空间的形式,这样更加准确 ,也可以避免未来可能的和其他命名空间发生关键字冲突的问题。 2.6. Docbook开发过程中如何调试错误 在Docbook开发过程中,难免会出现各种各样的错误。 遇到常见的错误的话,可以去参考我所总结的:第 3 章 Docbook开发过程中的常见问题及 解答 但是有时候会遇到一些相对比较复杂的问题。 2.6.1. 举例说明如何实现方便地调试Docbook生成pdf过程中所出现的错误 比如,我所遇到的,一个docbook的xml源文件,本身就有500多行,内容很多。 此时,编译生成pdf过程中,生成fo的时候出错: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:table" is missing child elements. Required content model: (marker*,table-column*,table-header?,table-footer?,table-body+) (See position 27:127554) 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) 其中可以看出,已经明确指出了出错的具体位置:27:127554 即,错误行号linenumber是27,行内偏移量offset为127554 调试无缩进的(xml格式的)fo文件. 但是,当你去用Notepad++打开fo文件的话,所看到 的内容是这样的: [no_hl_fo_s] 然后去通过选择:语言 → XML,进行语法高亮后,变成: [with_hl_fo] 虽然容易看清代码了。但是很明显,代码整体上非常乱,因为没有缩进,很多内容都集中 到同一行中显示了。这是因为之前对于fo所用的设置为: 即,制定了输出的xml中,indent为no,即没有缩进,导致生成的(xml类型的)fo文件, 内容都显示到一行中,显得很乱。在此种情况下,如果想要去调试的话,就只能是这样做 :在Notepad++中,用搜索→行定位...(Ctrl+G),调出跳转对话框,选择“行”,然后输入错 误行号,此处为27: [ctl_g_inpu] 然后点击"定位"就可以跳转到27行了。 [no_indent_] 可以看出,仅仅是单一的27行,其内容已经太多了,多到鼠标也要拖动很多个屏幕,才能 完全选中此行的内容。选中后,然后将此行的拷贝出来,放到新建的文件中去: [copy_out_t] 然后再去定位到行尾偏移量127554的位置: [ctl_g_inpu] 找到出错的位置: [can_found_] 可以看出,此处即使找到了所指示的出错位置,也很难找到具体错在哪里。因为代码实在 太多,很难找到是哪里错误的。 调试有缩进的(xml格式的)fo文件. 对于上述所面临的很难定位错误的问题,解决办法是 ,配置xml格式的fo的输出中,是带代码缩进的: 这样,生成的xml格式的fo文件,就变成这样了: [fo_src_wit] 对应的出错的提示中,行号和行内位置,也都变了: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:table" is missing child elements. Required content model: (marker*,table-column*,table-header?,table-footer?,table-body+) (See position 7594:441) 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) 变成错误行号是7594,行内偏移量是441了。然后就去跳转到对应的行: [ctrl_g_lin] 找到错误的位置: [error_line] 然后类似的,把整行内容拷贝出来,然后再去跳转到行内位置441: [ctrl_g_off] 这样,在不是很多的一行内,就很容易找到对应错误位置,然后具体分析错误的原因了。 总结一下就是,对于fo文件的话,想要调试的话,记得设置输出的indent为yes: 这样生成的fo中就是带缩进的了,格式就很清晰了,就容易找错误位置,方便调试错误了 。 2.7. Docbook开发过程中的一些感悟 2.7.1. Docbook更关注内容 使用Docbook越多,越加发现,Docbook的确只是更加让你关注文章的内容如何写,而对于 输出到底是什么样子的,就不需要让你关注了。 好处是可以让你把精力集中在文章的内容上,坏处是有时候,我可能会关注一下具体的输 出效果,某些需要特别注明的字体的颜色高亮等设置,就没法方便的设置了。 但是总体还是利大于弊的。更多关注文章内容,而非文章的显示效果,可能更加有利于文 章的最终的传播。 2.7.2. Docbook与盖楼 最近在折腾docbook,其内容总体来说包括两方面,一是搭建docbook的全套环境,而是完 成每个book的xml源码。 突然想到,其实这个过程,就像在是盖楼。 搭建docbook的环境,就是建摩天大楼之前的打地基,这部分是最基础,也是最重要的。 基础没有建好,楼是盖不起来的。 建好了地基,再去一层层的盖楼,就是完成每本book的xml源码的过程。 而此处完成每本book的xml源码,和建造每层楼,又有点不同。 目前已经写好的20左右本book,每本的内容都完全不一样,虽然表现形式上,都算是一样 的,符合docbook的定义而已。 而且每本book的内容,大小不同,换成楼层的层高的话,有的层高是只有3,5米,有的层高 可能要达到30,50米。 总的说来,完成docbook环境和这么多book的内容,就像建好了地基,建了20多层的楼。 之后对docbook环境的微调,就像是在不同的细节方面,加固和完善地基。 而再写新的book,就相当于再建一层楼了。 而对于已写好的book的内容的增添修改,就相当于对于建好的楼层的内部装修,优化布局 等细节处理了。 所以,之后要继续做的事情,就是继续加固地基,优化已有楼层,建新楼了。 另外,如果之后开始折腾替换已有xsltproc为Saxon的话,就相当于又找了个新的建筑方法 ,从新搭建另外一个地基了。 2.8. Docbook环境进化过程简单记录 此处简单记录一下,整个docbook环境,从无到有,到后期优化的大概进化过程: 1. 参考别人教程,可以编译HTML 2. 可以编译PDF了 3. 编写了一个统一的make,支持html,htmls,pdf,txt,chm,rtf 4. 添加了make release支持 5. 以最少改动去支持home和office 6. 把system的图片统一提取出去 7. 把css统一提取出去 8. 支持make两种版本local和release的时候对应链接地址不同 9. 支持从books目录下,对全局的books进行make操作 10. 添加了对于HTML中加入js代码实现统计页面访问次数的功能 【已解决】给Docbook生成的静态HTML页面添加统计访问次数的代码 11. 升级到docbook-ns-1.78.1 【记录】将docbook的xsl-ns从当前的docbook-xsl-ns-1.77.1升级到 docbook-xsl-ns-1.78.1 第 3 章 Docbook开发过程中的常见问题及解答 目录 常见问题 3.1. ValidationException: Property ID xxx previously used 3.2. ValidationException: xxx is not a valid child of xxx 3.3. ValidationException: xxx is missing child elements 3.4. docbook5中指定表格table中列column的宽度 3.5. 除了章(Chapter)有编号之外,其他不同层级的小节(section)都是没有编号 的,想要给各小节添加索引编号 3.6. 已经include了xsl配置文件了,但是自己添加的参数配置,不起效果 3.7. xsltproc出错:Element xxx in namespace xxx encountered in book, but no template matches 3.8. pdf中没有出现/显示revhistory所对应的历史版本 3.9. 生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx) 3.10. 想要给book中的标题下面添加一个版本号 3.11. 输出的pdf中的revhistory历史版本的内容中的表格无边框,想要添加边框 3.12. 如何去掉docbook中输出的pdf中,除了带链接的文字之外的那个链接地址 3.13. 给docbook生成的pdf中的带链接的文字,添加下划线和设置字体颜色为蓝色 3.14. 如何给docbook的pdf添加bookmark书签的功能 3.15. Docbook的pdf,去除正文对于标题的缩进indent 3.16. 生成的pdf中emphasis无效果,想要实现给pdf中emphasis的文字加粗或斜体 3.17. 如何给(docbook中的)xsl中定义实体Entity 3.18. 给docbook的pdf中的等式(equation)设置背景色 3.19. 如何将默认的输出单个的HTML页面,改为输入多个HTML页面? 3.20. 如何给docbook中的表格(table)的第一行(firstrow或thead)添加背景色? 3.21. 如何用docbook生成chm(微软帮助文件)? 3.22. docbook生成的chm的左边目录等内容都是乱码 3.23. 如何将qanda的标题添加到TOC目录中去? 3.24. 如何将docbook转换为(和word兼容的)RTF文档? 3.25. 如何用Docbook生成Webhelp? 3.26. 用fop生成pdf过程中出现警告:warning: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400" 3.27. Docbook中使用fop过程中出错:严重: Couldn’t find hyphenation pattern zh_cn 3.28. cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader/ ImageContext 3.29. Docbook中用xsltproc生成HTML过程中出错:runtime error xxx/chunker.xsl line 226 element document, invalid value for indent,xsltRunStylesheet : run failed 3.30. docbook的xsltproc生成的HTML中Charset的值是空的,不是所设置的UTF-8 3.31. 如何给Docbook中添加abbrev缩略词一项,且放置在目录之后,正文之前? 3.32. 给Docbook的HTML的等式(equation),程序源码(programlisting)等添加背 景色 3.33. PDF中和HTML中的图片显示,始终不能统一,要么HTML中是放大的,要么PDF中 不能完全显示,所以希望PDF和HTML中的图片显示可以用同一套代码来统一 3.34. 想要设置HTML和PDF中的图片的标题都是居中对齐 3.35. 生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无法显 示 3.36. Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显示,而且如果 内容是多行的,还会显示出多行 3.37. Docbook中的callout图片在programlisting中不显示 3.38. An fo:block is wider than the available room in inline-progression-dimension 3.39. TransformerException: The column-number or number of cells in the row overflows the number of fo:table-columns specified for the table 3.40. 如何通过xref(在别处)引用某个段落(para)? 3.41. WARNING: Content overflows the viewport of the fo:region-body on page 9 in block-progression direction by 99828 millipoints. (See position 2:5700) 3.42. PDF中callout不能点击跳转(而HTML中却可以) 3.43. callout图片在programlisting的源码中不显示 3.44. 如何在(只使用co而没有使用areaspec的)源码中多个位置,指向同一个co( callout)? 3.45. 新的docbook-xsl-ns-1.77.0生成的html中的revhistory中单元格无边框 3.46. WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei". 3.47. 如何实现给table中(多个)特定位置添加相应的注释? 摘要 3.1. ValidationException: Property ID xxx previously used 3.2. ValidationException: xxx is not a valid child of xxx 3.3. ValidationException: xxx is missing child elements 3.4. docbook5中指定表格table中列column的宽度 3.5. 除了章(Chapter)有编号之外,其他不同层级的小节(section)都是没有编号的, 想要给各小节添加索引编号 3.6. 已经include了xsl配置文件了,但是自己添加的参数配置,不起效果 3.7. xsltproc出错:Element xxx in namespace xxx encountered in book, but no template matches 3.8. pdf中没有出现/显示revhistory所对应的历史版本 3.9. 生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx) 3.10. 想要给book中的标题下面添加一个版本号 3.11. 输出的pdf中的revhistory历史版本的内容中的表格无边框,想要添加边框 3.12. 如何去掉docbook中输出的pdf中,除了带链接的文字之外的那个链接地址 3.13. 给docbook生成的pdf中的带链接的文字,添加下划线和设置字体颜色为蓝色 3.14. 如何给docbook的pdf添加bookmark书签的功能 3.15. Docbook的pdf,去除正文对于标题的缩进indent 3.16. 生成的pdf中emphasis无效果,想要实现给pdf中emphasis的文字加粗或斜体 3.17. 如何给(docbook中的)xsl中定义实体Entity 3.18. 给docbook的pdf中的等式(equation)设置背景色 3.19. 如何将默认的输出单个的HTML页面,改为输入多个HTML页面? 3.20. 如何给docbook中的表格(table)的第一行(firstrow或thead)添加背景色? 3.21. 如何用docbook生成chm(微软帮助文件)? 3.22. docbook生成的chm的左边目录等内容都是乱码 3.23. 如何将qanda的标题添加到TOC目录中去? 3.24. 如何将docbook转换为(和word兼容的)RTF文档? 3.25. 如何用Docbook生成Webhelp? 3.26. 用fop生成pdf过程中出现警告:warning: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400" 3.27. Docbook中使用fop过程中出错:严重: Couldn’t find hyphenation pattern zh_cn 3.28. cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader/ ImageContext 3.29. Docbook中用xsltproc生成HTML过程中出错:runtime error xxx/chunker.xsl line 226 element document, invalid value for indent,xsltRunStylesheet : run failed 3.30. docbook的xsltproc生成的HTML中Charset的值是空的,不是所设置的UTF-8 3.31. 如何给Docbook中添加abbrev缩略词一项,且放置在目录之后,正文之前? 3.32. 给Docbook的HTML的等式(equation),程序源码(programlisting)等添加背景色 3.33. PDF中和HTML中的图片显示,始终不能统一,要么HTML中是放大的,要么PDF中不能 完全显示,所以希望PDF和HTML中的图片显示可以用同一套代码来统一 3.34. 想要设置HTML和PDF中的图片的标题都是居中对齐 3.35. 生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无法显示 3.36. Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显示,而且如果内容 是多行的,还会显示出多行 3.37. Docbook中的callout图片在programlisting中不显示 3.38. An fo:block is wider than the available room in inline-progression-dimension 3.39. TransformerException: The column-number or number of cells in the row overflows the number of fo:table-columns specified for the table 3.40. 如何通过xref(在别处)引用某个段落(para)? 3.41. WARNING: Content overflows the viewport of the fo:region-body on page 9 in block-progression direction by 99828 millipoints. (See position 2:5700) 3.42. PDF中callout不能点击跳转(而HTML中却可以) 3.43. callout图片在programlisting的源码中不显示 3.44. 如何在(只使用co而没有使用areaspec的)源码中多个位置,指向同一个co( callout)? 3.45. 新的docbook-xsl-ns-1.77.0生成的html中的revhistory中单元格无边框 3.46. WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei". 3.47. 如何实现给table中(多个)特定位置添加相应的注释? 3.1. ValidationException: Property ID xxx previously used javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Property ID "ref.ldr_syntax" (found on "fo:block") previously used; ID values must be unique within a document! (See position 1315:169) 很常见的问题,即源码中,某个id的值,和之前的重复了。 常出现于,从别处拷贝了某段代码,然后修改完毕后,残留部分内容,导致其中有重复的 id 解决办法:将重复的id删除或者改名 3.2. ValidationException: xxx is not a valid child of xxx javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}list-item" is not a valid child of "fo:block"! (See position 345:1605) 错误的根本原因是:非正确地使用了某个标签。 比如某个元素不是另一个元素的子元素,但却由于不熟悉,而误用了。 但是具体的表现形式,那可能是多种多样的。 下面就简单列举一下,我所遇到过的错误的例子: 1. 在callout中使用了qandaentry 结果导致此错误。然后去官网查了下:qandaentry,才得知,qandaentry的父标签, 只包含三种:answer, qandadiv, qandaset。所以,此处在callout中使用qandaentry ,肯定会出错了。 解决办法:不使用该标签,或者换一个合法的位置使用该标签。 2. 在part下,title和chapter之间,使用了para 结果导致报错: org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! 后来是删除了para,才去掉此错误的。 详情参考:【已解决】org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format} block" is not a valid child of "fo:root"! 3.3. ValidationException: xxx is missing child elements org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "fo:list-item-body" is missing child elements. Required content model: marker* (%block;)+ (See position 77:16747) javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:list-item-body" is missing child elements. Required content model: marker* (%block;)+ (See position 77:16747) 出现类似missing child elements的问题的话,从字面上就能看出,是说明某个关键字下 面,缺少了某个必要的关键字 我遇到此问题,是因为就是折腾现在在用的这个qandaentry,结果在question下面,直接 写上了内容,忘了加上para或screen等关键字,导致了始终此错误。 所以遇到此类问题的话,请自行去找找,是不是也对于某个关键字,漏了其下某个必须的 关键字。 关于具体是哪个关键字出的问题,就要靠你自己调试,定位找到问题所在了。 而关于是其下缺少了哪个关键字,则是可以去DocBook: The Definitive Guide去找到对应 关键字,看其语法的定义了。 比如对于我这里的question,其语法是 question ::= (label?, (calloutlist|glosslist|bibliolist|itemizedlist|orderedlist| segmentedlist|simplelist|variablelist|caution|important|note| tip|warning|literallayout|programlisting|programlistingco| screen|screenco|screenshot|synopsis|cmdsynopsis|funcsynopsis| classsynopsis|fieldsynopsis|constructorsynopsis| destructorsynopsis|methodsynopsis|formalpara|para|simpara| address|blockquote|graphic|graphicco|mediaobject|mediaobjectco| informalequation|informalexample|informalfigure|informaltable| equation|example|figure|table|procedure|anchor|bridgehead| remark|highlights|indexterm)+) 该加号'+'表示至少有1个(或更多),所以,此处就是缺少了任何一个,才出现错误的。 加上合适的,比如我此处是代码,需要一个screen,即可解决问题了。 解决办法:找到对应出错的关键字,添加必要的子(child)关键字 3.4. docbook5中指定表格table中列column的宽度 解决办法:在table的tgroup之后,添加对应的colspec,指定对应的colwidth,即可达到 自定义表格中列的宽度。示例代码如下:
MPEG音频的帧头的格式 位置(bit)长度(bit)含义示例011用于同步帧,找到此帧头(所有位均置1)1111 1111 111 ......
详情参考【已解决】docbook5中指定表格table中列column的宽度 3.5. 除了章(Chapter)有编号之外,其他不同层级的小节(section)都是没有编号的,想要 给各小节添加索引编号 解决办法:设置section.autolabel为1和section.label.includes.component.label为1, 即可。 即给xsltproc添加参数: --stringparam section.autolabel 1 --stringparam section.label.includes.component.label 1 或者通过给xsl文件中添加对应参数: 也可以达到同样效果。 详情参考【已解决】Docbook中给章节添加索引编号 3.6. 已经include了xsl配置文件了,但是自己添加的参数配置,不起效果 原因:很可能是xsl的import和include没搞清楚,使用了include,导致后续设置的参数, 没有起效 解决办法:将改改为 即可。 详情参考【整理】xsl的import和include,即xsl:import与xsl:include的区别和联系 3.7. xsltproc出错:Element xxx in namespace xxx encountered in book, but no template matches 此错误有两种类型: 1. Element include in namespace 'http://www.w3.org/2001/XInclude' encountered in book, but no template matches. 原因:多数情况下,主要原因都是,没有给xsltproc添加--xinclude参数 另外,还要注意,不要出现,xml源码中使用了xi:include,但是却同时使用了ENTITY 定义,以及不要把xi:include的位置放错了 解决办法:同时保证如下条件: a. 确保只是使用了xi:include,没有同时再使用ENTITY定义。 b. 确保是xi:include是放在book之内,info之外 c. 给xsltproc添加--xinclude参数 2. Element xxx in namespace encountered in book, but no template matches. xxx为preface/chapter等docbook的元素。 原因:没有添加对应的默认的docbook的命名空间,和XInclude的命名空间 解决办法:将 改为: 即可。 3. Element listitem in namespace 'http://docbook.org/ns/docbook' encountered in listitem, but no template matches. 表面现象:根据字面意思是:listitem内包含了listitem,但是却找不到匹配的逻辑 原因:实际上是,此处是listitem内该有个itemizedlist的,但是由于笔误而忘记写 了。 解决办法:添加缺失的itemizedlist即可。 具体情况是: 应用程序 应用程序 库函数 操作系统内核 各个功能模块:网络,文件系统,进程通信,进程管理,存储管理 硬件抽象层HAL 硬件 很明显是,在itemizedlist内的listitem有嵌套的itemizedlist,但是不小心忘记写 内层的itemizedlist了。 改为如下即可: 应用程序 应用程序 库函数 操作系统内核 各个功能模块:网络,文件系统,进程通信,进程管理,存储管理 硬件抽象层HAL 硬件 举一反三:以后再遇到这类的错误,先去看清字面的意思,然后往往就可以看出,具 体错误的原因。比如此处的是listitem内包含listitem,找不到匹配的模板,意味着 listitem内不应该包含listitem,然后就可以去找代码中,到底是哪里出现了, listitem内包含listitem的情况。然后就可以梳理代码,找到错误的位置。否则对于 这类没有提醒错误代码的位置,想要找到错误位置简直就像大海捞针。 解决办法:综合两种类型,给出可以使用的示例代码: 主文件,比如docbook_dev_note.xml中,如下: Docbook开发手记 ... 2012-06-01 2012 Crifan ... 每个单独的分割的xml文件中,如下: xxx xxx yyy xxx ... xxx 然后在使用xsltproc处理xml的时候,记得加上参数--xinclude,即可。 详情参考【已解决】docbook中使用xsltproc出错:Element xxx in namespace xxx encountered in book, but no template matches 3.8. pdf中没有出现/显示revhistory所对应的历史版本 原因:对应的stylesheet配置文件titlepage.templates.xml中没有添加revhistory,导致 编出来的pdf中没有显示对应历史版本部分的内容。 解决办法:编辑titlepage.templates.xml,添加revhistory,变成: ... 2 ... 1 添加对应的revhistory部分,可以根据自己的需要,放到合适的位置 2 text-align,space-before等相关的设置,可以参考其他部分的设置,照葫芦画瓢, 写出自己需要的配置。 然后将其另存为titlepage.templates_crl.xml,放在当前文件夹下。 再用如下命令去编译出相应的xsl文件: xsltproc --output titlepage.templates_crls.xsl1 D:/tmp/tmp_dev_root/cgwin/home/CLi/develop/docbook/tools/docbook-xsl-ns-1.76.1/template/titlepage.xsl2 titlepage.templates_crl.xml3 1 输出xsl的文件名 2 xsl-ns自带的titlepage的template 3 上述的,经过自己修改之后的xml模板文件 这样,就可以生成相应的titlepage.templates_crls.xsl了,然后去把此xsl文件添加到自 己的配置中去: 用此配置编出来的pdf,就可以保护对应的revhistory部分的内容了。 详情参考【已解决】docbook中pdf中没有出现/显示revhistory所对应的历史版本 关于这个问题,多说几句: revhistory问题,同样也是releaseinfo所遇到的,默认pdf中都没有包含。 在mailing list中看到别人在2005年的时候,就讨论到此问题,默认pdf中没有 releaseinfo: missing from fo book titlepage template? 而相关的开发人员Michael Smith也回复说,以后会添加此功能,结果我现在2012年了,用 的fop 1.0 + docbook-xsl-ns-1.76.1,其中默认配置所输出的pdf中,也还是没把 releaseinfo添加进来的。 而同样的问题,也出现在revhistory,默认输出的pdf中,是没有的。而默认输出的HTML中 就有。 对此问题,即便是为了官网在解释如何定制化titlepage的教程中,把revhistory当做例子 来解释,但是如此常用的功能,也应该在pdf输出中,像HTML输出一样,把其加入进来,否 则对于多数使用者,在源码中写了revhistory和releaseinfo,结果输出的HTML中有,PDF 中却没有,肯定会造成现在所已经出现的问题,就是大家都以为这个问题是个bug,所以 google也能搜到一堆这类问题。 最新的结果是,新出的docbook-xsl-ns-1.77.0中,也还是没有把revhistory和 releaseinfo包含进来,真是无语。。。 3.9. 生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx) 原因:从问题本质上说,在图片存在的前提下,都是图片路径不正确。 但是对于为何图片路径不正确,至少有两种类型错误: 1. 本身图片路径设置有误 原因:对于图片本身所在的路径,没有正确指定对应的图片的地址,包括自己文章相 关的图片的地址,和docbook系统相关的callout/admon/navig等相关的 callout.graphics.path,admon.graphics.path,navig.graphics.path等路径。 解决办法:自行查找自己所设置的路径正确与否。 2. 运行环境不同,导致当前路径所相对应的图片路径有误,而找不到图片 之前由于某次改变了运行环境,换到了别的路径下,执行相应的命令去生成html和pdf ,结果出现找不到图片的错误。 原因:换了运行脚本的路径,导致之前所设置的图片的相对路径,变得无效了。 解决办法:确保运行的环境所处的路径,是自己所期望的。 详情参考【已解决】docbook最后生成pdf的时候出错:严重: Image not found. URI: xxx.png. (See position xxx) 3.10. 想要给book中的标题下面添加一个版本号 没有找到专门的元素。暂时先借用releaseinfo来实现放此版本号等内容。 详情参考【已解决】给docbook中的book添加最新的版本号 3.11. 输出的pdf中的revhistory历史版本的内容中的表格无边框,想要添加边框 解决办法:添加如下配置: 12pt left 0.5pt solid black 50% 0.5pt solid black 9pt 4pt 详情参考【已解决】给docbook所输出的pdf中的revhistory历史版本的表格,添加边框 3.12. 如何去掉docbook中输出的pdf中,除了带链接的文字之外的那个链接地址 原因:PDF配置中,默认开启了ulink.show,所以会导致链接的地址,也同链接的文字同步 显示出来。 解决办法:设置ulink.show为0即可。 给xsltproc传递参数 –-stringparam ulink.show 0 或者添加如下配置: 详情参考【已解决】去掉docbook中输出的pdf中,除了带链接的文字之外的那个链接地址 3.13. 给docbook生成的pdf中的带链接的文字,添加下划线和设置字体颜色为蓝色 解决办法:添加如下配置: blue underline 详情参考【已解决】给docbook生成的pdf中的带链接的文字,添加下划线和设置字体颜色为 蓝色 3.14. 如何给docbook的pdf添加bookmark书签的功能 解决办法: 添加如下配置: 1 详情参考【顺带实现】给docbook的pdf添加bookmark书签的功能 更多的关于fop1.extensions的解释,可以去看:Installing an XSL-FO processor和 fop1.extensions 3.15. Docbook的pdf,去除正文对于标题的缩进indent 解决办法: 添加如下配置: 0pt 详情参考【已解决】Docbook的pdf,去除正文对于标题的缩进indent 3.16. 生成的pdf中emphasis无效果,想要实现给pdf中emphasis的文字加粗或斜体 原因:由于当前使用的是中文字体,中文字体没有对应的粗体和斜体,所以无效果。 与此相对的是,很多英文字体,是有对应的粗体或斜体的,所以会有效果。 而其他word等文字处理软件中,中文字体也有粗体和斜体的效果,只是相应软件处理生成 出来的效果。 解决办法:此处想要给emphasis的文字的颜色设置为brown 主要就是修改inline.italicseq和inline.boldseq的部分,把相应的font-style="italic" 和font-weight="bold"都改为color="brown"即可。 即添加如下配置: ltr rtl ltr rtl 详情参考【已解决】docbook中生成的pdf的(中文字体的)emphasis无效果,没有加粗或 斜体等效果 3.17. 如何给(docbook中的)xsl中定义实体Entity 解决办法:参考如下中的xsl_ns_base_cygwin如何定义的,即可: ] > 详情参考【已解决】如何给(docbook中的)xsl中定义实体Entity 3.18. 给docbook的pdf中的等式(equation)设置背景色 解决办法: 添加如下配置: solid 0.5pt silver 详情参考【已解决】给docbook的pdf中的等式(equation)设置背景色 3.19. 如何将默认的输出单个的HTML页面,改为输入多个HTML页面? 解决办法:将之前引用html的docbook.xsl换为chunk.xsl即可。 详情参考【已解决】把Docbook默认输出的单个HTML文件,改为输出多个的HTML文件 3.20. 如何给docbook中的表格(table)的第一行(firstrow或thead)添加背景色? 解决办法: 添加如下配置: antiquewhite before center after Unexpected valign value: , center used. center before center after Unexpected valign value: , center used. center 详情参考【已解决】给docbook中的表格(table)的第一行(firstrow或thead)添加背景 色 3.21. 如何用docbook生成chm(微软帮助文件)? 解决办法: 总的逻辑是:使用htmlhelp.xsl生成相关的HTML文件和一个总的配置文件htmlhelp.hhp, 再用微软的工具hhc去将htmlhelp.hhp转换为对应的chm文件。 当然,使用htmlhelp.xsl的时候,别忘了加上自己的配置,我的配置如下: ] > msyhbd msyh msyh 然后用: xsltproc --xinclude -o MPEG_VBR.html docbook_htmlhelp_crl.xsl MPEG_VBR.xml 生成对应的HTML文件和htmlhelp.hhp 然后再去下载HTML Help Wordshop并安装。 然后用 hhc htmlhelp.hhp 去生成对应的chm 详情参考【全部解决】用Docbook生成htmlhelp 3.22. docbook生成的chm的左边目录等内容都是乱码 原因:主要是由于微软的hhc对UTF-8编码支持不好,导致会出现乱码。 解决办法:确保本身输出的HTML都是UTF-8编码: UTF-8 UTF-8 然后再用iconv将UTF-8转换为GB18030(因为我的本地系统是中文的GBK,而GB18030是GBK 的超集,使用GB18030比GBK更好,可以支持更多的字符) iconv -f UTF-8 -t GB18030 < ../output/htmlhelp/htmlhelp.hhp > ../output/htmlhelp/htmlhelp_gb18030.hhp mv ../output/htmlhelp/htmlhelp_gb18030.hhp ../output/htmlhelp/htmlhelp.hhp iconv -f UTF-8 -t GB18030 < ../output/htmlhelp/toc.hhc > ../output/htmlhelp/toc_gb18030.hhc mv ../output/htmlhelp/toc_gb18030.hhc ../output/htmlhelp/toc.hhc 最后再用hhc去处理,就可以了: hhc htmlhelp.hhp 详情参考【完全解决】生成的chm中标题和左边的索引目录是乱码的问题 3.23. 如何将qanda的标题添加到TOC目录中去? 解决办法:设置qanda.in.toc为1即可: 1 更多的解释,请参考:Q and A in table of contents 3.24. 如何将docbook转换为(和word兼容的)RTF文档? 解决办法:先用xsltproc转换xml为fo,然后再用fop将fo转换为rtf: fop -c fop.xconf MPEG_VBR.fo -rtf MPEG_VBR.rtf 详情参考【记录】将docbook的xml源码,通过xsltproc和FOP生成(可用word打开的)RTF (Word兼容)格式 [注 目前已知的没有非常好的生成RTF的办法 意] 目前折腾的几种方法,包括xsltproc+fop,openjade,XFC等,生成的rtf,效果都不 是很好,所以貌似除非有空自己折腾一下,添加对应的xsl的配置,以使得生成的rtf 效果更好些,目前暂无别的好的办法。 详情可以去看偶的折腾过程:【已放弃解决】将docbook的xml,用xsltproc和fop生成 rtf时出错:WARNING: Only simple-page-masters are supported on page-sequences. Using default simple-page-master from page-sequence-master "titlepage" "front" "body" "back",WARNING: RTF: fo:leader reference-area not supported + 【记录】折腾openjade和XFC去生成RTF 3.25. 如何用Docbook生成Webhelp? 解决办法:使用webhelp.xsl即可。不过偶目前暂时还没折腾出来。有空再去弄。 详情参考【记录】将Docbook生成Webhelp 3.26. 用fop生成pdf过程中出现警告:warning: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400" 解决办法: 如果只是想要去除此警告,那么可以加上此配置即可: 详情参考【已解决】Docbook中用fop生成pdf过程中出现警告:warning: Font "Symbol,normal,700" not found. Substituting with "Symbol,normal,400" [注 注意 意] 实际上,此symbol.font.family对应着的是“符号”所采用哪种字体 而我们的目的,其实应该是支持最全的字符的显示,而不是关注,如何取消此无关紧 要的警告。 而据说Cambria Math字体包含的字符算是最全的了,所以,建议设置为: 以此实现各种特殊字符,都能可以很好的显示出来。(因为之前用微软雅黑,好像个 别特殊字符显示不出来,所以才会如此设置。) 3.27. Docbook中使用fop过程中出错:严重: Couldn’t find hyphenation pattern zh_cn 解决办法:虽然有此提示,但是实际上中文的断字,基本上已经很好了。至少我这里这么 多的book,都没有出现之前别人遇到的,中文的标点符号,偶尔会在句首出现的问题。 但是的确好像对于中文的hyphenation,没有官方的支持的。只有en等英语的支持。 总的来说,就一句话,暂时可以忽略此“严重”型的警告,生成的pdf中的中文的显示,都还 是正常的。 详情参考:【部分解决】Docbook中使用fop过程中出错:严重: Couldn’t find hyphenation pattern zh_cn 3.28. cygwin/linux下的fop运行出错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlgraphics/image/loader/ ImageContext 原因:fop中所用到的cygpath有bug,导致不很好的支持windows中关于CLASS_PATH的定义 ,最终导致转换出来的路径出错,无法找到相应的各种的java的库 解决办法:修改fop文件,将(大概是189行的): LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"` 改为: #LCP_TEMP=`cygpath --path --unix "$LOCALCLASSPATH"` # for cygpath has bug, so use follow workaround # edit by admin AT crifan DOT com LCP_TEMP=`cygpath --path --$format "$LOCALCLASSPATH"` LCP_TEMP=`cygpath --path --unix "$LCP_TEMP"` 详情参考【终极解决】fop错误:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/xmlgraphics/image/loader/ImageContext 的终极解决办法,即cygpath有bug,转换路径出错,导致部分路径被截断 3.29. Docbook中用xsltproc生成HTML过程中出错:runtime error xxx/chunker.xsl line 226 element document, invalid value for indent,xsltRunStylesheet : run failed 原因:有些参数的值,是字符串,所以如果没有用单引号括起来,则会导致参数赋值出错 。 解决办法:将原先的参数赋值中的字符串类型的值,加上单引号。即,把: 改为: 详情参考【已解决】Docbook中用xsltproc生成HTML过程中出错:runtime error xxx/ chunker.xsl line 226 element document, invalid value for indent,xsltRunStylesheet : run failed 3.30. docbook的xsltproc生成的HTML中Charset的值是空的,不是所设置的UTF-8 原因:同问: 3.29 解决办法:把 改为: 详情参考【顺带解决】docbook的xsltproc生成的HTML中Charset的值是空的,不是所设置 的UTF-8 3.31. 如何给Docbook中添加abbrev缩略词一项,且放置在目录之后,正文之前? 解决办法:单独写一个glossary.xml,其中内容如下: 缩略词 ASE ASE Application Specific Extension (根据应用的)专用扩展 xxx xxx xxx xxx 然后将把glossary部分源码放到bookinfo之后,XInclude其他各个章节之前: ARM与MIPS的详细对比 ... ... 详情参考【已解决】给Docbook中添加缩略词 + 自动链接到缩略词表项 + 将缩略词单独放 置一页,且位于目录之后,正文之前 3.32. 给Docbook的HTML的等式(equation),程序源码(programlisting)等添加背景色 解决办法:添加相应的css文件,其配置如下: /* * about html color and corresponding name can refer: * http://www.w3schools.com/html/html_colornames.asp */ /* programlisting */ pre.programlisting { /* background-color: #F4F4F4 ; */ background-color: Lavender ; border: 1px solid #006600 ; } /* screen */ pre.screen { /* background-color: #F4F4F4 ; */ background-color: Lavender ; border: 1px solid #006600 ; } /* equation */ div.equation { /* background-color: #F4F4F4 ; */ background-color: Lavender ; border: 1px solid #006600 ; } /* table */ /* thead=table header */ thead { background-color: antiquewhite ; } /* QandA: Question and Answer */ tr.question { background-color: antiquewhite ; } 详情参考【已解决】给Docbook的HTML的等式添加背景色 3.33. PDF中和HTML中的图片显示,始终不能统一,要么HTML中是放大的,要么PDF中不能完全显 示,所以希望PDF和HTML中的图片显示可以用同一套代码来统一 解决办法:参考如下代码: 对于多数的,尺寸大于pdf中页面宽度(大概是500左右的像素)的图片,则使用pdf中设置 为自动缩放:
Nand Flash的结构图
对于多数的,尺寸小于pdf中页面宽度的图片,则使用pdf中设置为禁止自动缩放,并且自 行调节显示的比例:
典型的Flash内存单元的物理结构
详情参考【基本解决】Docbook生成的PDF和HTML中图片缩放不统一 3.34. 想要设置HTML和PDF中的图片的标题都是居中对齐 解决办法: 1. FOP 对于FOP添加设置: bold 12pt false 0.4em 0.6em 0.8em center 2. HTML 对于HTML添加设置:

详情参考【已解决】如何设置Docbook中的图片的标题为中间对齐 3.35. 生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无法显示 解决办法:添加设置 wrap 详情参考【已解决】Docbook生成PDF中,程序代码programlisting中单行代码太长,超出 页面宽度,无法显示 3.36. Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显示,而且如果内容是多行 的,还会显示出多行 原因:是自己误用了quote所导致的。 解决办法:对于block类型的内容,如table等,应该使用blockquote而不是quote。 详情参考【已解决】Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显示, 而且如果内容是多行的,还会显示出多行 3.37. Docbook中的callout图片在programlisting中不显示 原因:参考的代码是官方的,其用的是areaspec,但是xsltproc不支持areaspec,所以 programlisting中不显示callout图片 解决办法:使用co,放到代码中对应位置即可。可参考如下代码: ... chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); ...... 要读取数据,肯定是要先发送对应的读页(read page)的命令 详情参考【已解决】Docbook中的callout图片在programlisting中不显示 -> xsltproc不 支持areaspec 3.38. An fo:block is wider than the available room in inline-progression-dimension 29, 2012 10:36:07 org.apache.fop.events.LoggingEventListener processEvent An fo:block (See position 668:2859) is wider than the available room in inline-progression-dimension. Adjusting end-indent based on overconstrained geometry rules (XSL 1.1, ch. 5.3.4) 29, 2012 10:36:07 org.apache.fop.events.LoggingEventListener processEvent Line 1 of a paragraph overflows the available area by 4390 millipoints. (See position 668:2859) 29, 2012 10:36:08 org.apache.fop.layoutmgr.table.TableContentLayoutManager addAreas tablePositions empty. Please send your FO file to fop-users@xmlgraphics.apache.org 出现类似fo:block is wider than the available room in inline-progression-dimension的问题的话,从字面上就能看出,是block比inline宽,超 过界限了 我之前遇到此问题,是在不熟悉quote的用法时,将属于block类型的table等内容,放到了 属于inline类型的quote中,导致上面的问题的。 详情请参考:【已解决】Docbook生成的pdf中,当表格在quote中时,表格头部却在底端显 示,而且如果内容是多行的,还会显示出多行 所以遇到此类问题的话,请自行去找找,是不是也误用了某些关键字,把属于block的东西 ,放到了属于inline中去了。 解决办法:找到误用的关键字,换成适当的关键字 3.39. TransformerException: The column-number or number of cells in the row overflows the number of fo:table-columns specified for the table javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: The column-number or number of cells in the row overflows the number of fo:table-columns specified for the table. (See position 12:37135) 从字面上就能看出,是说明某个列数或者是单元格数目,超过了表格所定义的 比如我此处不小心写成的: USB 3.0的引脚定义 ... ... ShellShellShield
即在tgroup中定义了cols列数为4,结果不小心在tbody中的某行,错写了某个entry, nameend为col5,超过了本身所定义的最多4列,因此才出现此错误。 解决办法:去对应表格中,仔细找找,肯定是有某处,不小心,写错了,导致列的书目或 者是单元格的数目,超过了table的tgroup中所定义了列数了。 3.40. 如何通过xref(在别处)引用某个段落(para)? 可以给para添加一个包裹层,比如用tip包裹起来para,然后给tip添加id属性,然后就可 以在别处引用此para了。 后来又知道了Docbook中还有个formalpara,即正式的段落,带标题的段落 如果想要实现段落引用,个人觉得使用formalpara效果会更好,这样,段落还可以带标题 。 比如我后来就遇到一个情况,希望引用别处的某段代码,其是在某个para里面的,之前的 做法是专门用tip给这段programlisting包裹起来,然后给tip添加id属性,然后在别处引 用此源码,现在就可以把tip换成formalpara,然后给formalpara添加id属性,这样就方便 别处引用此formalpara了 解决办法:使用formalpara,然后给formalpara添加id属性,即可在别处通过xref引用 3.41. WARNING: Content overflows the viewport of the fo:region-body on page 9 in block-progression direction by 99828 millipoints. (See position 2:5700) 警告说是,有些的内容显示,溢出实际所定义的范围了 出现溢出的东西,有多种,有的是表格内的文字溢出单元格,有的是图片显示超过了当前 页面等等,而使得显示出来的效果,超过了其可视范围(viewpoint) 此溢出问题,有些是无关紧要的,在显示出来的效果上,也看不出有啥异常。 有些则是显示出来的效果,的确有重叠,覆盖等问题。所以,要根据实际情况而定。 解决办法:当显示效果没啥异常的话,可以忽略此警告。如果显示效果的确有问题了,则 需要去找到对应的代码的位置,进行微调,比如修改表格中单元格的宽度设置等,以避免 内容溢出而导致的内容显示异常问题。 3.42. PDF中callout不能点击跳转(而HTML中却可以) 原因是fo的xsl中co的配置,对于arearef没有正确添加对应的fo:basic-link的 internal-destination,导致了生成的pdf中,callout图片不带链接,无法点击。而对应 的HTML的xsl配置中,有对于arearef的处理,会生成对应的href,所以HTML中是callout是 可以点击的。 解决方法:给fo的xsl中添加如下配置即可: Error: coref link is broken: Error: coref doesn't point to a co: : ??? ??? 详情参考:【全部解决】Docbook生成的PDF中callout不能点击跳转(而HTML中却可以) [提 提示 示] 相关的支持callout和co的internal-link,以便可以互相点击实现跳转的功能的针对 docbook-xsl-ns-1.77.0版本的patch,我已经提交到docbook了: add internal-link support for callout and co - ID: 3531945 不知道官网会不会采纳偶的patch,会不会添加到下一个版本中呢,呵呵,期待中... 后记:对于上述我写的代码,已经被Robert Stayton修改增强后,提交了。 此处已确认,截止2013-10-04,最新版本的docbook-ns是1.78.1,已经包含了此部分 的代码,从而: 不论在html或pdf中,点击callout,都可以互相跳转了。 3.43. callout图片在programlisting的源码中不显示 callout图片,虽然可以在callout注释中显示,但是却在programlisting的源码中不显示 。 其原因在于,xsltproc不支持areaspec,而官网对于programlistingco的例子中,却用的 是areaspec,结果就是按照例子写出来的代码,用xsltproc生成的结果,callout图片在源 码中不显示。 解决方法:不用arespec,改用co,放在programlisting的代码中具体的位置,即可。示例 代码如下: 例 3.1. co用法示例 ... chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); ... 要读取数据,肯定是要先发送对应的读页(read page)的命令 详情参考:【已解决】Docbook中的callout图片在programlisting中不显示 -> xsltproc 不支持areaspec 3.44. 如何在(只使用co而没有使用areaspec的)源码中多个位置,指向同一个co(callout)? 之前已经实现了源码中的callout,详见:【已解决】Docbook中的callout图片在 programlisting中不显示 但是后来遇到的需求是,希望在源码中的多个位置,都设置同一个co 之前的临时性的办法是,使用linkends指向另一个co: .suspend = s3c24xx_nand_suspend, .resume = s3c24xx_nand_resume, 很明显,效果很不好。 后来无意间发现有个coref,发现正是我想要的,对应的用法如下: 例 3.2. coref用法示例 .suspend = s3c24xx_nand_suspend, .resume = s3c24xx_nand_resume, 生成的HTML中的效果,如下: 图 3.1. coref在HTML中的效果 coref在HTML中的效果 解决办法:使用coref,设置linkend属性值为某共同的co的id,即可 3.45. 新的docbook-xsl-ns-1.77.0生成的html中的revhistory中单元格无边框 原因:新版的docbook-xsl-ns-1.77.0相对于旧版的docbook-xsl-ns-1.76.1,改变了 部分的设置,导致新的边框的属性的设置,只应用于整个表格,而单元格的边框没有设置 。 解决办法:添加如下配置: 3 2 RevHistory
1px solid black 100% revhistory
详情参考:【已解决】新的docbook-xsl-ns-1.77.0生成的html中的revhistory中单元格无 边框 3.46. WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei". 原因:某些个人的特殊字符,此处为Unicode值为0x21b5的特殊的回车键形状的字符:↵, 对应的字体无法显示,所以报错。 解决办法:给该特殊字符添加role="xxx",其中xxx为别的某种类型的字体。比如,将原先 的源码: 回车(↵)后再输入: 改为: 回车()后再输入: 详情参考:【已解决】Docbook用fop生成pdf过程中出现警告:WARNING: Glyph "?" (0x21b5, carriagereturn) not available in font "MicrosoftYaHei". 3.47. 如何实现给table中(多个)特定位置添加相应的注释? 有两种办法: 1. xreflabel + note/tip 通过使用xreflabel的方法,加入到table中特定位置。然后注释部分的内容放在table 之外的tip或note中。 缺点是,很不方便用户使用,不直观 参考代码: ...(两个单声道)... ......
双声道 双声道文件由两个独立的单声道所组成。大多数解码器把双声道输出成立体声,但是实际上,不是所有的双声道都是立体声的。 关于xreflabel,更详细的解释,请参考官网的Linking from other elements 2. co + calloutlist + callout 在table的对应位置使用co,然后在table之外的calloutlist和callout中添加对应的 注释内容。 优点是,可以支持自动编号,且可互相点击跳转。 参考代码: xxx ... ...控制字符... ...
即在C语言中或其他地方如何表示。 详情参考:【已解决】找到更好的方法,给Docbook中的表格(table)添加注释( note) -> 用co(和calloutlist,callout) 第 4 章 Docbook参考资料 目录 4.1. Docbook相关的资源和工具下载 4.2. 关于对于Docbook的介绍和解释方面的资料 4.3. 关于对于Docbook的开发过程中可以参考和查阅的资料 摘要 4.1. Docbook相关的资源和工具下载 • docbook的样式表stylesheet Docbook Sourceforge 想要下载Docbook的相关的stylesheet,即各种xsl配置文件的话,可以去此docbook官 网下载页面去下载 包括各种版本,及最新版本的的,docbook-xsl-ns • 搭建windows下的docbook开发环境所需要的各种工具 之前最早的找到的是zlatkovic的下载页面:ftp://ftp.zlatkovic.com/pub/libxml/ 后来发现其还有个64bit的子页面,包含更多的,更新版本的,编译好的,win32的, 二进制包,供下载: ftp://ftp.zlatkovic.com/pub/libxml/64bit/ 之后,又发现,其中部分的内容,xml官网也已经提供下载了: http://xmlsoft.org/sources/win32/ 4.2. 关于对于Docbook的介绍和解释方面的资料 1. Docbook的HelloWord 单个HTML页面的版本 多个HTML页面的版本 mindmap版本 特点:入门参考经典资料 算是在Docbook的中文方面,最早的,解释的最全的资料了。 2. Ubuntu Docbook Wiki 特点:中文,解释的很清晰易懂. 3. Docbook简介 by 熊伟 [警 警告 告] 此网站会被赛门铁克检测出病毒 特点:内容不多,但是解释的深入浅出 4. 开源世界旅行手册之 Docbook指南 特点:清晰明了。东西概括得很好,尤其是很多基本概念,解释的到位。 5. Docbook Beginning 特点:解释的简洁易懂 6. DocBook - Tutorial by Lars Vogel 特点:老外写的,基于Eclipse搭建的环境,内容很新,更新很及时。目前最近的更新 是2012.07.02 而且还有国人帮忙翻译了一下:DocBook与Eclipse - 教程 4.3. 关于对于Docbook的开发过程中可以参考和查阅的资料 1. DocBook XSL: The Complete Guide – Fourth Edition – by Bob Stayton 特点:最权威解释的。 关于docbook的最权威的,官网的教程。 有任何问题,上去找,一般都可以找到答案或参考。 2. DocBook XSL Stylesheets: Reference Documentation 特点:参数大全 关于各种输出格式,HTML,FO(PDF),manpage,website等等的参数方面,有哪些参 数,具体如何配置,都可以去这里找到。 3. Linux C编程一站式学习 特点:(除了本身教程写的好之外,)docbook的xml源码可下载供参考 关于C编程的概念和知识,解释的很透彻,值得一看。 除了教程写的很有价值,其还把docbook的xml源码也公开了,可下载做参考。 相应html也可打包下载。 所以很适合,最开始写docbook源码的时候,做为参考代码。 4. DocBook 5: The Definitive Guide by Norman Walsh 特点:Norman Walsh写的,最权威的关于docbook5的参考资料 放在后面介绍,并不代表不重要。只是因为是英文写的,不适合做入门资料。 适合当参考书,有需要的时候去找相关内容再细看。 5. DocBook 5 快速起步教程 by tanghw 特点:入门的参考教程 解释的很详细,适合入门者。东西解释的够全,很多知识点都值得参考参考。 只不过其搭建环境是Mac,不是很多人常用的Windows。 6. DocBook 文件寫作入門 by 老貢生 特点:部分内容可做参考 台湾人写的。解释的比较详细。等遇到相关知识,也许可以做参考。 7. Installing And Using An XML/SGML DocBook Editing Suite by Ashley J.S Mills 特点:很多例子,还是可以参考参考的。而且内容也很全面,从环境搭建到例子,全 部都有。还介绍了用各种工具,转换成各种不同的格式的用法。 8. DocBook – Tutorial by Lars Vogel 简单介绍了如何写docbook,其中有关于用Eclipse平台的方法。 9. 一张图片总结了Docbook生成各种格式的途经 这里一张图片,就总结了,关于Docbook的各种方法,生成各种格式的文件。 10. DOCBOOK编译环境参考手册 by 廖佳亮 中文的docbook的教程,写的还不错,有空可以参考参考。 11. Docbook Frequently Asked Questions Docbook的FAQ 里面详细介绍了,各种常见问题。 个人觉得比较有帮助的有: Docbook tools 其中记录了,关于Docbook相关的一些工具,比如xsltproc等相关的问题和解决办法 12. The Docbook Project Docbook的主页 算是Docbook的入口了,想要找一切关于Docbook的东西,都可以先去那里看看,说不 定会有意外发现。 13. 关于Docbook中Table的一些资料 尤其是DocBook的表格CALS和HTML的表格的比较,很值得看看: Comparison of CALS and HTML tables 其中,也有关于表格中列的宽度的介绍: Column widths 14. 关于如何添加新的字体 之前别的教程中,最开始部分介绍的关于添加字体的内容,估计就是参考官网的这部 分的解释: Chapter 13. Print customizations – Adding a font 15. 关于在生成对应的HTML或者pdf的时候,需要按照自己的需要,配置输出的效果 主要分两种方法,一种是写对应的xsl配置内容,放到自己的xsl文件中去。 另外一种就是使用相应的参数控制。 对应的这些参数有哪些,以及具体含义,在这里可以找到(注:此处是用的xsl是 docbook-xsl-ns-1.76.1): DocBook XSL Stylesheets: Reference Documentation (也可以下载其pdf版本,留着当做参考书) 其中, 对于HTML的参数都在这里:1. HTML Parameter Reference 对于(用fo生成的)PDF的参数控制,都在这里:2. FO Parameter Reference 关于如何使用这些参数,可以参考一些相关的帖子: ulink.show:【已解决】去掉docbook中输出的pdf中,除了带链接的文字之外的那个 链接地址 fop1.extensions:【已解决】Docbook的pdf,去除正文对于标题的缩进indent + 【 顺带实现】给docbook的pdf添加bookmark书签的功能 16. 想要给pdf添加书签bookmark,以及支持更多种图片的话。 那么可以在使用xsltproc的时候,添加对应的参数即可。 对于使用fop的话: 如果是用的0.20.5或更早的版本,参考这里:Processor Extensions – fop.extensions添加这个参数: --stringparam fop.extensions 1 如果是用的0.90及更新的版本,参考这里:Processor Extensions – fop1.extensions添加这个参数: --stringparam fop1.extensions 1 我现在所用的fop是1.0的,所以用的是fop1.extensions。 17. 参数配置,可以通过传递--stringparam给xsltproc,也可以通过xsl:param写入到自 己的xsl配置文件中 折腾其他参数的过程中,无意间看到: 使用FOP将中文DocBook xml转换成pdf的实现记录 中是将参数写成这样的: simsun simsun simhei false 而与此相对,我之前都是写到–stringparam中的,所以,将原先的命令: xsltproc.exe --stringparam section.autolabel 1 --stringparam section.label.includes.component.label 1 --stringparam bibliography.numbered 1 --stringparam ulink.show 1 --stringparam ulink.footnotes 1 --stringparam table.cell.border.color green --stringparam table.frame.border.thickness 2pt --stringparam fop1.extensions 1 --stringparam body.start.indent 0pt --xinclude -o ../output/fo/MPEG_VBR.fo /home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl MPEG_VBR.xml 转化为: xsltproc.exe --xinclude -o ../output/fo/MPEG_VBR.fo /home/CLi/develop/docbook/config/docbook-xsl-ns-1.76.1/fo/docbook_crl.xsl MPEG_VBR.xml 加上docbook_crl.xsl中的相关配置: green 2pt 1 0pt 这样,每次就不用输入那么多的配置参数了。 而需要额外的参数配置,也就都可以写到xsl文件中了。 此时,也才理解,原来DocBook XSL Stylesheets: Reference Documentation 中的HTML和FO(PDF)的那么多参数,每个都有个语法解释,比如: table.cell.border.color中的: 指的就是,将此配置,写入到xsl文件中。而之前一直都不知道,都傻傻地加入到 xsltproc的参数中去了。 18. 对于catalog相关的知识,这一章有详细介绍: Part I. Setting up the tools – Chapter 5. XML catalogs 包括xsltproc中如何使用catalog的内容: Using catalogs with xsltproc 19. 关于pdf实现一定输入效果,会涉及到xsl文件参数配置。 这里:Docbook Stylsheet Customisation 列出了常见的一些配置参数,包括:章节编号的深度控制,给tip和warning加图片, 给programlisting加背景色等。 20. 使用Docbook建网站 如果想要通过Docbook建立网站,可以参考此文:How to use the Docbook Website system 21. 基于Ant的Docbook开发环境:ant4docbook 这里有专门的别人已经帮你搭建好的,基于ant的docbook的开发环境:ant4docbook 目前看到的已支持多种格式:html,pdf,epub,docx,rtf, 22. 用Ant编译Docbook ant的官网中,也有介绍:Create DocBook XML based documentation with Ant 第 5 章 未解决的问题 目录 5.1. 支持各种语言的代码的语法高亮 5.2. 中文hypernate断字 5.3. 给callout的co重新编号 摘要 此处记录Docbook中的一些还没有解决的问题 有人知道解决办法的话,希望可以联系并告知我,谢谢。 5.1. 支持各种语言的代码的语法高亮 折腾过程参见:【已放弃】给Docbook中代码programlisting实现高亮显示 5.2. 中文hypernate断字 折腾过程参见:【部分解决】docbook的programlisting中,单行的连续字符太长,超出 pdf边界和【已解决】Docbook生成PDF中,程序代码programlisting中单行代码太长,超出 页面宽度,无法显示 5.3. 给callout的co重新编号 【未解决】docbook中给callout的co重新编号 第 6 章 Docbook各种元素用法举例 目录 6.1. chapter, section, sect1-sect5 6.2. 段落 6.3. 图片figure 6.4. 表格,表格嵌套,表格单元格合并 6.5. 注释callout 6.6. 链接,引用 6.7. 等式 6.8. list列表系列 6.9. 简单列表simplelist,literallayout 6.10. xinclude文件,xinclude文件中的其中一部分的内容 6.11. filename:文件,文件夹,后缀名, 6.12. admonitions:note,caution,warning,tip和important 6.12.1. note 6.12.2. caution 6.12.3. warning 6.12.4. tip 6.12.5. important 6.13. 一些inline元素:keycap,guibutton,keycombo 6.13.1. keycap 6.14. programlisting代码和screen屏幕输出 6.14.1. programlisting代码 6.14.1.1. 带CDATA的programinglist示例 6.14.1.2. 不带CDATA的programinglist示例 6.14.2. screen屏幕输出 6.14.2.1. 带CDATA的屏幕输出screen 6.14.2.2. 不带CDATA的屏幕输出screen 6.15. 问题和回答 摘要 记录Docbook中,各种元素(element)的当前最新版本的示例用法 以下代码示例中,暂定均不含注解(callout),以方便借鉴者,直接拷贝代码,就可以参 考使用。 此处,尽量添加实际的例子,以便快速掌握用法。 其中,贴出来的xml源码,部分可能被删减,以防内容太长或者是和此处CDATA等内容冲突 。 6.1. chapter, section, sect1-sect5 例 6.1. chapter,section,sect1-sect5 交叉编译器简介 相关旧帖:嵌入式开发之交叉编译器 交叉编译器的名字的命名规则 在折腾嵌入式开发,用到交叉编译器的时候,常常会看到这样的名字: arm-xscale-linux-gnueabi-gcc arm-liunx-gnu-gcc 等等 其中,对应的交叉编译器的前缀为: arm-xscale-linux-gnueabi- arm-liunx-gnu- 而关于这些名字,我之前也是没注意,或者说很模糊,不是很清楚这些名字是从何而来的。 后来,经过折腾了crosstool-ng后,基本上明白了这些名字,是如何生成的。 其中,貌似此交叉编译器命名的规则,应该是通用的,至少记得是Buildroot中,好像也是这样命名的。 下面,就以crosstool-ng为例,参考我之前折腾crosstool-ng期间: 【整理】crosstool中如何设置xscale的Tuple’s vendor string(CT_TARGET_VENDOR) 所了解到的内容,来解释解释,这些名字的含义。 crosstool-ng中交叉编译前缀的命名规则 crosstool-ng中,交叉编译器的(前缀)的名字的命名规则是: arch-vendor-kernel-system 对应分别是: 交叉编译器名字中的system部分 system,直译为,系统 其实主要表示的,交叉编译器所选择的库函数和目标系统 最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。 其中,此处有几方面的值,表示了几方面的含义: system中的uclibc uclibc,是c库中的一种 crosstool-ng中,目前支持三种:glibc,eglibc,uclibc 关于三种的关系,详见: 【整理】uclibc,eglibc,glibc之间的区别和联系 crosstool-ng中system为uclibc的情况 crosstool-ng中,和system中uclibc对应的值,应该就是"C-library"中的"C library"的值设置为"uClibc"了。 C-library C library (uClibc) ---> 对应的配置参数是:CT_LIBC_uClibc 对应的help的解释是: 6.2. 段落 例 6.2. 普通的段落:para 在折腾嵌入式开发,用到交叉编译器的时候,常常会看到这样的名字: 【整理】crosstool中如何设置xscale的Tuple’s vendor string(CT_TARGET_VENDOR) 例 6.3. 带标题的正式的段落:formalpara 段落的标题 段落的内容 6.3. 图片figure 例 6.4. 带标题的图片:figure
图片的标题
例 6.5. figure内包含2张mediaobject图片
HID Usage page summary
例 6.6. 不带标题的非正式的图片:informalfigure 在同一行内显示图片,之前docbook 4使用inlinegraphic 而根据Inline graphics,而现在docbook 5已废弃使用inlinegraphic ,改用 inlinemediaobject。 例 6.7. 行内图片:inlinemediaobject 右击cmd的左上角的图标 cmd的图标 ,会出现对应的菜单: 6.4. 表格,表格嵌套,表格单元格合并 例 6.8. 表格:table USB Class表 Base ClassDescriptor UsageDescription00hDevice Use class information in the Interface Descriptors01hInterfaceAudio02hBothCommunications and CDC Control03hInterfaceHID (Human Interface Device)05hInterfacePhysical06hInterfaceImage07hInterfacePrinter08hInterfaceMass Storage09hDeviceHub0AhInterfaceCDC-Data0BhInterfaceSmart Card0DhInterfaceContent Security0EhInterfaceVideo0FhInterfacePersonal HealthcareDChBothDiagnostic DeviceE0hInterfaceWireless ControllerEFhBothMiscellaneousFEhInterfaceApplication SpecificFFhBothVendor Specific
例 6.9. 带嵌套(embedded)表格:informaltable XING 头的格式及含义 位置(字节)长度(字节)含义示例044个ASCII字符的VBR头 ID,要么是Xing,要么是Info,无NULL结尾(普通字符串都以NULL,即\0结尾)'Xing'44 存放一个标志,用于表示接下来存在哪些域/字段,各字段逻辑或的结果: 0x0001存在总帧数(Frames)字段0x0002存在文件大小(Bytes)字段0x0004存在TOC字段0x0008存在音频质量指示字段0x0007 就表示下面存在: 总帧数 文件大小总字节数 TOC表 84总帧数(Frames),大端[可选]73448或124文件总大小,单位字节,大端[可选]450008,12,16100TOC表,大端[可选] 8或12, 16, 108, 112 ,1164音频质量指示,最差0,最好100,大端[可选]0
例 6.10. 待单元格合并的表格:namest,nameend,morerows 字符(存储)交换标准 字符编码标准存储(交换/传输)标准包含字符字符编码领域的叫法英文 ASCII ==ISO/IEC 646 ASCII欧洲多国的字符ISO 8859通用(的任何)字符UnicodeUTF-8UTF-16UTF-32简体中文 GB2312 ==GB2312-80 ==GB ==GB0 EUC-CNGBKGB18030繁体中文 BIG5 ==大五码 ==五大码 CCCIICNS-11643EUC-TW日文 JIS X 0208 == JIS C 6226和JIS X 0212 Shift JISISO-2022-JPEUC-JPJIS X 0213EUC-JISX0213韩文 KS X 1001 == KS C 5601 EUC-KR
6.5. 注释callout 例 6.11. programlisting的callout:programlistingco static struct platform_driver s3c2410_nand_driver = { .probe = s3c2410_nand_probe, .remove = s3c2410_nand_remove, .suspend = s3c24xx_nand_suspend, .resume = s3c24xx_nand_resume, .driver = { .name = "s3c2410-nand", .owner = THIS_MODULE, }, }; probe就是系统“探测”,就是前面解释的整个过程,这个过程中的多数步骤,都是和你自己的Nand Flash相关的,尤其是那些硬件初始化部分,是你必须要自己实现的。 remove,就是和probe对应的,“反初始化”相关的动作。主要是释放系统相关资源和关闭硬件的时钟等常见操作了。 suspend和resume,对于很多没用到电源管理的情况下,至少对于我们刚开始写基本的驱动的时候,可以不用关心,放个空函数即可。 对应的screenco,就是把programlistingco和programlisting换为screenco和screen即可 。 screenco举例如下: 例 6.12. screen的callout:screenco crosstool-ng-1.18.0 crosstool-ng-1.18.0_build src x-tools crosstool-ng-1.18.0.tar.bz2 crosstool-ng的源码包:,解压后的文件夹 包含了crosstool-ng的相关源码 专门为后期使用crosstool-ng去建立交叉编译器,的编译(build),而专门建立的文件夹 对应的,后续的ct-ng menuconfigct-ng build等命令,都是在此文件夹下执行的。 为crosstool-ng中,后续需要下载各种软件的源码包,而准备的, crosstool-ng中,在开始执行build之后,会去下载对应的源码包,都会存放到这个文件夹下 这个文件夹,是,用crosstool-ng所生成的交叉编译器,所在的路径。 对应的配置中,会有,类似于: (${HOME}/develop/crosstool-ng/x-tools/${CT_TARGET}) Prefix directory 的配置,用来指定生成的交叉编译器,存放在何处。 此时,就是去设置为此处对应的路径即可。 很明显,这个就是之前我在折腾crosstool-ng-1.18.0时,去下载的源码包了。 对应的上面的,就是此源码包解压后的路径。 对应的table中添加callout,就是在table的任意位置使用co,然后再table之外使用 calloutlist+callout即可。 下面这个例子,是自己摸索出来的,通过在任意位置使用co,然后别处直接可以使用coref 引用该co,且不一定需要对应的callout和calloutlist: 例 6.13. 没有callout的co实现在任意位置使用co然后在别处使用coref去引用 Evacuation procedures are implemented whenever the fire alarms have been activated. The following rules and policies are binding for every employee who works at the premises of M&M Software (Suzhou) GmbH 1-20单词的含义 序号英文单词中文含义说明注释evacuation疏散,撤离指失火了,要逃离的情况premises经营场所此处是公司地址,场所的意思
不过目前此种用法,有个小bug,那就是生成的HTML中鼠标虽可点击,但是无法跳转,不过 生成的PDF中是正常的支持鼠标点击co和coref互相跳转的。 6.6. 链接,引用 链接,使用link代替旧的ulink: 注意,是在顶层的chapter,sect1等中,定义对应xlink的域名的 例 6.14. 带xlink域名的link Python ...... crifan的Python库:crifanLib.py 之前在折腾BlogsToWordPress:将百度空间,网易163,新浪sina,QQ空间,人人网,CSDN,搜狐Sohu等博客搬家到WordPress 的过程中,先后遇到很多个问题,然后基本上也都自己解决了。对应的也写了相应的代码和函数。 ...... 引用,很简单,就是用xref而已: 例 6.15. xref引用 上述gif动画演示,只支持HTML在浏览器中的显示。其他格式输出中,比如PDF中,不支持此gif动画。所以下面再用文字解释一下大概流程:... 用文字简述就是: 用文字解释如何在Windows的cmd中运行Python脚本BlogsToWordpress.py ...... 6.7. 等式 例 6.16. 等式equation CBR播放时间(CBR Duration) CBR Duration = File Size(Byte) × 8 bit/Byte ÷ (Bitrate(K bit/s)× 1000 bit/Kbit ) CBR播放时间 = 文件大小(字节)× 8比特/字节 ÷(比特率 千比特/秒 ×1000 比特/千比特) 6.8. list列表系列 例 6.17. itemizedlist xx xx xx yy yy yy xxxxxx xxx xxx xxx xxxxxx yyy yyy yyy 例 6.18. 带emphasis的itemizedlist xxx xx xx xx yyy yy yy yy 例 6.19. 带指定编号类型的orderedlist 总的帧数:VBR中的总的帧的数目。 帧的采样个数:对于MP3(MPEG1,Layer III)来说,是固定的1152个采样。 帧的采样率:通过解析第一帧,即可得知帧采样率索引,查表,即可得此采样率。 6.9. 简单列表simplelist,literallayout 例 6.20. 简单列表simplelist MP3文件的内容组织结构 第二帧,格式如下: [ID3......]ID3 V2的头,大多数最新的MP3,都有这个头 [APE 头]用于APE格式的头,现在也用于MPEG ...... [TAG ......] 128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头
例 6.21. 简单列举literallayout Nand Flash第3个ID的含义 ...... DescriptionI/O7I/O6I/O5 I/O4I/O3 I/O2I/O1 I/O0Internal Chip Number1 2 4 8 0 0 0 1 1 0 1 1 ......
6.10. xinclude文件,xinclude文件中的其中一部分的内容 在主文件docbook_dev_note.xml中: 例 6.22. xinclude主文件中使用xinclude ...... Docbook开发手记 ...... ...... 然后被包含的文件中,是正常的xml文件。 比如preface.xml: 例 6.23. 被xinclude包含的子文件:preface.xml Docbook介绍 什么是Docbook ...... 比如ch01_build_env.xml: 例 6.24. 被xinclude包含的子文件:ch01_build_env.xml Windows下的Docbook的环境搭建 搭建Docbook之前需要知道的最基本的事情 ...... 6.11. filename:文件,文件夹,后缀名, 当去表示一个普通文件,文件夹,符号链接,分区,库文件,头文件,设备文件等等内容 时,可以用filename这个关键字。 关于filename的详细语法,可参考:docbook elelment: filename 例 6.25. filename是文件,文件夹的例子 此处,只是去修改对应的.build/src/linux-custom/scripts/unifdef.c,即可。 比如:我之前,除了,解压crosstool所得的文件夹crosstool-ng-1.18.0之外,去建立了一个对应的文件夹:crosstool-ng-1.18.0_build 同时,为了后续crosstool-ng下载对应的各个包,也建立了对应的srcx-tools两个文件夹。 例 6.26. 示例:filename是后缀名 提示:其中可以看到Notepad++自动帮你写好了.py后缀,那是因为你之前设置了Python语法高亮。 6.12. admonitions:note,caution,warning,tip和important Docbook中有个一系列的术语叫做admonitions,包含了note,caution,warning,tip和 important 6.12.1. note 例 6.27. note举例 如果没有安装java,请先安装java fop的运行,依赖于java运行环境。 如果你的windows中,还没有安装java,请先安装java运行环境(JRE=java runtime environment)。 关于java的基本知识和如何安装,不了解的请参考:Java java已经安装好前提下,另外记得确保JAVA_HOME环境变量已经正确设置好了。 比如,我的系统中的是: JAVA_HOME=D:\Program Files\Java\jre7 6.12.2. caution 例 6.28. caution举例 此处不要通过make时加LDFLAGS参数去添加-lintl和-lcurses 其实,上面贴出来的,修改makefile的办法,的确已经解决了此处的,缺少intl和缺少ncurses的库的两个问题了。 只是,后来,在另外一个Cygwin环境下去折腾同样的make编译crosstool-ng的时候: 【记录】Cygwin下配置编译和安装crosstool-ng 由于之前解决上面这个问题的时候: 【已解决】Cygwin 1.7.17下make编译crosstool-ng出错:zconf.tab.o:zconf.tab.c:(.text+0x162a): undefined reference to `_libintl_gettext' 用的解决办法是: 不去修改makefile,而直接给make加上LDFLAGS参数加上-lintl: make LDFLAGS="-lintl" 当时也是可以解决此问题的。 6.12.3. warning 6.12.4. tip 例 6.29. tip举例 如何设置windows环境变量 关于如何添加相应路径到windows的环境变量中,不熟悉的可以参考: Windows的环境变量 6.12.5. important 6.13. 一些inline元素:keycap,guibutton,keycombo 参考:Inline Docbook Elements 而看到,Docbook中有个一系列的术语叫做内嵌元素(inline elements),比如,keycap, guibutton,keycombo 这些元素,可以通过css配置而达到3D显示的效果: 6.13.1. keycap 例 6.30. keycap举例 PrtScn键可以截屏。 此处,就用上面的代码,加上合适的css去配置,在浏览器中打开编译输出的网页,就能看 到下面的这个PrtScn可以显示出3D的效果: 按PrtScn键可以截屏。 6.14. programlisting代码和screen屏幕输出 docbook中用于代码和屏幕输出等内容,对应的是programlisting和screen [提 XML中的实体和CDATA 示] 对于docbook中写programlisting和screen等方面的东西 会涉及到CDATA方面的事情,其和XML的中的实体有关。 对于XML的实体不了解的,可以去参考:XML中的实体引用 6.14.1. programlisting代码 6.14.1.1. 带CDATA的programinglist示例 例 6.31. 举例:带CDATA的programinglist scan_res = nand_scan_ident(&nmtd->mtd,(sets) ? sets->nr_chips : 1); if (nmtd->scan_res == 0) { s3c2410_nand_update_chip(info, nmtd); nand_scan_tail(&nmtd->mtd); s3c2410_nand_add_partition(info, nmtd, sets); } if (sets != NULL) sets++; } ]]> 上述,就是由于programlisting的内容中出现了&,<,>,才用括起来的。 6.14.1.2. 不带CDATA的programinglist示例 例 6.32. 举例:不带CDATA的programinglist for (setno = 0; setno < nr_sets; setno++, nmtd++) { pr_debug("initialising set %d (%p, info %p)\n", setno, nmtd, info); s3c2410_nand_init_chip(info, nmtd, sets); nmtd->scan_res = nand_scan_ident(&nmtd->mtd,(sets) ? sets->nr_chips : 1); if (nmtd->scan_res == 0) { s3c2410_nand_update_chip(info, nmtd); nand_scan_tail(&nmtd->mtd); s3c2410_nand_add_partition(info, nmtd, sets); } if (sets != NULL) sets++; } 上述,就是由于programlisting的内容中出现了:&,<,> 所以才分别用:&,<,>,去替换的。 6.14.2. screen屏幕输出 screen适合用于表现:对于软件开发等过程中,屏幕输出信息之类的内容 6.14.2.1. 带CDATA的屏幕输出screen 例 6.33. 举例:带CDATA的screen 查看单个的某个示例配置的核心参数,用: ]]> 上述,就是由于screen的内容中出现了<,>,才用括起来的。 6.14.2.2. 不带CDATA的屏幕输出screen 例 6.34. 举例:不带CDATA的screen 查看单个的某个示例配置的核心参数,用: ct-ng show-<sample> 上述,就是由于screen的内容中出现了:<,> 所以才分别用:<,>,去替换的。 6.15. 问题和回答 关于问题和解答,此处涉及到几个关键字: • qandaset • qandaentry • question • answer 下面直接列出相关示例代码: 例 6.35. 举例:问题和解答qanda相关的示例代码 ValidationException: Property ID xxx previously used javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Property ID "ref.ldr_syntax" (found on "fo:block") previously used; ID values must be unique within a document! (See position 1315:169) 很常见的问题,即源码中,某个id的值,和之前的重复了。 常出现于,从别处拷贝了某段代码,然后修改完毕后,残留部分内容,导致其中有重复的id 解决办法:将重复的id删除或者改名 ValidationException: xxx is not a valid child of xxx javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}list-item" is not a valid child of "fo:block"! (See position 345:1605) 错误的根本原因是:非正确地使用了某个标签。 比如某个元素不是另一个元素的子元素,但却由于不熟悉,而误用了。 但是具体的表现形式,那可能是多种多样的。 下面就简单列举一下,我所遇到过的错误的例子: 在callout中使用了qandaentry 结果导致此错误。然后去官网查了下:qandaentry,才得知,qandaentry的父标签,只包含三种:answer, qandadiv, qandaset。所以,此处在callout中使用qandaentry,肯定会出错了。 解决办法:不使用该标签,或者换一个合法的位置使用该标签。 在part下,title和chapter之间,使用了para 结果导致报错: org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! 后来是删除了para,才去掉此错误的。 详情参考:【已解决】org.apache.fop.apps.FOPException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}block" is not a valid child of "fo:root"! 第 7 章 Docbook相关的知识和概念 目录 7.1. 输出类型:html和打印输出print out 7.2. docbook中的条件编译:profiling 7.3. 关于docbook中的图片方面的内容 7.4. docbook的一些变体 7.4.1. 简化版的docbook 7.4.2. docbook(制作)幻灯片 7.4.3. docbook(制作)网站 摘要 7.1. 输出类型:html和打印输出print out 在将docbook的xml源码,转换输出为其他格式的时候,最常见的两大类是:HTML和fo 然后基于html,有多种对应的可选的输出类型,比如单个html,多个html,htmlhelp(即 chm),webhelp等等。 而基于fo,则可以再转换为其他的格式,比如pdf,ps等等。 此处,在docbook中,html和fo,则分别对应着:html和print out打印输出,算是两种不 同的输出类型。 7.2. docbook中的条件编译:profiling Docbook中有个类似于一般编程中的条件编译的东西,叫做: Profiling 即,你在xml源码中,加上一些参数,然后在输出生成HTML或FO的时候,会根据你所设置的 条件,去执行相应的动作。 比如: 例 7.1. 添加role参数实现条件编译
Nand Flash数据读取操作的时序图
然后编译的时候,就会根据你所输出的是HTML,就调用上面的那个fileref中scalefit="0" 的配置,而生成FO的时候,fileref的配置中的,就使用scalefit="1"了。 7.3. 关于docbook中的图片方面的内容 一般常见模式是,在xml源码同路径下,存在一个images文件夹,然后把自己文章相关的图 片放进去。 此类图片的地址,在xml中都是很简单的images/xxx.jpg之类的。 另一些图片,就是和docbook系统相关的了,其随着docbook的xsl文件一同发布的,在 docbook-xsl-ns-1.76.1\images中可以找到。 共分好几类,包括: 1. callout 1,2,。。。,30 2. admon caution,important,note,tip,warning 3. navi home,prev,next,up 基本上,每种类型,都有对应的矢量的svg图片,和普通的bitmap类型的gif/jpg/png图片 。 7.4. docbook的一些变体 7.4.1. 简化版的docbook 首先我们要知道的是,对于docbook本身,这个规范 其包含了很多元素,比如book,title,para,sect1,sect2,等等等等, 参考:Writing Documentation Using DocBook 一共有超过400个元素(还不包括元素的各种属性) 而后来,由于大家在实际使用中,发现貌似完整版的docbook,有点太复杂了。 而很多时候,比如只将docbook用于写个article,技术手册(white paper)等等情况时,只 需要用到其中部分的元素,就够用了。 所以,后来就又弄出一个docbook的简化版:Simplified DocBook 简化版的docbook,只包含了大约119个元素(还有其他相关的555多个实体,29个符号) 很明显,相对于400多个元素的,完整版的docbook,还是要简化不少。 注意,此处的简化版的docbook,并非官网标准,而是所谓的community project,即由 docbook社区发起的,逐渐丰富和制定出的一个标准。 简化版的docbook的主页: Simplified DocBook DTD 相关页面: Simplified DocBook Home Simplified DocBook 7.4.2. docbook(制作)幻灯片 类似于上面的简化版的docbook,这个docbook slides,也是个社区标准,而非官方标准。 其中,最新版本的docbook-xsl-ns中,可以找到对应的样式表stylesheet,比如: docbook-xsl-ns-1.78.1/slides 相关页面: DocBook “Slides” 7.4.3. docbook(制作)网站 类似于上面的简化版的docbook,这个docbook websites,也是个社区标准,而非官方标准 。 其中,最新版本的docbook-xsl-ns中,可以找到对应的样式表stylesheet,比如: docbook-xsl-ns-1.78.1/website 相关页面: DocBook “Website” 附录 A. 已通过Docbook发布的资料 目录 A.1. 基础知识相关 A.2. 嵌入式相关 A.3. 上层软件相关 A.4. 其他 A.1. 基础知识相关 1. 字符编码详解 2. 软件开发基础知识 3. 各种计算机语言简介和总结 4. JSON详解 5. 正则表达式学习心得 6. 计算机编程语言基础知识 7. 详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等) A.2. 嵌入式相关 1. 【详解】如何编写Linux下Nand Flash驱动 2. Uboot中start.S源码的指令级的详尽解析 3. MPEG简介 + 如何计算CBR和VBR的MP3的播放时间 4. Linux MTD下获取Nand flash各个参数的过程的详细解析 5. 如何在Linux下写无线网卡的驱动 6. 【详解】嵌入式开发中固件的烧录方式 7. 在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs) 8. GNU Binutils详解 9. 交叉编译详解 10. crosstool-ng详解 11. USB基础知识概论 12. 如何实现Linux下的U盘(USB Mass Storage)驱动 13. USB HID Learning Record 14. 详解ARM的AMBA设备中的DMA设备PL08X的Linux驱动 15. 硬件电路基础知识 16. ARM与MIPS的详细对比 17. 【详解】中断相关的知识 18. 现场总线Field Bus简析 19. Code 128 Symbology Introduction 20. GS1-128条形码和相关的AI及FNC1的详解 21. Plessey & MSI Symbology Introduction 22. UPC/UPC-A/UPC-E & EAN Barcode Symbology A.3. 上层软件相关 1. Docbook开发手记 2. 建设网站详细教程 3. 网站搬家详解 4. 详解crifan的C#库:crifanLib.cs 5. C#学习心得 6. Python语言总结 7. python初级教程:入门详解 8. python中级教程:开发总结 9. Python专题教程:字符串和字符编码 10. Python专题教程:抓取网站,模拟登陆,抓取动态网页 A.4. 其他 1. crifan推荐软件 2. 【crifan推荐】轻量级文本编辑器,Notepad最佳替代品:Notepad++ 3. 英语学习笔记 4. 买房详细教程 5. 电脑基础知识教程 6. 虚拟机教程 7. VirtualBox教程 8. VMWare教程 参考书目 [1] 理解docbook [2] XML中的实体引用 [3] DTD vs XML Schema [4] xml的命名空间namespace [5] XML Entity Declarations for Characters [6] RELAX NG - XML syntax [7] 一个简单的Docbook 5.0例子 [8] 在Windows上安装配置Apache FOP [9] DocBook 5 differences [10] Profiling [11] Graphics [12] Using XIncludes with DocBook 5 [13] Selecting part of a file [14] qandaset [15] docbook elelment: filename [16] Cygwin [17] Notepad++的多种编码支持 [18] 【已解决】给Docbook生成的静态HTML页面添加统计访问次数的代码 [19] 【记录】将docbook的xsl-ns从当前的docbook-xsl-ns-1.77.1升级到 docbook-xsl-ns-1.78.1 [20] 【整理】制作pdf文件后,保持原先word文档中的页内链接和超链接+常见pdf打印机 安装使用方法简介 [21] 【终极解决】fop错误:Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/xmlgraphics/image/loader/ImageContext 的终极解决办法,即cygpath有bug,转换路径出错,导致部分路径被截断