[XSL-FO] Formatter サポートが語る orphans と widows プロパティの話

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

今日はうっかり忘れがちなorphansとwidowsプロパティのお話です。
(….うっかり忘れるのは私だけかもしれませんが)

CSSやXSLで定義されているorphansとwidowsプロパティは次のように説明があります。
The “orphans” property specifies the minimum number of lines of a paragraph that must be left at the bottom of a page. The “widows” property specifies the minimum number of lines of a paragraph that must be left at the top of a page.

orphansプロパティはページ下に残される段落の最低の行数、widowsはページの1番上に残される段落の最低の行数を指定するということになります。
図1 を見ると解りやすいかと思います。

【図1 orphansとwidows】
【図1 orphansとwidows】

このorphans/widowsというプロパティの値は規定値が”2″に決められています。
これは、段落の始まりの1行だけがページ下にあったり、段落の最後の1行だけがページ上部にあるのは組版ルール上好ましくないとされているためです。
そのため、orphans=”2″の状態で組版すると図2 のような結果になります。

【図2 orphans=
【図2 orphans=”2″での組版結果】

Page1の下には1行分の空きがありますが、orphans=”2″なのでここに入るはずだった行(文字列)は次ページの先頭に移動します。その結果Page1の下には空きが発生します。
この段落でorphans=”1″を指定すると、図3 のようになります。

【図3 orphans=
【図3 orphans=”1″での組版結果】

widowsも同じです。

【図4 widows=
【図4 widows=”2″での組版結果】

図4 で最後の段落は4行分のデータです。普通に並べるとPage1に3行、Page2に1行と入るはずですが、widows=”2″にしたがってPage2のtopに1行だけ配置することはできないのでPage1の最後の行はPage2に移動します。結果的にPage1の下には1行分の空きが発生することになります。
これも、widows=”1″を指定すると図5 のようになります。

【図5 widows=
【図5 widows=”1″での組版結果】

※ここからうっかりポイント

このプロパティは段落の中に画像を埋め込んだ場合も適用されます。
例えば次のようなXSL-FOの記述があったします。
<fo:block>
<fo:external-graphic src=”1.jpg”/>
<fo:external-graphic src=”2.jpg”/>
</fo:block>

fo:external-graphicで埋め込まれた画像はインラインオブジェクトなので文字列と同様に行エリアを生成します。画像の大きさにもよりますが、これを組版したとき、次のような結果になる場合があります。

【図6 画像を2つ埋め込んだケース】
【図6 画像を2つ埋め込んだケース】

この例では1つの画像が1行分になります。
orphans=”2″,widows=”2″のままだと1行だけの配置はできないので最低の2行を同じページに配置しなくてはなりません。したがってこのように画像2つ(2行)が並んだ結果、ページからオーバーフローしてしまうことがあります。
こういう場合もorphans=”1″,widows=”1″を指定することで図7 のように解決します。

【図7 orphans=
【図7 orphans=”1″ widows=”1″ を指定して解決】

他にも、
<fo:external-graphic src=”embedded.pdf#page=3-5″/>
AH Formatterの拡張機能を使ってこのようなPDFの連続ページ埋め込みを行った場合も同じです。

先日、お客様からこういったお問い合わせを受けて
orphans/widowsの仕業だということを思い出すのに3時間ほどかかってしまったのでした。