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