🖊️

日本語対応のプログラミング用フォント「Calex Code JP」を作ってみた

2023/11/07に公開

Calex Code JPの紹介

個人的な好みで、英数字に Cascadia Mono Regular を、日本語に IBM Plex Sans JP Medium を使用したフォントが欲しかったので、それらをマージして新しいフォント「Calex Code JP」を作ってみました。

すこしかわいい感じのフォントを組み合わせていて、違和感のない結果になった気がしています。


エディタで見るとこんな感じ

フォントを作り方は全く知らなかったのですが、マージする方法なら既存フォントをありがたく拝借するだけなのでとても簡単でした。誰でも好きな組合せのフォントを作成できるので楽しいと思います。ただし配布する場合はライセンスにご注意を!

フォントが置いてあるリポジトリを張っておきます。
https://github.com/yknishidate/CalexCodeJP

Cascadia Mono

Cascadia MonoMicrosoftが作成した比較的最近のフォントです。Windows Terminalのデフォルトフォントになっていますが、日本語には対応していません。

https://github.com/microsoft/cascadia-code より

リガチャ(合字)に対応したCascadia Codeと非対応のCascadia Monoがあります。

くにゃっとしていて若干かわいい感じで、横幅はゆったりめで読みやすい気がします。

IBM Plex Sans JP

IBM Plex Sans JPIBMが作成した日本語対応フォントです。こちらも割と最近のものです。


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