しろもじメモランダム

文字についてあれこれと。

FontForge で細くしたい

Ubuntu に入っているデフォルトの和文フォントはIPA ゴシックで、これはこれで結構綺麗に見える。ただ、Windowsメイリオを使っていたこともあり、もう少しふところが広めのゴシック体にしたい。が。自分のフォントフォルダを覗いてみても、大したフォントは持っていない。

そこで、この前出てきたリョービナウを使ってみたのが画像の上半分。なかなかくっきりしていて見やすいが、何せウエイトが Bold と Ultra なので、濃い。文章が少なければまだ良いが、ネットで長文を読もうとするとさすがに目が疲れる。しかもコードとグリフの対応が一部おかしいのか、「すぎません——」が「すぎませんぅぅ」になっていたりする*1。ぅぅ。

そこで、なんとかして Bold から Medium/Regular あたりのものを作り出せないかと試行錯誤してみた。先に結果を言えば、今日できたものは画像下半分のとおりで、まあまあのものになったような気がする。意外と。

以下、試行錯誤の過程をメモ。

フォントの補間

最初に試したのはフォントの補間。2つのフォント*2から、中間のウエイトを持つフォントを生成してくれるらしい。比率を負の値にすれば補外もしてくれるので、これを試してみた。が、「パスをつくる点の個数が両フォントで同じ」という条件を満たしていないグリフが多く、「文字 unixxxx において、基底グリフのパスに含まれる点の個数が多すぎます/少なすぎます。」というエラーが続出。

これはひどい

輪郭を太らせる

輪郭を太らせる」に挙げられている例は開いた(一本線の)パスの場合だが、すでにちゃんとした形になっている閉じたパスに対しても使える。閉じたパスの場合、「内側の輪郭線を削除する」にチェックを入れれば太く、逆に「外側の〜」にチェックを入れれば細くなる*3。今回の場合は角が丸まっては困るので、線端は Butt、線の結びは Miter を選ぶ。それほど綺麗なものができるわけでもないが、どうせ目的は画面表示だし(他にうまい方法が思いつかないし)、細かいことは気にせずにこの方法でいくことにする。

スクリプトを書く

FontForge ではスクリプトが使える。Windows ではどうもうまく動かなかったが、Ubuntu を入れたのでスクリプトを書いて動かしてみる。といっても全く大したものじゃないな……。よくよく考えてみると、このスクリプトの利点は、「ストロークが太すぎるので, *****に含まれる生成されたパスが自分自身と交差している可能性があります」というダイアログの OK ボタンを押す手間が省ける、ということぐらいか。

width = 30                             // 細くする幅

Open("TT5000M_.TTF")                   // オリジナルを開く
ClearInstrs()                          // ヒント命令を削除
ExpandStroke(width, 0, 0, 0, 2)        // 輪郭を太らせる
Simplify()                             // 単純化
Simplify()                             // もう一回単純化
CorrectDirection()                     // アウトラインの向きを修正
Generate("NOWGoB_" + width + ".ttf")   // フォントを出力

実行してみたら18分48秒もかかった。「輪郭を太らせる」のに結構計算量が必要な様子。これでできたのがさっきの画像のもの。もう少し細くしてもいいかもしれない。「ぅぅ」はいつの間にか直っている。

問題点

これだけ見れば「まぁいいんじゃないの」といったところだが、上の画像は問題が目立たない状況でのものであって、実際は問題点がいくつか(いくつも?)。

  • 中がつぶれている文字が結構ある
  • パスが交差している文字が結構ある
  • 行間が妙に広い(実は元フォントの7倍ぐらいある)
  • 記号・アルファベットなどをどうするか

どこで妥協しようか……。それとももっと簡単な方法があるんだろうか。ぅぅ。

*1:さらに言えば、アルファベットが一部表示されない。

*2:両方とも FontForge で開いておく必要がある

*3:パスの向きが正しくないとうまくいかない。「アウトラインの向きを修正」で修正できる。