こんにちは
『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 で長体にして収めようとしています。
ところが、組版してみると次のような結果になります。
ラベルの “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>
と指定すれば結果は次のようになります。
これにてめでたしめでたし(^^)