読者です 読者をやめる 読者になる 読者になる

旧字フォントをつくった

IPAexフォントからこの旧字(正字)フォントを作ったときの方法を簡単に紹介します。

といっても、難しいことは何もしていません。実はIPAexフォントはもとから旧字の情報を持っているのです。
どういうことかといいますと、TTFフォントには内部にGSUB(たぶんGlyph Substituteの略)テーブルというものを持っていまして、そこに所謂新字体と旧字体の対応が書かれているのです。
これによって、ソフトウェアによってはそこの情報を読み取って全ての文字を旧字体にするといったことが簡単にできるようになっています。

が、ソフトウェアによってと書いたとおり、それを出来るソフトウェアはほとんどありません。詳しくは知りませんが、Adobe Indesignのようなプロ向けの(高価な)DTPソフトくらいだと思います。
そこで、このテーブルに載っている情報を元に、新字体のグリフを旧字体のものに置き換えてしまうことで、どのような環境でも旧字体で表示するフォントを作りました。

私はブラウザの表示フォントをこれに指定しているのですが、使っていて結構便利です(便利とは一体)

・例えば大学のサイトを見に行ったら、おおーかっこいい、となったりします(流体物理学研究室 | Kyoto University, Department of Physics)。
f:id:suzusime:20160417002553p:plain

なお、GSUBテーブルというとあまり耳慣れないかも知れませんが、実は縦書きの際に文字の形が変わるというのはこの機能を使って実現されています。
そもそも、もともとこんなフォントを作ろうと思ったのは、全ての文字を縦書き字形に置き換えたフォントを作ろうとしたためです。

私はサークル(KMC)のslack上で「はんこbot」なる、受け取った文字列をはんこ状に配置した画像を生成するbotを作りました。
ただ、imagemagickを使っていたために縦書き字形で表示することが出来ませんでした。
で、どうするのかと考えた結果、フォント自体を弄ってしまえばいいと気付いて、少しFontforgeスクリプトの書き方を調べ、縦書き字形フォントを作りました。
そしてそれを応用すれば旧字フォントが作れると気付いて、旧字フォントもついでに作ったのでした。

・はんこbotがちゃんと縦書きの字形(長音符など)を表示している例
f:id:suzusime:20160417004043p:plain


さて、肝心の作り方ですが、FontForgepythonの使えるコンピュータ上で次のようなスクリプトをipaexm.ttfと同じディレクトリで実行するだけです(実行は `$ fontforge -script hoge.py` )。

# -*- coding: utf-8 -*-
import fontforge;

sfn=fontforge.open("ipaexm.ttf")

sblist=[] #置換するグリフリスト
glyphs=sfn.glyphs()
for item in glyphs:
    table=item.getPosSub("'trad' 旧字体 lookup 19 subtable")
    if len(table) != 0:
        sblist.append( (item.glyphname, table[0][2]) )

nfn=sfn #新しいフォントオブジェクト
for item in sblist:
    sfn.selection.select(item[1])
    sfn.copy()
    nfn.selection.select(item[0])
    nfn.paste()

#名前の設定
nfn.fontname="Hanyu1MinchoR"
nfn.fullname="Hanyu1MinchoRegular"
nfn.familyname="Hanyu1Mincho"
#保存
nfn.save("hanyu1min.sfd") #sfdファイルを保存する
nfn.generate("ipaexm_trad.ttf", bitmap_type="", flags=('opentype')) #ttfフォントを出力する

……だったら良かったのですが、実は私の環境(debian 8)では最後のttfフォントの生成がうまくいきませんでした。
そこでsfdファイル(中間ファイル)を出力し(下から二行目)、そのsfdファイルを別PC(Windows)のFontForgeのほうで開いてttfフォントを出力すればうまくいきました。
たぶん最初の環境ではFontForgeのバージョンが古かったとかそういうことだと思うのですがよく分からないです。

ちなみに縦書きフォントを作りたいときは(サブ)テーブルの名前として "'trad' 旧字体 lookup 19 subtable" の代わりに "'vert' 縦書き字形【廃止】 lookup 0 subtable" を指定すれば良いです。
このあたりの情報はGUIFontForgeでIPAex明朝を開いて調べました。なお、フォントによってテーブルの名前は異なります。

FontForgeで使えるスクリプトは独自のスクリプトpythonがありますが、どちらもほぼ初見だったので、どうせなら汎用性が高い方ということでpythonを選びました。

このフォントの問題点としては、自分が旧字と思っているものでも旧字として扱われないことがあることでしょうか。例えば「真」と「眞」とか。IPAexフォントを作った人の考え方に依存しているので仕方がないことですが。
本当は自力で変換テーブルを作れば良いわけですが、そこまでのやる気はないかなぁと(ちなみにそういうフォントは五月雨明朝(梅雨空文庫)や馬酔木明朝(
旧字フォント 馬酔木明朝)などいくつかあるみたいです)。

今回はまあFontForgeスクリプトでお手軽にフォント編集できるよ、ということでひとつ。