使用 SGMLtools 实现更灵活的格式化
在 1995 年 10 月号的 LJ 中,Christian Schwarz 对当时的 Linuxdoc-SGML 做了一个简短的概述:一个完整的、开箱即用的软件包,它曾经并且仍然为作者提供了一次编写,随处呈现的机会。从纯文本 ASCII 到排版 PostScript 和超文本 HTML,这一切都来自一个 SGML 源文件。从那时起,许多或大或小的更改导致它被重命名为 SGML-Tools(然后是 SGMLtools——连字符造成了混淆),以表明它不仅仅适用于 Linux。尽管如此,我们,SGMLtools 项目的作者,对这并不满意,因此我们着手构建一个更好的软件包,即这里介绍的 SGMLtools 2。本文将简要概述 SGML-Tools 1 发生了什么,导致我们将其重命名为 SGMLtools 2;更多详细信息可以在 SGMLtools 网站上找到(请参阅“资源”部分)。
一次又一次出现的一个大问题是,Linux 文档类型定义的缺点开始显现。文档类型定义 (DTD) 是 SGML 术语,用于描述符合 DTD 的 SGML 文档必须是什么样子的规则集。它概述了文档的结构,从标题和小标题到表格;一切都已定义。
正如我们发现的那样,维护文档类型定义非常困难。关于应该允许哪些功能、如何使现有功能更好、是坚持纯过程标记还是对事物采取一些务实的态度,不断地进行讨论。无休止的讨论来来回回,开始干扰进展。Linuxdoc DTD 显然过于有限,但我们不想在不了解是否已存在替代方案的情况下重新设计它。
我们很快得出结论,由 Davenport Group 开发的 DocBook DTD 将是 Linuxdoc DTD 的良好继任者。DocBook 由专业人士为专业人士开发,重点是技术文档,非常适合 SGMLtools 的目标受众,并解决了 Linuxdoc 的许多问题。此外,几乎每个 SGML 供应商都支持 DocBook,因此这将使用户减少对我们的依赖,并为他们提供更多处理 SGML 文档的方法。最近,维护 DocBook 的责任已转移到结构化信息标准促进组织 (http://www.oasis-open.org/),确保 DocBook 将继续得到广泛支持。
首字母缩略词 DSSSL 可能对普通读者来说意义不大,但它代表了 SGMLtools 的另一个重大变化。DSSSL(文档样式和语义规范语言)是一种用于指定 SGML 文档外观的语言。它有助于将诸如“section”之类的过程标记转换为诸如“Helvetica Bold,18 points”之类的特定格式样式,构建目录等等。它比以前使用的映射文件强大得多,因为它可以在上下文中操作并允许您定义函数。由于 DSSSL 基于 Scheme,您可以做任何您想做的事情。
我们选择使用 DSSSL 不仅是因为它的强大功能,还因为它是一个行业标准(与旧方法和我们评估的替代方案相反)。此外,它帮助我们快速启动了该项目,因为 DocBook DTD 的一整套 DSSSL 样式是可用的。
SGMLtools 2 是一个围绕三个核心元素构建的工具集合
DocBook DTD
标准的 DocBook DSSSL 文件
Jade,SGML/DSSSL 解析器
当您将 SGML 源交给 SGMLtools(使用命令 sgmltools)时,它基本上什么也不做,只是调用 Jade,并提供 SGML 文件的名称、要应用于它的 DSSSL 文件的名称以及请求的输出格式。以下部分将详细介绍,以使过程清晰明了。理解起来并不困难,并且当您想进行修改时,对 SGMLtools 运行期间发生的事情有一些基本了解会有很大帮助。
Jade 首先读取 SGML 文件,并尝试从 SGML 文件开头的声明中找到文档类型定义。例如
<!DOCTYPE article PUBLIC "-//Davenport//DTD DocBook V3.0//EN">
出现在符合 DocBook 的文档的开头。(请注意,article 可以指 DocBook DTD 的任何部分,而 para 可以用于指定单段文档。)Jade 从 PUBLIC 标识符获取 DTD 定义的文件名(请参阅关于公共和系统标识符的侧边栏),如果一切顺利,则检查 SGML 源的合规性。
在文档被发现没问题(“已验证”)后,Jade 读取指示的 DSSSL 文件,并针对解析后的 SGML 文件执行它。DSSSL“程序”从内存中的对象读取 SGML 文档,并输出另一个称为 流对象树 (FOT) 的内存结构。FOT 在结构上将类似于 SGML 文档,但它包含有关字体、大小和其他选项的信息。最后,Jade 将 FOT 交给其后端之一,后端将通用样式信息转换为后端特定的文件格式。
作为一个简短的例子来说明这个过程,从一行 SGML 文档开始
<Sect1><Title>Introduction</Title> ...
这是一个以“Introduction”为标题的顶级章节。Jade 通过读取 DSSSL 文件(可能是 ldp.dsl,它提供了 Linux 文档项目样式格式的说明)来确定它是一个有效的 DocBook 文档。
以下部分可能在 DSSSL 文件中
(element SECT1 TITLE ((make paragraph font-family-name: "Times New Roman" font-weight: 'bold font-size: 20pt))
这个表达式表示“对于 SECT1 元素中的 TITLE 元素,输出一个段落,字体为 20pt 加粗 Times 字体”。为了简化起见,我们可以说这个表达式产生一个具有给定属性和文本“Introduction”作为内容的流对象(将一切都变成段落的概念,甚至包括标题,对于使用过 DTP [分布式事务处理] 软件的人来说是很熟悉的)。当一切都完成后,Jade 将所有流对象交给后端,例如 TeX。这个后端在遇到我们介绍性章节标题的流对象时,将输出类似
{\setfontfam{Times-Roman-Bold}\setfontsize{20pt}Introduction}然后可以由 TeX 和一个特殊的 TeX 包处理,以生成 DVI 和 PostScript。
请注意,DSSSL 的美妙之处在于您只谈论样式,而不是特定格式的特定指令。无论是 TeX、RTF 还是 groff,您都至少会得到一个与“20pt Times New Roman Bold”节标题非常接近的等效项。如果您需要调整它,您可以轻松地覆盖特定后端的 DSSSL 规范片段。通常,您至少会有不同的 DSSSL 文件用于硬拷贝和 HTML 输出。
新版本最大的优势之一是它非常容易自定义——一旦您掌握了 DSSSL。正如上一部分所示,您甚至不需要了解很多关于后端的信息。在 DSSSL 中,您处理相当高级的东西,例如字体名称,而无需担心这些字体名称在 PostScript 或 groff 文档中是如何处理的。
SGMLtools 提供的原始 DocBook DSSSL 样式表旨在进行自定义。您所需要做的就是编写您自己的样式表,其中包含原始样式表并覆盖您想要自定义的内容,通常只需几行来调整参数。在 SGMLtools 中,您会找到一些这些自定义的示例。在您设置好自己的 DSSSL 样式表后,您必须确保 SGMLtools 使用它。通过提供指向您的 DSSSL 样式表的 -d 或 --dsssl-spec 选项来做到这一点。
许多 Linuxdoc 用户的第一个问题是,“我当前的文档怎么办?” 答案是,您必须在 SGMLtools 2 发布之日起六个月内从 Linuxdoc 迁移到 DocBook。该软件包提供了一个工具来帮助您进行转换过程。
迁移过程的第一步是确保您的文档符合最新的 SGML-Tools 1 版本,该版本将是 1.0.7 或更高版本。安装此软件并运行您的文档,以确保它们是最新的。
第二步是使用命令 sgmltools --backend=ld2db 转换您的文档,这将输出 DocBook 文档。如果此运行成功,您可以通过阅读 DocBook 并查看您是否对转换结果感到满意来完成迁移。从那时起,您可以继续用 DocBook 编写。
为了给您一些时间来规划您的转换,我们将继续在 SGMLtools 2 发布后的六个月内支持 SGML-Tools 1(发布日期现在未知,但应该非常接近本文的发布日期——查看网站了解详细信息)。六个月后,SGML-Tools 1 将从网站上删除,并且就我们而言,Linuxdoc DTD 将成为历史。我们会在 comp.os.linux.announce 中提前提醒您这一事件,当然,您可以随意继续使用 SGML-Tools 1,只要您愿意,但我们建议您花些力气学习 DocBook 并开始使用 SGMLtools 2——它将为您提供更灵活的格式化能力。
