fo:page-sequence-master

この前fo:page-sequenceの話を出しましたのでついでに、そのページレイアウトを規定するfo:page-sequence-masterの話を書きたいと思います.と言っても仕様の解説という訳ではなく、陥りやすい間違いについてです.fo:page-sequenceはmaster-reference属性で参照するページマスターを記述します.印刷用に左右ページ、先頭ページ、左右を調整するための空白ページなどをおりまぜてパブリッシングするときには、fo:page-sequence-master/fo:repeatable-page-master-alternativesを使います.この子要素にはfo:conditional-page-master-referenceを使って、どのような条件の時にどのようなページレイアウトを適用するのかを記述します.例えば次のようなものです.

<fo:page-sequence-master master-name="pmsPageSeqChapter">
  <fo:repeatable-page-master-alternatives>
    <fo:conditional-page-master-reference master-reference="pmsChapterFirstLeft" 
                                          odd-or-even="even"  
                                          page-position="first"
                                          blank-or-not-blank="not-blank"/>
    <fo:conditional-page-master-reference master-reference="pmsChapterFirstRight" 
                                          odd-or-even="odd"  
                                          page-position="first"
                                          blank-or-not-blank="not-blank"/>
    <fo:conditional-page-master-reference master-reference="pmsChapterLeft" 
                                          odd-or-even="even"  
                                          page-position="any"
                                          blank-or-not-blank="not-blank"/>
    <fo:conditional-page-master-reference master-reference="pmsChapterRight" 
                                          odd-or-even="odd" 
                                          page-position="any"
                                          blank-or-not-blank="not-blank"/>
    <fo:conditional-page-master-reference master-reference="pmsChapterBlankLeft" 
                                          odd-or-even="even"  
                                          page-position="any"
                                          blank-or-not-blank="blank"/>
    <fo:conditional-page-master-reference master-reference="pmsChapterBlankRight" 
                                          odd-or-even="odd"  
                                          page-position="any"
                                          blank-or-not-blank="blank"/>
  </fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>

この定義では、①先頭偶数ページ、②先頭奇数ページ、③(空でない)偶数ページ、④(空でない)奇数ページ、⑤空白の偶数ページ、⑥空白の奇数ページの順に参照するfo:simple-page-materを定義しています.そこで何が間違いやすいか?といいますとこの定義順です.①②は必ず③④の前に書く必要があります.③④と⑤⑥は条件が相反しているので、順番はどうでも良いです.

もし③④のあとに①②を書いたらどうなるでしょうか?この先頭ページのページマスターは決して組版の際には使われない運命となります.これはFormatterが組版の際にfo:page-sequence-master/fo:repeatable-page-master-alternativesを上から順にチェックして「最初に条件に一致」したfo:simple-page-materを使うからに他なりません.つまり条件の厳しいfo:conditional-page-master-referenceは、それより条件の緩いfo:conditional-page-master-referenceより前に書かねばならないのです.

この手のページマスターの定義は一回書いたら滅多に変更は起きません.なのでたまたま新規に作ったり、修正したりする時にこの書き順を間違えて期待した組版結果が得られず、「おかしいな~?」ということになることがあるのです.(少なくとも私は2回間違えました.プロの人なら間違えることはないでしょう.)

このことはXSL仕様では注として次のように記述されています.

6.4.11 fo:repeatable-page-master-alternatives

Because the conditions are tested in order from the beginning of the sequence of children, the last alternative in the sequence usually has a condition that is always true and this alternative references the page-master that is used for all pages that do not receive some specialized layout.