DocBookで文系論文を書いてみる 1日目
- 2008-01-09
- カテゴリ: その他のプログラミング
- タグ: ○○で文系論文を書いてみる Tips XML XSL DocBook Apache FOP Xalan
twitterで何を使って卒論を書こうかと考えていたときに、DocBookが候補にあがった。そこで、DocBookについてはほとんど何も知らないし、DocBookをPDF化する環境も整っていないけど、DocBookに挑戦してみることにした。
日本語でDocBookを使うのは相当面倒らしいけど、途中で心が折れないようにがんばろう。仮に、DocBookが駄目だったとしても、XML → XSL → PDFの変換環境を作ったり、本格的にXSLを勉強しておくのは悪いことではないと思うし。
ということで、がんばってみる。
方針
はじめに方針をいくつか。
- DocBookを使って卒論を書ける程度の状態にはする
- DocBookからPDFとXHTMLに変換できるようにする
- 少なくとも、SVGとMathMLが使えるようにしておく
- OSは文系らしくWinXP Home
- 自分でXSLを書かざるを得なくなる状況を考えて、基本的なDocBookの要素しか使わない
書きながら気づいたけど、卒論をDocBookで書くつもりなら、卒論関係のドキュメントは全てXMLで作らなきゃいけないんだな。少なくともXHTML、できればXSL-FOで書いておかなきゃまずそうだ。今さらTeXを使うのも嫌だし、XSL-FOについてはよく勉強しておいたほうがよさそうだ。
XSL処理系導入
まずはXSLTとXSL-FOの処理系を導入することに決めた。XSLTの処理系としてはXalan, SAXON, XTなどがあって、XSL-FOの処理系はFOP, PassiveTeXなどがある模様。
最終的にはApache FOPを採用することに決定。理由は、
- Javaで操作できる
- Xalanを含むから、XSLTの処理系も手に入る
- Apacheが好き
- Apacheが好き
- 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を探してきて日本語化したりっていうのがえらい大変らしいけど、今日は時間がないのでここまで。
トラックバックURL
- http://liosk.blog103.fc2.com/tb.php/70-86c39be0
0 件のトラックバック
2 件のコメント
-
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:-

