<!-- -*- mode:text coding:euc-jp -*-
   $FML: docbook.sgml,v 1.9 2009/12/26 13:33:25 fukachan Exp $
-->


<appendix id="docbook">
	<title>
	SGML の書き方
	</title>

<para>
&fml8; のドキュメントでは、SGML の DTD 

	<ulink url="http://www.oasis-open.org/docbook/">
	"DOCBOOK"
	</ulink>

をごくごく普通に使うことにしています。
</para>

<para>
本章は SGML で書くために最小限必要な知識についてのメモです。
</para>

<para>
基本的な SGML の書式は、当たり前
	<footnote>
        <para>
        HTML は SGML 形式の応用の(最も有名な)一例です。
        そのため本質的なシンタックスは HTML と同じということになります。
        </para>
	</footnote>
ですが、正しい HTML の書き方と同様です。
本付録で、2、3 の典型的な SGML テンプレートをメモしておくので、
それらを適当に切り剥ぎしていけば、なんとかなるはずです。
</para>


<!--  =========================================================  -->
<sect1>
   <title>
   SGML の概念
   </title>

<para>
SGML は本や短い文書(記事)を作成する際に使われます。
文章の論理構造を記述するための規格です。
HTML のもっと厳密なものだと思って下さい。
  <footnote>
  <para>
  正確には「SGML の一部にフォーマッタの要素が合体したもの」が HTML です。
  HTML の方がはるかに有名になってしまったので、
  「HTML のもっと厳密なもの…」といった説明が良くされます :)
  </para>
  </footnote>
</para>

<para>
たとえば、”本”という概念を考えてみます。
まず”本”には章、節といった構成単位があります。
節の中にはパラグラフがありますし、文には脚注がついたり、
図などが挟み込まれたりします。
</para>

<para>
これらの概念には、ある関係があります。
たとえば”章”は”節”を含みますが、”節”は”章”を含みません。
そして、文は必ず「あるパラグラフ」の中に「ある」ものです。
</para>

<para>
そういった概念をどう表現するべきか？を規定したものが 
DTD (Data Type Definition)といえます。
</para>

<para>
DTD は自由に定義できますが、定義自体が大変な作業です。
しかしながら 誰かが作った DTD コレクションが世の中にはあるので、
それを使うのが便利です。
我々は DTD として docbook というものを使う
   <footnote>
   <para>
   我々が DOCBOOK を選んだ理由は簡単で、
   多くの場所で使われているからです。
   つまり、docbook のタグを書ける人が世の中に多いという意味でもあります。
   </para>
   </footnote>
ことにしています。
</para>

<para>
DOCBOOK は OASIS-0PEN.ORG が保守している DTD 集です。
非常に有名なもので、デファクトスタンダードといってもよいでしょう。
(わかりやすいかどうかは別として;)リファレンスがオライリーから本も出ていますし、
ドキュメントも豊富です。
Free の Unix などをはじめ、多くのプロジェクトで使われています。
</para>

<para>
つまり、SGML を使うことで得られる最大の意義は
「ある基準となるもの」に規格化ないしは強制されるということです。
これは SGML の構文による規制という意味ではありません。
ある概念に従うことに強制されようということです。
</para>

<para>
ここで”概念”といっているのであって、
”見栄え”についてはふれていないことに注意して下さい。
たとえば HTML では概念と見栄えは(むしろ意識的に)はっきり分離していません。
</para>

<para>
見栄えは DTD とは別の何かで定義されます。
通常スタイルシートというものです。
HTML 4.0 の CSS と同じ概念です。
</para>

<para>
スタイルシートの記述にもプログラミング言語が必要です。
docbook では schema (lisp の一種) ベースの
DSSSL (Document Style Semantics and Specification Language)
を使います。
</para>

<para>
また SGML では論理構造しか記述しないので、
見栄えはコンバータ次第でどうとでもなります。
HTML、テキスト、ROFF、PS、PDF、RTF をはじめ、
いろいろなものへ変換するやり方が用意されています。
</para>


</sect1>


<!--  =========================================================  -->
<sect1 id="book.sgml">
	<title>
	本( book )形式のテンプレート
	</title>

<para>
docbook DTD には
book や article といった代表的な形式についての定義があります。
</para>

<para>
book スタイルの典型的な SGML のテンプレートは次のようになります。

<screen>
&lt;!doctype book public "-//OASIS//DTD DocBook V3.1//EN" [
	&lt;!entity % include SYSTEM "include.sgml"&gt; %include;
]&gt;
&lt;book&gt;

  &amp;bookinfo;
  &amp;preface;

  &lt;toc&gt;&lt;/toc&gt;

  &lt;part&gt;
	&lt;title&gt; タイトル &lt;/title&gt;
	&lt;partintro&gt;
	&lt;para&gt;
	本パートは…目指しています。
	&lt;/para&gt;
	&lt;/partintro&gt;

	&lt;!-- 以下、各章が並ぶ --&gt;
	&amp;overview;
  &lt;/part&gt;
