DocBook/SGML や DocBook/XML で文書を書く

SGML,特にDocBookで文章を書く時のための方法についての説明です. DocBookは最近XMLに移行しつつあるので,XMLについても説明しています.

DocBook文書作成術

SGMLの超基本的用語説明

SGMLでは多くの専門用語がありますが,とりあえず 知っていなければいけない言葉として, エレメント(要素)という言葉があります. <para>むが</para> では,paraが要素(エレメント), <para>が開始タグ, </para>が終了タグ, というようになります. あと,<para id="fufu">というように, 指定できます.この「id」の部分を 属性(アトリビュート)と呼びます.そして, 「"fufu"」の部分を属性値と呼びます

&なんたら;と書いてあるものを エンティティーと表現します. これは,何か別のものに置換されます. 「なんたら」が何に置換されるのか,と言う事に ついてはSGMLでは自由に定義できます.

実際問題としては, SGMLの利用例であるDocBookにおいては何がどうなって, HTMLにおいてどれがどうなる,ということは,それぞれ 定義されています. つまり, HTMLなら,&amp;& に対応すると定義されていますが,SGMLのアプリケーション全てで その対応だとは限りません.

DocBookの位置付け

SGMLで,特定のDocBookのDTDを利用した文書がDocBookの文書です. これは,HTMLのDTDを利用したSGML文書がHTML文書であると 言えることと同様で 他の有名なDTDとしては,LinuxDoc等があります. LinuxDocとDocBookは,LinuxのLinux Documentation Project (LDP) で採用されています.

DocBookはXMLへ移行中で, 一部の文書がXML版へ移行しているようです.

DocBookで文章を書く

そこまで難しくないので.既存の文章を参考にして書くと良いでしょう. SGML版DocBookの基本としては,

<!doctype Book PUBLIC "-//OASIS//DTD DocBook V4.2//EN">

が文書の最初に入っていれば良いです. また,エンティティの宣言をしたいのなら, ここに追加します. 外部文書を引用したい, 例えば,バージョン情報を 別のファイルにおいて管理したいのなら,preambleを

<!doctype Book PUBLIC "-//OASIS//DTD DocBook V4.2//EN"[
<!ENTITY VERSION SYSTEM "version.sgml">
]>
    

のように書いておくと,&VERSION;と文章内に 書いたときに,そのファイルversion.sgmlの 中身に置き換わります.

XML文書の場合は最初の部分が多少違って

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "docbookx.dtd">
    

になります.この他は大体一緒です. 最も目につく違いは,SGMLだと, <element>contents</element><element / contents />と省略できる点です. また,XMLはタグを必ず閉じる必要があり, そのために<element></element> の省略形として<element /> があります. この二つは全く互換性が無いので注意.(確認必要?間違っていたらメールください)

DocBook文章の構造

DocBookで書く文書の構造について解説します. まず,DocBookで本を書く場合は, Bookエレメントで 全てがつつまれます. そして,Bookの最初の要素として, titleが指定され, そして, chapterエレメントが指定されます. chapterエレメントの中には, 一般的に,最初にtitle エレメントにより章のタイトルを指定して, paraエレメント, もしくは,sect1エレメントが 含まれます. sect1エレメントも 同様に,タイトルの指定と paraエレメントがあると 考えて良いと思われます.

SGMLやXMLで文章を書くツール

SGMLやXMLで文章を書けるツールが最近は着実に増えて来ています. その中でいくつか紹介します.

Emacsを利用して,psgmlを利用することを勧めます. また,Emacsでは,yasgmlというのもあるようです.

psgmlモードであれば, 最初にSGML宣言を書いたファイルで, C-cC-pを入力すると,DTDを解析してくれます. そうすると,C-cC-eを押せば,その時点で入力可能な 選択肢が表示されます.

WYSIWYGで編集したい場合もあります, その場合,利用できるツールは凄く限られて来ます. フリーソフトウェアで利用できるDocBook XML のWYSIWYGエディタとして, qemacsがあります.

また,emacs21上でマイナーモード WYSIDocBookXML を利用すると,mozillaでプリビューをリアルタイムに見ながらDocBook XML ファイルを編集できます.

日本語の文章の場合

日本語でSGML文章を書く場合は, 文字コードをEUC-JPにしてください. XMLの場合はutf-8 が良いでしょう.

2003年1月現在,日本語SGML文書やXML文書からpsへの変換を行うための 簡単で一般的な方法が確立されていないようです. これから整備されて行くところに期待したいです. HTML文書への変換には全く問題が無いようです.

DocBookで書いた文章を変換する

SGMLやXMLで書いた文章は一般的にはそのまま利用されることは ありません. (mozilla等のブラウザはXSLを利用してDocBookもレンダリング可能なはずですが). より利用しやすい形式に変換される事が主となります. ここでは,SGMLのDocBook を利用した時に,それを どう変換するか,ということについて解説します.

Debianを見渡したところ,使えるツールとしては,jadesgmltools-liteがあるらしいということが分かります. sgmltools-liteはjadeのフロントエンドのようです. るということも分かります. 他にはdocbook-utils(旧cygnus-stylesheets)等もあるようです.

sgmltools-lite (SGML からの変換)

