Linuxだって、綺麗にフォントが表示できるんだからねッ!

Linuxと風呂敷を広げていますが、ごめんなさい、対象はあくまで「Debian GNU/Linux 9(stretch)」です。

尤も、他のディストリビューションでも、同じようなパッケージは用意されていると思われるので、興味が有れば探してみてください。

綺麗なんですけど?

確かに。

最近のLinuxのデスクトップは、Windowsなんかに比べて、遥かに綺麗にフォントを表示してくれます。

特に明朝体(Serif)は、Windowsの場合、到底実用とならないレベルですが、Linuxのデスクトップではどのアプリケーションでも充分常用できます。

Debian GNU/Linux 9では、標準でIPA明朝とIPAゴシックがインストールされます。

とても見やすいフォントなのですが、残念ながらウェイトがRegular一択なので、タイトルなどで太い文字を使いたい時に、綺麗に表示されません。

少し前であれば、フォント関連のように、『フリーな選択肢があるのが不思議』なジャンルでは諦めが肝心だったのですが、最近は状況が変わってきました。

Noto(no more tofu)というフォントが、GoogleとAdobeにより開発され、SIL Open Font License 1.1で公開されています。

Debian GNU/Linux 9にも、標準のパッケージが存在します。

ゴシック体フォントが、「Thin」「Light」「DemiLight」「Regular」「Medium」「Bold」「Black」の7種類(細い順)、明朝体フォントが「ExtraLight」「Light」「Regular」「Medium」「SemiBold」「Bold」「Black」の7種類(細い順)が用意されています。

フォントをインストール

標準パッケージを普通にインストールすると、RegularとBoldがインストールされます。

普通にインストール

これで、ドキュメントなどでタイトルや強調したい箇所でボールドで指定すれば、あの滲んだような太字ではなく、スッキリしたフォントで表示されます。

IPAフォントとNotoフォント

IPAフォントのボールド(合成)も、それなりに綺麗ですが、濁点や狭い隙間などがどうして潰れてしまいます。その点、元からボールドが用意されているNotoフォントの場合は、細かい部分もスッキリしています。

拡張機能もインストール

せっかくなの他のウェイトも使えるようにしましょう。但し、少々重くなる傾向があるので、必要性を感じた場合のみにしてください。

標準パッケージではなく、backportsからのインストールになります。

拡張版もインストール

これで、ゴシック体・明朝体共に、7種類のウェイトが使えるようになりました(何に使うかは不明ですが)。

Noto CJK JP

画像にしてしまうと、まあちょっと微妙ですが、普通に表示していると、なんとなく違いは分かります(なんとなくって...)。

上記の画像は、Firefoxに表示したものをキャプチャして作成したのですが、CSSでフォントを指定する時に、少しイレギュラーな指定が必要でした。

通常は下記のように、全体のフォントファミリを指定して、個々のウェイトを指定すればよいのですが、Sansの一部のウェイトが正しく判定されませんでした(Serifは特に問題ありません)。

通常のCSSセッティング

font-weightの300と350が正しく認識されないため、LightがDemiLightで表示されてしまいます。

そこで、以下のようにLiteだけ、font-familyでウェイトも含めて指定しています。

イレギュラーなCSSセッティング

ちなみに、フォントのウェイトと名前の対応については、font-weight - CSS: カスケーディングスタイルシート | MDNを参考にしています。DemiLightはLightとRegularの中間ということで、350としています。

本来この画像はSVGで作ろうと思ったのですが、InkscapeがSansのDemiLightを認識してくれなくて断念しました。

このあたりも、Firefoxが認識しなかったのと同じような理由によるかと思いますが、LibreOfficeのDrawは認識してくれます。

LibreOfficeのDrawだと、フォントをパスに変換できないので、PNGということになりました。

Webフォント

こだわりのあるコンテンツ制作者は、自分が作ったものを自分が見たままに表示させたいと考えます(昔、トップページが全面一枚の画像という、印刷会社のWebサイトがありました)。

こだわりのあるエンドユーザは、コンテンツくらい自分の好きなフォントで見たいと考えます(私もこの一人です)。

なので、font-familyが指定されているコンテンツは鬱陶しいだけです(何でもかんでもsans-serifにするんじゃねえよ、俺は明朝が好きなんだ!!)。

あまつさえ、Webフォントなんざ(特にでかいサイズのWebフォントなんざ)、「うざい!」の一言です。

しかし、コンテンツ制作者側に回れば、もちろん言うことがころっと変わります。

自分が作ったものは、自分が見たままに表示させたいじゃないですか ^_^;

ということで、Webフォントを作ってみます。

LinuxでWebフォントを作成するためには、pyftsubsetコマンドを使います。

pyftsubsetコマンドは、fonttoolsパッケージに含まれますので、インストールします。

fonttoolsのインストール
Webフォントを作成する

上記コマンドは、NotoSansCJKjp-Regular.otfというフォントファイルから、NotoSansCJKjp-Regular_jyouyou.woff2という、woff2形式のWebフォントを作成します。

NotoSansCJKjp-Regular_jyouyou.woff2の中には、jyouyou.txtに指定された文字が格納されます。

jyouyou.txtは、必要な文字が羅列された単なるUTF-8のテキストファイルです。この中の改行コードは無視されるので、1行で記述する必要はありません。

3行目の--layout-features='*'の指定は、おまじないです。

OpenTypeのフォントファイルは、合字や置き換え・配置位置など様々な情報を保持しているのですが、--layout-featuresで、その中のどの情報をWebフォントに残すかを指定できます。

当然、その内容を絞ることでWebフォントのサイズを小さくできまる筈ですが、OpenTypeの仕様に詳しくなければ、正しい指定ができないでしょう(私にもできません)。

ということで'*'(全て)を指定しています。

--flavor=woff2の指定は言うまでもなく、woff2形式のWebフォントを作成するためのものです。

常用漢字とひらがなカタカナ記号などに限定しても、1メガを超えるサイズとなるので、やはりWebフォントはタイトル部分などに限定して使うというのが正しいのでしょう。

2020/6/25追記

なんと、記述内容に私の環境でしか動作しないという、不具合がありました ^_^;

Debianで紹介した通りインストールすると、実際にインストールされるフォントファイルは ttc 形式のファイルなので、pyftsubsetを使ったコマンド例では、エラーとなってしまいます。

ttc 形式のフォントファイルは、複数のフォントを包括しているので、そのなかのどのフォントを使うかを指定する必要があります。

まずは、フォントファイルにどの様なファイルが入っているかを確認します。

フォントファイルの内容確認

fc-scanコマンドは、fontconfigパッケージに入っているので、通常はインストール済みだと思います。

Notoフォントファイルが格納されているディレクトリに移動して、NotoSansCJK-Regular.ttc に上記コマンドを実行すると、下記のように表示されます。

$ cd /usr/share/fonts/opentype/noto
$ fc-scan --format "%{postscriptname}\n" NotoSansCJK-Regular.ttc
NotoSansCJKjp-Regular
NotoSansCJKkr-Regular
NotoSansCJKsc-Regular
NotoSansCJKtc-Regular
NotoSansMonoCJKjp-Regular
NotoSansMonoCJKkr-Regular
NotoSansMonoCJKsc-Regular
NotoSansMonoCJKtc-Regular

8つのフォントが入っていることが確認できます。

このなかから、NotoSansCJKjp-Regular を使ってWebフォントを作成する場合、以下のようになります。

ttc形式のフォントファイルからWebフォントを作成する

--font-number=の指定は0スタートの番号で、NotoSansCJKjp-Regularが0、NotoSansMonoCJKtc-Regularが7となります。