&lt;/book&gt;
</screen>
</para>

<para>
part や title は文字通りの意味です。
</para>

<para>
ここで注目するべきは、SYSTEM というキーワードのある、
2 行目です。
これは include.sgml を読み込む( include する)命令です。
C 言語の #include や
perl の require() と同様の働きをしています。
</para>

<para>
さらに、 include.sgml の中では次のような命令が定義されています。

<screen>
&lt;!-- include する SGML ファイル群 --&gt;
&lt;!entity bookinfo  SYSTEM "bookinfo.sgml"&gt;
&lt;!entity overview  SYSTEM "overview.sgml"&gt;
</screen>

これらの定義により
&amp;bookinfo;
命令で
bookinfo.sgml
が include されるようになります。

このようにして、文書本体と
include するべき定義ファイルを
分離することができます。
</para>

</sect1>


<!--  =========================================================  -->
<sect1>
	<title>
	HTML の &lt;UL&gt; 相当
	</title>

<screen>
&lt;itemizedlist&gt;

   &lt;listitem&gt;
	&lt;para&gt;
		アイテム１
	&lt;/para&gt;
   &lt;/listitem&gt;

   &lt;listitem&gt;
	&lt;para&gt;
		アイテム２
	&lt;/para&gt;
   &lt;/listitem&gt;

&lt;/itemizedlist&gt;
</screen>

<para>
たとえば

<screen>
&lt;itemizedlist&gt;

   &lt;listitem&gt;
	&lt;para&gt;
		けんけんはきたきつね
	&lt;/para&gt;
   &lt;/listitem&gt;

   &lt;listitem&gt;
	&lt;para&gt;
		るどるどはばんざいベア
	&lt;/para&gt;
   &lt;/listitem&gt;

&lt;/itemizedlist&gt;
</screen>

は次のようになります。

<itemizedlist>
   <listitem>
	<para>		けんけんはきたきつね	</para>
   </listitem>
   <listitem>
	<para>		るどるどはばんざいベア	</para>
   </listitem>
</itemizedlist>

数字付のアイテムは orderedlist です。

<orderedlist>
   <listitem>
	<para>		けんけんはきたきつね	</para>
   </listitem>
   <listitem>
	<para>		るどるどはばんざいベア	</para>
   </listitem>
</orderedlist>

</para>

</sect1>


<!--  =========================================================  -->
<sect1>
	<title> HTML の &lt;TABLE&gt; 相当 </title>

<screen>
&lt;para&gt;
  &lt;table&gt;
    &lt;title&gt; テーブルのタイトル &lt;/title&gt;
    &lt;tgroup cols=2&gt;

      &lt;thead&gt;
        &lt;row&gt;
          &lt;entry&gt; キー 		&lt;/entry&gt;
          &lt;entry&gt; 値		&lt;/entry&gt;
        &lt;/row&gt;
      &lt;/thead&gt;

      &lt;tbody&gt;
        &lt;row&gt;
          &lt;entry&gt; キー 1 		&lt;/entry&gt;
          &lt;entry&gt; 値 1		&lt;/entry&gt;
        &lt;/row&gt;

        &lt;row&gt;
          &lt;entry&gt; キー 2  	&lt;/entry&gt;
          &lt;entry&gt; 値 2		&lt;/entry&gt;
        &lt;/row&gt;
      &lt;/tbody&gt;

    &lt;/tgroup&gt;
  &lt;/table&gt;
&lt;/para&gt;
</screen>

<para>
たとえば

<screen>
&lt;para&gt;
  &lt;table&gt;
    &lt;title&gt; table description &lt;/title&gt;
    &lt;tgroup cols=2&gt;

      &lt;thead&gt;
        &lt;row&gt;
          &lt;entry&gt; 名前 		&lt;/entry&gt;
          &lt;entry&gt; 説明		&lt;/entry&gt;
        &lt;/row&gt;
      &lt;/thead&gt;

      &lt;tbody&gt;
        &lt;row&gt;
          &lt;entry&gt; けんけん	&lt;/entry&gt;
          &lt;entry&gt; きたきつね	&lt;/entry&gt;
        &lt;/row&gt;

        &lt;row&gt;
          &lt;entry&gt; るど 		&lt;/entry&gt;
          &lt;entry&gt; ばんざいベア	&lt;/entry&gt;
        &lt;/row&gt;
      &lt;/tbody&gt;

    &lt;/tgroup&gt;
  &lt;/table&gt;
&lt;/para&gt;
</screen>

