FontForgeのデフォルトUIフォントが酷すぎるのは不具合だったし今直せる

# イントロ

**Windows 10** (Home 64-bit) にて、**FontForge v20230101** を新規インストール。

で、開いてみる。
とりあえずソフトを立ち上げたいだけなので、最初のダイアログは「新規」を選択。

![initial-dialog-mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/736641f1-e27f-9257-d91f-62900f1d9b3c.png)

…ん？

![default2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/c9b0556e-bbc0-cab2-4c7c-5bb9bed7ae18.png)

**なんで？**

![default-middle2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/9dfb65fd-6290-acec-3f71-00b8df6870d7.png)

<font color="#00CC6C">**な**</font><font color="#B200FF">***ん***</font><font color="#FF6A00">**で**</font><font color="#808080">***こ***</font><font color="#000000">**ん**</font><font color="#0094FF">***な***</font><font color="#E5BF00">**読**</font><font color="#008040">***み***</font><font color="#FF0000">**づ**</font><font color="#66CC00">***ら***</font><font color="#7C4CFF">**い**</font><font color="#0026FF">***の***</font><font color="#00E5E5">**！**</font><font color="#A04000">***？***</font>

フォントを作るソフトなのに、その UI フォント表示がめちゃくちゃ汚いってどういうこと？
欧米産のフリーソフトだから…で済ますレベルではない気がする。


# 解決法

この手順で解決できる。

1. このファイルをダウンロード、あるいは中身を全選択してコピーする。
   - fontforge/resources.in at 20230101 · fontforge/fontforge · GitHub
     https://github.com/fontforge/fontforge/blob/20230101/fontforgeexe/pixmaps/tango/resources.in
1. 適当なテキストエディターでそれを開く。
1. `@云々@` という変数がある 5 個の項目について、変数部分を自分の OS の**然るべき値**に置換する。
   - 然るべき値の参照元：
     - fontforge/BuildUtils.cmake at 20230101 · fontforge/fontforge
       https://github.com/fontforge/fontforge/blob/20230101/cmake/BuildUtils.cmake#L142
       私は Windows なので、`elseif(WIN32 OR CYGWIN)` の分岐にある各値を用いる。
     - fontforge/CMakeLists.txt at 20230101 · fontforge/fontforge · GitHub
       https://github.com/fontforge/fontforge/blob/20230101/fontforgeexe/pixmaps/CMakeLists.txt
       同様に、私は APPLE ではないので `else()` の分岐にある値 `False` を用いる。
   - 変数部分と置換：
     置換といってもそれぞれ 1 箇所ずつしか登場しないので、手作業でコピペするだけで良い。
     私は Windows なので、次のような値となる。
     - `@FONTFORGE_UI_FAMILIES@` → `system-ui,Deja Vu Sans,Calibri`
     - `@FONTFORGE_LABEL_FAMILIES@` → `Deja Vu Sans,Calibri,unifont,unifont upper`
     - `@FONTFORGE_MONO_FAMILIES@` → `monospace,unifont`
     - `@FONTFORGE_SERIF_FAMILIES@` → `serif`
     - `@GDRAW_GMENU_MACICONS@` → `False`
1. 置換し終わったテキストを適当に "resources-correct.txt" みたいなテキストファイルとして保存する。
   - パスやファイル名には日本語を含めない方が安全だろう。
1. FontForge の [ファイル] → [環境設定] → [一般] → [リソースファイル] でそのテキストファイルを参照する。
1. [OK] して環境設定を保存し、FontForge を再起動する。

![correct-middle2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/c06d3ece-3595-2526-8f83-ec257be69207.png)

**読みやすい！**

Before/After の比較 APNG（アニメーション PNG）はこちら。
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/cabf3bcc-d46a-42a3-04a1-4bd567e6fcb7.png


# 背景

以下、この解決法に至った背景。

## FontForge の UI フォントの苦しみ

冒頭の通り、私は Windows 用の FontForge 最新版を入れた。
FontForge を使った経験はほぼ無いので、環境設定等の引き継ぎも無いクリーンインストールとなる。
そしてやはり冒頭の通り、その UI フォントに***ウッ***となった。

