XMLとスタイル (2)

もう少し典型的ではないかと思われる例を見つけました.PDFですが複製、転載禁止とありますのでコピーを載せるという訳にはゆきません.もしよろしければ以下からダウンロードして見ていただければと思います.日本のリコーのデジカメのマニュアルです.

GR Operation Manual (PDF)
英語版
日本語版

注目していただきたいのは英語版の4ページです.(日本語版だったら16ページ)ここにはカメラのモードダイアルの図があり、それぞれのモードが何であり、その説明がどこに書かれているのかが記されています.

これはXMLだったらどのように作れるでしょうか?以下が私が考えたアイディアです.

まず次のようなベクター画像をイラストレータで作ります.赤枠で囲ってあるところは、あとからはめ込むので、イラストレータでは文章は入れません.こうして作った画像をPDFに保存します.名前をpentax_mode_dial.pdfとします.

イメージ 1


そしてDITA中ではこれを次のようにオーサリングします.左上のProgram shiftの説明だけオーサリングしてあります.

<bodydiv outputclass="container" fo="width:100%;height:70mm;">
  <bodydiv outputclass="container" fo="display-align:center;">
    <section>
      <image href="pentax_mode_dial.pdf"/>
    </section>
  </bodydiv>
  <bodydiv outputclass="container" fo="absolute-position:absolute;left:0mm;top:100;width:27mm;">
    <section>
      <ph fo="font-weight:bold;">P (program shift)</ph>: You choose from combinations of shutter speed and aperture
      that produce the same exposure (page 
      <xref href="program_shift.xml#program_shift" format="dita" type="concept" outputclass="page-only"/>).
    </section>
  </bodydiv>
  <!--bodydivで各モードの説明が続く-->
  ...
</bodydiv>

このDITAインスタンスは標準のOASISスキーマではかけません.fo属性が特殊化で拡張されています.

fo属性は、汎用のXSL-FOのオブジェクトの属性を記述するものです.記法は例にあるようにCSSスタイルです.PDFを生成するスタイルシートは、fo属性があったらそれを解釈して生成するXSL-FOのオブジェクトに反映させます.

あとoutputclassに特別な意味を持たせています.

bodydiv/@outputclass="container"は、bodydivからfo:block-containerを生成する決まりとします.スタイルシートはfo:block-containerを生成し、fo属性をそれに展開します.

xref/@outputclass="page-only"は参照先のページ番号を出力することを表します.通常xrefがtopicを参照しているとスタイルシートは参照先のtopic/titleを表示しますが、これがあるとページ番号だけにします.

それでは、この前提でどのような出力が想定されるのでしょうか?

まず、<bodydiv outputclass="container" fo="width:100%;height:70mm;">でそこまでの文書フローの下に続けて、高さ70mmのfo:block-containerをスタックして配置します.

<bodydiv outputclass="container" fo="display-align:center;">でその中に上下をセンタリングしたfo:block-containerを更に作り、<image href="pentax_mode_dial.pdf"/>で、この説明図を配置します.

あとは、<bodydiv outputclass="container" fo="absolute-position:absolute;left:0mm;top:100;width:27mm;">で位置決めをして、<section>の中の説明テキストを中に流し込みます.

<ph fo="font-weight:bold;">P (program shift)</ph>は""をボールドフェースで表示します.<xref href="program_shift.xml#program_shift" format="dita" type="concept" outputclass="page-only"/>で、ページ番号36を表示します.

結構うまく行くはずです.例えばイラストレータでテキストボックスの中のテキストまで書いてしまうと参照先ページをハイパーリンクにすることはできませんが、この方法だったら何の苦もなくリンクが作れます.

それではこの方法はどのような利点があるのでしょうか?

まず説明文や画像、参照先などの仕様変更があっても、それはすべて画像作成を含むオーサリング側で解決できることです.いったんfo属性のインプリメントスタイルシート側でやってしまえば、あとはほとんどどのような仕様変更があってもスタイルシートを直す必要がありません.

文書デザインの自由度が増すことです.いままでのスタイルシートの作り方は出力物のデザインと表裏一体でした.ですので新しいデザインを考えると、それは必ずスタイルシートの変更を伴いました.このfo属性をオーサリングするやり方では、スタイルシートの変更が不要なので、経費をかけずにデザインを実現することができます.

でもこの方法は問題点もあります.

まずfo属性をオーサリングしなければなりません.今までこのような技術マニュアルはスタイルシートを外部に委託することがほとんどだと思いますので、オーサリングする側はスタイルを「どう書くか?」に関してはノウハウを持っていません.特にXSL-FOの属性を書けといわれても.和書では解説本が出ていないので直ちにはわからないでしょう.困った点です.でもXSL-FOの洋書は数冊出ていますし、たいていの属性はCSS2と互換があるので習得するのにそれほど大変ではないでしょう.

あと、この方法はXMLにスタイルを記述するというある意味今までは禁じ手だったことをやっていることです.XMLの潔癖さを愛する人からは非難されるかもしれません.しかし、XMLはコンテンツのみ記述し、スタイルシートでスタイル付けをするというのは、現実に作られている技術文書のデザイン水準を考えると、夢物語にしか思えません.XMLはあくまでも手段であって目的ではないと思います.いくらオーサリングをXMLにしても、現実に要求されているデザインを実現できなければ、やはりお客様はInDesignやFrameMakerの世界に戻らざるを得ないでしょう.

ではこのような方法の実現例があるのでしょうか?実はあります.前、あるお客様がやはり少し凝ったマニュアルの表紙を作成しようとして同じような問題にぶつかり、私がfo属性の導入を提案して無事複雑な表紙を作成することができました.

たぶんこのアイディアは世界でも誰かは考えているかもしれません.現実に実装している例があったらすばらしいことだと思います.