は次のようになります。

  <table>
    <title> テーブルの見本 </title>
    <tgroup cols=2>

      <thead>
        <row>
          <entry> 名前 		</entry>
          <entry> 説明		</entry>
        </row>
      </thead>

      <tbody>
        <row>
          <entry> けんけん	</entry>
          <entry> きたきつね	</entry>
        </row>

        <row>
          <entry> るど 		</entry>
          <entry> ばんざいベア	</entry>
        </row>
      </tbody>

    </tgroup>
  </table>
</para>

</sect1>



<!--                プログラミング、ツール群      -->
<sect1>
<title> ツール群 </title>

<para>
SGML を HTML などに翻訳するために、いくつかのツールが必要です。
また DTD と DSL の規格文書群も必須です。
処理系としては openjade と opensp
	<footnote>
	<para>
	opensp は openjade パッケージに含まれています。
	</para>
	</footnote>
が必須のプログラムでしょう。
その他はオプショナルで、各自が好きにすればよいようです。
</para>

<para>
&fml8; では、
以下のプログラムを使って HTML やテキストファイルを作成しています。
<itemizedlist>

   <listitem>
	<para>
           openjade       1.3 以降
	</para>
   </listitem>

   <listitem>
	<para>
           opensp         1.3.4 以降
	</para>
   </listitem>

</itemizedlist>
多くの OS ではこれらのプログラムを附属のパッケージシステムで簡単に
インストールできるでしょう。
</para>

<para>
また、SGML からの変換には fml/doc/share/sgml/ にある
fml.dtd と fml.dsl を定義として使っています。
各 Makefile 内に、これらのファイルを各ツールでどう使うかの定義
(openjade に与えるオプション -c や -d オプション)が記述されています。
</para>

<!--
<warning>
<para>
NetBSD 1.5-stable 系列(およびそれ以前のバージョン)上で
openjade を compile するには unproven-pthreads が必要ですが、
以前作った時の変な include ファイルが残っていて
openjade をうまく compile できないことがありました。

うまくいかない時はまっさらにして全部やり直してみましょう。
</para>
</warning>
-->

</sect1>

<!--
<sect1>
   <title>
   例: SGML から HTML を作る (sgmltools を使う例)
   </title>

<warning>
<para>
obsolete です(すでに sgmltools は使っていません)。
</para>
</warning>

<para>
<link linkend="book.sgml">
book.sgml
</link>
から html ファイルを作るには sgmltools を次のように実行します。
<screen>
% sgmltools -b html book.sgml
</screen>
正しく動けば、
これだけで book/ ディレクトリの下に HTML ファイルが作成されるはずです。
</para>

<para>
もし、独自のカタログや DSSSL のファイルを指定する必要があれば
<screen>
% sgmltools -b html -j '-c /some/where/catalog -d /some/where/your.dsl' book.sgml
</screen>
などとします。
-j
は openjade に与えるオプションを指定しています。
-c
でカタログを指定しない場合、
sgmltools は /etc/sgml/catalog ファイルを使います。
</para>

</sect1>
-->


<!--  =========================================================  -->
<sect1>
	<title>
	見栄えを変更する
	</title>

<para>
SGML は論理的な構造を記述している言語です。
HTML の各ページに URL をつけたいとか、画像をつけたいといった
"見栄えの記述"を SGML で直接変更することはできません。
</para>

<para>
見栄えは DSL により記述をすることになります。
しかしながら、DSL は本質的に LISP (List Processor) 言語なので、
LISP を知らないとちょっと手が出ないでしょう。
</para>

<para>
見栄えは誰かが頑張った結果だけ使えということなのかもしれません。
</para>

<para>
ちなみに &fml8; の DSL の記述は

   <ulink url="../../../fml/doc/share/sgml/fml.dsl">
   fml/doc/share/sgml/fml.dsl
   </ulink>

にあります。
こういったものを書かないと見栄えを変えることができません ;)
</para>

</sect1>


<sect1>
	<title>
	その他の情報源
	</title>

<para>
SGML の書き方については

	<ulink url="http://www.freebsd.org/tutorials/docproj-primer/index.html">
	FreeBSD の初心者向けチュートリアル
	</ulink>

などを参照して下さい。
</para>

<para>
必要なツールのインストールについては
        <ulink url="http://www.linuxdoc.org/HOWTO/mini/DocBook-Install/">
        http://www.linuxdoc.org/HOWTO/mini/DocBook-Install/
	</ulink>
を参照して下さい。
</para>

<para>
SGML のタグの一覧は

	<ulink url="http://www.oasis-open.org/docbook/documentation/reference/html/docbook.html">
	DOCBOOK definitive guide (O'reilly)
	</ulink>

のオンライン版を参照するのが便利です。
</para>

</sect1>

</appendix>
