第22章 索引

XSLTスタイルシートでFOツリーに変換するとき、XMLドキュメントの索引マークアップから、次のようにして巻末索引を作る。

  1. XMLドキュメントの索引語マークアップをFOツリーの中で索引キーに変換する。索引キーの作り方には次の2種類がある。
    1. FOのindex-keyプロパティの値として索引キーを指定する。
    2. fo:index-range-beginとfo:index-range-endの二つの索引専用FOで索引キーを設定する。
  2. XSLTスタイルシートでXMLの索引語マークアップから索引項目を並べた巻末索引を作る。巻末索引の項目の配列や項目スタイルはXSLTスタイルシートで設定する。
  3. 索引項目はfo:index-key-reference(索引キー参照)で索引キーを参照する。
  4. fo:index-page-citation-listで組版時に索引キー参照により得られる、索引キーのページ番号の重複や連続するページ番号を整理する。

images/fo-index--epub--.png

図22・1 XSL-FOの索引

22–1 索引キーと索引項目

索引キーは巻末の索引項目と、参照先索引用FOとの対応を付けるための値である。プロパティindex-keyプロパティの値として索引キーを指定する。index-keyはほとんどすべてのFOに関連付けられる。プロパティindex-classで索引の種別を示す。例えば章と付録、図など索引項目の所属などを分類できる。

各索引項目の見出しは、例えばfo:blockの内容である。fo:blockの子供としてfo:index-page-citation-list(索引ページ引用リスト)を置き、その子供としてfo:index-key-reference(索引キー参照)を置く。

22–2 範囲の始まりと終わりの索引キー

fo:index-range-beginfo:index-range-endは明示的に索引キーの始まりと終わりを示すFOである。fo:index-range-beginにはid、index-key、index-classの三つのプロパティを設定できる。fo:index-range-endのref-idは、fo:index-range-beginのidと同じ値にして開始と終了を対応付ける。次に例を示す。

<!--節の先頭は2ぺージ-->
<fo:index-range-begin id="b01" index-key="XSL-FO" />
  …
<!--節の最後は6ページ-->
<fo:index-range-end ref-id="b01" />
 …
<!--索引項目-->
<fo:block>XSL-FO
  <fo:inline> </fo:inline>
  <fo:index-page-citation-list>
    <fo:index-key-reference ref-index-key="XSL-FO"/>
  </fo:index-page-citation-list>    
</fo:block> 

組版結果は次の通り。

images/index-0.png

図22・2 範囲の索引キー

22–2–1 索引ページ引用リスト

fo:index-page-citation-list(索引ページ引用リスト)は、索引キー参照で取得した索引語のページ番号を整理する役割である。索引ページ引用リストの子供には複数の異なる索引キーを置くことができる。

同一の索引キーで得られた同一ページ番号は,index-classが同じならば一つにまとめられる。異なる索引キーで得られた同一ページ番号のまとめ方は、次のプロパティで指定する。

索引のぺージ番号を纏める

プロパティmerge-pages-across-index-key-referencesプロパティは異なる索引キー参照で得られた同一ページ番号をまとめる(merge)か、まとめない(leave-separate)かを指定する。mergeであれば異なる索引キーで得られた同一ページ番号は一つになる。leave-separateであれば別に表示される。

22–2–2 連続ページ番号の範囲表示

プロパティmerge-sequential-page-numbersプロパティは索引キーが3ページ以上連続するときページ番号の表示を範囲形式にするかどうかを指定する。設定値は範囲にまとめる(merge(初期値))または範囲にまとめない(leave-separate)。ページ番号が連続するとは、次の三つをすべて満たすときである。

  • 索引キーが連続するページに出てくる。
  • 索引キーのindex-classが同じである(index-classが異なるとマージ処理が指定されていても分離される)。
  • merge-ranges-across-index-key-referencesプロパティ"merge"が設定されている。

プロパティmerge-ranges-across-index-key-referencesプロパティは異なる索引キー参照で得られた範囲を一つにする(merge(初期値))か、しない(leave-separate)かを指定する。

次に範囲をまとめる例を挙げる。

<!--本文 3ページ-->
<fo:wrapper index-key="XSLTプロセサ">…</fo:wrapper>
 …
<!--本文 4ページ-->
<fo:wrapper index-key="XSLTプロセサ">…</fo:wrapper>
<fo:wrapper index-key="テンプレート">…</fo:wrapper>
 …
<!--本文 5ページ-->
<fo:wrapper index-key="XSLT">…</fo:wrapper>
 …
<!--索引項目-->
<fo:block>XSLTプロセサ<fo:inline> </fo:inline>
  <fo:index-page-citation-list 
      merge-sequential-page-numbers="merge" 
      merge-pages-across-index-key-references="merge" 
      merge-ranges-across-index-key-references="merge">
    <fo:index-key-reference ref-index-key="XSLTプロセサ"/>
    <fo:index-key-reference ref-index-key="テンプレート"/>
    <fo:index-key-reference ref-index-key="XSLT"/>
  </fo:index-page-citation-list>
</fo:block> 

この例では、3種類の索引キー参照で得られたページ番号を一つの範囲にまとめる。そこで索引項目の組版結果は次のようになる。

images/index-a.png

図22・3 索引キー参照のページ番号をまとめる

三つのプロパティを分離にする。

<fo:block>XSLTプロセサ<fo:inline> </fo:inline>
  <fo:index-page-citation-list 
      merge-sequential-page-numbers="leave-separate" 
      merge-pages-across-index-key-references="leave-separate" 
      merge-ranges-across-index-key-references="leave-separate">
    <fo:index-key-reference ref-index-key="XSLTプロセサ"/>
    <fo:index-key-reference ref-index-key="テンプレート"/>
    <fo:index-key-reference ref-index-key="XSLT"/>
  </fo:index-page-citation-list>
</fo:block> 

組版結果は次のようになる。

images/index-b.png

図22・4 索引キー参照のページ番号を分離する

22–3 索引ページ番号の表示に関わるFO

fo:index-page-citation-list-separatorはページ番号のリストでページ番号同士を分離する文字を指定する。fo:index-page-citation-range-separatorはページ番号の開始と終了の範囲を示す文字を指定する。fo:index-page-number-prefixfo:index-page-number-suffixは索引キー参照で得られたページ番号に付ける接頭辞、接尾辞を指定するためのFOである。