sgmltools-liteは非常に簡単です.

$ sgmltools text.sgml    
    

のようにして実行すると,text.htmlというファイルが生成さ れます.オプションを指定すると他のフォーマットにも変換できます. デフォルトは,-b onehtmlのようですが, -b htmlや,-b txt等もあります. -b rtfというのがありますが,これはMS Wordの文書 に変換するのに便利そうです.

-b htmlとすると,ディレクトリが作成され,その中にHTML 文書が複数作成されます.

jade (SGML からの変換)

jadeはDSSSLというスタイルシート言語の処理系です. DSSSLとはSGMLの文章の表示体裁を指定するための言語です. jadeを直接利用するよりは,sgmltools-liteを利用したほうが良いと 考えられます.

HTML文書を生成するには,以下のようなコマンドを指定すれば良いです.

      $ jade -t xml -d /usr/lib/sgml/stylesheet/dsssl/docbook/nwalsh/html/docbook.dsl text.sgml 
    

まず,出力の種類を指定して,そして,DSSSLを指定して,処理するファ イルを指定しています.こうすると,book1.htmlを目次とし て,複数のHTMLファイルが生成されます.

docbook-utils / cygnus-stylesheets (SGML からの変換)

cygnus-stylesheetsや,docbook-utilsを利用すると,SGML 処理用のスクリプトがついてきます. db2ps (docbook to PostScript)などの そのままの名前の物が複数入っています.

DocBook/SGMLの文章例

<!doctype Book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<book>
  <title>利用方法についての内部資料</title>
  <chapter>
    <title>この文書について</title>
    <para>
      この文章は 2001年9月に,上川が書いた
    </para>
  </chapter>
  <chapter>
    <title>HURD</title>
     <sect1>
      <title>HURD のインストールについて</title>
      <para>
	昨日から HURDをインストールしてみてます.
	まず,ISOイメージとして, Debian GNU/Hurd F1 を利用しました.
      </para>
      <para>
	インストールは適当にすれば途中まで終了しますが,自前で
	ハードディスクから起動するようにはしてくれないので,
	事前に用意した GRUBの起動ディスクで起動することになります.
      </para>
      <para>
	GRUBの起動フロッピーディスクの作り方は,grubの入っているDebianのシステムから:
	<screen>
	    cd /usr/share/grub/i386-pc
	    dd if=stage1 of=/dev/fd0 bs=512 count=1
	    dd if=stage2 of=/dev/fd0 bs=512 seek=1
	</screen>

	というようにしてフロッピーに書き込みます.
      </para>

      <para>これから起動すると,grubのプロンプトが現れるので,
今回のシステムの場合は,IDE0のマスタのHDDの
2番目のパーティションにインストールしたので,

	<screen>
	  root (hd0,1)
	  kernel /boot/gnumach.gz root=/dev/hd0s2
	  module /boot/serverboot.gz
	  boot
	</screen>
	とうちこむと,GNU Machが起動します.
      </para>
    </sect1>
    <sect1>
      <title>HURD での CDROM のマウントの方法</title>
      <para>
        GNU HURDにはmountが無いので,
        <command>
          settrans <parameter>/cdrom /hurd/isofs /dev/hd2</parameter>
;
        </command>
        のようにします.大抵の場合,hd2 というデバイス自体が無いので,
        <command>MAKEDEV</command>で作成します.
      </para>
    </sect1>
  </chapter>
</book>
    

これをHTMLに変換すると

SGML output in HTML
	    rendered in Mozilla

のようになります.

日本語文書をPostscript / PDFに変換する方法

SGML DocBook 形式の日本語文書のPostScript/PDF 化

大浦さんの作成した ptexを利用するjadetexというものがあり,それを使うと sgmltools-liteを利用して文書変換をすることができるそうです.

XML DocBook 形式の日本語文書のPostScript/PDF 化

XMLの方面にいろいろと発展しているようです. しかし,XMLの文書をHTMLに変換できるのは確認しましたが, その他の方法についてはまだ確認できていません.

DocBook stylesheets で FOに変換してからFOPで処理してPDFにする方法, DB2LaTeX-XSLlatex文書にしてからplatexにかける,という方法が紹介されています. 英語の文書であれば,DB2LaTeX-XSLで処理してpdflatexで処理すると2ステップでPDFが作成できます.日本語ではplatexで処理してからdvipdfmxなどを経由することになります. DB2LaTeX-XSLは2003年ころは活発にメンテされていたようですが,今はあまりメンテされていないようです.

dblup というプロジェクトがDocBookからLaTeXへ変換するものですが, ISO-8859-1専用のようです. ちょっといじっただけではどうにもなりませんでした. これもしばらくメンテされていないようです.

この状況を打開するために, DocBook XML から latexに変換するperlがあったので, それをいじって一部の文書をコンパイルできるように改善してみたりもしました. しかし,それでは限界があるので, dancer-xmlパーサを利用して のDocbookからLaTeXとHTMLへの変換プログラムを作成しました. しかし,見た目がださく, DB2LaTeXのほうがあきらかにきれいな出力です.

他の文献へのリンク


Junichi Uekawa

$Id: writing-sgml.html.ja,v 1.22 2006/03/05 04:34:58 dancer Exp $