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 は自動参照してくれるらしいです。
しかし、うちの場合MicrosoftのJIS2004互換フォントをインストールした環境なので、ファイル名が msmin04.ttc になっていました。
この場合は自動的に読み込んではくれない模様で、明示的に指定してやる必要がありました。
- hello world.txt
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有)で保存してあっても問題なかったため、ちょっと気づくのに時間がかかりました。