欢迎访问华乐美文网

DocBook 文件写作入门 (2000字)

写作基础2018-08-09 03:21书业网

DocBook 文件写作入门

作者. 老贡生

Edited by

总编. 老贡生

台湾企鹅宝宝工作队

Revision History

Revision 1.2

第一次正式公开发布

Revision 1.1.1.1.2.1

第一次草稿 2004/01/01 09:25:51 2004/01/01 15:10:15

这是一本帮助以前没接触过 DocBook 格式文件的新手,一个基础导览的技术小手册。本手册并未包含所有 DocBook 标签,及其详细解说。本手册只挑选 DocBook DTD 定义中最常为使用者利用的标签做最基础的解说,尤其会和 HTML 的相类似格式数据做比对。所以不应该希望本手册为你解答所有 DocBook 的疑惑,这只是一个垫脚石和敲门砖,帮助你更快的向 DocBook 的殿堂迈进。

本文采用 GNU 组织的 GPL公开版权宣告,欢迎复制,改写,散布,并要求你应该以同样的权利条款,授予文件的使用人。对 GPL 的进一步的解释,请参考GNU 通用公共许可证。

我的感谢

首先我要感谢 James Clark 先生,没有他,我们就缺少了一个执行 DocBook 文件解析转译的自动执行工具。他的 OpenJade 工具组,是一切 SGML 文件处理的心脏和引擎。由于他的慷慨,使得我们不必花一毛钱,就能拥有商业软件同样的服务和效能。

我们也要感谢 Norman Walsh 先生,要不是他耗费心力制作 docbook-dsssl 转换输出样式表,DocBook 将只是又一个意义分类结构标记语言的实验,一种理论性的教材而已。有了配套的 DSSSL 样式表,DocBook 才能转换成 text,rtf,ps,html 各种文件,真正达成一次输入,多种输出,各种格式文件交换中介的有力工具。 Norman Walsh 先生不只提供 DocBook-DSSSL ,他本身也是 OASIS DocBook 委员会的主要成员。藉由早期的 Davenport 讨论组,到现在 DocBook Committees 参与成员的不断努力,所谓分类意义的结构化文件格式的使用,已经不再只是个目标而已,它已经开始在我们的电子文件处理中日渐担负起重要的使命。 最后,照惯例,要感谢我已七六高龄的老母亲,要不是他打理我生活的一切,我一定连三餐都成问题,还提什么奉献呢?我知道这世间就算没了我们母子,一样阳光灿烂,生气蓬勃,但至少这篇文章是不会问世了。所以如果你觉得从这篇文章多少得到益处,请和我一样,多少感谢我娘及自己的娘一些。 Table of Contents

导论

1. DocBook 是什么

2. DocBook 的源流

3. 开始写作前的准备工作

4. DocBook 编写的注意事项

1. 基础标签的运用

1.1. 无用之用

1.2. 文件型态宣告

1.3. 根标签

1.4. 常用的根标签介绍

1.5. DocBook 最基本的文件结构 -- Sect

1.6. 基本的根卷标结构

1.7. 条列资料表示法

1.8. 表格数据表示法

1.9. 外部其它媒体格式档案表示法

1.10. 书签与联结的表示法

1.11. 其它区块资料的表示法

1.12. 字符串强调表示法

1.13. 其它标签使用方法

2. 特殊数据格式的卷标

2.1. 出版讯息表示法

2.2. 作者序言表示法

2.3. 目录索引表示法

2.4. 词汇解释表示法

2.5. 参考书目表示法

2.6. 问题解答集表示法

2.7. 结语

A. 附录

A.1. 如何查询卷标的组织结构

参考数据

DocBook 参考字典

List of Tables

1. DocBook 文件运作流程表

1-1. mediaobject 主要组成列表

1-2. 特殊意义的区块标签

1-3. DocBook 特殊字符表

A-1. 单纯卷标次序规则叙述表

A-2. 综合卷标次序规则叙述表

List of Figures

1-1. DocBook DTD 文件组成结构图

List of Examples

1-1. SGML 的备注表示法

1-2. SGML 的文件型态宣告

1-3. XML 的文件型态宣告

1-4. sect 的基本结构

1-5. sect 的层级结构

1-6. chapter 基本的层级结构

1-7. book 基本的层级结构

1-8. book 的 SGML 文件模型

1-9. book 的 XML 文件模型

1-10. HTML 的编号列示资料表示法

1-11. DocBook 的编号列示资料表示法

1-12. HTML 的两段条列式资料表示法

