😈

FreeBSD の vt で大きな日本語フォントを使いたい!

2023/06/03に公開

はじめに

最近の FreeBSD の仮想端末コンソールドライバには vt(4) が使われています。 これはそれまで使われていたドライバである syscons(4) を置き換えるもので、CJK 文字を含む Unicode 対応、グラフィックモードによる描画、KMS ビデオドライバとの統合 (X Window System との切り替え対応) などの豊富な機能を持っています。 特に CJK 文字の表示に対応している部分はとても魅力的であり、漢字などを含んでいる適切なフォントを用いることで日本語を表示できるようになっています。

日本語を表示可能にするために必要となるフォントですが、いくつかのインターネット上で配布されているフォントがあります[1]。 しかし、これらのフォントの高さは 16 ピクセル程度であり、現代の高解像度なディスプレイ上で表示するととても小さく見えます。 加えて、私の視力はこの数年間で着実に低下してきており、あの頃のようにディスプレイと睨み合うことでこの問題を解決することはもう随分難しくなってしまいました。

この記事では、平木敬太郎氏による KH ドットフォントシリーズに含まれる “日比谷 32” を大きな日本語フォントとして利用し、仮想端末コンソール上で日本語表示できるようにするまでの流れを解説します。

環境

FontForge を実行するために Xorg をインストールしています。 また、X Window System を実行するために Intel Graphics 用のドライバ drm-kmod をインストールしています。 フォントのダウンロードのためにウェブブラウザを利用する必要があるかもしれません。

実行環境
% uname -a
FreeBSD MacBook.kusaremkn.com 13.2-RELEASE FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC amd64
% cat /etc/os-release 
NAME=FreeBSD
VERSION="13.2-RELEASE"
VERSION_ID="13.2"
ID=freebsd
ANSI_COLOR="0;31"
PRETTY_NAME="FreeBSD 13.2-RELEASE"
CPE_NAME="cpe:/o:freebsd:freebsd:13.2"
HOME_URL="https://FreeBSD.org/"
BUG_REPORT_URL="https://bugs.FreeBSD.org/"

日比谷 32 の準備

日比谷 32 は自家製フォント工房が配布している KH ドットフォントシリーズに含まれています。 これらのフォントは SIL Open Font License 1.1 の下で利用できます。 まずはこれらのフォント一式をダウンロードしましょう[2]

フォントファイルのダウンロード (直リン)
% fetch -o khdotfont-20150527.7z 'https://ja.osdn.net/frs/chamber_redir.php?m=rwthaachen&f=%2Fusers%2F8%2F8545%2Fkhdotfont-20150527.7z'

ダウンロードしてきたファイルは 7-zip 形式で圧縮されているので展開してやる必要があります。 FreeBSD の tar(1) は 7-zip 形式を展開できるので、これを利用して展開します。

圧縮ファイルを展開する
% mkdir khdotfont
% tar xvfC khdotfont-20150527.7z khdotfont

日比谷 32 のフォントファイルは、展開されたファイルのうち KH-Dot-Hibiya-32.ttf と名付けられているものです。

日比谷 32 のフォントファイル
% ls -l khdotfont/KH-Dot-Hibiya-32.ttf
-rw-r--r--  1 mkn  mkn  4120480 May 28  2015 khdotfont/KH-Dot-Hibiya-32.ttf

FontForge の準備

上で準備した日比谷 32 のフォントファイルは TrueType フォント形式です。 これを vt(4) で利用できる形式 (ここでは VFNT 形式と呼びます) に変換するために、TTF → BDF → VFNT の形式を経由する必要があります。 ここでは TTF → BDF の変換作業のために FontForge をインストールします。 pkg 経由でインストールする方法が最も簡単でしょう。

FontForge のインストール
# pkg install fontforge

TTF → BDF の変換

ここからは FontForge を用いて TTF → BDF の変換作業を行ないます。

フォントファイルの読み込み

まずは日比谷 32 の TrueType フォントファイルを FontForge で開きます。 この TrueType フォントにはビットマップフォントデータが含まれています。 FontForge を起動する際に、それを読み込むか否か尋ねられるので 32 を選択してから Yes を押下します。

フォントファイルを読み込む
% fontforge khdotfont/KH-Dot-Hibiya-32.ttf 

**32** を選択してビットマップフォントを読み込む
32 を選択してビットマップフォントを読み込む

フォントが読み込まれるとグリフの一覧が表示されますが、これはアウトラインフォントを表示しているのでぼやけて見えるかもしれません。 これが気になる場合、メニューの View から下のほうにある 32 pixel bitmap を選択することでビットマップフォントを表示できます。

ビットマップフォントを表示する
ビットマップフォントを表示する

不要なグリフの削除

まずは VFNT 形式に不要なグリフを削除します。 これらのグリフが残っていると、BDF → VFNT の変換作業で問題が発生します。

不要なグリフは一覧の最下部にあります。 赤色の ? で示されている 3 つのグリフを選択し、メニューの Encoding から Detach & Remove Glyphs... を選択します。 グリフが正常に削除されるとマス目の内容がグレーのバツ印に変化します。

不要なグリフ (左下 3 つ) を削除する
不要なグリフ (左下 3 つ) を削除する

等幅フォントである自覚を持たせる

次に、フォントファイルに自身が等幅フォントであるという自覚を持ってもらいます。 この作業を行わないと、やはり BDF → VFNT の変換作業で問題が発生します。

