DocBookで文系論文を書いてみる 1日目

DocBookで文系論文を書いてみる 1日目

twitterで何を使って卒論を書こうかと考えていたときに、DocBookが候補にあがった。そこで、DocBookについてはほとんど何も知らないし、DocBookをPDF化する環境も整っていないけど、DocBookに挑戦してみることにした。

日本語でDocBookを使うのは相当面倒らしいけど、途中で心が折れないようにがんばろう。仮に、DocBookが駄目だったとしても、XML → XSL → PDFの変換環境を作ったり、本格的にXSLを勉強しておくのは悪いことではないと思うし。

ということで、がんばってみる。

方針

はじめに方針をいくつか。

  1. DocBookを使って卒論を書ける程度の状態にはする
  2. DocBookからPDFとXHTMLに変換できるようにする
  3. 少なくとも、SVGとMathMLが使えるようにしておく
  4. OSは文系らしくWinXP Home
  5. 自分でXSLを書かざるを得なくなる状況を考えて、基本的なDocBookの要素しか使わない

書きながら気づいたけど、卒論をDocBookで書くつもりなら、卒論関係のドキュメントは全てXMLで作らなきゃいけないんだな。少なくともXHTML、できればXSL-FOで書いておかなきゃまずそうだ。今さらTeXを使うのも嫌だし、XSL-FOについてはよく勉強しておいたほうがよさそうだ。

XSL処理系導入

まずはXSLTとXSL-FOの処理系を導入することに決めた。XSLTの処理系としてはXalan, SAXON, XTなどがあって、XSL-FOの処理系はFOP, PassiveTeXなどがある模様。

最終的にはApache FOPを採用することに決定。理由は、

  1. Javaで操作できる
  2. Xalanを含むから、XSLTの処理系も手に入る
  3. Apacheが好き
  4. Apacheが好き
  5. Apacheが好き

ということで、FOPのサイトからWindows用バイナリのZIPアーカイブをダウンロードする。今回僕がダウンロードしたバージョンは0.94。

インストール自体は簡単で、ダウンロードしたZIPを展開して適当なフォルダに放り込むだけ。FOPを走らせるためには、展開したフォルダにパスを通して、コマンドプロンプトでfopを呼ぶだけ。使い方が説明されます。

パスを通すのが嫌だったら、パスが通っているフォルダにfop.batを移動し、fop.batを開いて18行目付近の以下の部分を編集します。

Before:

rem %~dp0 is the expanded pathname of the current script under NT
set LOCAL_FOP_HOME=
if "%OS%"=="Windows_NT" set LOCAL_FOP_HOME=%~dp0

After:

rem %~dp0 is the expanded pathname of the current script under NT
set LOCAL_FOP_HOME=展開したフォルダへのパス
rem if "%OS%"=="Windows_NT" set LOCAL_FOP_HOME=%~dp0

つまり、LOCAL_FOP_HOMEに展開したフォルダを指定し、デフォルトの指定をコメントアウトするだけです。

テスト

ここまででXSLの処理系導入は一応完了。日本語対応などはこれからだけど。とりあえず、簡単なXMLと簡単なXSLを使ってPDFを出力してみた。

↓helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<article version="5.0">
    <info>
        <title>Hello World</title>
    </info>
    <para>Hello World</para>
</article>

↓helloworld.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output encoding="utf-8" indent="yes"/>

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:apply-templates/>
        </fo:root>
    </xsl:template>

    <xsl:template match="/article">
        <fo:page-sequence master-reference="A4">
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="./info/title"/>
                <xsl:apply-templates select=".//para"/>
            </fo:flow>
         </fo:page-sequence>
    </xsl:template>

    <xsl:template match="//info/title">
        <fo:block font-size="20pt"><xsl:apply-templates/></fo:block>
    </xsl:template>

    <xsl:template match="//para">
        <fo:block font-size="10.5pt"><xsl:apply-templates/></fo:block>
    </xsl:template>
</xsl:stylesheet>

PDF化

コマンドプロンプトで↓のコマンドを叩くとXMLがPDFに変換される。

fop -xsl helloworld.xsl -xml helloworld.xml -pdf helloworld.pdf

このコマンドで出力されたPDFが↓

XSL-FO化

そして、↓のコマンドでXMLからXSL-FOを取り出すことができる。

fop -xsl helloworld.xsl -xml helloworld.xml -foout helloworld.fo

このコマンドで出力されたXSL-FOが↓

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<fo:region-body margin="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="20pt">New Hello World</fo:block>
<fo:block font-size="10.5pt">Hello World</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>

とりあえず、

XMLからXSLを使ってのPDFへの変換はうまくいってるみたいだ。FOPに日本語フォントを導入したり、DocBookのXSLを探してきて日本語化したりっていうのがえらい大変らしいけど、今日は時間がないのでここまで。

「DocBookで文系論文を書いてみる」の目次はこちら

スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/70-86c39be0

トラックバック

コメント

FOPは、前方参照系の実装が貧弱です。最新のFOP-0.94でも、ページ数が多めの文書をFO処理するとき、その文書が前方参照を含むものだと、OutOfMemoryErrorになってしまうケースが多いです(LaTeXのように「2回実行させる」仕様で、この問題を回避できないものか…)
http://sqs.cmr.sfc.keio.ac.jp/tdiary/20070705.html#p01

そういうわけで、卒論レベルの長さのものを書くなら、FOPではなくLaTeXを選んだほうが無難だと思いますよ。
  • 2008-01-14
  • by hiroya
  • id:-
ご丁寧にありがとうございます。

前方参照というものがよくわかっていないのですが、確かに、page-sequenceに大量のデータを詰め込むと落ちるようですね。
ただし、学部生の卒論であれば最大でも100ページ程度で、かつ4章程度の構成になるはずなので大丈夫かと思います。場合によってはDocBookからLaTeXに変換する方法もあるようですし…
  • 2008-01-14
  • by LiosK
  • id:-

コメントの投稿

お名前
コメント
編集キー