WindowsXPでblockdiagを使うときのフォント設定

ブロック図生成ツール blockdiag(http://blockdiag.com/ja/blockdiag/) を使ってみました。
Windows XP Professional の環境に python 2.7、easy_install、sphinx 1.1.2、blockdiag 1.1.1 の順でインストールしました。
配置を気にせずにブロック図を生成できるので、とても便利なツールだと感じています。

このツールを使う上で、フォント設定に関わり何点か引っかかったことがあるので、備忘録として残しておこうと思います。
「こんなの常識じゃないか」というような内容かと思いますが、俺のようにこの程度で引っかかるユーザーもいるだろうということで。

blockdiag生成のたびにフォントファイルを指定しなければいけない

勝手な思い込みで、%Windir%\Fonts にあるフォント設定を自動的に参照してくれるだろうと思っていました。
欧文フォントは(どれか特定してはいませんが)自動的に読み込んでいました。
日本語フォントは、ぐぐったところどうやら msmincho.ttf は自動参照してくれるらしいです。
しかし、うちの場合MicrosoftJIS2004互換フォントをインストールした環境なので、ファイル名が msmin04.ttc になっていました。
この場合は自動的に読み込んではくれない模様で、明示的に指定してやる必要がありました。

blockdiag {
    "Hello world!";   //ASCIIサンプル
    "ようこそ!";     //日本語サンプル
}
  • 実行結果
C:\sphinx\blockdiag>blockdiag "hello world.txt"
ERROR: UnicodeEncodeError caught (check your font settings)

C:\sphinx\blockdiag>blockdiag -f %windir%\fonts\msmin04.ttc "hello world.txt"

C:\sphinx\blockdiag>

MS PゴシックMS P明朝、MS UIゴシックを使うのに手間をかける必要がある

ttcフォントを指定した場合、フォントコレクションの1番目のフォントしか使用できません。
(どうやら仕様のような気がしています)
具体的には、下表の"コレクション1"しか使用できないということです。
その他のフォントを使用したい場合、ttcファイルからコレクションごとのttfファイルを生成してやる必要があります。

フォント名 コレクション1 コレクション2 コレクション3
msgoth04.ttc MS ゴシック MS Pゴシック MS UIゴシック
msmin04.ttc MS 明朝 MS P明朝  

フォントマップの文字コードについて

blockdiag 1.1.0からfontmapの考え方が導入されました。
図中でフォントを切り替えるため、以下のようにフォントマップを定義しています。

  • fontmaprc
[fontmap]
ms-serif = C:\sphinx\blockdiag\ttf\mspmincho.ttf         ; MS P明朝
ms-sansserif = C:\sphinx\blockdiag\ttf\mspgothic.ttf     ; MS Pゴシック
ms-monospace = C:\sphinx\blockdiag\ttf\msmincho.ttf      ; MS 明朝
msg-monospace = C:\sphinx\blockdiag\ttf\msgothic.ttf     ; MS ゴシック
msu-sansserif = C:\sphinx\blockdiag\ttf\msuigothic.ttf   ; MS UIゴシック

このファイルを生成するにあたり、文字コードの問題で2点ほど引っかかりました。

UTF-8 の先頭にU+FEFFがあると --fontmap で読み込めない

fontmap を含め、テキストを作成するにあたり UnEditor というソフトを使用しています。
UnEditorには、保存時の文字コード(UTF-8)指定に「UTF-8(BOM有)」と「UTF-8(BOM無)」の2種類がありました。
ここで「UTF-8(BOM有)」で保存すると、以下のとおりエラーが発生します。

  • fonts.txt
blockdiag {
  default_fontsize = 24;
  default_fontfamily = "ms-serif";
  
  A[label = "MS P明朝", width = 300];
  B[label = "MS Pゴシック", width = 300, fontfamily = "ms-sansserif"];
  C[label = "MS 明朝", width = 300, fontfamily = "ms-monospace"];
  D[label = "MS ゴシック", width = 300, fontfamily = "msg-monospace"];
  E[label = "MS UIゴシック", width = 300, fontfamily = "msu-sansserif"];
}
  • 実行結果
C:\sphinx\blockdiag>blockdiag --fontmap=fontmaprc fonts.txt
ERROR: File contains no section headers.
file: fontmaprc, line: 1
u'\ufeff[fontmap]\r\n'

C:\sphinx\blockdiag>

UTF-8(BOM有)」で保存すると、ファイル先頭3バイトに U+FEFF というコードが付加されるのがバイナリエディタで確認できました。
この3バイトを処理しようとして失敗している模様です。

fonts.txt は UTF-8(BOM有)で保存してあっても問題なかったため、ちょっと気づくのに時間がかかりました。

ASCII文字だけだと文字コードがShift-JISとして認識される

Windowsの一般的な仕様だと思われます。
UTF-8で保存したいため、各フォント名の設定後にコメントを追加して対応しました。
試していませんが、ASCII文字以外でコメントを1文字でも残していればUTF-8で保存できると思います。