1-13. DocBook 的两段条列式资料表示法

1-14. DocBook 的简单列示资料表示法

1-15. DocBook 单一形式表格

1-16. DocBook 跨行列表格

1-17. DocBook 附加说明讯息表格

1-18. DocBook 的图形数据显示

1-19. DocBook 的外部多媒体数据显示

1-20. DocBook inline 标签的使用

1-21. HTML 的书签表示法

1-22. DocBook 的书签表示法(1)

1-23. DocBook 的书签表示法(2)

1-24. DocBook 的联结表示法

1-25. xref 与 link 输出结果比较

1-26. 郑愁予诗选

1-27. DocBook 脚注连结表示法

1-28. 引用资料表示法

1-29. 图解说明的表示法

1-30. 范例说明的表示法

1-31. tip 区块表示法

1-32. 字符串强调表示法

1-33. 字符串下标表示法

1-34. 字符串上标表示法

1-35. 版面格式表示法

1-36. 特殊字符除能表示法

2-1. Book 的特殊数据区段位置

2-2. bookinfo 出版讯息表示法

2-3. dedication 作者序言表示法

2-4. index 目录索引表示法

2-5. glossary 词汇解释表示法

2-6. bibliography 参考书目表示法

2-7. 问题解答集(qandaset)范例

导论

本手册希望协助一些还不熟悉 DocBook 文件格式的新手,学习基本的语法,并能快速而容易的开始触类旁通,把 DocBook 这种格式的组织方法,用到自己文件的开发上。当然,在你学习一项新事务前,总希望知道一些新东西特性,大概的用途,以及最重要的,学会了有何好处?所以我们一开始先来谈谈 DocBook 是什么?

1. DocBook 是什么

谈到 DocBook ,有人喜欢以标记语言出发,先解说一大堆 SGML 和 XML 的概念。另些人则着重在表形文件格式与表意文件格式的分别,强调所谓逻辑结构和意义分类在文件组织的重要性。这些都对,也都是组成 DocBook 的重要概念,但是这些概念本身比 DocBook 更难理解,结果是用一个不明白解释了另一个不明白。为了避免花了大半篇幅,还是让你一头雾水,我不企图让你明白什么叫标记语言的结构逻辑,也不一再举例表形和表意格式文件的差别,我只向大家说明一个重点,那就是 DocBook 文件能做怎样的利用,你能从 DocBook 的格式安排上得到什么样的好处。

1.1. 写一份学术著作

从望文生义来做最直接的了解,DocBook 的 Book 就是书,DocBook 的种种格式就是帮助你很方便的去写作一本书。而且这本书是指具有理论性,严谨性的学术著作,所以举凡目录,索引,参考书目,词汇解释,备注解释.....,乃至作者,出版商,书籍国际编码等等,举凡一本我们在书店买到很正式象样的书中所能找到的各种数据分类,DocBook 都做了相对应的格式规划。只要你按照 DocBook 规定填入各部份资料,透过翻译转换器及样式表的自动处理,还可以为你自动编辑版面和补充数据,而且你的书写得愈大愈多,你就会发觉 DocBook 帮你省下的编排功夫也愈多。

DocBook 并不是只适用大部头的书籍写作,单一主题的讨论文章,或是问题解答集也很合适。但基本上 DocBook 是为学术或技术性等论理文章设计的,而不是为诗词歌赋这种文艺文章设计的。

1.2. 一次输入多种输出

DocBook 格式文件的最大特色就是没有可阅读的版面样式,这并不是说 DocBook 文件无法阅览,刚好相反,任何一个能处理纯文字的编辑器和浏览器都能开启 DocBook 格式文件。问题是那只是字符一个挨着一个,你完全看不出来那个字符串该使用什么字体字型,要多大多小,要置左置右置中,那个要缩排,那个要凸排,那个要单独另成一段,那个要折行,又那个要紧跟前面,不分段落。凡此种种,你常在各种排版软件上使用的版面设定和功能,在 DocBook 里一样也找不到。

DocBook 做为一个标记文件,一样有标记设定,以及将文章加以分类的方法。不过他是将文章分为章,节,段,落,作者,出版商...等等,至于作者,出版商,章,节,标题等该用什么字型字体,成个什么段落,在 DocBook 格式定义里完全没有这些讯息。DocBook 把这些设定留给样式表去规定[1]。所以只要样式表一变,DocBook 最终转换输出的结果就会改变,而完全不需改动到原有的 DocBook 文件内容。利用标记语言中数据文件本体与输出样式表分开的概念,我们只要按 DocBook 格式规定,输入一次数据,就可以利用样式表的设定及改换,可以转换输出成 HTML,RTF,PS,MAN...等等其它阅览格式的文件,并且可以设定个人或组织专属的特殊风格,这就是所谓的一次输入,多种输出。

