第4章 ページレイアウトの切り替え

4–1 本のページレイアウト

一冊の本には本文と本文以外のさまざまな構成要素がある。構成要素によってページのレイアウトを変えたり、ページの位置(右と左、あるいは先頭ページと最後のページ)でレイアウトを変更したり、ページ総数を偶数に制約したり、などの指定事項がある。

表4・1 本に要求されるページレイアウト
構成要素ページレイアウトの要求(例)
表紙(本扉)、半扉(書名のみの扉)独立した挟み込みのページ。裏表ペア。
目次目次ページには柱やノンブルを付けないことが多く、上下余白を本文ページと変えることがある。
右ページと左ページ製本のために、左右のマージンを鏡像関係に設定する。
柱の位置、ノンブルの位置を鏡像関係にする。
章の先頭ページを改丁して(奇数ページから)開始するか。
章の先頭ページには柱を付けない。
索引本文が一段組でも索引は二段組にする。
奧付柱やノンブルを付けない。
改丁するか、改ページするか。

ページシーケンスから参照する単純ページマスターを切り替える機能だけで、表紙・半扉、目次、奧付、索引のページレイアウト要求は実現できる。しかし、右ページと左ページのレイアウト切り替え要求や、章の先頭ページのレイアウト変更要求は実現できない。これらの要求を実現するには、次に説明するページシーケンス・マスターを使う。

4–2 ページマスターの参照方法

fo:page-sequenceからページマスターを参照するには、master-referenceプロパティで直接fo:simple-page-masterを参照する方法(図4・1 ページマスターの参照(上))と、fo:page-sequence-masterを経由して間接的に参照する方法(図4・1 ページマスターの参照(下))がある。

i01-image8.png

図4・1 ページマスターの参照

単純ページマスターが一回使われる毎に1ぺージが生成される。例えば、図4・1 ページマスターの参照(下)のようにfo:repeatable-page-master-referenceからfo:simple-page-masterを参照している場合、fo:page-sequenceの中から単純ページマスターが呼ばれる毎に1ページが生成される。

4–3 ページシーケンス・マスター

fo:page-sequence-masterページシーケンス・マスター)は、いろいろな単純ページマスターの繰り返し回数を規定したり、繰り返し順序を制約したりする。具体的にはfo:page-sequence-masterの子供として次の3種類のサブシーケンス指定のFOを組み合わせて制約条件を設定する。ページシーケンス・マスターにはプロパティmaster-nameプロパティで名前を付けなければならない。fo:page-sequenceのmaster-referenceからその名前によって参照される。

サブシーケンス指定のFOは繰り返しの制約などのためのものなので空要素である。サブシーケンス指定のFOにはプロパティmaster-referenceプロパティを設定し、単純ページマスターの名前を参照しなければならない。

4–3–1 1ページ参照

fo:single-page-master-reference(1ページ参照)は単純ページマスターを1ぺージだけ挿入する。fo:page-sequenceのfo:flowの内容が1ページを超えるときは、弟のサブシーケンスが使われる。fo:flowの内容が1ページを超えるにも関わらず、弟のサブシーケンスがないとエラーである。

次は最初のページと2ぺージ目以降(fo:repeatable-page-master-referenceを使う)でページのマスターを切り替える例である。"change-master"を参照するページシーケンスの内容は、1ページ目だけ"first-page"という名前の単純ページマスターを使い、2ページ目以降は"normal-page"という名前の単純ページマスターを使う。

<fo:page-sequence-master master-name="change-master">
  <fo:single-page-master-reference 
              master-reference="first-page" />        
  <fo:repeatable-page-master-reference 
              master-reference="normal-page" />
</fo:page-sequence-master>

4–3–2 繰り返しページ参照

fo:repeatable-page-master-referenceは、一つの単純ページマスターの繰り返しを規定する。プロパティmaximum-repeatsプロパティで最大繰り返し回数を指定する。

表4・2 maximum-repeatsプロパティ
プロパティ値説明
no-limit(初期値)制限は付けない。
0以上の整数最大繰り返し回数を指定する。0以下は0とする。0は使わないことを意味する。

4–3–3 繰り返しページマスター択一

fo:repeatable-page-master-alternatives(繰り返しページマスター択一)は、単純ページマスターの組み合せの繰り返しを規定する。子供に一つ以上のfo:conditional-page-master-reference(条件付きページマスター参照)を置き、条件付きページマスター参照から単純ページマスターを指定する。条件付きページマスター参照では次の三つのプロパティの組み合わせによって出現条件を設定する。その条件が満たされたときに、master-referenceプロパティで指定した単純ページマスターを参照する。

