個人的な話として、索引周りは既にあるなら自前で実装したくはない箇所です。
索引に関連した仕様はXSL-FO 1.1で追加されました*1。1.1は2007年には登場しており、私が学び始めた時点で既に存在します。
先日それ以前に書かれたコードに触れる機会があり、<fo:basic-link>
とXSLT 1.0で書かれた処理を見て苦労を偲びました。
索引関連のFOはアンカーと、アンカーの参照、その参照をまとめて書式などを調整するものがあります。
組版するまで未決定なページ番号関連の挙動を制御してくれる索引のFOですが、逆に、索引対象語のソートなどはXSLTなどで、索引の表示レイアウトは通常のブロックやリーダなどで行うことになります。
テキストの揃えやリーダ関係ではAH Formatterのマニュアルにあるように*2指定すれば、よく目にする「テキストはstartの端、ページ参照はendの端」という見た目の索引とできるでしょう。目次もこのようなレイアウトを取ることがあります。
索引の索引語ごとのブロックとしては@text-align
、@text-align-last
、(axf:text-align-first
)で揃えを制御し、@keep-together.within-page
でページ参照部分だけ次ページに分割されてしまうことがないように、という指定を行うことになるでしょうか。このときインラインの構造としては「索引語」「リーダ」「索引参照のFO」という並びになります。
さらに大きい構造として、「索引の見出し文字」と「索引語ごとのブロックの連続」となります。このとき見出し文字のブロックに@keep-next.within-page
でこの箇所での分割を避けておく必要がありますね。