フォントファミリーの指定方法

FOへのスタイルシートを作るとき意外と落とし穴になるのがフォントファミリーだなと実感しました.先週からフォントファミリーで頭がおかしくなりそうな状態だからです.

XSL-FOのスタイルシートを作る場合、大抵元はInDesignとかFrameMakerとかでやっていて、「できる限りこの通りに作ってほしい」というのが前提条件になります.このようなとき元のデータをInDesignで開いてXSL-FOにした時のスタイル要件をまとめ上げるなんていう作業が結構あります.

このような作業をやった後、XSL-FOを作るためにスタイルを作ってフォントファミリーを設定するときには次のようにちゃんと方針を持ったやり方をすると楽です.

1.地のフォントファミリーをfo:rootに設定します.基本的にXSL-FOの継承機能を利用します.
2.見出しとかその他で地のフォントと違う個所だけフォントファミリーを指定したスタイルを作ります.地と同じ場合はフォントファミリーの指定はしません.
3.フォントファミリー名は直書きせず、実体定義+実体参照を使います.

コード例を書くと次のような感じです.(私はxsl:attribute-setを使わないのでもしかしたら間違いがあるやもしれません.)

スタイルシートの先頭での実体定義]
<?xml version='1.0' encoding="UTF-8" ?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY RYUMIN-L "RyuminPr5-Light">
<!ENTITY RYUMIN-R "RyuminPr5-Regular">
<!ENTITY RYUMIN-M "RyuminPr5-Medium">
<!ENTITY RYUMIN-B "RyuminPr5-Bold">
<!ENTITY GOTHIC-R "GothicMB101Pr5-Regular">
<!ENTITY GOTHIC-M "GothicMB101Pr5-Medium">
<!ENTITY GOTHIC-B "GothicMB101Pr5-Bold">
<!ENTITY GOTHIC-BBB-M "GothicBBBPr5-Medium">
<!ENTITY MIDASHIGO-MB31 "MidashiGoPr5-MB31">
]>
<xsl:stylesheet version="2.0" 
 exclude-result-prefixes="xs ahf" 
>

[スタイルの定義例]
<xsl:attribute-set name="atsRoot">
    <xsl:attribute name="xml:lang">ja</xsl:attribute>
    <xsl:attribute name="font-family">&RYUMIN-L;</xsl:attribute>
    <xsl:attribute name="line-stacking-strategy">line-height</xsl:attribute>
    <xsl:attribute name="text-align">justify</xsl:attribute>
</xsl:attribute-set>

[コード例]
<xsl:template match="/">
  <fo:root xsl:use-attribute-sets="atsRoot">
     ...
  </fo:root>
</xsl:template>

このようにしておくと

1.フォントファミリー名の誤記を防ぐことができます.誤記はFormatterを使用した場合、組版時にWindowsだと通ってしまってもUnix系では悲惨な結果になります.(少々の誤記はWindows APIが吸収してくれるようです.)
2.お客様のフォント環境が変わっても、実体定義を変えれば済む場合もあります.
3.スタイルのメンテナンス量が減ります.

なんていう御利益があります.

でも私がやっているのは、すべてこのやり方をしていないスタイルシートのメンテです.個々のスタイルにフォントファミリー指定がすべて直書き状態です.このようなもので「多言語展開でフォントを変えよう!」などということになると、もはや後の祭りです.XSL-FOのフォントファミリーの継承機能を使おうとしても、XSL-FOを実際に出してみて、どこでどのようにフォントが継承されているか調べないと、「fo:rootに指定したからいいや!」などとは行かなくなってしまうからです.仕方がないのでしこしことフォントファミリーを言語単位に抜き出して別定義をする作業をやっています.

何事も最初が肝心です.たかがフォントファミリーと言ってあまり深く考えないかもしれませんが、ちゃんと見通してスタイルを作ってあるか否かで、後々のメンテナンスの工数は非常に変わります.