這是一份 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.