**嘘だろ**と思って Twitter で `lang:ja fontforge ui` とか検索してみると、私と同様に***ウッ***となっている人々が見受けられる。
また Google 画像検索で FontForge のスクショを検索してみると、やはり明らかに***ウッ***となるようなデフォルトの UI フォントでの使用風景が見当たる。
彼ら彼女らのバージョンや OS は知らねども、我らは同じ苦しみの下に集う同志であると実感できる。

で、そんな苦しみは爆破したいので、FontForge の UI をいじる方法を知りたくなる。

## 確かに UI はいじれる、けどなんかおかしい

FontForge の UI フォントをいじっている先人は当然いる。

- FontForge2023のUIのフォントの変更にあまりにも手こずった話 - Qiita
  https://qiita.com/FengNegi/items/10443222f9bdb61f9dfb

### いじり方

次のような手順で UI 設定をいじれる。

1. [ファイル] → [Appearanca Editor] で、外観エディター<sup>（ここでは勝手にそう呼びます）</sup>を開く。
1. 色々と好きなようにいじる。
1. いじった内容を [Save As] で適当なテキストファイルに保存する。
   その際、[Store this filename in preferences] オプションを有効化しておく。
1. 外観エディターを閉じる。
1. さっきのオプションを有効化**しなかった**場合、[ファイル] → [環境設定] → [一般] → [リソースファイル] でさっきのテキストファイルを手動参照する。
1. [OK] して環境設定を保存し、FontForge を再起動する。

理由は知らないが、このようにしてとにかく一度外部ファイルを経由する仕組みになっている。
一旦保存してしまえば、あとはそれを再び外観エディターから再変更して保存して…とやっても良いし、テキストエディターで直接変更しても良い。

それは別に良いんだけど…。

### 外観エディターの説明、ほんと？

ここで、外観エディターを開くと最初に表示される [表示] ページが言っていることを確認してみる。

![editor-description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/9dbc86e6-00a1-75b9-6681-a47f7d0e9020.png)

説明文：

> This is an abstract class which defines common features of the FontView, CharView, BitmapView and MetricsView.
> 拙訳：これは、FontView、CharView、BitmapView、MetricsView の共通機能を定義する抽象クラスです。

[DefaultFont] のツールチップ：

> The primary display font family (normally sans-serif) at the normal size for menus, dialogs, etc.
> 拙訳：メニューやダイアログ等で通常サイズで表示される、主たる表示フォントファミリー（通常はサンセリフ）です。

うん、どう考えても**とりあえず [DefaultFont] を変更してみれば FontForge の主なフォント表示に影響を及ぼせる**はず。

ということで、[DefaultFont] をデフォルト値の `400 12pt system-ui,Deja Vu Sans,Calibri` から、変更がわかりやすいように **`400 20pt Consolas`** に変更してみる。
然るべき手順で保存し、読み込ませ、再起動すれば、FontForge の UI フォントが 20pt の Consolas になって…

![try1-just-consolas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/ab47572d-10ba-0315-ce1f-9d1b96e94421.png)

**なってない！！**

ちなみに、画像は Consolas をファイルとして開いたもの。
メニューのフォントと見比べてみると、Consolas なら見分けられて当然の `I` と `l`（大文字アイと小文字エル）が、メニューの方の [取り込み(I)] や [Clear Special Data] では明らかに見分けにくい縦一直線のグリフになっていることがわかる。
そしてもちろん、フォントサイズも全然大きくなっていない。

なぜ変わらないかというと、メインメニューのフォントを司っているのは `Gdraw.GMenuBar.Font` という項目であり、そこに影響を及ぼしていないから。
外観エディターを再び開き、グッとスクロールして [Menu Bar] のページを見てみる。

![try2-gdraw-gmenubar-font.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/fbdc182a-a1e9-b0c9-c792-4125f5afa7d6.png)

[Font] 欄が `400 10pt sans` となっている。
では、ここを `400 20pt Consolas` に変更して FontForge を再起動してみると…

![try3-consolas-menubar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/a750d5c2-1a83-4db2-f9c4-3df683b50ef7.png)

$\Huge\textbf{デッッッッッッッッッッカ}$
$\Huge\textbf{ふざけんな}$

いや失敬。
元が 10pt だったのが倍の 20pt になったので、めちゃくちゃデカくなった。

