xfs (X font server) で TrueType フォントを使う


xfs は X window system 上でフォントを使える様にする為の仕組である。

フォントファイル (.ttf 又は .ttc) の install

TrueType フォントを任意のディレクトリに置く。 この文書では、 RICOH の明朝体 hgrhm3.ttchgrhm9.ttc、 ゴシック体 hgrhg3.ttchgrhg9.ttc/usr/local/share/fonts/ricoh に置いた場合について書く。

一覧ファイル (fonts.dir) の作成

xfs はフォントファイルをディレクトリごとに扱っており、 各ディレクトリごとにフォントファイルの一覧 fonts.dir が必要になる。 これを自動的に作ってくれるコマンドが2つ有って、 似通った名前で分かり難いのだが 機能の優れている mkttfdir を使う方が良いと思う。 TrueType フォントの有るディレクトリに移動して mkttfdir を実行するだけで fonts.dir が作られる。
# cd /usr/local/share/fonts/ricoh
# mkttfdir

fonts.dir の書式、同時に X で有効なフォント属性

fonts.dir は1行で1種類のフォントを定義しており、 先頭行には定義したフォントの数が書いてある。 フォント定義の書式は例えば以下の通りであり、 TTCap、file name、XLFD の3つに分けられる。
bw=0.5:vl=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictai-medium-r-normal--0-0-0-0-c-0-iso8859-1
------------__________ -------------------------------------------------------------------
TTCap       file name  X Logical Font Description (XLFD)

TTCap: フォントファイルの扱い方を指定する

TrueType フォント等の scalable font に対してのみ使える機能であり、 フォントファイルに入っている形状を変形させて利用できる。 次の様なオプションが有り、複数のオプションは : で区切って指定する。
オプション 取り得る値 意味
fn 0 (固定幅フォント)、1 (プロポーショナルフォント) 等で利用するファイルに依存する。 face number。TrueType Collection フォント (.ttc) から利用するフォントを選択する。
bw 実数。(default value = 1.0) bounding box width。固定幅フォントのみ有効で、文字の幅を指定する。 半角文字は0.5で全角文字は1.0というのが無難だが、 理想的には各フォントの形状に合わせて少し小さめの値にする。
ai 実数。(default value = 0.0) auto italic。文字を傾ける。 アルファベットは italic 体ならば0.2で oblique 体ならば0.4にするが、 日本語フォントはより小さな値の方が良い。
ds y 又は n double strike。文字を二重に表示して bold 体を表す。
以下は使わないのだが
sw 実数。(default value = 1.0) scale width。文字幅の倍率を指定する。
fs c (character cell)、m (mono space)、p (proportional) のどれか。 force spacing。XLFD で指定するはず。
vl y 又は n very lazy metrics calculation method。 埋め込みビットマップに影響が有るらしいが詳細不明。
他にも幾つか有るらしい

X Logical Font Description: フォントの属性を指定する

- は区切り記号であり、 その間にフォントの属性を指定してある。 フォント属性の各項目は以下の様な意味を持つ。
-fndry-fmly-wght-slant-sWdth-adstyl-pxlsz-ptSz-resx-resy-spc-avgWdth-rgstry-encdng
属性名 取り得る値 意味
fndry 文字列。 foundry。フォント鋳造者名。
fmly 文字列。 family。フォント名。
wght boldbookdemidemiboldlightmediumnormalregular 等。 weight。文字の太さ。沢山有るが mediumbold くらいで充分。
slant i (italic)、o (oblique)、r (roman) 等。 slant。文字の傾き。
sWdth condensednarrownormalsemicondensed 等。 set width。文字の幅。通常は normal を指定する。
adstyl (nil)jakomediumsans 等。 add style。追加情報。(nil) で良い。
pxlsz 整数。scalable font ならば0 pixel size。ピクセル単位でのフォントの高さ。 ptSz と一対一対応するので片方だけ指定すれば良い。
ptSz 整数。scalable font ならば0 point size。1/10 ポイント単位でのフォントの高さ。 pxlsz と一対一対応するので片方だけ指定すれば良い。
resx 整数。scalable font ならば0 resolution x。水平方向の解像度。
resy 整数。scalable font ならば0 resolution y。垂直方向の解像度。
spc c (character cell)、m (mono space)、p (proportional) のどれか。 spacing。文字の送り幅。
avgWdth 整数。scalable font ならば0 average width。文字幅の平均。
rgstry 日本語の場合は大体が iso8859 (ASCII)、jisx0201.1976 (半角カナ)、jisx0208.1983 (全角文字)、jisx0208.1990 (全角文字)のどれか。 registry。文字体系。
encdng 整数又は文字列。 encoding。rgstry に付属して文字体系を表す。