メニューの Element から Font Info を選択し、表示されるダイアログの General の項目に移動します。 表示されている Scale OutlinesHas Vertical Metrics のチェックを外し、Interpretation の値を Japanese に設定します。

General の設定
General の設定

続いて OS/2 の項目に移動し、PFM Family の値を Monospace に設定します。 そのまま Panose のタブに移動し、Proportion の値を Monospaces に設定します。

OS/2 の Misc. タブの設定
OS/2 の Misc. タブの設定

OS/2 の Panose タブの設定
OS/2 の Panose タブの設定

ここまでの設定を完了したら OK を押下して確定します。

BDF フォント用の設定

さらに BDF フォント用の設定を行います。

メニューの Element から Other InfoBDF Info を選択します。 表示されるダイアログの New... をクリックし、表示されるリストから SPACING を選択、値を C に設定します。 その後、OK を押下して設定を確定します。

BDF フォント用の設定
BDF フォント用の設定

BDF フォントの書き出し

最後に BDF フォントを書き出します。

メニューの File から Generate Fonts... を選択します。 表示されるダイアログのファイル名を入力する欄には KH-Dot-Hibiya-*.bdf のような末尾にアスタリスク (*) を持つ名前を入力します (ファイル生成時に 32 などのピクセル数に置き換えられます)。 その下にある 2 つのプルダウンメニューのうち、左側の値を No Outline Font に、右側の値を BDF に設定します。 Generate を押下すると BDF Resolution と名付けられたダイアログが表示されるので、Guess を選択して OK を押下します。

BDF フォントの書き出し
BDF フォントの書き出し

ここまで来れば FontForge の役目は終了です。

BDF → VFNT の変換

BDF 形式のフォントファイルを vt(4) で利用できる形式のフォントファイルに変換するには vtfontcvt(8) を利用します。 問題なく変換できた場合、黙って完了します。

BDF → VFNT の変換
% vtfontcvt -o KH-Dot-Hibiya-32.fnt KH-Dot-Hibiya-32.bdf

フォントの適用

ここまで来ればフォントは完成しています。 完成したフォントを利用するために vidcontrol(1) を利用します。 仮想端末コンソールからログインし、次のように実行するとフォントが切り替わるはずです。

フォントの適用
% vidcontrol -f KH-Dot-Hibiya-32.fnt

トラブルシューティング

ここでは、よく遭遇するエラーとその対処法について解説します。

font spacing "C" (character cell) required

vtfontcvt(8) が表示するエラーに次のようなものがあります。

vtfontcvt(8) のエラー
% vtfontcvt -o output.fnt errorfont.bdf
vtfontcvt: font spacing "C" (character cell) required

これは、フォントファイルが等幅フォントとしての自覚を持っていない場合に発生するエラーです。 等幅フォントである自覚を持たせるを参考に等幅フォントとしての自覚を持たせてやると解決します。

bitmap with unsupported DWIDTH 0 0 at line XXXX

vtfontcvt(8) が表示するエラーに次のようなものがあります。

vtfontcvt(8) のエラー
% vtfontcvt -o output.fnt errorfont.bdf
vtfontcvt: bitmap with unsupported DWIDTH 0 0 at line 269290

これは、フォントファイルに 0 ピクセルの幅を持つグリフが含まれている場合に発生するエラーです。 日比谷 32 は .null と名付けられたグリフと nonmarkingreturn 名付けられたグリフを持っており、これらの幅は 0 ピクセルです。 不要なグリフの削除を参考に不要なグリフを削除すると解決します。

broken char header at line XXXX!

vtfontcvt(8) が表示するエラーに次のようなものがあります。

vtfontcvt(8) のエラー
% vtfontcvt -o output.fnt errorfont.bdf
vtfontcvt: broken char header at line 2737!

これは、フォントファイルに垂直方向のメトリクス情報が含まれていると発生するエラーです。 等幅フォントである自覚を持たせるの中で行なっている Has Vertical Metrics のチェックを外す作業で解決できます。

文字が表示されない・文字の一部が欠ける

チルダ (~) やギリシャ文字の π など、一部の文字は正常に表示されません。

一部の文字が正常に表示されない
一部の文字は正常に表示されない

日比谷 32 にはチルダを始めとするいくつかのグリフが含まれていません。 これらの文字を表示するためには自分でグリフを追加する必要があります。 また、π を始めとする曖昧幅の文字の多くは全角の幅を持ちます。そのため、アプリケーションによっては文字の一部が欠けて表示されることがあります。

もっと使いたい!

もっともっと使ってあげてください。

デフォルトでこのフォントを使いたい

できます。 まずは生成した VFNT 形式のフォントファイルを /usr/share/vt/fonts/ 配下にコピーします。 その上で /etc/rc.conf に利用するフォントの設定を追加します。

デフォルトで日比谷 32 を使う
# cp KH-Dot-Hibiya-32.fnt /usr/share/vt/fonts/.
# sysrc font8x16="KH-Dot-Hibiya-32.fnt"

日比谷 24 を使いたい

できます。 ただし、不要なグリフの削除では縦書き用のグリフも削除してください。

削除すべきグリフ (日比谷 24)
削除すべきグリフ (日比谷 24)

おわりに

おわりです。


参考

脚注
  1. 例えば、このページで配布されている b16.fnt や、このページで配布されている jiskan16u.fnt などがあります。 ↩︎

  2. このコマンドでは “直リン” を利用しています。 これはとても行儀が悪いので、ウェブブラウザを利用してダウンロードしたほうが良いかもしれません。 ↩︎

Discussion