第2章 FOツリーの基本構造

2–1 fo:rootとその子供たち

XSL-FOドキュメントの上部ツリー構造を図2・1 FOツリーの基本構造に示す。ルート要素はfo:rootである。その子供を大きく分けると、①ページの雛形をまとめるFOサブツリー、②ドキュメントの内容を含むFOサブツリー、③その他のFOツリーに分かれる。

images/fo-tree-top--epub--.png

図2・1 FOツリーの基本構造

2–1–1 ページの雛形をまとめるFOサブツリー

fo:layout-master-setレイアウトマスター・セット)は必須のFOである。レイアウトマスター・セットは、単純ページマスター(3–1 単純ページマスター参照)やページシーケンス・マスター(4–3 ページシーケンス・マスター参照)などのページの雛形をグループ化する。またフローマップ(3–6–1 フローマップ)を含むことができる。

単純ページマスターには組版に使うページの雛形を一種類ずつ設定する。ページシーケンス・マスターはページの雛形の並び順を設定する。

2–1–2 ドキュメントの内容を含むFOサブツリー

fo:page-sequence(ページシーケンス)はドキュメントの内容を含む必須のFOである。冊子の組版では、目次、前書き、本文、後書き、付録、索引など冊子の構成部分毎にページシーケンスを作る。複数のfo:page-sequenceのプロパティに同じ値を設定したいときは、それらをfo:page-sequence-wrapperで囲んでプロパティを設定し、子供のfo:page-sequenceに継承できる。但し、継承できるプロパティのみが対象である。

2–1–3 その他のFOツリー

ルート要素の子供として、オプションのfo:declarationsfo:bookmark-treeを置くことができる。fo:declarationsにはカラープロファイルを指定する。fo:bookmark-treeは、PDFのしおり(ブックマーク)作成などに使用する(第19章 しおりのFOを参照)。

2–2 簡単な冊子FOドキュメントと組版例

次に表紙と本文からなる簡単な冊子の例でもう少し具体的に説明する。表紙にはタイトルや発行日をレイアウトする。本文には見出しに続いて、文章の段落を配置する。本文の下部(フッター)にはノンブルを配置する。表紙用と本文用の2種類の単純ページマスターを作り、表紙用の単純ページマスターの名前としてmaster-name="cover"、本文用のページマスターの名前としてmaster-name="body"とする。

表紙の内容を構成するFOと本文の内容を構成するFOをそれぞれページシーケンスとして用意する。表紙のページシーケンスにはmaster-reference="cover"を設定する。本文のページシーケンスにはmaster-reference="body"を設定する。

全体のFOツリーは図2・2 表紙と本文からなる冊子のFOツリーのようになる。

i01-image2.png

図2・2 表紙と本文からなる冊子のFOツリー

流し込みの順序はFOツリーのページシーケンス順である。最初のページシーケンス(cover)を、指定したページマスター(cover)に流し込むと、ページマスター(cover)を雛形としたページ(表紙)が作成される。表紙の所定区画にページシーケンス(cover)の部分ツリーが規則に則り配置される。もし、ページマスター(cover)の領域にページシーケンスの内容が収まりきらなければ、2ページ目が作成されまた所定の領域に残りの内容が配置されていく。表紙は1ページなのでページシーケンスの内容が1ページに収まるように準備するべきである。

ページシーケンス内で配置するFOがなくなった場合、次のページシーケンス(body)の処理を始める。ページシーケンスが変わるところでは改ページされる(改丁の指定もできる)。ページシーケンスの内容を流し込み終えたら組版終了となる。

ページシーケンスの子供には、fo:static-contentsとfo:flowがある。流し込みの主役はfo:flowの内容である。fo:flowの内容を本文区画(fo:region-body)に配置してページを作っていく。fo:static-contentsの内容はページが作られたときに指定された周囲区画(fo:region-beforeなど)に配置される。

前記の例をFO で表すと次のようになる。ルート要素はfo:rootであり、その最初の子供として一つのfo:layout-master-set(レイアウトマスター・セット)を置く。次の子供として一つ又はそれ以上のfo:page-sequenceを置く。

