FontForgeで生成した日本語TrueTypeフォント文字幅広すぎ対策

FontForgeで日本語TrueTypeフォントを出力したとき、文字幅が広すぎることがよくあります。

たとえばIPAゴシックを読み込んですぐ [ファイル>フォントを出力]TrueTypeフォント保存するだけで、以下のようにまるで全角文字の幅が2倍になったようになります。

f:id:itouhiro:20140910173716p:plain

この原因は、FontForgeの不具合です。

詳しくは M+ FONTS >メーリングリストのこのスレッド http://sourceforge.jp/projects/mplus-fonts/lists/archive/dev/2011-July/000601.html にありますが、OS/2テーブルのxAvgCharWidthの値が、FontForgeを通すとおかしくなるためです。

環境

修正方法

  1. OS/2テーブルのバージョンを書き換える
    上記のスレッドにある「OS/2テーブルのバージョンを書き換える」をやっているのが、Rictyフォント https://github.com/yascentur/Rictymisc/os2version_reviser.sh スクリプトです。しかしこれは、Ricty以外のフォントには効果ないことが多いです。
    FontForge[エレメント>フォント情報>OS/2>OS/2バージョン] を 1 にすると直る場合もあるようですが、今回のIPAゴシックでは直りませんでした。

  2. xAvgCharWidth を直接書き換える
    これが確実な方法です。書き換える方法は今だと TTX/FontTools http://sourceforge.net/projects/fonttools/ がよいと思います。

TTXインストール

Unixの人は fonttools-2.4.tar.gzをそのままインストールもできますし、AFDKO http://www.adobe.com/devnet/opentype/afdko.html をインストールすればTTXもインストールされます。

しかし、Windowsだと http://rtfreesoft.blogspot.jp/search/label/ttx のWinTTX 2.4がよかったです。Pythonインストールしなくてすみますし動作も確実です。以下はこのWinTTXに含まれるttx.exeを使用します。インストールは必要なく、zipファイルから取り出したexeファイルをそのまま使用します。

TTXを準備

C:\font (どこでもよいですが今回はここ)に以下を配置します。

  • 文字幅がおかしくなる前の元フォント ipag.ttf
  • 文字幅がおかしいIPAGothic.ttf
  • WinTTXに含まれるttx.exe

[Windowsのスタートメニュー>すべてのプログラム>アクセサリ>コマンドプロンプト] を起動します。

f:id:itouhiro:20140910173749p:plain

cd c:\font

と入力します。これでttx.exeを使える場所に来ました。

OS/2テーブルを書き出す

ttx.exe -t OS/2 IPAGothic.ttf

と入力します。OS/2テーブルがテキストファイIPAGothic.ttx として出力されましたよ。

f:id:itouhiro:20140910174945p:plain

ttxファイルを書き換え

ttxファイルをテキストエディターで開いて、 xAvgCharWidth を書き換えましょう。 フォントごとに違う値を指定する必要があります。

今回は 1024 にします。この 1024 はどこから出てきたかというと、書き換え前の ipag.ttfOS/2テーブルの xAvgCharWidth の値です。

f:id:itouhiro:20140910175912p:plain

IPAGothic.ttx を書き換えて、保存するのですが、このとき注意があります。

  • ファイル名は新しいフォント名になるので、IPAGothic.ttx とは違う名前にしておく。

ここでは New1 とファイル名に追加しておきます。

f:id:itouhiro:20140910181032p:plain

文字幅おかしいフォントのOS/2テーブルを書き換える

文字幅おかしいTrueTypeファイルを修正しましょう。先ほどのttxファイルでOS/2テーブルを上書きします。

ttx.exe -m IPAGothic.ttf IPAGothicNew1.ttx

これでフォントが修正されました。

f:id:itouhiro:20140910182150p:plain

余談

xAvgCharWidth の値はIPAゴシックの場合 1024 となっていました。等幅フォントの場合、半角英数字の幅も同じ値だと思います。 xAvgCharWidth の意味は「半角英数字の平均的な横幅」ですから、等幅フォントだとそうなりますよね。

f:id:itouhiro:20140910182333p:plain