前回、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つになったわけではありません。つまり次のようなことが起こり得ます。
上部の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 の基礎 第2版 – XML を組版するためのレイアウト仕様 第2版』(アンテナハウス株式会社, 2017)
- Extensible Stylesheet Language (XSL) Version 1.1 – 6.4.22 fo:flow-map
- JIS X 4179『拡張可能なスタイルシート言語(XSL) 1.1』
前々回:XSL-FO試行錯誤 脚注のインデント
前回:XSL-FO試行錯誤 fo:flow-map 概要編
XSL-FO試行錯誤 fo:flow-map 概要編
今回はflow-mapについてです。今回の記事は「概要編」としてflow-mapとはどんなものなのか紹介します。
region-bodyは複数記述可能
<fo:region-body>
は<fo:simple-page-master>
に複数記述可能です。region-body同士は重なり得るので、適切に配置します。<fo:flow>
の@flow-name
で利用するregion-bodyを指定します。
たとえば、翻訳文を併記したいけれどテキストの長さが元の文と異なってしまうときなどにも対応可能ですね。表組や段組で左右の文の位置が揃うよう並べるよりも構造がすっきりしているのではないでしょうか。表組の解除や段抜きなどはないため、図版だけページ中央に表示したいなどの要求があるとややこしくなりますが。
flow-mapについて
本記事の本題はflow-mapです。名前の通りflowのマッピングを行える機能です。簡易な理解ではページシーケンスマスタでのページシーケンスとページマスタの関係を、flowとregionに置き換えたものとなります。ページシーケンスマスタのように条件よる参照分岐はできません。
JIS X 4179『拡張可能なスタイルシート言語(XSL) 1.1』で紹介されているflow-mapの使い方は3パターンほどです。簡単な例としては次のような形があります。
- 別々のregionであるregionA、regionBに対し、同じflowを流し込む
- 1つのregionに対し、別々のflowであるflow1、flow2を流し込む
- regionA、regionBにflow1、flow2を流し込む
この中でもっとも使い方として分かりやすいのは「regionA、regionBに対し同じflowを流し込む」という形でしょう。
<fo:flow-map>
に@flow-map-name
を指定し、<fo:page-sequence>
でそのflow-mapを参照するようにします。
流し込まれるソースのflowの@flow-name
と同じ値を<fo:flow-source-list>
の子、 <fo:flow-name-specifier>
の@flow-name-reference
に、流し込み先のregionを<fo:flow-target-list>
の子、<fo:region-name-specifier
の@region-name-reference
に指定します。今回はregion2つに対してflow1つを割り当てました。
<fo:page-sequence>
に@flow-map-reference
で参照するflow-mapを指定する必要があります。
複数flow-mapを用意すれば、同じflow-nameのflowに対し、flow-mapの参照を変更することで別のregionに流し込むことも可能です。
さらに細かいregionとflow-mapを利用することで、次のようなレイアウトも可能です*。
試行錯誤であるところはここからで、このregionはマッピングされているとはいえそれぞれ独立です。たとえばフォントサイズを大きくするとテキストの位置がずれ、次の行のテキストと重なるかもしれません。
- * このようなレイアウトを実現するほかの方法として
<fo:block>
に都度インデントを指定するような方法も考えられます。そのときはテキストの内容を行ごとにあらかじめ分割しておく必要があるでしょう。
上は極端な例ですが、領域が独立していて困ることはほかにもあります。この話題については来週に続きます。
参考資料
- 『XSL-FO の基礎 第2版 – XML を組版するためのレイアウト仕様 第2版』(アンテナハウス株式会社, 2017)
- Extensible Stylesheet Language (XSL) Version 1.1 – 6.4.22 fo:flow-map
- JIS X 4179『拡張可能なスタイルシート言語(XSL) 1.1』
前回:XSL-FO試行錯誤 脚注のインデント