1.3. 建立可搜寻的文字库

DocBook 另一个被称颂的功能就是他的分类细腻而周延,结构完整,并且有搜寻次序上的意义。由于这些特性,凡遵照 DocBook 格式规定制作出来的文件,有如一个数据库一般,有完整的纪录次序,字段分隔,可供条件查询及检索。所以不只把 DocBook 文件转换成其它格式文件,是有效的利用,就是把 DocBook 原始文件放在网络上供查询检索,也比任何其它的排版格式文件更为适合。

1.4. 共同文件写作

DocBook 是非常靠近 SGML 原始型态及功能的格式文件,透过对 SGML 中模块化的文件型态定义,条件编译选项,外部插入档案等等功能的继承,使得 DocBook 非常适合担任团体共同写作文件的重任。经由根文件的适当设定,每个写作团队成员都可以分头独立写作部份文件,最后再透过 DocBook 的自动编排功能,把独立的部份文件串成一个整体文件,宛如一个人写作一般。

由于这个共同写作的强大功能,在 Unix 系统下许多软件开发项目团队,都渐渐采用 DocBook 作为他们共同写作的解决方法,最有名的例证就是 Linux 的 HOWTO 文件的组织整理,已经将 DocBook 做为推荐的标准写作格式。[2]

2. DocBook 的源流

寻找一个共通的,可以在不同的工作平台及操作系统中,在不同的排版软件中,交换彼此数据的文件格式,一直是许多机关组织,工作团队,在制作流通文件上的基本需求。尤其在 Unix 的 Open source 软件开发团队运作上,更是不停的在寻求更理想的运作模式。这其中尤以 The Linux Document Project[3] 这个项目计划最具指标意义,因为 TLDP 汇集了 Linux 操作系统下各个层面的软件使用者及发展者,所以 TLDP 网站采用的文件格式,几乎就可以说是 Linux 小区的标准数据格式了。所以,现在我们就来看看 TLDP 文件格式的演化过程。

2.1. HTML

作为 Wild World Web 的一分子,大概主要的显示文件都是 HTML 文件吧。在所谓意义分类的结构文件概念尚不发达,来源数据与版面显示分开处理的技术尚未开展时,HTML 格式,既是资料来源的组成,也是最终的显示样式,一肩挑起所有的大梁。

2.2. LinuxDoc

HTML 虽然在网络数据的交换显示上,有其不可忽视的贡献,但却有他另一面不足的地方。第一:HTML 只适合在网页浏览器中显示,如果要把他打印,或用别的排版软件开启,显示的结果都会格格不入,无法配合。这时同样的内容,换种利用方式,就要对文件做重新编排,导致编辑时间浪费及版本混乱。

其次 HTML 并不会对文件内容加以归类,他的标记只是表明那个字符串或区段该如何排列显示而已,并不会有任何指示,告诉你那一段文字,他代表了什么意义。这对网络数据的搜寻与统整毫无任何帮助,他无法达成一份文件,既能显示,又方便检索查询的数据库功能。

为了寻求更符合需求的文件格式,大家不约而同的都寻求 SGML 这个标记语言的帮忙[4]。首先是 Tom Gordon 利用 SGML 语法制定了一个 QWERTZ DTD ,目的是为了方便输入数据,然后自动化产生 LaTex 排版格式文件。

接着是 Matt Welsh,他觉得 QWERTZ DTD 既可以将一般文字转换成 Latex 格式文件,那同样的原理,应该也可以产生其它种格式文件。正巧他的工作,需要大量产生各种不同格式的文件,例如像plain text, html, and PS 等等,因此他修正了一下 QWERTZ DTD,作为他 Linuxdoc-SGML document processing system(Linux SGML 格式文件处理系统) 的核心部份。由于 Linuxdoc 格式的产生,确实能解决一次输入,多种输出的功能,以及将文件做良好有意义的分类,以方便检索的功能,因此被 TLDP 采用为交换文件标准。从此所谓的 Linux SGML 文件变成 Linux 系统中,非打印显示,而是以意义分类为标记的格式文件统称[5],而 Linuxdoc 格式就是第一代的 Linux SGML 文件。

2.3. DocBook

