XSL-FO試行錯誤 fo:flow-mapの注意事項

前回、flow-mapの概要と、簡単な例、若干極端な利用方法と失敗例を紹介しました。

今回も注意深く使わなければ失敗してしまうという例を紹介します。

2つのregionであるregionA、regionBへ1つのflowを流し込むようなケースです。(というより、ほかの2つはこのパターンよりも複雑なので、利用しようとしたとき「うっかり失敗する」というケースは少ないのではないでしょうか。)

脚注はそれぞれのregionごとに配置される

一見1つのregion-bodyに見えますが、実は上下2つのregion-bodyで構成され、flow-mapでxsl-region-bodyを流し込んでいます。前回見たようにregionのサイズを超えるオブジェクトを挿入すると表示が壊れるかもしれませんし、あまりメリットがないように思えます。このflow-mapがどんなときに有用かというのは今後紹介するかもしれません。

とりあえず上手くいったように見えるFOですが、大きな欠点があります。

脚注をページ下部に配置するとき、正確にはregion-bodyのbottomから脚注の分の領域が確保されます。flow-mapはあくまでマッピングを行うだけで、region-bodyが1つになったわけではありません。つまり次のようなことが起こり得ます。

脚注をflow-mapで1つに見せかけたregionに流し込む
 <fo:flow flow-name="xsl-region-body">
   <fo:block >Lorem ipsum dolor sit amet<fo:footnote>
       <fo:inline ...>*<axf:footnote-number id="a"/></fo:inline>
         <fo:footnote-body>
           <fo:block ...>Lorem ipsum ...</fo:block>
         </fo:footnote-body>
     </fo:footnote>, consectetur ...
  </fo:block>
</fo:flow>

上部のregionAの下部に脚注は配置されました。たとえば左右に分けられているregionではそれぞれのregionの下部に表示してほしいでしょうし、当然の挙動ではあります。

複雑な回避方法を考えるよりも、このページシーケンスとflow-mapを使うときに「脚注を使用しない」「図表を使用しない」と制限した方が事故を防げるでしょう。
AH XSL Formatter拡張仕様ではregion-startやregion-endを注の配置に利用可能なので、「脚注ではなく傍注を利用する」といった方法も考えられます。

https://www.antenna.co.jp/AHF/help/ja/ahf-ext.html#axf.footnote-position

flow-mapで幅の違う疑似段組も実現可能だが、段抜きはできない

AH XSL Formatterではregion-bodyのほか、ブロックコンテナに段組を指定可能ですが、段組は通常段の行進行方向の長さが均等になります。
https://www.antenna.co.jp/AHF/help/ja/ahf-fo11.html#fo.block-container
flow-mapを活用することで、段の幅が異なる段組を擬似的に実現可能なのですが、span="all"を指定しても段抜きができないなど、これもまた使い所を考える必要があります。

幅の異なる(疑似)段組

これらのFOでは、表組などでもうっかり破綻する可能性があるので、くれぐれも注意深く使用しましょう。

参考資料


前々回:XSL-FO試行錯誤 脚注のインデント
前回:XSL-FO試行錯誤 fo:flow-map 概要編