<!--
	$FML: docbook.sgml,v 1.1 2001/05/09 09:37:35 fukachan Exp $
-->


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

<para>
fml-devel (fml 5.0) のドキュメントでは、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 の書き方と同様です。
本 Appendix で、２、３の典型的な SGML テンプレートをメモしておくので、
それらを適当に切り剥ぎしていけばなんとかなるはずです。
</para>


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

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

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

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

<para> 
そういった概念をどう表現するべきか？を規定したものが DTD (Data Type
Definition)といえます。
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>
fml 5.0 では、以下のプログラムを使って HTML やテキストファイルを作成し
ています。
<itemizedlist>

   <listitem>
	<para>
           openjade       1.3
	</para>
   </listitem>

   <listitem>
	<para>
           opensp         1.3.4
	</para>
   </listitem>

   <listitem>
	<para>
           SGMLtools-Lite 3.0.3
	</para>
   </listitem>

</itemizedlist>

多くの OS では附属のパッケージシステムで一発ポン！てなもんでしょう。
</para>

<para>
もちろん sgmltools がなくても SGML から HTML を作ることができます。
どのツールを使うかは、あなたがどれを便利に思うか？次第です。
単に &fml5; では、sgmltools を歴史的に使っているだけです。 
</para>

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


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

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

</sect1>

<!--  =========================================================  -->
<sect1>
   <title>
   例: SGML から HTML を作る
   </title>

<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 Processre) 言語なので、
LISP を知らないとちょっと手が出ないでしょう。
</para>

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

<para>
ちなみに fml 5.0 の 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>
