fo:block-container

今回はfo:block-containerを紹介します.fo:block-containerはその名の示すとおり、ブロックオブジェクトのコンテナ(入れ物)です.ここでブロックオブジェクトというのは、
fo:block
fo:block-container
fo:table-and-caption
fo:table
fo:list-block
 
などのオブジェクトです.なにかイメージが湧かないという方はWordのテキストボックスを思い浮かべていただけたら良いでしょう.Wordのテキストボックスは、起点(アンカー)を指定して、そこからの縦/横の距離を指定して中に段落を格納することができます.
 
fo:block-containerはどのようなときに使うのでしょうか?通常の上から下にスタックされるだけのテキストフローでは表せないようなレイアウト、例えば本の表紙などを作成するときに便利です.
 
イメージ 1
 
この表紙では、fo:region-bodyに高さ55mmと青のボーダーを指定したfo:block-containerを配置し、その中に4つのfo:block-containerをabsolute-position="absolute"を指定して入れ子で文字や画像を配置しています.(私の大好きなSCORPAのトライアルバイクのマニュアルを作ってみました.)

FOはこんな感じになります.
<fo:flow flow-name="xsl-region-body">
<fo:block-container border-before-style="solid" border-after-style="solid" absolute-position="auto" height="55mm"  border-before-width="2.8mm" border-before-color="blue" border-after-width="2.8mm" border-after-color="blue">
<fo:block-container absolute-position="absolute" top="2mm" left="0mm" width="50mm">
<fo:block><fo:external-graphic src="tys.jpg" content-height="50mm"/></fo:block>
</fo:block-container>
<fo:block-container absolute-position="absolute" top="4.5mm" left="130mm">
<fo:block font-family="Arial Black" font-size="18pt" font-style="italic">
SCORPA
</fo:block>
</fo:block-container>
<fo:block-container font-weight="bold" font-family="inherit" absolute-position="absolute" top="18mm" left="58mm" width="90mm">
<fo:block  font-family="Arial" white-space="pre" wrap-option="wrap" font-size="20pt">SCORPA TYS125-F
User's Manual</fo:block>
</fo:block-container>
<fo:block-container absolute-position="absolute" top="47mm" left="130mm" right="20mm">
<fo:block font-size="10pt" font-family="Arial">TYS125F-20111022</fo:block></fo:block-container>
</fo:block-container>
</fo:flow>

親のfo:block-containerにabsolute-position="auto"が指定してあるのにお気づきでしょうか?こうすると絶対位置に配置されるのではなく、fo:blockと同じように本文領域にスタックされます.fo:blockと違う点は、サイズを指定できる点です.この場合、height="55mm"を指定してあります.横方向はwidthを指定していないのでfo:region-bodyいっぱいに広がります.
 
あと、Wordのテキストボックスと違うのは、fo:block-containerは絶対位置を指定して本文とぶつかった場合に表示が重なってしまうことです.Wordのテキストボックスは、重ねる指定や、本文を避けて配置するような指定ができますが、fo:block-containerはそのようなことはできません.
 
でも機能的には、fo:block-containerのモデルの方がずっと高機能なんです.ともかく入れ子でブロック要素を入れられますから.Wordではテキストボックスの中にテキストボックスを入れる芸当なんてとてもできません.
ちなみに「本文テキストを避ける」ような機能を持つのは、fo:flowというオブジェクトです.これについてはまた紹介する機会があるでしょう.