日本語対応のプログラミング用フォント「Calex Code JP」を作ってみた
Calex Code JPの紹介
個人的な好みで、英数字に Cascadia Mono Regular を、日本語に IBM Plex Sans JP Medium を使用したフォントが欲しかったので、それらをマージして新しいフォント「Calex Code JP」を作ってみました。
すこしかわいい感じのフォントを組み合わせていて、違和感のない結果になった気がしています。
エディタで見るとこんな感じ
フォントを作り方は全く知らなかったのですが、マージする方法なら既存フォントをありがたく拝借するだけなのでとても簡単でした。誰でも好きな組合せのフォントを作成できるので楽しいと思います。ただし配布する場合はライセンスにご注意を!
フォントが置いてあるリポジトリを張っておきます。
Cascadia Mono
Cascadia MonoはMicrosoftが作成した比較的最近のフォントです。Windows Terminalのデフォルトフォントになっていますが、日本語には対応していません。
https://github.com/microsoft/cascadia-code より
リガチャ(合字)に対応したCascadia Codeと非対応のCascadia Monoがあります。
くにゃっとしていて若干かわいい感じで、横幅はゆったりめで読みやすい気がします。
IBM Plex Sans JP
IBM Plex Sans JPはIBMが作成した日本語対応フォントです。こちらも割と最近のものです。
https://github.com/IBM/plex より
Source Han Sans系列よりも丸っこいので、Cascadiaに合わせるならこちらかなと思って選びました。Cascadiaが太めなので、マージするときはPlexだけMediumにしています。
左がIBM Plex Sans JP | 右がSource Han Code JP
フォントをマージする方法
fontforge というソフトウェアを利用しました。
GUIで細かい作業もできるのですが、マージするだけであればPythonからfontforgeを利用することで作成できます。
ここではスクリプトの内容までは踏み込みませんが、こちらの fontforge講座 を読めば簡単に処理できます。
実際に取り組む際のTips
Pythonからfontforgeを利用するには、fontforgeをインストールした上で、fontforgeコマンドにpythonファイルを渡す方法が楽でした。
fontforge -script xxx.py
fontforge講座に記載されているスクリプトに加えた点
# 合成処理
def merge(self, filename):
self._open_merge(filename)
for repname, val in self.gname.items():
basename = val[0]
subfont = val[1]
+ # ベースフォントにすでに同じ名前のグリフが存在する場合はスキップ
+ if basename in self.basefont and self._is_glyph_unicode(self.basefont[basename]):
+ continue
if repname == basename:
print(repname)
else:
print(repname + ' => ' + basename)
grep, gbase = self._copy_glyph(repname, basename, subfont)
self._del_base_possub(gbase)
self._copy_rep_gsub(grep, gbase)
self._copy_rep_gpos(grep, gbase)
self.repfont.close()
# 出力
def output(self, filename):
if self.basefont.encoding == 'Custom':
self.basefont.encoding = 'UnicodeFull'
root, ext = os.path.splitext(filename)
print('# output ... ' + filename)
+ # フォント情報を設定
+ self.basefont.copyright = """Copyright (c) xxx"""
+ self.basefont.familyname = "XXX"
+ self.basefont.fontname = "XXX-Regular"
+ self.basefont.fullname = "XXX Regular"
+ self.basefont.weight = "Regular"
if ext.lower() == ".sfd":
self.basefont.save(filename)
else:
self.basefont.generate(filename, flags=('opentype', 'short-post'))
まとめ
日本語フォントをゼロから自作するのは果てしないですが、マージするだけなら個人でも簡単に可能でした。いいフォントライフを!
Discussion