TLDP 所属的不少人曾用 Linuxdoc 格式写作 HOWTO 文件,但 Linuxdoc 本身的发展演进却不令人满意。在 Matt Welsh 继续发展了几年没有很好的成效后,Cees de Groot 用 perl 这套程序重新改写了 Linuxdoc 系统,改名为 SGML-tools ,但 DTD 仍用的是 Linuxdoc 的标准。最后 SGML-tools 又被用 python 程序语言全新改写了一次,但这次,Linuxdoc 却让出了龙头宝座,而把文件制作的格式标准,让给了另一个由 SGML 语言定义出来的 DocBook 格式文件。

DocBook 并非由 Linuxdoc 衍生出来的,它有它自己的故事。早在 1991 年 HaL Computer Systems 和 O'Reilly & Associates 这两个组织为了达成 Unix 操作系统下 groff 文件系统转换问题,特别用 SGML 设计了 DocBook V1.1 这个格式文件。

在 DocBook V1.1 推出的同时,O'Reilly 开辟了一个讨论园地,称为 Davenport 讨论组。参与 Davenport 讨论的成员非常投入,贡献良多,因此到了 1994 年他们得到正式的授权,成为 DocBook 格式标准的正式维护组织,并同时推出 DocBook V1.2.2。

DocBook 交到 Davenport 手上后,快速的成长蓬勃,不只包含的企图与收纳更多,并且摆脱 groff 工具的限制,直接使用 sgml 解译器程序来处理文件转换,并尝试直接做打印格式输出。这时期 Novell 和 Sun 两大信息公司对 DocBook 风格的形成,有很大的影响。

到了 1997 年 1 月,Davenport 推出 V3.0 后的不久,一些 Davenport 的主要发展者开始讨论怎样把 DocBook 格式文件从原来的 SGML 标记语言推展到 XML 标记语言,从而能在 DocBook 中使用 XML 发展蓬勃的应用工具软件。它们取得了一些进展,但在 Davenport 时期,并未完成这件工作。

1998 年 7 月,在 Davenport 原有的赞助者结束赞助的情况下,由绿洲组织(OASIS)接手 DocBook 发展计划,成立了 The DocBook Technical Committee 组织负责推展及研发 DocBook 。目前 DocBook 已推出 V4.2 ,并且完成了 XML 的格式定义档案,变成可选择由 SGML 或 XML 两种转译方式的处理。DocBook Technical Committee 的发展人员正着手规画推出 DocBook 5.0 ,正逐步健全发展,也成为 KDE,Gnome 以及 TLDP 等数十个公私组织的标准文件交换格式,势必在将来日增其影响力,成为普遍的文件标准。

3. 开始写作前的准备工作

如果 DocBook 格式文件已经挑起你的兴趣,而你以前又从未制作过 DocBook 格式文件,那么可以考虑跟随着本手册的章节,从最基本的开始。虽然 DocBook 文件唯一需要的工具只是一个简单的文字编辑器即可,Unix OS 下的 vi ,MS Windows 下的 notepad 都可胜任愉快。但能够边编写边解析转换,校正标签使用的合法性及观视阅览格式输出的结果,都是你在学习制作 DocBook 文件时不可或缺的。所以一些解析转换 DocBook ,及检视输出结果的工具,也是我们在制作 DocBook 文件前要先准备好的。先了解一下 DocBook 文件运作流程,有助于我们了解要做那些准备工作。

Table 1. DocBook 文件运作流程表

由上表可知,学习 DocBook 文件编写的必要工具是:

1. 纯文字编辑器

2. DocBook 的 DTD 文件模块

3. DocBook 的 DSSSL 文件模块

4. SGML 的 解析器 OpenSp

5. SGML 的 转译器 OpenJade

6. 输出格式文件的浏览器

如本手册前面所言,文字编辑器任何一个都可以,系统中现有的,习惯使用的即可。

DTD,DSSSL,OpenSp,OpenJade 等工具的安装及设定,在 Linux 系统下,可以使用 docbook-utils or sgml-tools 套件,或者你也可以参考本人的另一篇译文 DocBook XML/SGML Processing Using OpenJade 从原码来自己编译建立 DocBook 的转译输出系统。至于输出格式的浏览器,本手册的输出是采用 HTML 格式,所以不管你使用 IE,Netscape or Mozilla ,都是很适合的浏览器。

4. DocBook 编写的注意事项

4.1. 标记语法的规则

DocBook 使用的标记语法和 SGML 默认值相同,如果你会使用 HTML or XML 的标记语法,那么可以说也就会了 DocBook 标记语法。但如果你不曾接触过 SGML 的标记语法,不妨看看下面标记语法的简短介绍。

