这是一份 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 为基础发展的.
这份文件以附在 SGML-Tools 上的 linuxdoc DTD 所撰写的.
它几乎包含所有使用这份 DTD 来写 SGML 文件所需知道的事情.
请参考 example.sgml
这份 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 该做什麽.
这里解释如何使用 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.