日別アーカイブ: 2021年5月13日

XSL-FO試行錯誤 索引でページ番号をmergeできるのは3ページから

XSL-FOの索引でページ番号が連続するとき、最初と最後のページ番号だけ表示して途中のページを省略するプロパティがあります。

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

このときmerge-sequential-page-numbersmergeを指定いると、ページ番号表示が範囲形式にまとめられます。範囲形式のときに最初のページ番号と最後のページ番号の間の文字は<fo:index-page-citation-range-separator>で指定可能です。

仕様にも「3ページ以上のとき」とあり、2ページのときはとくに何もしません。

この機能は、索引に指定した語の登場ページを列挙するときに表示をまとめる機能であり、「トピックと語がほぼ一致するので、索引表示はトピックの範囲が分かるようにしたい」という要望のためのものでは「ない」ということです。
具体的には、筆者は「2ページ連続のときも範囲形式で表示したい」とFOを記述しようとして「そういう機能ではない」という指摘を受けました。

ちなみに「トピックの範囲を常に範囲形式で表示したい」というときはどうするかについては、「トピックは必ず2ページ以上となる」という制約を付けられるのであれば(見開き2ページを基本構成とするなど)、<fo:page-number-citation>を使えば良いでしょう。制約がないと、トピックが1ページの範囲のとき「3ページ-3ページ」のような表示になってしまうかもしれません。(<fo:static-content>内のマーカ参照でのこういった重複については、AH XSL Formatterではaxf:suppress-duplicate-marker-contentsという拡張仕様があります。)


索引 22–2–2 連続ページ番号の範囲表示 | XSL-FOの基礎 第2版

索引自体の記述例はサンプルFOをご覧ください。
https://www.antenna.co.jp/AHF/ahf_samples/sample-fo.html#page-set