要在文件中加入分类标签,一定要有些字符负责当作分隔字符,把卷标数据和文件原始内容分开。SGML 是以 '<' 字符当作标签开始字符,把 '>' 当标签的结束字符,所以一个数据内容的开始卷标,它的语法是 <卷标名称 属性名称A="属性值" 属性名称B="属性值" ...> ,< 和 > 字符之间是标记数据。

至于一个数据内容的结束卷标就比较简单,他的语法是 </卷标名称>,分隔字符和开始卷标完全相同,卷标名称前要有 '/' 前置字符,至于属性值字符串,结束卷标是不需要属性设定的。

最后开始卷标字符串和结束卷标字符串间包夹的就是文件的分类数据内容了,譬如:

<email id="mymail">abc@def.idv.tw</email>

<email id="mymail"> : 开始标签

email : 标签名称

id="mymail" : 卷标属性设定

ibc@def.idv.tw : 数据内容

</email> : 结束标签

标记语言对卷标的格式有严格的要求,除了分隔字符,卷标名称,属性名称不能有丝毫错误外,尤其是 XML 语法定义的 DocBook 格式,不可任意简省结束标签,或采取像

<email id="mymail"/abc@def.idv.tw/

这样的简省叙述。请一定照规矩打足开始卷标与结束卷标,空卷标没有结束卷标,所以他的开始标签结尾要加 '/' 字符,如 <xref linkend="address" />。

4.2. 特殊字符的表示法

如同前一小节叙述,'<' 和 '>' 字符被 DocBook 拿来当作标签分隔字符用,那万一我们要显示 '<' 和 '>' 字符符号,而不是要他发挥分隔字符串功能的时候该怎么办呢?这时就要有个 '<' 和 '>' 字符的代名来表示要显示他们原来字符的意思。'<' 的代名是 lt(little) ,'>' 的代名是 gt(great) 。使用代名时要在代名前加个 '&' 字符当前置字,';' 当收尾字。< 表示 lt 这里不是代表 "lt" 字符串,而是表示 '<' 字符显示的意思。

这里为了特殊字符表示把 '&' 字符借去当前置字,那么 '&' 字符本身也成了特殊字符,所以也有个 '&' 的代名是 amp ,表示式是 & 。

DocBook 特殊字符列表请参考后面章节的 DocBook 特殊字符表> 。

4.3. 放弃版面编排的习惯

百分之九十以上的人在制作文件时,都会考虑到版面编排的问题,因为重视文件阅览的感受和效果,被认为是一个文件撰写人应当负起的责任。但这在 DocBook 文件撰写时,却是你应该极力屏除的心理障碍,理由如下:

不管是 XML 或 SGML 标记语言定义的格式文件,都是忽略格式字符处理的,所以不管你在一行文字前塞入多少空白,在行与行间按下多少个分段按键,DocBook 一概忽略不理,所以就算你费尽心力去排,也是枉然,对 DocBook 来说,只有标签的改变才是有意义的。

DocBook 的功能就是要将数据塞到各种显示格式文件里,唯有他毫无任何固定格式,才能随时被捏塑成各种格式。任何单一的版面考虑,不管是对 HTML,RTF or Tex/Latex ,当他换成另一种显示时,原来的版面设定肯定会成为捣蛋鬼和麻烦的来源。所以 DocBook 文件本身不该包含版面设定数据,决定输出成什么样子,应该留给样式表来决定。在 XML 中是 XSL 和 XSLT ,在 SGML 中是 DSSSL 。

在 DocBook 中重视的是大量文件的自动编排转换,和统一风格的建立,单一文档版式细部的修整设定,不是 DocBook 所擅长的。

我们常在 DocBook 文件中,把子标签前多塞几个空格,好表示他是父标签的下一个层级。这纯粹是方便文件撰写者检视文件语法用的,与输出格式完全无关,一个标签是否是另一个卷标的子卷标,端看他是否处在别人的开始卷标与结束卷标中,与他是否缩排或凸排完全无关。

4.4. 其它注意事项

本手册以 SGML-DTD-V4.2 为标准,所以你至少需下载 DocBook sgml-dtd-4.2 DTD 模块文件。

本手册只触及 DocBook 所有标签的一小部份而已,如果有任何疑问或怀疑,请以 DocBook: The Definitive Guide 记载为准。

本手册的各范例希望你都能试作一遍,并把他们转换成 HTML 文件,在网页浏览器上观视。这样做有两个好处;一:校正自己的语法错误(我使用 DocBook 到如今,没有一次不用错语法的。)二:知道 DocBook 这样安排的意义所在。

