第15章 柱の内容を取得

fo:marker(マーカー)とfo:retrieve-markerを組にして使うことで、章や節の見出しなどからページの柱(ランニングヘッダーやランニングフッター)を設定したり、辞書のページの辺に最初の単語と最後の単語を示したり、インデックスマーク(ツメやインデックスタブということもある。ツメというときは正確にはツメをかけるための切り込みを付けたもので、タブというときは正確には出っ張りを意味するので、ここではインデックスマークとした。)を作成できる。

15–1 取り出したい内容の設定

fo:markerは取り出したい内容を予め用意しておくためのFOである。マーカーの内容はテキスト、ブロックレベルのFO、インラインレベルのFOである。fo:retrieve-markerを使ってマーカーの内容を取り出す。

マーカーはFOツリーでfo:flowの子孫でなければならず、FOの最初の子供にしなければならない。マーカーにはfo:marker、fo:retrieve-marker、fo:retrieve-table-marker(表の章を参照)を子孫として置くことはできない。

マーカーにはプロパティmarker-class-nameプロパティで種類を指定する。fo:retrieve-marker、fo:retrieve-table-markerはマーカーを種類別にグループ化し、自分が取り出したいグループの中から適切なマーカーを選択する。

表15・1 marker-class-nameプロパティ
プロパティ値説明
<name>(必須)マーカーの種類を設定する。同じエリアの中で同じ種類が指定されていたり、空のときはエラーである。但し、組版処理は継続される。

15–2 柱の作成

fo:retrieve-markerは予め用意されているマーカーの内容を取り出すためのFOである。fo:retrieve-markerは組版時に取り出した内容に置き換えられる。fo:retrieve-markerは、fo:static-contentの中にのみ置くことができる。組版結果のエリアには、そのエリアを生成したFOに対して、最初の子供として設定されたマーカーが付随している。後述のretrieve-positionとretrieve-boundaryプロパティで優先順位を付けて、優先度の高いマーカーの内容を取り出す。

15–2–1 取り出したいマーカーの種類を指定

プロパティretrieve-class-nameプロパティは、fo:retrieve-markerによって取り出したいマーカーの種類(marker-class-name)を設定する。

表15・2 retrieve-class-nameプロパティ
プロパティ値説明
<name>(必須)取り出したいマーカーの種類を設定する。

15–2–2 取り出す優先順位

プロパティretrieve-positionプロパティの値はマーカーがついているエリアの優先順位を指定する。なお、開始エリアとは、例えば、fo:blockからできるブロックエリアが1ページの中で終了するなら、そのブロックエリアは開始エリアでありかつ終了エリアである。2ぺージに渡るなら、1ページ目のブロックエリアが開始エリアであり、2ぺージ目のブロックエリアが終了エリアである。

表15・3 retrieve-positionプロパティ
プロパティ値説明
first-starting-within-page(初期値)retrieve-boundaryの中で最初の開始エリアを優先する。そのようなエリアがなければ最初のエリアを優先する。
first-including-carryoverretrieve-boundaryの中で最初のエリアを優先する。
last-starting-within-pageretrieve-boundaryの中で最後の開始エリアを優先する。そのようなエリアがなければ最後のエリアを優先する。
last-ending-within-pageretrieve-boundaryの中で最後の終了エリアを優先する。そのようなエリアがなければ最後のエリアを優先する。

15–2–3 取り出す範囲

プロパティretrieve-boundaryは取り出すマーカーの対象範囲を指定する。

表15・4 retrieve-boundaryプロパティ
プロパティ値説明
pageページの中のエリアについているマーカーを対象とする。
page-sequence(初期値)fo:page-sequenceのマーカーを対象とする。
documentキュメント全体でfo:flowの子供であるマーカーを対象とする。

次は章と節のマーカーを設定する例である。各章のブロックFOに<fo:marker marker-class-name="chapter">chapter*</fo:marker>、節のブロックFOに<fo:marker marker-class-name="section">section*</fo:marker>というようにマーカーを設定する。この例では章は1~4、節は1~4まで、*は1~4を設定する。第1章の本文のみを示す。第2章~第4章は章番号が変わるだけで節の内容は同じである。

