16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

イントロ

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

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

initial-dialog-mosaic.png

…ん?

default2.png

なんで?

default-middle2.png

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

解決法

この手順で解決できる。

  1. このファイルをダウンロード、あるいは中身を全選択してコピーする。
  2. 適当なテキストエディターでそれを開く。
  3. @云々@ という変数がある 5 個の項目について、変数部分を自分の OS の然るべき値に置換する。
    • 然るべき値の参照元:
    • 変数部分と置換:
      置換といってもそれぞれ 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
  4. 置換し終わったテキストを適当に "resources-correct.txt" みたいなテキストファイルとして保存する。
    • パスやファイル名には日本語を含めない方が安全だろう。
  5. FontForge の [ファイル] → [環境設定] → [一般] → [リソースファイル] でそのテキストファイルを参照する。
  6. [OK] して環境設定を保存し、FontForge を再起動する。

correct-middle2.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 フォントをいじっている先人は当然いる。

いじり方

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

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

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

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

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

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

editor-description.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

なってない!!

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

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

try2-gdraw-gmenubar-font.png

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

try3-consolas-menubar.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] 欄は何のためにあるのか

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

フォント名参照を使おう

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

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 には日本語配列のキーボードで入力しても英語配列と見なされるという未解決バグがあり、このため私達が外観エディター上で ^ を直接入力しようとすると ' になってしまう。
どこかから ^ をコピペしてくるとか、&(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 を立てた

立てた。

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

そして解決へ

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

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

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

correct-middle1.png

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

correct-ae-view-crop.png

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

correct-ae-menubar-crop.png

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

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

後書き

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

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

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

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

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

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

おわり

16
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?