留心转译器所显示的错误讯息,像:

jade:preface.sgml:134:112:E: end tag for element "LISTITEM" which is not open

jade:docwrite.sgml:33:12:E: end tag for "APPENDIX" which is not finished

它会告诉你原因及详细的错误所在,别偷懒,一一去改正你文件中的错误。

Chapter 1. 基础标签的运用

本章将介绍 DocBook 格式文件写作时,最基本而且常用的标记名称及使用方法 。尤其是把重点放在与 HTML 相对应功能的标记上,希望你学会这些标记后,至少能做到把 DocBook 文件数据,转换成 HTML 网页,供人网络阅览无碍。至于其它比 HTML 更进一步的功能,我们在制做其它文件常用的,将会分别以专章讨论。至于一些十分细碎的,特殊用途的标记,则不是本手册能包含的内容,请到 DocBook 官方网站 查询官方版的在线手册。

1.1. 无用之用

在介绍任何其它有分类意义的标签前,先要介绍这个不代表任何分类意义,也对文件内容或输出格式无任何影响的卷标,就是备注卷标。不管 HTML,DocBook or XML ,他们的备注标签格式都一样,以 "<!--" 字符串开头,以 "-->" 字符串结尾的一个空标签,凡在 "<!--" 和 "-->" 间包夹的所有字符字符串都被忽略,一律不予处理,这是 SGML 标记语言的预设备注表示法。

Example 1-1. SGML 的备注表示法

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN">

<book> <!-- 这是根卷标的开始标记 -->

...... <!-- 这是文件数据的数据内容 -->

</book> <!-- 这是根卷标的结束标记 -->

<!-- 所有的文件内容叙述,都必须被包夹在根标签的开始

标记与结束标记之间。 -->

上例可知,"<!--" 和 "-->" 间的所有文字叙述,都只是对本文的附加说明而已,使用与不使用都对该文件没有影响[6],本手册一开始就介绍这标签的目的是,后面很多的解释段落要用到他,你及早知道这样表示法的含意,才不会不知所云。

1.2. 文件型态宣告

不管是 SGML 或 XML ,除了批注之外,开头的第一或第二个标记,一定是用一个文件型态宣告的标记,来标明整份 SGML 文件,是遵守那种 DTD 格式规范所制作的。他的目的是通知负责处理此份文件的软件程序,使用适合的 DTD 规定,来解译和处理。这是一切 SGML 文件制作法则的依据,也是 DocBook 在完成以后,能够顺利转换成别种显示格式文件的根本,虽然他不是文件要显示的内容,却是决定并掌管了整份文件的规则,所以必须清楚明确而不可少。

Example 1-2. SGML 的文件型态宣告

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.2//EN">

注1 注2 注3 注4

注1, 文件型态表示词

'!' 字符加上大写 "DOCTYPE" 字符串,表示这个卷标作为宣告文件型态之用。

注2, 根标签名称

指定本文件要用那个 DocBook DTD 定义的卷标当根卷标。原则上 DocBook 并未严格指定限用那些卷标做根卷标,所以不只 book ,像 article,chapter,grossary.appendix 都可以当根标签。但很重要的一点就是,根标签是一份文件最上层的标签,不可以有比他更高层的标签出现在文件中,所以一旦你选定了根标签,也同时决定了这份文件能使用那些类别的子卷标和阶层结构。这点是和 HTML 大不相同的,HTML 的根标签永远是 <html>,能使用的卷标名称和结构也永远不变,但 DocBook 的文件的风格,会跟着根标签的不同而改变。

注3, 公共识别表示词

大写 "PUBLIC" 字符串是表示它后面跟了个公共标识符串,又称作 PUBLIC IDENTIFIER 。

DocBook 有个庞大的 DTD 定义,通常都不会直接和本文写在一起,而采外部文件形式,把 DTD 叙述储存成单独的档案,在解译转译 DocBook 文件时,再由解译器加载外部 DTD 档案,以分析 DocBook 文件。那为何不直接写 DTD 的档案路径名称就好,而要拐弯抹角,搞个又臭又长的 public ID 字符串呢?这是因为 DocBook 是一个供不同平台交换数据讯息用的文件。当一份文件由作者的主机传到阅览者主机上时,怎能保证彼此的 DTD 定义文件路径会一样呢?所以为了避免因阅览者与文件作者主机系统配置不同而指定错误,就用 public ID 的办法。经由