<fo:flow flow-name="xsl-region-body">
  <fo:block>
    <fo:marker marker-class-name="chapter">chapter1</fo:marker>
    <fo:block font-size="16pt">第1章</fo:block>
  <fo:block font-size="14pt" background-color="#CCCCCC">
      <fo:marker marker-class-name="section">
    section1</fo:marker>節1
      <fo:block font-size="11pt" line-height="1.6">
    章や節の見出しなどから…略…
      </fo:block>	
    </fo:block>	
    <fo:block font-size="14pt" background-color="#DDDDDD">
      <fo:marker marker-class-name="section">
    section2</fo:marker>節2
      <fo:block font-size="11pt" line-height="1.6">
    章や節の見出しなどから…略…
      </fo:block>
      <fo:block font-size="11pt" line-height="1.6">
    章や節の見出しなどから…略…
      </fo:block>
    </fo:block>					
    <fo:block font-size="14pt" background-color="#EEEEEE">	
      <fo:marker marker-class-name="section">
    section3</fo:marker>節3
      <fo:block font-size="11pt" line-height="1.6"> 
    章や節の見出しなどから…略…
      </fo:block>
    </fo:block>						
    <fo:block font-size="14pt" background-color="#CCCCCC">
      <fo:marker marker-class-name="section">
    section4</fo:marker>節4
      <fo:block font-size="11pt" line-height="1.6">
    章や節の見出しなどから…略…
      </fo:block>
    </fo:block>	
  </fo:block>
</fo:flow>

章毎にfo:page-sequenceを構成し、第1章のfo:retrieve-markerを次のように、retrieve-boundary="page"、retrieve-position="first-starting-within-page"に設定する。

<fo:static-content flow-name="xsl-region-before">
  <fo:block font-family="sans-serif">
    <fo:block>retrieve-boundary: page-sequence</fo:block>
    <fo:block border="0.2pt solid black"  
              padding="0.2em" 
              start-indent="0.2em" 
              end-indent="0.2em">
      <fo:retrieve-marker  retrieve-class-name="chapter"
               retrieve-position="first-starting-within-page" 
               retrieve-boundary="page-sequence"/>
    </fo:block>	
    <fo:block>first-starting-within-page:</fo:block>
    <fo:block background-color="blue" 
              color="yellow" 
              padding="0.2em" 
              start-indent="0.2em" 
              end-indent="0.2em">	
      <fo:retrieve-marker retrieve-class-name="section" 
               retrieve-position="first-starting-within-page" 
               retrieve-boundary="page"/>
    </fo:block>	
  </fo:block>
</fo:static-content>

第1章の組版結果は図15・1 柱の取出し(第1章)のようになる。1ページには開始エリアが二つあるが最初の開始エリアは節1である。2ページには開始エリアはなく、最初のエリアは節2である。3ページにはエリアが二つあるが最初の開始エリアは節3、4ページにもエリアが二つあるが最初の開始エリアは節4である。

images/marker-401.png

図15・1 柱の取出し(第1章)

第2章はretrieve-positionのみを"first-including-carryover"に変更する。第2章の組版結果は図15・2 柱の取出し(第2章)のようになる。3ページ目と4ページ目の節がそれぞれ節2、節3に変わる。

images/marker-402.png

図15・2 柱の取出し(第2章)

第3章はretrieve-positionのみを"last-starting-within-page" に変更する。第3章の組版結果は図15・3 柱の取出し(第3章)のようになる。1ページ目に開始エリアが二つあるが節2が選択される。

images/marker-403.png

図15・3 柱の取出し(第3章)

第4章はretrieve-positionのみを"last-ending-within-page" に変更する。第4章の組版結果は図15・4 柱の取出し(第4章)のようになる。そのページの最後の終了エリアを優先とするので、1ページ目が節1、3ページ目が節2となる

images/marker-404.png

図15・4 柱の取出し(第4章)