mattintosh note

どこかのエンジニアモドキの備忘録

Fira Mono と M+ FONTS を合成して等幅和文フォントを作る (2回目)

FontForge

Fira Mono と M+ FONTS を合成して等幅和文フォントを作る (2回目)


前回から行間をちょっとだけ広げ、レギュラーとボールドを同時生成するためにスクリプトを2つに分けた。FontForege のスクリプトって環境変数拾えないのかな…。

#!/bin/sh -e

FONTFORGE=/opt/local/bin/fontforge
tempfile=`mktemp -t $$`.pe
trap "rm $tempfile" EXIT

set -- Regular Bold

for f
{
    case $f in
    Regular) weight_jp="レギュラー" ;;
    Bold   ) weight_jp="ボールド"   ;;
    esac

    sed -f /dev/fd/0 $HOME/share/fontforge/firaplus.pe.in >$tempfile <<!
/@HOME@/s||$HOME|g
/@WEIGHT@/s||$f|g
/@WEIGHT_JP@/s||$weight_jp|g
!

    $FONTFORGE -script $tempfile
}
width  = 1100
margin = 0

WinAscent    = 785  + margin
WinDescent   = 215  + margin
HHeadAscent  = 785  + margin
HHeadDescent = -215 - margin
TypoLineGap  = 100
HHeadLineGap = 100

fira = "/usr/local/src/repos/Fira/otf/FiraMono-@WEIGHT@.otf"
mx   = "/usr/local/src/repos/mplus_outline_fonts/work.d/targets/mplus-\
2m/@WEIGHT@/mplus-2m-@WEIGHT@.ttf"

Open(mx)
SelectWorthOutputting()
Scale(90)
SetWidth(width)
if (width >= 1001)
    SetLBearing((width - 1000)/2,1)
endif
SetOS2Value("WinAscent",    WinAscent)
SetOS2Value("WinDescent",   WinDescent)
SetOS2Value("HHeadAscent",  HHeadAscent)
SetOS2Value("HHeadDescent", HHeadDescent)
SetOS2Value("TypoLineGap",  TypoLineGap)
SetOS2Value("HHeadLineGap", HHeadLineGap)

Open(fira)
SetUniqueID(0)
SelectWorthOutputting()
SetWidth(width/2)
if (width >= 1001)
    SetLBearing(((width - 1000)/2)/2,1)
endif
SetOS2Value("WinAscent",    WinAscent)
SetOS2Value("WinDescent",   WinDescent)
SetOS2Value("HHeadAscent",  HHeadAscent)
SetOS2Value("HHeadDescent", HHeadDescent)
SetOS2Value("TypoLineGap",  TypoLineGap)
SetOS2Value("HHeadLineGap", HHeadLineGap)
MergeFonts(mx)
SetFontNames("FiraPlus-@WEIGHT@", \
             "Fira Plus", \
             "Fira Plus")
SetTTFName(0x409, 1, "Fira Plus")
SetTTFName(0x409, 2, "@WEIGHT@")
SetTTFName(0x409, 4, "Fira Plus")
SetTTFName(0x411, 1, "Fira Plus")
SetTTFName(0x411, 2, "@WEIGHT_JP@")
SetTTFName(0x411, 4, "Fira Plus")
Generate("@HOME@/Library/Fonts/" + $fontname + ".otf", "")

Quit(0)

ターミナルプレビュ

Fira Plus はグリフ幅 550/1100 で M+ FONTS の分を Fira Mono に合わせるためにスケール 90%。こうしてみるとどっちに合わせるかまた悩む…。

Fira Plus

Firefox HTML ソースビューアプレビュ

Fira Plus M+ 2m Regular
Fira Plus
M+ 2m Regular

ウェイトが変わっても幅の変動が少ない DejaVu Sans Mono

Fira Mono と M+ FONTS を合成してみて、英語と日本語のバランスはよくなったものの英語部分が DejaVu Sans Mono と比べるとやっぱりなんだか見づらい。日本語に合わせるために Fira Mono の両サイドベアリングを削ってるせいもあってボールドにするとかなりキツキツな感じ。DejaVu Sans のときはあまりこういう印象がなかったんだけど何でだ?と思って Font Book を眺めていたら DejaVu Sans Mono はボールド時に内側に太くなるのでレギュラーとボールドの文字幅の変動が少ないことに気づいた。

黒はレギュラーのライン、赤はボールドのライン。V と W の間なんかを見てみるとわかりやすい。

Fira Mono

Fira Mono

DejaVu Sans Mono

DejaVu Sans Mono


最初から DejaVu Sans Mono と M+ FONTS を合わせればよかったのではないか…。