DocBook 使用者在自己机器上放置一份对照表,纪录各 public ID 的 DTD 相对应档案路径,就不必耽心因为彼此 DTD 档案放置路径的不同,而无法成功转译。

注4, 公共标识符串

任何一个格式标准的发布者,都应该设定其与众不同,独一无二的标识符串,来公布周知。如果在文件开头看到这个标识符串,就表示此文件使用该发布者制定的格式,应该依据发布者规定的方式处理。这个标识符串的组成可翻阅参考字典的 Public Identifier,查看标准的组成方式。但纵使不依据此规则,仍无损其效力,因为标识符串的关键是独特与唯一。而 DocBook 的每一版本都有其唯一的公共标识符串,你必须完全照抄,不能任意增减,所以写作前请先参考相关 DTD 下载群组的 catlog or docbook.cat ,看看他要求的标识符串是怎么下的,然后复制贴上,成为你 DocBook 文件的第一行。

Example 1-3. XML 的文件型态宣告

<?xml version='1.0'?>

<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"

"http://docbook.org/xml/4.1.2/docbookx.dtd">

XML 文件表示标签:W3 组织制定 XML 标准时的规定,凡使用 XML 标记语法的文件,开头第一行要做这样的表示。如果你是采用 SGML ,当然就不能加这个。

除了public ID 加上 XML 字样外,其它完全和 SGML 的 DOCTYPE 标签用法一样。

SYSTEM ID 路径字符串:这也是只有 XML 才有的要求,通常是指向外部 DTD 规格文件的所在路径。由于 XML 标榜的是网络运作交换,所以通常这里都是 DTD 文件的 URL 地址。不管是 SGML 还是 XML ,当设定产生竞合冲突时,文件设定高于系统设定,所以解译器在处理时,是会跨过系统指定的 DTD ,而到网络上去找指定的 DTD 檔。但这也同时容易在网络地址错误或更动时,引起找不到 DTD 档的错误而导致解译转换失败,所以 SGML 和 XML 文件宣告方式的差异,可说各有利弊。

1.3. 根标签

根标签表示一个文件的定义宣告区段结束,文件分类编辑区正式开始。除此之外,根卷标有下列规则必须遵守:

根标签的法则

1. 任何一份 DocBook 文件都不能缺少根标签。

2. 根卷标的起始卷标必须紧接着定义宣告区段,作为本文的第一个标签,而他的结束标签必须在结

尾的最后一个,包含着整个本文的其它卷标及文字区段。

3. 根卷标必须与 DOCTYPE 宣告的根标签名称一致。

4. 根标签不得包含在 DTD 定义中的上层结构卷标,也就是一份文件只可以出现及使用根卷标的子

卷标。

5. 根标签在同一份文件上只可以出现一次,不得出现两次以上。这包括根卷标内含根卷标的阶层结

构,或两者前后排列的平行结构。

6. 空卷标不得作为根卷标。

1.4. 常用的根标签介绍

就如前面章节所言,DocBook 并不限制根标签要用那个。但依据一般我们日常的使用习惯,也考虑到最后输出格式的样式表是否支持,还是有些比较标准化的根标签可供依循。一般比较常用的根标签有:

book, 书籍, 手册

这并无一定大小的区别,与一般我们对书籍观念类似,集合几个章节,谈些相关但分门别类的主题。

chapter, 章

虽然 chapter 本身在 DocBook DTD 定义中是 book 的子标签,但一般也常拿他当讨论某个单一主题文件的根卷标。导致和下面要讲的 article 标签,反而有异曲同工的感觉。

article, 主题文章

这是一个和 chapter 平行的标签,在使用习惯上,article 比 chapter 更常被用来当根标签,他代表单一主题的单一文章,与动用数个 chapter 去描述一个主题的使用习惯不同,所以在 Linux Document Project 上的 HOWTO 文章,用得最多的根标签就是 article。

这纯粹是种使用习惯,而非 DocBook 的 DTD 限制,没人规定你不可以用数个 article 来

谈单一主题,以及只用一个 chapter 谈一个主题。

当然 DocBook 不只这几个上层卷标而已,如 set 卷标,相当于丛书,是 book 的上层标签,而介于 book 和 chapter 之间还有个 part ,就好像我们说书的上篇下篇一样。此外像 preface (序言,导论) , appendix (附录),其实把他们看成第一个 chapter 及最后一个 chapter ,并没什么分别。所以熟悉

book,chapter,article 结构,就同理可推了。

