imageもしくはfigの特殊化⇒DITAにないフロート画像


Googleで"マニュアル"、"PDF"、"ダウンロード"とサーチしてみると、一番最初にニコンのデジカメの取扱説明書がヒットします.このPDFは特に転載などの制限条項がありませんでしたので少し参考になるページを出させていただきました.


今回考えてみたのはこのxxivページのレイアウトです.

DITAで書くならtask/taskbody/steps/stepでしょうけれども、steps/stepとそれを説明する画像の位置関係が一様ではありません.

イメージ 1



stepの説明が画像を回り込んでいるのが"6","7"です.しかし、"8"は画像がstepの右下に配置されています.両者はあきらかに別物です.

一般的にはstepので実行する内容はstep/cmdに書き、step/info/figにその説明の図を入れます.

このような場合、"6"、"7"と"8"では画像の配置方法を変えねばなりませんが、これはどうすればできるのでしょうか?実はこのような文書の画像配置は極めてよく目にするにもかかわらず、DITA1.2では明確な記述方法が書かれていません.

では、DITAの下の階層のXSL-FOでどのようにして実現するかと言うと、"6"、"7"は、fo:float/fo:block/fo:external-graphicです.fo:floatには@float="end"を指定して右側に画像をオフセットさせます.

"8"の場合は単にfo:block/fo:external-graphicで、fo:block/@text-align="end"を指定して画像を右寄せにします.

DITAの仕様ではimageには@placementという属性があって、これが"inline"か"break"の値をとります."inline"の場合は、行内画像であり本来そこの文字サイズをほぼ同じ大きさの画像を指定することが期待されます."break"の場合は、ブロック画像でページに収まる任意の大きさの画像を指定します.

属性値で存在するのはこの二つだけで、"6","7"のフロートする画像を表すような属性はどこにもありません.しかしPDFに変換する場合、fo:floatでこのようなテキストを回り込ませる画像を表現するのであれば、どうしてもオーサリングのレベルでこれを区別してやる必要があります.

つまり標準のDITAのスキーマにはないので、特殊化が必要になるということです.では実際問題どのように特殊化すれば良いのでしょうか?

最初はimage/@placement="inline,break,float"という風にplacement属性を拡張するように考えてみました.こうすると、@placement="float"の場合、単にその画像を右か左に配置するfo:floatを生成してやればよい訳です.

この方法の利点は、imageがcmdの中にかけることです.fo:floatはその説明文と同じ高さに肩を並べるように配置してやらねばなりません.そうすると、

<step><cmd><image placement="float" align="right" href="~.svg"/>フォーカスモードセレクターをAF(オートフォーカス)にする</cmd></step>

などと書くことができます.このimageをfo:float/fo:block/fo:external-graphicに変換してやれば済みます.

ところが、この方法は画像に説明文がついていると使えないという弱点がありました.例えば"6"には画像の上に「フォーカスモードセレクター」という画像に付随しているテキストがあります.これはどう見ても画像と一体です.

画像と一体のテキストを記述するためには、DITAではfigを使用します.例えば

<fig>フォーカスモードセレクタ
  <image href="~.svg" placement="break"/>
</fig>

となります.そうすると本質的に必要なのはimageの特殊化ではなく、figの特殊化のようです.例えば"6"は以下のように書けるでしょう.figに属性のfloatを追加しています.

<step>
  <cmd>フォーカスモードセレクターをAF(オートフォーカス)にする</cmd>
  <info>
    <fig float="end">フォーカスモードセレクタ
      <image href="~.svg" placement="break"/>
    </fig>
  </info>
</step>

問題は、このようにオーサリング上は表現できても、DITA⇒XSL-FOのスタイルシートは、それなりに難しいことです.何故かというと、このようにcmdの後のinfo/figで表現しても、figから生成するfo:floatオブジェクトの

<fo:float float="end">
  <fo:block>
    フォーカスモードセレクタ
  </fo:block>
  <fo:block>
    <fo:extenal-graphic src="~.svg"/>
  </fo:block>
</fo:float>

は、step/cmdの先頭、つまり"フォーカスモードセレクターをAF(オートフォーカス)にする"というテキストの先頭に必ず生成したやらねばならないからです.こうしないと、画像と説明文が肩を並べて配置される保障がありません.

つまり、cmdのテンプレートで、info/fig/@float="start,end"がないかを調べて、あったらcmdのテキストを処理する前に、そこにfo:floatを生成してやります.

このような特殊化はDTDでしたら[DITA-OT]/dtd/base/commonElements.modを以下のように変えれば実現できるでしょう.もちろん公開識別子の追加はいうまでもありません.

<!ENTITY % fig.attributes
             "%display-atts;
              spectitle 
                        CDATA 
                                  #IMPLIED
              %univ-atts;
              outputclass 
                        CDATA 
                                  #IMPLIED
              float 
                        (start |
                         end  | 
                         none |
                         -dita-use-conref-target) 
                                  'none'
              "
>
<!ELEMENT fig    %fig.content;>
<!ATTLIST fig    %fig.attributes;>

以上