(10日目) blockdiag のフォントを切り替える

今日は最新の blockdiag で搭載されたフォント切り替え機能について紹介します。

かんたんなフォント指定

blockdiag は文字を描画する際に TrueType フォントを利用しています。

blockdiag は起動時にオプションを指定しない場合、
TrueType フォントがインストールされていないか探索します。*1

よく利用されるフォント指定方法は -f (--font)オプションを利用して TrueType フォントを指定する方法です。

$ blockdiag -f /path/to/font.ttf input.diag

この指定を行うと指定したフォントで文字の描画を行います。

実際に同じ図を複数のフォントでレンダリングしてみましょう。
サンプルには以下のソースを利用しました。

blockdiag {
  default_fontsize = 24;

  ABC -> def -> あいうえお -> 文章;
}
  • IPA フォント (ゴシック)

  • IPA フォント (明朝)

  • さざなみフォント (ゴシック)

  • AppleGothic

それぞれのフォントによって出力される文字がそれぞれ異なっていることがわかるかと思います。
世の中にはフリーのもの、有償のものを含め本当にたくさんのフォントがあるので、
興味が有る方はタイポグラフィやレタリングについて調べてみるととても楽しいと思います。

複雑なフォント指定 (複数のフォントを切り替える)

-f オプションを利用したフォントを切り替え方についてご紹介しましたが、
図の表現として一部の要素だけフォントを切り替えたいケースがあります。

blockdiag 1.1.0 では複数のフォントを切り替える方法として fontmap という考え方が導入されました。
fontmap は TrueType フォントと名前(フォントファミリー名)の対をリストにしたものです。

fontmap ファイル

fontmap を理解するには、実際の fontmap 定義ファイルを見てもらうのがわかりやすいと思います。
fontmap ファイルは以下のようなファイルです。

[fontmap]
serif = /usr/share/fonts/truetype/ipafont/ipamp.ttf
serif-bold = /usr/share/fonts/truetype/ipafont/ipamp.ttf
sansserif = /usr/share/fonts/truetype/ipafont/ipagp.ttf
monospace = /usr/share/fonts/truetype/ipafont/ipam.ttf
cursive = /usr/share/fonts/truetype/ipafont/ipam.ttf
cursive-italic = /usr/share/fonts/truetype/ipafont/ipam.ttf
fantasy = /usr/share/fonts/truetype/ipafont/ipam.ttf

fontmap ファイルは一般的な ini 形式のファイルで、fontmap セクション([fontmap]) の中に
複数のフォントをリストアップしたものです。

フォントをリストアップする際、左辺にはフォントファミリー(font-family)名を記載します。
フォントファミリーは 1〜3つのパートからなる文字列です。

[フォント名称]-[総称ファミリ]-[スタイル]

それぞれのパートは以下の役割を持っています。

  • フォント名称 (省略可)
    • フォントの名称を指定する。自由に指定することができる。
  • 総称ファミリ (必須)
    • フォントの形状を指定する。CSS の総称ファミリ (generic-family) と同じもの。
    • sansserif, serif, monospace, fantasy, cursive のいずれかの値を取る
    • それぞれの意味は以下のとおり。
      • sansserif: ゴシック体、ヒゲのないフォント
      • serif: 明朝体、ヒゲのあるフォント
      • monospace: 固定幅フォント
      • fantasy: 装飾系フォント
      • cursive: 筆記体フォント
  • スタイル (省略可)
    • フォントの装飾を指定する
    • normal(装飾なし), bold(太字), italic(斜体), oblique(斜体) のいずれかの値を取る
    • 省略時は normal として扱われる


例えば AppleGothic, ヒラギノ, IPAフォント(ゴシック/明朝)を利用する場合は
次のような fontmap ファイルを定義します。*2

[fontmap]
apple-sansserif: /System/Library/Fonts/AppleGothic.ttf
hiragino-sansserif: /Library/Fonts/Hiragino Sans GB W3.otf
ipa-sansserif: /Users/tkomiya/fonts/ipagp.otf
ipa-serif: /Users/tkomiya/Fonts/ipamp.otf
フォントの切り替え (fontfamily)

さて、fontmap を定義してしまえば、あとは図の定義でフォントを切り替えながら利用するだけです。
blockdiag では 2つの方法でフォントを切り替えることができます。

  • default_fontfamily
    • 図全体に反映されるフォント設定です。
    • fontmap のフォントファミリーを指定します。
    • 初期値は sansserif-normal です
  • 要素毎の fontfamily 設定
    • 要素ごとに設定されるフォント設定です。
    • defualt_fontfamily より優先されて適用されます。

この2つを組み合わせると、特定の箇所だけ文字を大きくすることができます。

blockdiag {
  default_fontsize = 16;
  default_fontfamily = "ipa-sanserif";  // 標準のフォントを IPA ゴシックに設定

  AppleGothic [fontfamily = "apple-sansserif"];
  ヒラギノゴシック [fontfamily = "hiragino-sansserif"];
  IPAゴシック;
  IPA明朝 [fontfamily = "ipa-serif"];
}

blockdiag で変換する際、--fontmap ファイルを fontmap ファイルを指定し忘れないようにします。

$ blockdiag --fontmap fontmaprc input.diag

フォントサイズの調整

ここまではフォント(書体)の話をしていましたが、文字描画の構成要素の一つに大きさ、つまりフォントサイズもがあります。
blockdiag では2つの方法でフォントサイズを変更することができます。

  • default_fontsize 設定
    • 図全体に反映されるフォントサイズ設定です。
    • 初期値は 11 ポイントです。
  • 要素毎の fontsize 設定*3
    • 要素ごとに設定されるフォントサイズ設定です。
    • default_fontsize より優先されて適用されます。

この2つを組みわせると、全体の文字を大きくしたり、特定の箇所だけ文字を大きくまたは小さくすることができます。

blockdiag {
  default_fontsize = 16;       // 標準のフォントサイズを 16 ポイントに設定

  小さい文字 [fontsize = 12];  // フォントサイズを小さくする
  普通の文字;                  // 設定しない = 標準のフォント(16ポイント)を使用
  大きい文字 [fontsize = 24];  // フォントサイズを大きくする
}

まとめ

blockdiag では -f オプションと fontmap の二種類のフォント指定方法があります。
このふたつを使い分けて、ドキュメンテーションに役立ててください。

fontmap の仕組みが複雑すぎてすみません orz *4

*1:特定のパスを見に行くだけなので、よりよい探索ロジックがあれば教えて欲しいです。

*2:この例は手元の MacOS Lion 環境に、~/Fonts に IPA フォントを設置した環境です。

*3:ノードだけでなく、エッジ、グループなどにも利用できます

*4:言い訳:PDF/PNG と SVG を両立させるためにこんな複雑な仕組みになっています。XLFD と CSS、TrueType というそれぞれのいいとこどりをしているつもりですが、最初に予想されたとおり複雑で残念な感じです。だれか助けて。