DITA 1.3詳解ワークショップ(2)

DITA 1.3詳解ワークショップのEliot Kimberさんの解説を聞いていて感じたことを追加します.

DITA 1.3ではCross-deliverable linking、つまりbookmap間の参照(通常分冊間参照と呼んでいる)が出来るようになったという話です.これは具体的にはどのように行うのかというと、例えばmap01からtopicrefされているtopic1.ditaで次のようなxrefがあったとします.すると次のような別のmapを間接参照することにより、分冊間参照が「表現」できるというものです.

[topic01.dita]
<xref href-"topic-02">

[map01.ditamap]
<topicref href="topic-01.dita"/>
<keydef keys="topic-02" keyref="map-02.topic02"/>
<mapref keyscope="map-02" href="map02.ditamap" scope="peer"/>

[map02.ditamap]
<topicref keys="topic-02" href="topic02.dita"/>

[topic02.dita]
<topic>
 ...
</topic>

これは仕組みとしてscope="peer"で対象のmapが独立したルートマップであることを表すという意味付けを導入したことによります.ここで大切なのは「表現」であるということです.つまりDITAの仕様の中で、分冊間参照を仕様として表現できるようになったという点が重要なのです.表現と実装は異なります.この分冊間参照の仕組みは、現在のDITA-OTで実現されている訳ではありません.そして私はひょっとしたら、永久に実現はむつかしいのではないか?とも思っています.

例えばPDFの分冊間参照の場合、map02.ditamapとmap02.ditamapは別々にビルドされ、一定の(ユーザーの要望による)ファイル名が付けられるでしょう.実は分冊間参照は、最終的には「このPDFファイル名」+「ターゲットのid」という形にまで落とし込む必要があります.しかし、上記のオーサリングからは、PDFファイル名は知るすべはありません.またターゲットのidを知ることが出来たにせよ、topicにユニークなid付けを行いPDF生成ではそれを外部に参照先としてエキスポートするという処理なしには成し遂げられません.そもそもXSL-FOの仕様では、PDF内にこのidを埋め込むような仕組みはなく、各Formatter毎の独自仕様になっています.

またそもそもmap01.ditamapはPDFでpublishされるのかもしれませんが、map02.ditamapはHTMLでpublishされるのかもしれません.DITAは様々なメディアにpublish可能です.単にリンクが記述できるようになったと言ってもメディアが違えばリンクの生成方法も違うのです.

という訳で、分冊間参照はDITAの仕様の中で整合性を持って解決されたとはいえ、実装には程遠いのではないのかというのが私の感想です.しかしもちろん現実にはDITAで分冊間参照しているPDFは作られています.私もDITA 1.2を特殊化してxrefではないextxrefともいうべき要素を導入して、この仕組みを考案して実装しました.結局DITAの仕様はDITA-OTがそれをどのように消化するかにかかってきています.分冊間参照は技術文書では必須の機能ですが、やはり実装者が頭を悩ませて実現することに変わりはないのでしょう.

あとKimberさんに質問してお答えいただいたのですが、MathMLの実体参照の問題があります.DITA 1.3からMathMLのDITAインスタンスの中へのオーサリングが可能になり、<equation-block>とか<equation-inline>などMathMLを内包し、数式を表現する要素が導入されています.MathMLは実際にオーサリングする人がいて決しておかしくない機能です.同じDITAでもSVGとなるとさすがに手でオーリングする方は少ないのではないでしょうか?でも、MathMLは現実に使えるし、すでに大学ではDITA 1.3とともに使われています.

ここで問題になるのが実体参照です.数式は様々な数学記号を使用するので、文字参照では苦しいのです.名前付けされた実体参照の方がピンときます.例えばインテグラルだって、&Integral;と書けた方が&#x0222B;と書くよりわかりやすいでしょう.しかしOASISのDITA 1.3 DTDは実体定義のファイルをフォルダに含んでいるにもかかわらず、それを使用しない道を選択しました.つまりDITAでまともに書くとインテグラルは&#x0222B;と書くしかないのです、これはある意味苦痛でもあります.いちいちUnicodeのコード表を見ないとオーサリング出来ません.

これについてはKimberさんは次のような案を教えてくれました.

 ① 実体参照を使用しないことを選択する.
 ② 自分の特殊化したシェルDTDで実体定義をインクルードして使えるようにする.
 ③ DITAとは別のファイルのXMLを参照する.外部のXMLファイルならDITA 1.3 DTDの制限に依存せず実体定義+実体参照を使用することが可能です.
 
しかし、これらは決してOASIS DTDでは実体参照の使用を可能とすることを選択しなかった事実を変えるものではありません.会社のMathMLのサンプルを見たらみんなHTMLで実体参照を使って書かれていました.HTMLはそういう意味では楽です.サンプルを作るためにこれをXMLで書き直したことがありましたが、実体参照をすべて文字参照とするように、しなければならず非常に手間でした.

この問題はMathMLを使用する方にとっては結構大きい問題ではないかと思いました.