そして当然、フォントが Consolas **だけ**で表示されるようになった。
Consolas **だけ**しかフォントを指定しておらず、Consolas には日本語文字が含まれていないので、必然的にメニューの日本語部分は全て豆腐化してしまっている。
実用の際には `Consolas,system-ui` のようにフォールバックを必ず指定しておくべきだろう。
なお、カンマの後ろにスペースを入れてはいけない。

しかしそもそも、本当にこんな風に外観エディターの全ページからフォント指定の項目を見つけ出して個別にフォント指定をコピペし尽くさねばならないのだとしたら（ちなみにそういう項目は **48 個**あるが）、それはソフトウェアの作りとしてあまりにも厳しい気がする。
それこそフォールバックの件のように、「最初は `Consolas` だけで良いやと思って 48 個コピペし終わったけど、やっぱり `,system-ui` も付けたかった」となったら再び 48 個のコピペをし直すハメになる。
また、メインメニューのフォントの項目は `Gdraw.GMenuBar.Font` であると書いたが、じゃあそんな感じで各設定項目が具体的に UI のどこに作用するのかが直ちにわかるものなのかというと別にそういう訳でもなく、普通は [MenuBar] とその一個下の [Menu] との違いすら全然自明ではないと思うので、実際には純粋なコピペ作業ではなくフォントサイズ等の細かい個別調整も必要になるだろう。
だいたい、48 個全ての項目にそんな職人作業が要るのだとしたら、**最初の [DefaultFont] 欄は何のためにあるのか**。

うーん、何かがおかしい。

### フォント名参照を使おう

ここで公式ドキュメントを見てみる。

- Changing FontForge’s UI Appearance — FontForge 20230101 documentation
  &gt; Reference Font Names
  https://fontforge.org/docs/ui/misc/xres.html#reference-font-names

> Instead of specifying a font from scratch you can do so in relation to a reference font, given by the name of the resource preceded by a caret. The primary fonts to reference are “View.DefaultFont”, “View.LabelFont”, “View.MonoFont”, and “View.SerifFont”.
> 拙訳：フォント指定をゼロからやっていかなくても、リソース名の頭にキャレットを付けた参照フォントで同じことができます。参照すべき主たるフォントはそれぞれ `View.DefaultFont` `View.LabelFont` `View.MonoFont` `View.SerifFont` です。

> To copy the exact specification of a different font you can just include the reference name, as in “^View.DefaultFont”. To override the size, weight or style just include one of those directives, as in “10pt bold ^View.MonoFont”.
> 拙訳：`^View.DefaultFont` のように参照名を含めるだけで、よそのフォント指定を完全にコピーできます。サイズ、ウェイト、スタイルを上書きする場合も、`10pt bold ^View.MonoFont` のようにその指示をただ含めるだけです。

**これだよ！！！！！！！**

ということで、外観エディターの項目を次のように設定すれば、さっきと同じデカい Consolas の UI が見られる。

- `fontforge.View.DefaultFont: 400 20pt Consolas`
- `Gdraw.GMenuBar.Font: ^View.DefaultFont`

画像はデカいので略。同じだし。