此外 DocBook 也提供了一些非一般章节的,特殊格式的卷标组可以当根卷标,也可以内涵于 book 当子标签,譬如:

index: 目录索引

bibliography: 参考书目

glossary: 词汇解释

qandaset: 问答集(Q & A)

这些都是比较复杂的书籍会有的文件结构,由于他们不同于一般章节的内容,所以我们将另辟一章来讲解如何制作这些特殊格式标签组。至于本章,我们将着重在 DocBook 最基本的结构 book,chapter,article ,以及如何使用 DocBook 标签,做出类似 HTML 表现方式的结构出来。

1.5. DocBook 最基本的文件结构 -- Sect

在进入 book,chapter,article 这三种最常用根卷标附属结构的讨论前,我们先来谈谈这三个根标签共同拥有,也是 DocBook 格式文件最常被使用的子结构,sect。

sect 是 section 的缩写,通常我们中译成段落。在 DocBook 中他的基本结构是:

Example 1-4. sect 的基本结构

<sect[n]>

<title>段落标题</title>

<para>第一段文字......</para>

<para>第二段文字......</para>

......

[子卷标结构]

......

</sect[n]>

从 HTML 表现格式的观念来模拟,就如同一个 <Hn> 的横幅,配上一个 <div>,<div> 里可能是文字区段 <p>,也可能是其它的标记。所以一个标题,加上一个数据区块,就是 sect 基本上的样貌。

HTML 的 title 卷标和 DocBook 的 title 卷标,在意义和最后显示格式上不大一样,HTML 的 title 一个 page 只能有一个,而且通常显示在浏览器的标题列,但 DocBook 的 title 则大部分的区段标签都有,表现形式比较像分隔区段与区段的醒目横列文字(like HTML <Hn>)。

至于 sect 的区块部份,一个 DocBook 各种标签都少不了他的就是 para。para 是 paragraph 的缩写,中译也是区域段落,老实说光从字义看,好像和 sect 没啥区别,但依据 DocBook DTD 的定义,真正文字叙述是放在 para 里面,也就是 sect[n] 是要靠 para 来收纳他的文字串行的。一个 sect[n] 最少要有一个 para,但可依需要增加 para 使用数量。[7]

最后是包含子卷标,这是选项,可要,可不要。sect[n] 表示是有层级分别的,目前 DocBook DTD 的定义是 sect1 到 sect5五个层级,而且必须按层级逐阶隶属,也就是你不可以不透过 sect2 就直接把 sect3 塞到 sect1 里。 [8] 同理,如果你坚持要使用 sect5 ,那就必须:

Example 1-5. sect 的层级结构

<sect1><title>sect1 标题</title>

<para>sect1 文字段落...</para>

<sect2><title>sect2 标题</title>

<para>sect2 文字段落...</para>

<para>sect3 文字段落...</para>

<sect4><title>sect4 标题</title>

<para>sect4 文字段落...</para>

<sect5><title>sect5 标题</title>

<para>sect5 文字段落...</para>

</sect5>

</sect4>

</sect3>

</sect2>

</sect1>

上面的结构范例请你再多看两眼,因为把它记熟了,你就已经会了百分之六十的 DocBook 基本结构[9]。而且不要怀疑,光靠这几个标记,已经够写出个阳春型的 DocBook 文件来了。

1.6. 基本的根卷标结构

首先我们谈 chapter 和 article ,这两种根卷标结构大同小异。以 chapter 为例,套用上节的 sect 结构理念,一个标题配一个数据区块,那 chapter 的基本结构就是:

Example 1-6. chapter 基本的层级结构

<chapter><title>章</title>

<para>章引言... </para>

<sect1><title>sect1 标题</title>

<para>sect1 文字段落...</para>

<sect2><title>sect2 标题</title>

<para>sect2 文字段落...</para>

<sect3><title>sect3 标题</title>

<para>sect3 文字段落...</para>

<para>sect4 文字段落...</para>

<sect5><title>sect5 标题</title>

<para>sect5 文字段落...</para>

</sect5>

</sect4>

</sect3>

</sect2>

</sect1>

</chapter>

article 的根卷标基本结构,就是把那根标签名称从 chapter 换成 article 就成了。

至于 book 这个很有份量的根标签是由数个 chapter 或 article 组成,所以book 根卷标的结构应该是类似这样:

Example 1-7. book 基本的层级结构

<book><title>书籍名称</title>

<chapter><title>章标题</title>

<para>章引言... </para>

<sect1><title>节标题</title>

Copyright @ 2012-2024华乐美文网 All Rights Reserved. 版权所有