第18章 リスト(箇条書き)

XSL-FOでは、fo:list-block(リストブロック)で箇条書きのブロック全体をグループ化する。fo:list-blockの子供として、fo:list-item(箇条項目)を項目数分繰り返し、各fo:list-itemの中にfo:list-item-label(リストのラベルを表示する部分)とfo:list-item-body(リストの本体を表示する部分)をペアで配置する。

リストの構造

図18・1 リストの構造

注意すべき点が二つある。

  1. XSL-FOではリストのラベルの内容をfo:list-item-labelの子供として明示的に指定する。したがって番号なしリストであれば先頭の箇条記号を、番号付きリストであればその番号をXSL-FOドキュメントを作成するときに振らなければならない。
  2. fo:list-item-labelの終了位置やfo:list-item-bodyの開始位置を明示的に指定しなければならない。

18–1 リストのレイアウト

プロパティprovisional-distance-between-startsは、リストのラベルの開始位置と本体の開始位置の間隔を設定する。プロパティprovisional-label-separationは、ラベルの終了位置と本体開始位置の間の空きを設定する。この二つの設定値は後述のbody-start()、label-end()という二つの関数のためのパラメータとして使われる。

表18・1 provisional-distance-between-startsプロパティ
プロパティ値説明
<length> リストのラベル開始位置と本体開始位置の間の間隔。初期値は24.0pt。
<percentage> 直近の先祖であるブロックエリア(ラインエリアを除く)の幅に対する割合。
表18・2 provisional-label-separationプロパティ
プロパティ値説明
<length> リストのラベル終了位置と本体の終了位置の間の間隔。初期値は6.0pt。
<percentage> 直近の先祖であるブロックエリア(ラインエリアを除く)の幅に対する割合。

18–1–1 リストラベルの開始位置と終了位置

リストラベルの開始位置と終了位置はfo:list-item-labelのstart-indentとend-indentで指定する(XSL V1.1仕様書では、6.8.4 fo:list-item-body、6.8.5 fo:list-item-labelではインデントが適用対象にリストされていない。しかし、仕様書のサンプルではfo:list-item-labelとfo:list-item-bodyに指定している。)。開始位置はリストブロックを含む参照エリアの開始辺を基準に直接指定する。終了位置はend-indent="label-end()"としてXSL-FOプロセサに計算させる。

18–1–2 リスト本体の開始位置と終了位置

リスト本体の開始位置と終了位置はfo:list-item-bodyのstart-indentとend-indentで指定する。start-indent="body-start()"としてXSL-FOプロセサに計算させる。終了位置はリストブロックを含む参照エリアの終了辺を基準に直接指定する。

<fo:list-block provisional-distance-between-starts="15mm" 
               provisional-label-separation="5mm">
  <fo:list-item>
    <fo:list-item-label start-indent="4mm" 
                        end-indent="label-end()">
      <fo:block>&#x02022;</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()" 
                       end-indent="50mm">
      <fo:block>※※※※※※※※※※※</fo:block>
    </fo:list-item-body>
  </fo:list-item>
  <fo:list-item>
    <fo:list-item-label start-indent="4mm" 
                        end-indent="label-end()">
      <fo:block>&#x02022;</fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()" 
                     end-indent="50mm">
      <fo:block>********************************************</fo:block>
    </fo:list-item-body>
  </fo:list-item>
</fo:list-block>

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

i01-image42.png

図18・2 リストの組版

18–1–3 相対位置合わせ

箇条書きの項目にはプロパティrelative-alignプロパティを適用できる。

表18・3 relative-align(箇条項目)
プロパティ値説明
beforefo:list-item-labelによって生成される最初のエリアの前方辺と、fo:list-itemによって生成されるエリアの前方辺が一致する。また、fo:list-item-bodyによって生成される最初のエリアの前方辺と、fo:list-itemによって生成されるエリアの前方辺が一致する。
baselinefo:list-item-labelによって生成される最初の行エリアのベースラインとの距離と、fo:list-item-bodyによって生成される最初の行エリアのベースラインとの距離が一致する。加えて、最初のエリアのうち一つの配置矩形の前方辺はfo:list-itemの内容領域の前方辺に一致しなければならない。