なお、現状の FontForge には[日本語配列のキーボードで入力しても英語配列と見なされるという未解決バグ](https://github.com/fontforge/fontforge/issues/5086)があり、このため私達が外観エディター上で `^` を直接入力しようとすると `'` になってしまう。
どこかから `^` をコピペしてくるとか、`&`（Shift+`6`）を入力しようとするとかで対応は可能だが、それよりはテキストファイルとして好きなテキストエディターで開いて編集する方が何倍も楽だろうから、そちらを推奨する。

いや～そういうことでね、フォント指定を使い回せることがわかってめでたしめでたしってことでね！！
あとは**然るべき項目**に**然るべきフォント名参照**（`View.DefaultFont` `View.LabelFont` `View.MonoFont` `View.SerifFont` のどれか）をコピペすれば万事解決ってね！！！
そう、然るべき……然る………………え？ **どこにどれを？ どんなサイズで？**
コピペマラソンの再走は免れたけど、**個別対応の問題**は残ってるんじゃない？？

っていうかこのドキュメントの続き曰く、

> The default resource file now has these relative font settings, so that changing the point size of View.DefaultFont scales the whole UI.
> 拙訳：`View.DefaultFont` のポイントサイズを変更することで UI 全体の拡縮が行えるように、デフォルトのリソースファイルではこれらの相対的フォント設定を済ませてあります。

**デフォルトでもうそれが全部済んでるはずなんだが？？？**

## ということで Issue を立てた

立てた。

- Appearance Editor: Why not use `^View.DefaultFont` etc. by default? · Issue #5238 · fontforge/fontforge
  https://github.com/fontforge/fontforge/issues/5238

なお、立てた時はまだ私もドキュメントに「デフォルトで済んでる」の件があるのを知らず、「デフォルトで済ませてくんない？」という旨の Issue になってしまっている。

## そして解決へ

すると迅速に返答があり、多少の状況確認の後、現状のデフォルト設定が**確かにおかしい**（古い？）こと、ソースの `/fontforgeexe/pixmaps/tango/resources.in` といくつかの CMake 用変数を見れば**本来あるべき値が全部得られる**ことを教えていただいた。

私はこの Issue を改善要望のテンプレで書いたが、前者の通りこの挙動がおかしい（古い）のであれば、この件は改善要望というよりはバグ報告だったということになる。
そして後者の情報を受け、私の手元で問題の解決が確認できた。
その解決法が、本記事の「[解決法](#解決法)」の節に記した手順となる。

結果、UI フォントはこのように `system-ui`（恐らく Yu Gothic UI か）が適用されて格段に見やすくなったし、

![correct-middle1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/6b328581-6c84-1925-2093-8d4275b9b360.png)

改めて外観エディターのフォント指定欄を見てみると、ちゃんと `^View.DefaultFont` のようなフォント名参照が各所に使われていることがわかる。

![correct-ae-view-crop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/a9d1410e-f3ec-0b49-93cc-5914e53445f9.png)

何気に文字入力欄の表示が等幅フォントになっており、その点でも効果を実感できる。

![correct-ae-menubar-crop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225134/bb63f8fd-7560-222f-efb9-f8c8a7d654da.png)

メニューのフォントサイズは 10pt ではなく 83%（12pt × 0.83 = 9.96pt）だったらしい。
割合指定なので、ドキュメントの通り「`View.DefaultFont` のポイントサイズを変更することで UI 全体の拡縮が行える」ようになっている。

かくして FontForge の UI はあるべき姿を取り戻した。
めでたし。


# 後書き

いや～報告して良かった。
少なくとも私自身の 48 項目コピペマラソンは回避できたし、他のユーザーの益にもなったと信じている。
何せなまじ致命的な不具合ではない上、正直言って**欧米産フリーソフトで日本語の扱いに難があるなんてのは大して珍しくもない**だろうから、日本語ユーザーとしては読みづらいな～と感じても**まぁ耐え忍べば読めるし…**<wbr>と思ってそのまま使い続けている人が少なくなかったのではないかと思う。

**その読みづらさ、直せますよ！！！！！！！**

ということで、解決法と経緯を記録して共有すべく、本記事を書いた。
いずれ公式に更新が来て何か良い感じに修正されるだろうとは思うが、そう言っている間にも既に全国の FontForge ユーザーがその UI フォントに***ウッ***となり続けているはず。
一体いつからこの不具合があったのかは知らないが、今後いつか修正される日が来るまでの間、FontForge の UI フォントに***ウッ***となる日本語ユーザーを本記事の手法で少しでも減らせればと願う。

他方、FontForge を開発して提供している側の気持ちを想像するとゾッとする。
とっくの昔に刷新していたはずの外観設定リソースが、なぜか**古いまま残っていてデフォルト設定としてバリバリ現役で使われ**、それが全世界のユーザー達を***ウッ***とさせ続けていたなんて……。
それこそ<font color="#FF0040">***ヴッッッッッ！！！！***</font>となるだろう。

OS 依存（Windows）の問題なのかと最初は思ったが、画像検索すると明らかに Mac のスクショで同じような日本語 UI になっているものも見つかる。
どちらかというと言語依存、特に非ラテン文字圏の言語だからこそ表面化することなのだろう。
開発陣は基本的に英語や西洋言語の話者ばかりだろうから（知らんけど）、そちらの言語で表面化していたらとっくに見つかって直っているだろうし。
環境は本当に人それぞれであり、ある環境では当たり前のことが、別の環境では全く当たり前ではない、という当たり前のことを感じさせられた。

**バグは言わなきゃ直らない**。
…かどうかはわからないが、**言ったら直せた**。

&ZeroWidthSpace;

おわり