fonts.dir の変更

mkttfdirfonts.dir を作ると、 1つのフォントファイルに対して次のフォント属性が定義される。
bw=0.5:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-jisx0201.1976-0
hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
つまり weight を medium、slant を r、spacing を c として の3種類が作られており、 iso8859jisx0201.1976 は半角なので bw=0.5 が自動的に付く様になっている。 更に TTCap を使えば1つのフォントファイルから複数のフォント属性を作りだせるはずで、 という3つの項目を扱うとすれば、 最終的に registry が3通り、weight が2通り、slant が2通り、spacing が2通りで 合わせて24通りのフォント属性が定義できる。
bw=0.5:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-iso8859-1
fn=1:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-p-0-iso8859-1
bw=0.5:ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-c-0-iso8859-1
fn=1:ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-p-0-iso8859-1
bw=0.5:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-c-0-iso8859-1
fn=1:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-p-0-iso8859-1
bw=0.5:ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-c-0-iso8859-1
fn=1:ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-p-0-iso8859-1
bw=0.5:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-jisx0201.1976-0
fn=1:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-p-0-jisx0201.1976-0
bw=0.5:ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-c-0-jisx0201.1976-0
fn=1:ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-p-0-jisx0201.1976-0
bw=0.5:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-c-0-jisx0201.1976-0
fn=1:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-p-0-jisx0201.1976-0
bw=0.5:ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-c-0-jisx0201.1976-0
fn=1:ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-p-0-jisx0201.1976-0
hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
fn=1:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-r-normal--0-0-0-0-p-0-jisx0208.1983-0
ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-c-0-jisx0208.1983-0
fn=1:ai=0.2:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-medium-o-normal--0-0-0-0-p-0-jisx0208.1983-0
ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
fn=1:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-r-normal--0-0-0-0-p-0-jisx0208.1983-0
ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-c-0-jisx0208.1983-0
fn=1:ai=0.2:ds=y:hgrhg3.ttc -Ricoh-HGHeiseiKakugothictaiW3-bold-o-normal--0-0-0-0-p-0-jisx0208.1983-0
こんな物を手で入力するのは嫌なので、 適当にスクリプト mkfontsdir.sh を作った。 取り敢えずディレクトリ内の全ての TrueType フォントに対して 各々24通りのフォント属性を定義できる。
# ~/bin/mkfontsdir.sh > fonts.dir
fonts.dir 先頭行のフォント定義数は自分で追加せねばならない。 普通はこれで完成だが、 この例では明朝体ゴシック体共に太さの違うフォントファイルを用意していて、 hgrh[gm]3.ttc が medium 用で hgrh[gm]9.ttc が bold 用である。 よって bold 属性になっている hgrh[gm]3.ttc の定義と medium 属性になっている hgrh[gm]9.ttc の定義を消した。

xfs の設定

xfs の設定は /etc/X11/XF86Config-4 で行う。 以下の変更を加えてから X を再起動させれば有効になるが、 font path の追加は xset +fp /usr/local/share/fonts/ricoh/ でも出来る。

font module の指定

TrueType フォントを扱う為には freetypextt のどちらかのモジュールを使う。 TTCap を使えるのは xtt だけらしいので選択の余地は無い。
/etc/X11/XF86Config-4Section "Module"
#    Load        "freetype"
    Load        "xtt"

font path の指定

フォントファイルを置いたディレクトリを追加する。
/etc/X11/XF86Config-4Section "Files"
    FontPath   "/usr/local/share/fonts/ricoh/"

確認と利用

利用可能なフォントは xfontselxlsfonts で確認できる。 ブラウザや gimp ではフォントの選択が可能になっているはずである。