PDFが出来るまで

昨日は「BoostBookの書式が間違っていた」としか書きませんでしたが、その舞台裏をご紹介。
2/21バージョンでpdfを作成すると、いろいろ警告が出た後、

[ERROR] null

という究極に無意味なエラーメッセージを吐いて失敗します。(このエラーはFOP公式サイトのFAQにも載ってます)
FOPのバージョンを上げれば、多少マシになるかと思い最新のbeta版を試すと、どうもFOの書式が間違っているらしいことが分かりました。FOの書式を調べるのは骨が折れそうです。
BoostBookからPDFへの変換は、

  1. BoostBook形式のXMLをXSL変換してDocBook形式のXMLを生成
  2. DocBook形式のXMLをXSL変換してFO形式のXMLを生成
  3. FO形式のXMLをFOPでPDFに変換

という3段階で行われます。doc/bin/msvc/debugを覗けば中間ファイルが見つかります。FOの生成時点で問題があるわけなので、PDFを生成できる最小限のDocBookを書いてみました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
  "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book>
<chapter>
<para>a</para>
</chapter>
</book>

bookだけの状態から始めて、パラグラフに1文字追加した時点で動きました。
これをBoostBookから生成したDocBookを比較してみます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<book><title>Hamigaki C++ ライブラリ</title><section><title>ライブラリ一覧</title><itemizedlist spacing="compact"><listitem><simpara><link linkend="audio">Audio</link> - 

おっと、bookの子要素にsectionがあります。これが原因のようです。sectionの替わりにchapterが来るようにXMLを調整すると、無事PDFが出来上がりました。
はじめからDTDの妥当性をチェックすればよかったですね。今、xmllintしてみたらまだ問題はあるみたいですが。