fo:repeatable-page-master-alternativesには、maximum-repeatsプロパティ(オプション)で0以上の最大繰り返し回数を指定できる。初期値はno-limitである。

fo:conditional-page-master-referenceは、単純ページマスターの出現条件を設定するために使う。プロパティpage-positionプロパティodd-or-evenプロパティblank-or-not-blankプロパティを設定できる。

表4・3 page-positionプロパティ
プロパティ値説明
only、first、last、rest、anyのどれかfirst、lastはそれぞれ先頭と最後のページに使う単純ページマスターの名前を参照する。restはその他。onlyはページシーケンスの中で唯一の(firstかつlast)ページになるとき使う単純ページマスターの名前を参照する。
表4・4 odd-or-evenプロパティ
プロパティ値説明
odd参照する単純ページマスターは奇数ページに適格である。
even参照する単純ページマスターは偶数ページに適格である。
any奇数ページでも偶数ページでも適格である。
表4・5 blank-or-not-blankプロパティ
プロパティ値説明
blank空白ページ挿入用に使う単純ページマスターの名前を参照する。空白ページとはbreak-before、break-after、先頭または最後に、奇数・偶数という条件を満たすため挿入されるfo:flowの内容がないページである。
not-blank参照する単純ページマスターは生成するページが空白でないときに適格である。
any常に適格である。

page-position、odd-or-even、blank-or-not-blankで設定する条件は同時にあてはまることがある。その場合、最初にあてはまるfo:conditional-page-master-referenceで指定した単純ページマスターが使われる。

表4・1 本に要求されるページレイアウトで示した、左右ページのレイアウトの切り替え、章の先頭ページのレイアウト変更は、fo:conditional-page-master-referenceで指定する。次に利用方法の例を示す。

4–4 左右ページのヘッダー・フッターの配置切り替え

左右のページでマージン、ヘッダーやフッターの内容と文字の配置を変更する例を示す。

  1. 左ページ用、右ページ用の2種類の単純ページマスターを用意、ヘッダーとフッター用の区画にユニークな名前を付ける。
  2. fo:repeatable-page-master-alternativesの子供として、左ページ用と右ページ用の二つのfo:conditional-page-master-referenceを用意する。
  3. fo:page-sequenceの中のfo:static-contentsに右ページ用と左ページ用の二つ用意し、flow-nameにページマスター上の対応する区画名を指定する。

images/RepeatablePmAlternatives--epub--.png

図4・2 左右ページのヘッダー・フッター配置切り替え

4–5 先頭ページのヘッダーとフッターの内容を変える

本の章で先頭ページでは柱を出さず、2ページ目から柱を出したいときは、次の例のように設定すれば良い。

  1. 先頭ページ用の単純ページマスターを用意する。
  2. fo:conditional-page-master-referenceで先頭ページの単純ページマスターを指定する。
  3. fo:page-sequenceに先頭ページ・ヘッダーの内容(この例では空)をもつfo:static-contentsを用意し、flow-nameをFirst-headerとする。
<fo:layout-master-set>
…奇数ページ用の単純ページマスターと偶数ページ用の単純ページマスター(省略)
  <!--次は先頭ページ用の単純ページマスター-->
  <fo:simple-page-master margin="10mm 00mm 10mm 00mm" 
                         master-name="PageMaster-First"
                         page-height="297mm" 
                         page-width="210mm">
  <fo:region-body margin="15mm 25mm 15mm 25mm"/>
  <fo:region-before region-name="First-header" 
                    extent="10mm"/>
  <fo:region-after region-name="First-footer" 
                   extent="10mm"/>
  <fo:region-start region-name="First-start" 
                   extent="25mm"/>
  <fo:region-end region-name="First-end" 
                 extent="25mm"/>
  </fo:simple-page-master>
  <fo:page-sequence-master master-name="PageMaster">
    <fo:repeatable-page-master-alternatives>
      <fo:conditional-page-master-reference 
             master-reference="PageMaster-First"
             page-position="first"/>  
      <fo:conditional-page-master-reference 
             master-reference="PageMaster-Left" 
             odd-or-even="even"/>
      <fo:conditional-page-master-reference 
             master-reference="PageMaster-Right" 
             odd-or-even="odd"/>
    </fo:repeatable-page-master-alternatives>
  </fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="PageMaster" 
                  initial-page-number="1">
  <fo:static-content flow-name="First-header">
  </fo:static-content>
  <fo:static-content flow-name="Left-header">
    <fo:block>左ページ用ヘッダー</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="Right-header">
    <fo:block >右ページ用ヘッダー</fo:block>
  </fo:static-content>
  <fo:static-content flow-name="First-footer">
  </fo:static-content>
  …略…
