Next Previous Contents

1. 简介

这是一份 SGML-Tools 文件处理系统的使用说明.SGML-Tools 提供一个 SGML DTD (文件形态定义,Document Type Definition) 及一组「置换档(replacement files)」,可以将 SGML 转换为 groff, LaTeX, HTML, GNU info, LyX, 与 RTF 的原始档.

SGML-Tools 主要以 Tom Gordon 的 QWERTZ DTD 为基础发展的.

1.1 关於此文件

这份文件以附在 SGML-Tools 上的 linuxdoc DTD 所撰写的. 它几乎包含所有使用这份 DTD 来写 SGML 文件所需知道的事情. 请参考 example.sgml 这份 SGML □例,你可以拿它当作你自己文件的□本.

1.2 为何用 SGML?

我选择使用 SGML 是因为 SGML 是专门用来转换成其它格式的. SGML 是 Standard Generalized Markup Language 的简称,它允许你指定文件的结构---也就是,用何种事物来标示文件. 你使用一份 DTD (文件形态定义) 来指定文件的结构.linuxdoc 是一种指定 Linux HOWTOs 与其它文件的 DTD. QWERTZ 是另一种 DTD; SGML 的标准提供书,文章,及其馀一般文件所使用的 DTD.

DTD 指定文件中「组成元素」的名称.组成元素就是一种结构---例如章,节,段落,或是更小的像是这样的 强调文字.然而跟 LaTeX 不同的是,这些组成元素并非 SGML 本身内含的.linuxdoc DTD 就定义了类似 LaTeX 中的组成元素---你有章,节,或是「环境」等等.然而,利用 SGML 你可以照你喜欢定义文件的任何结构.就某方面来说,SGML 就像是低阶的 TeX,而 linuxdoc DTD 则像是 LaTeX.

别被这类比搞混了.SGML 并不是一种文件格式化系统.没有所谓的「SGML 格式」. SGML 的原始档只是用来转换成其它格式以便处理的.还有,SGML 本身是用来指定文件的结构. 没有 SGML 本身的文字格式化工具或是「巨集」之类的.所有的一切都定义於 DTD 中. 没有 DTD 你不能使用 SGML,一份 DTD 定义了 SGML 该做什麽.

1.3 它如何运作

这里解释如何使用 SGML-Tools 处理文件.首先,你需要一份 DTD.我用的是 QWERTZ DTD, 它本来是一群人因为需要类似 LaTeX 的 DTD 而做的.我将 QWERTZ DTD 修改成 linuxdoc DTD 以符合我们的需求.DTD 不过设定了文件的结构.它看起来像是这个样子的:

<!element article - -
    (titlepag, header?, 
     toc?, lof?, lot?, p*, sect*, 
     (appendix, sect+)?, biblio?) +(footnote)>

这部份设定了「文件」的整个结构,就像是 LaTeX 的「documentstyle」. 这文件包含了一个书页名(titlepag),一个可有可无的标题(header),一个可选用的内容列表(toc),可选用的图形列表(lof)与表格列表(lot),任意数量的段落(p),任意数量的章节(sect),可选用的附录(appendix),一个可选用的参考书目(biblio)以及注解(footnote).

你可看出,DTD 并未说明文件应如何被格式化,或它看起来长得怎麽样. 它只不过定义了文件由何种部份所组成.在文件的另一个地方定义了 titlepag, header, sect 及其馀的组成元素.

写文件时你并不需要知道任何关於 DTD 的文法规则.我只不过让你看一下它长得什麽样子还有它做了什麽. 但你必需熟悉这份 DTD 所定义的文件结构.否则,在尝试写文件时你可能会违反结构, 而且被错误讯息搞昏了.下面我们会描述 SGML 文件结构的细节.

接下来就是用这份 DTD 所定义的结构来写文件了.再说一次,linuxdoc DTD 使得文件看起来长得像 LaTeX---所以很容易遵从.用 SGML 的术语来说,使用某一个特别的 DTD 来撰写的单一文件叫做那份 DTD 的「案例(instance)」.

为了将 SGML 原始档转换成其它格式(例如 LaTex 或 groff)以便处理,你所写的 SGML 原始档必须经 SGML 解析器处理过.我用的是 James Clark( jjc@jclark.com) 所写的 sgmls 解析器, 他也是 groff 的作者.它用起来很方便.sgmls 读入你的文件,检查它遵循 DTD 所定义的结构. 它同时将你文件中的「巨集」和元素展开,以方便下一阶段的 sgmlsasp 来处理.

sgmlsasp 用来将 sgmls 的输出结果转换成另一种格式(如 LaTeX). 它使用置换档将原始 SGML 文件中的组成元素转换成「目标」格式(如 LaTeX 或 groff)对应的原始档.

例如,一部份 LaTeX 的置换档长得像这样:

<itemize>    +    "\\begin{itemize}   +
</itemize>   +    "\\end{itemize}    +
它说明了当你在 SGML 原始档中使用 itemize 元素时,应该被置换成 LaTeX 原始档中的
\begin{itemize}
(我说过了,DTD 中的元素像极了它们在 LaTeX 中的对应物.)

因此,要将 SGML 转换成其它格式,你所要做的就是为此格式写一个新的置换档, 在新格式中为每一 SGML 组成元素指定适当的对应.事实上,没这麽简单---例如, 如果你尝试转换成和你的 DTD 完全不同的结构,你就有麻烦.不过, 比起要为每一种格式写单独的解析器与转换程式还是要简单的多. SGML 提供一种一般的系统将一种原始档转换成许多格式.

一但 sgmlsasp 转换完成,你就有与原先 SGML 原始文件相对应的 LaTeX 原始档, 你可以像一般的 LaTeX 档一样来使用它.下面我会示□如何做这样的转换与格式化. 你只要用一行指令就够了.

不过首先,我要说明如何安装及设定 SGML-Tools.


Next Previous Contents