FlexBoxみたいなFO(ただのインラインコンテナの使い方)

1 min read読了の目安(約1700字

XSL Advent Calendar 2020 14日目の記事です。空いている箇所はそのうちに埋めます。きっと。

https://adventar.org/calendars/5027

FlexBoxはご存じ様々な画面サイズに応じて表示するコンテンツのサイズを柔軟に変えてくれるCSSです。多分。

https://www.w3.org/TR/css-flexbox-1/

「画面が固定(ページサイズ)のXSL-FOでは必要ないのでは」という。まあ、「みたいな」と書いた通り、本記事の話題はつまる所display:inline-blockです。これもあまり話す要素はなくって、<fo:inline-container>を親に持つ<fo:block>で大体期待通りになります。

 <fo:block>
  <fo:inline-container inline-progression-dimension="30%">  
   <fo:block margin="5pt">
        Lorem ipsum ...   
	</fo:block>
     </fo:inline-container>
  <fo:inline-container inline-progression-dimension="30%">
    <fo:block margin="5pt">
        Lorem ipsum ...</fo:block>
      </fo:inline-container>
        <fo:inline-container inline-progression-dimension="30%">
    <fo:block margin="5pt">
        Lorem ipsum ...
        </fo:block>
      </fo:inline-container>
</fo:block>

幅サイズを指定しないとブロックらしく行一杯に広がりますし、それぞれの幅(inline-progression-dimension)を変更すればこんな感じにもできます。

インラインコンテナ自体の使い方としては他に部分的な縦書きや疑似的にルビを組む方法などがあります[1]

FlexBoxがフレキシブルな所といえば、配置方法の細かな制御です。最たる「幅指定全部autoだけど上手いこといく」幅の制御などは流石にXSLTとかで頑張ってもらうしかありませんが、通常行をjustify、最終行をcenterあたりはなんとかなります。

<!-- 均等割、最終行だけ中央-->
<fo:block text-align="justify" text-align-last="center">
	<fo:inline-container ...>...</fo:inline-container>
	...
</fo:block>
<!-- 配置順を右から -->
<fo:block-container writing-mode="rl-tb"><!-- ブロック内の記述より上で書字方向は戻しておく -->
	<fo:block ...>
		<fo:inline-container ...>
			...
		</fo:inline-container>
	</fo:block>
</fo:block-container>
脚注
  1. https://www.antenna.co.jp/AHF/ahf_publication/data/xsl-fo-v2/i01-0012.html ↩︎