[AH Formatter] インデントの継承のお話

こんにちは
AH Formatter』サポート担当です。

今回もお問い合わせのあったサポート案件から1つご紹介します。

『AH Formatter』の拡張機能の1つに、axf:overflow-condense というのがあります。
大きさが指定されたエリアにテキストが入りきらない=オーバーフローする場合に
font-size や font-stretch を調整(フォントサイズを小さくしたり長体にしたり)して詰め込むというものです。
サンプルページ

ある時、この axf:overflow-condense が効かないというお問い合わせがありました。
FOは以下のように記述されていました。

 <fo:list-block provisional-label-separation=”30pt” provisional-distance-between-starts=”40pt” >
  <fo:list-item>
   <fo:list-item-label end-indent=”label-end()”>
    <fo:block-container width=”30pt” overflow=”condense” axf:overflow-condense=”font-stretch” background-color=”yellow” wrap-option=”no-wrap”>
     <fo:block>A.1.1</fo:block>
    </fo:block-container>
   </fo:list-item-label>
   <fo:list-item-body start-indent=”body-start()”>
    <fo:block>Sample Data</fo:block>
   </fo:list-item-body>
  </fo:list-item>
 </fo:list-block>

リストのラベルに fo:block-container を置いて、
ラベルのテキストが width=”30pt” を超える場合は
font-stretch で長体にして収めようとしています。
ところが、組版してみると次のような結果になります。

 [AH Formatter] インデントの継承のお話

ラベルの “A.1.1″ が長体にならず、はみ出していますね。。。。

fo:block-container に width は指定されているし他の指定も間違っていませんし。。。。

どうして axf:overflow-condense=”font-stretch” が効かないんでしょう????


(ここで小一時間悩みました)

(後になって、過去にほぼ同じ案件があったことがわかったんですけどね)

(もうね、おばちゃん忘れっぽくてね、年はとりたくないわぁ)

すみません、心の声が出すぎました。

原因は、【インデントの継承】によるものでした。
XSL-FO で忘れてはいけない仕様の1つに(忘れとるやん!)、このインデントの継承があります。
よくあるケースとしては、親のオブジェクトで start-indent を指定すると
そのインデントが子(孫)にも継承されてインデントされてしまうという話です。
弊社の FAQ のページにもいくつか関連する項目を載せています。

親要素に start-indent を指定して、
子要素には継承しないようにリセット(start-indent=”0pt”)することは多いですが
今回の場合、start-indent ではなく、

 <fo:list-item-label end-indent=”label-end()”>

fo:list-item-label に指定されている end-indent=”label-end()” が継承されていたんです。
リストラベルの中の fo:block-container に end-indent が継承されていたために
結果的にエリアの幅が負の値になってしまって axf:overflow-condense が効かなかったということでした。

ということで、解決方法としては、この end-indent のリセットが必要になります。

 <fo:block end-indent=”0pt”>A.1.1</fo:block>

と指定すれば結果は次のようになります。

 [AH Formatter] インデントの継承のお話

これにてめでたしめでたし(^^)