fo:page-sequenceは表紙用、本文用を兄弟として用意する。fo:page-sequenceのmaster-reference プロパティに、ページシーケンスを流し込むページマスターの名前を指定する。

<fo:root>
  <fo:layout-master-set>
    <fo:simple-pagemaster master-name="cover">
    ......................
    </fo:simple-pagemaster>
    <fo:simple-pagemaster master-name="body">
     ......................
    </fo:simple-pagemaster>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="cover">
  ......................
  </fo:page-sequence>
  <fo:page-sequence master-reference="body">
  ......................
  </fo:page-sequence>
</fo:root>

fo:simple-page-masterはレイアウトマスター・セットの子供である。次の例は、coverとbodyという2種類の単純ページマスターを定義したレイアウトマスター・セットである。coverは表紙用である。表紙にはヘッダー・フッターなどはないのでfo:region-body区画のみを設定する。bodyにはfo:region-body、fo:region-before、region-afterを設定する。fo:region-beforeはヘッダー、region-afterはフッターの領域である。

<fo:layout-master-set>
  <fo:simple-page-master margin="50mm 40mm 25mm 40mm" 
                         master-name="cover"
                         page-height="297mm"
                         page-width="210mm">
    <fo:region-body margin="0mm 0mm 0mm 0mm"/>
  </fo:simple-page-master> 
  <fo:simple-page-master margin="10mm 00mm 10mm 00mm" 
                         master-name="body"
                         page-height="297mm"
                         page-width="210mm">
    <fo:region-body margin="15mm 25mm 20mm 25mm"/>
    <fo:region-before region-name="header" extent="10mm" />
    <fo:region-after region-name="footer" extent="15mm" />
  </fo:simple-page-master>
</fo:layout-master-set>

表紙と本文のfo:page-sequenceは次のようになる。

<fo:page-sequence master-reference="cover" 
                  force-page-count="even">
  <fo:flow flow-name="xsl-region-body">
    <fo:block space-after="120mm" 
              font-size="24pt" 
              font-family="Arial,'MS ゴシック',sans-serif" 
              text-align="center" 
              background-color="#EEEEEE" 
              border-style="solid" 
              border-color="#888888" 
              padding-top="5pt" 
              padding-bottom="5pt" >
      <fo:block>
XSL-FOによる<fo:block/>XMLドキュメント印刷のための<fo:block/>スタイルシート作成</fo:block>
    </fo:block>
    <fo:block space-after="5mm" 
              font-size="12pt" 
              font-family="'MS 明朝'" 
              text-align="center">2016年3月</fo:block>
    <fo:block font-size="14pt" 
              font-family="'MS 明朝'" 
              text-align="center">
    アンテナハウス株式会社
    </fo:block> 
  </fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="body" 
                  initial-page-number="1">
  <fo:static-content flow-name="header">
    <fo:block font-size="12pt" text-align="center">
    ヘッダー
    </fo:block>
  </fo:static-content>
  <fo:static-content flow-name="footer">
    <fo:block text-align="center">
      <fo:leader text-align="center" leader-pattern="rule" leader-length="60%" />
    </fo:block>
    <fo:block font-size="14pt" text-align="center">
      <fo:page-number/>   
    </fo:block>
  </fo:static-content>
  <fo:static-content flow-name="end" />
  <fo:static-content flow-name="start" />
  <fo:flow flow-name="xsl-region-body">
    <fo:block font-size="22pt" 
              font-family="Arial,'MS ゴシック',sans-serif" 
              space-after="14pt" 
              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:flow>
</fo:page-sequence>

この例ではページシーケンス(cover)の制約条件をforce-page-count="even"で偶数を指定しているので、2ページ目が空白となる。ページシーケンス(body)にはinitial-page-number="1"としているので、本文は3ページ目から始まるが、フッターのノンブルは1となる。

組版結果のPDF

図2・3 組版結果のPDF