</fo:page-sequence>

4–6 段組

XSL-FOの段組は、fo:region-bodyのcolumn-count(段数)とcolumn-gap(段間の空き)の二つのプロパティによって指定する。この指定方法ではページ単位の設定のみができる。

4–6–1 段数

プロパティcolumn-countプロパティで段数を設定する。

表4・6 column-countプロパティ
プロパティ値説明
<number>(初期値は1)段数を指定する。自然数でない数字を指定したときは1以上の近い数とする。

4–6–2 段間の空き

プロパティcolumn-gapプロパティは段間の空きを設定する。

表4・7 column-gap プロパティ
プロパティ値説明
<length>(初期値は12 pt)長さを指定する。負の数は0とする。
<percentage>設定対象区画に対する割合を指定する。

4–6–3 段抜き

プロパティspanプロパティで段抜きするかどうかを指定する。fo:flowの子孫のブロックレベルのFOに指定する。

表4・8 spanプロパティ
プロパティ値説明
none(初期値)1段に配置する。
all多段組の全段に渡って配置する。

次の例では、単純ページマスターのfo:region-bodyを2段組に設定する。

<fo:simple-page-master margin-top="7mm" 
                       margin-bottom="7mm"
                       margin-right="5mm" 
                       margin-left="10mm"
                       page-height="297mm" 
                       page-width="210mm"
                       master-name="Twocol-PageMaster">
  <fo:region-body margin-top="8mm" 
                  margin-bottom="8mm"
                  margin-right="10mm" 
                  margin-left="10mm"
                  column-count="2" 
                  column-gap="16pt"/>
  ...
</fo:simple-page-master>

段組に流し込むページシーケンスは次の通り。

<fo:flow flow-name="xsl-region-body">
  <fo:block span="all" 
            font-size="22pt" 
            font-family="Arial,'MS ゴシック',sans-serif" 
            space-after="14pt" 
            space-after.conditionality="retain" 
            break-before="page" 
            border-after-style="solid" 
            border-after-width="2pt">
   はじめに
   </fo:block>
   <fo:block text-indent="1em" 
             text-align="justify">
「Extensible Stylesheet Language仕様」(XSL仕様)はXMLドキュメントを表示・印刷するための仕様としてW3Cが勧告したものです。XSL仕様はXMLドキュメントを表示・印刷するためのオブジェクトとプロパティを定義しています。このため、この仕様に基づいて作成された結果をXSL-FO(XSL-Formatting Object)と呼ぶのが通例です。
  </fo:block>
  <fo:block text-indent="1em" 
            text-align="justify">
さてXMLドキュメントから、このXSL-FOを作成して印刷するには、次の手順が一般的です。
  </fo:block>
  <fo:block span="all" 
            font-size="18pt" 
            font-family="Arial,'MS ゴシック',sans-serif" space-after="14pt" 
            border-after-style="solid" 
            border-after-width="0.5pt">
  見出し2
  </fo:block>
  <fo:block text-indent="1em" 
            text-align="justify">
「Extensible Stylesheet Language仕様」(XSL仕様)はXMLドキュメントを表示・印刷するための仕様としてW3Cが勧告したものです。XSL仕様はXMLドキュメントを表示・印刷するためのオブジェクトとプロパティを定義しています。このため、この仕様に基づいて作成された結果をXSL-FO(XSL-Formatting Object)と呼ぶのが通例です。
  </fo:block>
  <fo:block text-indent="1em" 
            text-align="justify">
さてXMLドキュメントから、このXSL-FOを作成して印刷するには、次の手順が一般的です。
  </fo:block>
</fo:flow>

見出しのfo:block二つにspan="all"を設定して段抜きとする。また、最初の見出しと本文の間に空きを12ptに設定しているが、これを有効とするためspace-after.conditionality="retain"を指定する。これを組版すると図4・3 段組の組版結果のようになる。

段組の組版結果

図4・3 段組の組版結果

2段組の左段の途中でテキストが終了しても自動的には左右の段が均等にならない。均等にするにはspan="all"を指定した空のfo:blockを文末に置くと良い。