fo:page-sequenceの調停(1)

XSL-FOで一連の同じページレイアウトを行う単位をfo:page-sequenceと呼びます.XSL-FOの構造を見るとわかりますが、fo:page-sequenceはまさにコンテンツ部分を表現しています.最低限の簡単なXSL-FOの構造は次のようになるからです.

fo:root
  |
  +-- fo:layout-master-set
  |      |
  |      +--(fo:simple-page-master | fo:page-sequence-master)+
  |
  +---fo:page-seqence+

fo:page-sequenceはどのような単位で作るのでしょうか?例えばDITAのbookmapだったら、frontmatterで1つのfo:page-sequence、あとchapter単位で1つのfo:page-sequenceという感じが一般的です.なぜならば、frontmatterは前付けの情報なので、よくi,ii,iii...という本文とは異なったページ番号付けを行います.またchapterは最初のものは1-1,1-2,1-3...1-Nと、二番目は2-1,2-2,2-3...2-Nというようにページ番号付けを行うからです.またたいていchapterが変われば改ページします.

このままだったら何も問題ありませんが、時としfo:page-sequenceの生成には困った問題が生じることがあります.例えば

1.全体はA4サイズで統一するのだけれど、中にA3で図面を入れたい.
2.全体は一段組みだが、索引(backmatter/booklists/indexlist)だけは二段組にしたい.

などという場合です.図面を入れる場合、

<chapter href="chapter1.xml">
  <topicref href="chapter1-1.xml"/>
  <topicref href="chapter1-2.xml"/>
  <topicref href="chapter1-3.xml"/><!--これがA3図面-->
  <topicref href="chapter1-4.xml"/>
  <topicref href="chapter1-5.xml"/>
</chapter>

とあって、chapterからA4のページマスターを参照してfo:page-sequenceを生成しますが、不特定の場所に図面が挿入される(この場合chapter1-3.xmlが該当)ことが考えられます.この場合、図面用にどうしてもA3のページマスターを生成しなければなりません.

しかし、XSL-FOの仕様ではfo:page-sequenceは入れ子には出来ないのです.つまりどうしても次のような「のべたん」のXSL-FOを作ってやらねばなりません.

<fo:page-sequence master-reference="A4のページマスター">
  <!-- chapter1.xml~chapter1-2.xmlのコンテンツ-->
</fo:page-sequence>
<fo:page-sequence master-reference="A3のページマスター">
  <!-- chapter1-3.xmlのコンテンツ:A3の図面-->
</fo:page-sequence>
<fo:page-sequence master-reference="A4のページマスター">
  <!-- chapter1-4.xml~chapter1-5.xmlのコンテンツ-->
</fo:page-sequence>

困るのはA3の図面の出現位置がたいていの場合あらかじめ特定できないことです.また図面のtopicrefが入れ子の深い位置にあったりすると、bookmapのレベルでfo:page-sequenceの生成を制御するのはますます困難になります.

<chapter href="chapter1.xml">
  <topicref href="chapter1-1.xml"/>
  <topicref href="chapter1-2.xml"/>
  <topicref href="chapter1-3.xml">
    <topicref href="chapter1-3-1.xml"/>
    <topicref href="chapter1-3-2.xml"/><!--これがA3図面-->
    <topicref href="chapter1-3-3.xml"/>
  </topicref>
  <topicref href="chapter1-4.xml"/>
  <topicref href="chapter1-5.xml"/>
</chapter>

また索引も同様です.索引は通常backmatterに置かれますが、ここだけ二段組にしようとすると索引用に二段組のページマスターを参照するfo:page-sequenceを作って、その中に索引のデータを入れてやらねばなりません.でもやはり索引の出現位置はあらかじめ特定しがたいのです.DITAではbackmatterは索引とその他のtopicrefに簡略化すると次のようなモデルだからです.

(topicref | booklists/indexlist)*

つまりbackmatterで一個のfo:page-sequenceを生成したとしてbooklists/indexlistが出現したら、まさにそこで二段組のfo:page-sequenceに切り替えてやる必要があります.ですから

<backmatter">
  <topicref href="backmatter1.xml"/>
  <topicref href="backmatter2.xml"/>
  <booklists>
    <indexlist/><!--ここに二段組で索引を生成-->
  </booklists>
  <topicref href="backmatter3.xml"/>
  <topicref href="backmatter4.xml"/>
</backmatter>

とあれば

<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter1.xml~backmatter2.xmlのコンテンツ-->
</fo:page-sequence>
<fo:page-sequence master-reference="A4/二段組のページマスター">
  <!-- 索引のコンテンツ-->
</fo:page-sequence>
<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter3.xml~chapter4.xmlのコンテンツ-->
</fo:page-sequence>

としてやらねばなりません.このようなことは可能なのでしょうか?実は可能です.私が以前から使用させていただいているスタイルシートを次回紹介します.