Xで日本語スケーラブルフォントを使おう

X-TT project または フォント貧乏からの脱却
まずスクリーンショットを見てね

最終更新時刻:03/04/08 17:59 (Tuesday)


お知らせ

このページの内容はかなり古くなっています。参考になりません。 最近のディストリビューションには 標準でX-TT入ってるし。昔の苦労を偲びたい人だけ見てください。

最近の情報については、 After X-TT Projectを みて下さい。


目次


X server with VFlib

従来PC-UNIXで日本語を表示する場合は、k14等の固定サイズのフォントを使うか、 汚い上に遅いのを承知でbitmapフォントを拡大/縮小するしかありませんでした。 アプリケーションでは、k14やjis16、jis24などのフォントを使い分けて表示するか VFlibライブラリを利用して得たglyphをイメージとして扱うしかなく、不自由な思いを していたものです。

1997年の秋ごろ、高木淳司さんが日本語フォントを扱うライブラリであるVFlibを 組み込んだX server (X-V)を開発され、状況が一変しました。VFlibでは TrueTypeフォントを利用することができ、MS-Windows用に発売されている多くの フォントをXからダイレクトに利用できるようになりました。 X-Vの詳細についてはX-Vプロジェクトのページ(arhive.orgにある最新)を参照してください。でもリンク切れてます。移転先どこだろう...

X-Vから派生していろいろな試みが行われました。また、当時、 The FreeTye Projectで、TrueTypeフォントを綺麗に扱えるソフトウェアが 開発されつつあり、X-VにVFlib経由でFreeTypeを組み込むという試みもなされました。 これらの試みについてはX-Vプロジェクトのページが参考になります。

XでTrueTypeが使えるのなら、xfs(X font server)でもTrueTypeが使えるはずで 塩崎拓也さんが、xfs-VFlib … 「VFlib 対応のフォントサーバを作る試み」関連を開発しました。(リンクありません) 当初はxfsを利用すると速度が激しく低下するという現象がありましたが、 これはX serverとxfsの設定の変更を行うことで解決されました。


Xで多彩な日本語フォントが使えるようになったのですが、いろいろと気になる ところが出てきました。

一番気になったのは『VFlib経由でフォントをアクセスしているために VFlibとX側の両方でフォントの設定をしなければならず面倒臭い』ということです。 日本語を扱う場合、表示だけではなく印刷やアプリケーションごとに設定が 必要です。WindowsではWindowsのフォント名だけを意識していればいいのですが、 PC-UNIXの場合、フォントのファイル名、アプリケーションから見えるフォント名 (これはVFlibで付けた名前とXから見える名前の両方があります)、印刷時に利用する フォント名(PostScriptだとリュウミンとか)を意識し、設定する必要があります。

あるいは、xdviやghostscriptなど、スケーラブルな日本語フォントを扱わないと いけないアプリケーションは、(現在の実装では)VFlibからbitmapを得てそれを 表示するようにしていますが、X server側でスケーラブルフォントが利用できるなら それを使った方が自然です。仮に将来そうなった場合、X serverがVFlib経由で フォントをアクセスしているとやっぱり設定が面倒ですし、どうも不自然な気がします。


X with FreeType

X serverが直接日本語スケーラブルフォントを扱えるようになれば 前述の問題は改善されると期待できます。そこで、Xに直接FreeTypeフォントを 組み込む試みがなされています。

The FreeTye ProjectのRelated Projectには、『The X11 TTF font server (Still in alpha)』 が記載されています。これも試してみたのですが、日本語を扱うのはまだまだという感じでした(1998/2上旬現在)。

もう一つの試みが、渡邊剛さんのX trueType Server(仮称)開発ノート(archive.orgの最新)です。 こちらも作成途上ですが、日本語スケーラブルフォントを扱うことはできるように なっています。


残された課題

X上で多彩な日本語フォントが使えるようになったのですが、まだまだやるべきことは 残っています。例えばこんなことです。


x-tt メイリングリストの紹介

X with TrueType Serverの開発、 設定例、 アプリケーションの使い方などの報告、などなど 協力していただける方を募集しています。 x-tt MLでこれらの話をしていますので、参加してください。


ソースとかパッチ

ソースから自分でコンパイルする場合は、X11R6.3のソースツリーが必要になります。 X serverだけあればいい場合は、Server Onlyなパッケージを使うのもいいと思います。

手順

統合済パッチ

1998/02/21,23に渡邊剛さん作成の 上記統合済パッチと バグ修正が出ました。

1998/02/20に森木さん作成の x-tt pl02 統合済パッチが出ました。塩崎さんのページからダウンロードできます。

上記いずれかのパッチを適用したあとで、make Worldでいける...んじゃないかなあ。ダメだったらメイルで報告ください。

個別パッチの説明

以下は、個別のパッチの説明ですが、このへんの情報はもはや古いです。 読まない方がいいかも...

  1. freetype-1.0を入手してinstallします。
  2. X11R6.3のソースツリーを展開します。
  3. 渡邊剛さんのページからxtt01.diff.gz、xtt01-02.diff.gzを入手しパッチを当てます。
  4. xfsを作成する場合は、塩崎拓也さんのページからxfs-VFlib.patchを入手して当てておきます。
  5. Unicodeでエンコーディングされたフォントを使う場合は、塩崎拓也さんのページからxtt-pl2-jis2uc.patch.gzを入手してパッチを当てます。
  6. x-ttメイリングリストで流れたパッチを当てるといいらしいです。

あとは普通にmake Worldでいける...んじゃないかなあ。 ダメだったらメイルで報告ください。


とりあえず使ってみたい人のために

Linux(RedHat4.2+PJE)で作成したバイナリを置いておきます。 OpenBSD、FreeBSDな人は渡邊剛さんのX trueType Server(仮称)開発ノートを見てください。

前準備

フォントディレクトリを作る

TrueTypeフォントを格納したディレクトリを用意します。 私は『RICOH TrueTypeWorld』というフォント集を買ってきました。 19980211時点ではでWindows95標準のMS明朝、MSゴシックはまだ扱えませんし、 ライセンスの関係から使ってはいけないという話もあります。 三田吉郎さんの(ベクトルフォントの著作権について)を参考にしてください。 Taroh's FreeBSD tips/X11 + VFlib - buy fonts (in Japanese)も参考にしてください。

私は/usr/X11R6/lib/X11/fonts/ttfにフォントを置きました。 実体(.ttc)は別の場所にあってここにはsymbolic linkを張ってあります。 Windows95でinstallをしてあるフォントを流用する場合も、 /dosc/windows/fontsからsymboic linkするとディスクを節約できます。

[217]shin:/usr/X11R6/lib/X11/fonts/ttf:ls
fonts.alias   hgrhg3sj.ttc  hgrhkpsj.ttc  hgrkrsj.ttc
fonts.dir     hgrhg5sj.ttc  hgrhm3sj.ttc  hgrlksj.ttc
hgrcbsj.ttc   hgrhg7sj.ttc  hgrhm9sj.ttc  hgrpn1sj.ttc
hgrcksj.ttc   hgrhg9sj.ttc  hgrhr4sj.ttc  hgrpp1sj.ttc
hgrcresj.ttc  hgrhkfsj.ttc  hgrhr8sj.ttc  hgrpp2sj.ttc
hgrgysj.ttc   hgrhkgsj.ttc  hgrkksj.ttc   hgrsksj.ttc

fonts.dirにはフォントのファイル名とXでの名前との対応表を記載します。 また、アプリケーションからよく参照されそうな名前はfonts.aliasで別名を 付けるようにしました。

フォントファイル名と書体の対応表は、RICOH TrueType Worldのページに掲載されています。

[219]shin:/usr/X11R6/lib/X11/fonts/ttf:cat fonts.dir
21
hgrgysj.ttc     -ricoh-gyosyo-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrkksj.ttc     -ricoh-kyokasyo-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrsksj.ttc     -ricoh-kaisyo-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrlksj.ttc     -ricoh-ozawa kaisyo-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhkgsj.ttc    -ricoh-sirasu gyosyo-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhkfsj.ttc    -ricoh-sirasu kaisyo-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrkrsj.ttc     -ricoh-kanteiryu-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrpn1sj.ttc    -ricoh-souei pen-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhkpsj.ttc    -ricoh-sirasu pen-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrpp1sj.ttc    -ricoh-kaku pop-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrpp2sj.ttc    -ricoh-maru pop-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhm3sj.ttc    -ricoh-mincho-w3-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhm9sj.ttc    -ricoh-mincho-w9-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhg3sj.ttc    -ricoh-gothic-w3-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhg5sj.ttc    -ricoh-gothic-w5-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhg7sj.ttc    -ricoh-gothic-w7-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhg9sj.ttc    -ricoh-gothic-w9-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrcresj.ttc    -ricoh-reisic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrcbsj.ttc     -ricoh-bouquet-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhr4sj.ttc    -ricoh-maru gothic-w4-r-normal--0-0-0-0-c-0-jisx0208.1983-0
hgrhr8sj.ttc    -ricoh-maru gothic-w8-r-normal--0-0-0-0-c-0-jisx0208.1983-0
[220]shin:/usr/X11R6/lib/X11/fonts/ttf:cat fonts.alias
-ricoh-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-mincho-w3-r-normal--0-0-0-0-c-0-jisx0208.1983-0
-ricoh-mincho-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-mincho-w9-r-normal--0-0-0-0-c-0-jisx0208.1983-0
-ricoh-gothic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-gothic-w3-r-normal--0-0-0-0-c-0-jisx0208.1983-0
-ricoh-gothic-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-gothic-w9-r-normal--0-0-0-0-c-0-jisx0208.1983-0
-ricoh-maru gothic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-maru gothic-w4-r-normal--0-0-0-0-c-0-jisx0208.1983-0
-ricoh-maru gothic-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0 -ricoh-maru gothic-w8-r-normal--0-0-0-0-c-0-jisx0208.1983-0

DYNALAB INC. のDynaFontプレミアム30書体パックの「DF平成明朝体W3」と「DF平成明朝体W9」を利用する場合は、 渡邊剛さんのX trueType Server(仮称)開発ノートを参考にするといいと思います。

TurboLinuxや、db NOTE for Linux/BSDのフォントも同様に使えると思います。

ディレクトリを作成したらmkfontdirしておきます。でも、いまの実装ではmkfontdir には対応してないらしいんでやらなくてもいいんですが、クセを付けておきましょう :)

Xとxfsの設定

xfsで大量のフォントを扱う場合、デフォルトの設定のままでは非常に動作が 遅くなります。それを避けるために、deferglyphsオプションを設定します。 Xの起動にstartxを使っている場合は、.xserverrcに記述します。
[222]shin:/home/shin:cat .xserverrc
exec X -deferglyphs all $@
セキュリティホールを塞ぐために、Xwrapperを使っている環境では 下記のように指定しないとroot以外ではXが起動しないかもしれません。
[222]shin:/home/shin:cat .xserverrc
Xwrapper -deferglyphs all $@
xdmを使っている場合は、/usr/X11R6/lib/X11/xdm/Xservers に記述するそうです。 田口さんに教えていただきました。 ありがとうございます。
% cat /usr/X11R6/lib/X11/xdm/Xservers
:0 local /usr/X11R6/bin/X -bpp 16 -deferglyphs all
xfsの設定は /etc/X11/fs/configで行います。 catalogueにxfs経由で取得するフォントのディレクトリを指定します。
[223]shin:/home/shin:cat /etc/X11/fs/config
# font server configuration file
# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $

clone-self = on
use-syslog = off
#catalogue = /usr/X11R6/lib/X11/fonts/VFlib/
catalogue = /usr/X11R6/lib/X11/fonts/ttf/
error-file = /usr/X11R6/lib/X11/fs/fs-errors
# in decipoints
default-point-size = 120
default-resolutions = 75,75,100,100
#
deferglyphs=all

deferglyphsの設定には、none/16/allのいずれかが設定できます。 日本語だけであれば16でもallでもどちらでもいいと思いますが、 私はallに設定しました。

XFree86を利用している方は、 /etc/X11/XF86ConfigのFontPathの設定を変更して miscフォントはunscaledにした方がいいと思います。これがないと固定サイズの bitmapを無理矢理scaledにする機能が働いてしまい、意図しない結果を得ることが あります。 ついでに、xfs経由でフォントを持ってくるように定義を追加しましょう。

FontPath    "/usr/X11R6/lib/X11/fonts/misc/:unscaled"
FontPath    "tcp/localhost:7000"

Accelareted-X Serverでは、FontPathにunscaledを設定することができないようです。 これでは困りますので、/etc/Xaccel.iniのFontPathの定義からmiscを定義している 部分を取り除いて、xfs側にmiscを追加してあります。

[root@salty specs]# cat /etc/Xaccel.ini
//
// Accelerated-X (tm) Display Server, Version 4.1, Xaccel.ini created at Tue Jan 13 07:24:47 1998
//

[FONTPATH]
    "/usr/X11R6/lib/X11/AcceleratedX/fonts/misc/",
    "/usr/X11R6/lib/X11/fonts/Speedo/",
    "/usr/X11R6/lib/X11/fonts/75dpi/",
    "/usr/X11R6/lib/X11/fonts/100dpi/",
    "tcp/localhost:7000";

//    "/usr/X11R6/lib/X11/fonts/misc/",

[RGBPATH]
    "/usr/X11R6/lib/X11/AcceleratedX/etc/Xrgb";

[KEYBOARD]
    Layout = "en_US.xkm";

[MOUSE]
    Device   = "/dev/mouse";
    Protocol = PS/2;
    Emulate3Buttons = YES;

[SCREEN]
    Board   = "neomagic/nm2093.xqa";
    Monitor = "mfreq/svga.vda";
    Depth = 16;
    ColorTemperature = 6500;

    [RESOLUTIONS]
        800x600@56;
[root@salty specs]# cat /etc/X11/fs/config
# font server configuration file
# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $

clone-self = on
use-syslog = off
#catalogue = /usr/X11R6/lib/X11/fonts/VFlib/
catalogue = /usr/X11R6/lib/X11/fonts/ttf/,/usr/X11R6/lib/X11/fonts/misc/:unscaled
error-file = /usr/X11R6/lib/X11/fs/fs-errors
# in decipoints
default-point-size = 120
default-resolutions = 75,75,100,100
#
deferglyphs=all

xfsとXの起動

ここまで設定できたら、『xfs -port 7000』と入力してxfsを起動したあとで、 Xを起動してフォントが利用できるか確認してください。

xfsは立ち上げっぱなしでも構いませんので、/etc/rc.d/に書いておくといいと 思います。


各種アプリケーションで使ってみよう

Netscape Navigator/Communicator

XでNetscapeを使う場合、最初に日本語化しておいた方が何かと便利です。 Linux版 Netscape Communicator 4.0x 及び Navigator 3.0xGold の 日本語表示/入力設定を参考に、 日本語化しましょう。あと、Netscapeでのスケーラブルフォントの扱いについては X-V XserverでのVFlibフォントとBitmapフォントの複合利用が参考になります。

上記の文章に目を通したら、フォントの設定をします。 Japanese(jis x0208-1983)のフォントの設定メニューにて X/FreeTypeで登録したファイルから好きなものを選びます。 私は、プロポーショナルとか等幅の区別はせず両方とも Mincho(Ricoh)を選びました。スケーラブルはON、 フォントの大きさは0(any)を選びます。 フォントの設定後はNetscapeを再起動してください。

なお、Netscapeでは通常の文字と太字はフォント名のmedium/boldで切替えます。 フォントの重さをw3等で指定している場合は、fonts.aliasでmedium/boldも 定義するようにしましょう。

gimp

gimpについては、The GIMP HomePageGIMPメーリングリストLove Love GIMPIntroduction to The GIMPあたりを見てください。

お定まりの呪文を唱えて、フォントの選択で日本語フォントを選んで (単にminchoを選ぶとdaewoo-minchoでハングルになっちゃうよ) kinput2を起動すると、日本語が入力...できないんだなあこれが。 kinput2までは起動するんだけど、まだうまくいかないみたい。

Japanese GIMPの ページにkinput2で入力できるようにするパッチを発見しました。

でも、入力フィールドでJISコードに相当する文字を直接入力すれば 一応文字は入力できるし、ASCIIの文字と同じ扱いで使えます。 例えば ?p7DMw と入力すると瑞慶覧って入るんだ。簡単でしょ? :)

tgif

tgifのフォントの設定については、ソースについてくるJAPANESEというドキュメントを まず、読んで欲しい。PJEのtgifを 利用している場合は、/usr/X11R6/lib/X11/tgif/3.0J0.12-p13/JAPANESE に存在する はずである。

印刷のことは余り考えずにとりあえず、フォントを使う設定をする場合は、 リソースで下の例のようにすればよい。各エントリの説明はJAPANESEを読んで欲しい。 スケーラブルフォントを利用する場合、一番最後のフォントサイズのエントリを allにしないとフォントが大きくならなくて大変悲しい思いをする。

Tgif*NihongoFonts: \
	mincho-medium-r-normal, jisx0208.1983-*, \
	Ryumin-Light-EUC-H, Ryumin, \
	H, false, all \n\
        gothic-medium-r-normal, jisx0208.1983-*, \
	GothicBBB-Medium-EUC-H, Gothic, \
	H, true, all \n\
	fixed-medium-r-normal, jisx0208.1983-*, \
	Ryumin-Light-EUC-V, Ryumin-V, \
        V, false, 14 \n\
	fixed-medium-r-normal, jisx0208.1983-*, \
	GothicBBB-Medium-EUC-V, Gothic-V, \
	V, true, 14


他の実装

スケーラブルフォントを扱えるX server、xfsの実装は、ここで紹介した他にも いろいろあります。
他にも情報があったら教えてください。

FAQ

スクリーンショットの背景に見えているWindow Managerが気になって眠れません

これはKDE(K Desktop Enviromnent)という Desktop環境です。 Window Managerであるkwmや、ファイルを管理するkfm、下のバーを表示する kpanelなどで構成されています。 メニューなどの変更は .XXXrc をいじるのではなく、GUIベースでできますので 非常に簡単に扱えますし、なにしろ綺麗です。

X serverは作成できましたが、xfsを使うと空の箱しかでてきません

古いパッチではこの現象が発生します。なるべく最新のxttを使いましょう。

必要があって、古いパッチでxfsをコンパイルする場合は、 xfs-VFlib … 「VFlib 対応のフォントサーバを作る試み」 のxfs-VFlib.patchを当てる必要があります。

Transformation matrixについて知りたい

xc/docs/hardcopy/XLFD/xlfd.PS.Z の『4 Matrix Transformations』を 読んでください。

msmincho.ttcが使えない

古いパッチではこの現象が発生します。なるべく最新のxttを使いましょう。

内部コードがUnicodeでエンコーディングされたフォントはxtt02では使えません。 塩崎さんのUnicode パッチを当ててください。

xfsを経由すると表示が非常に遅いです

deferglyphsオプションをXサーバーとxfsの両方で指定しないと、 フォントをオープンしたときにグリフを一括して取得しようとして劇的に遅くなります。 『とりあえず使ってみたい人のために』を参考に、 オプションを設定してください。

フォント名を指定する際に、
-dynalab-mincho-bold-i-normal--0-0-0-0-p-0-jisx0208.1983-0
とすると、プロポーショナルにするためのデータの取得のため全glyphに対して Load_Glyph, Get_Metrics, Get_Glyph_Outline, Transform_Outline, Get_Outline_BBox が実行されます。
# 正確には要求があった code に対してだけど、結局全部要求がくる(^^;;
この処理、はっきりいって、かなり時間かかります。 256 個程度だと気にならないのですが、日本語だと....(T_T)
-dynalab-mincho-bold-i-normal--0-0-0-0-c-0-jisx0208.1983-0
とすると、Metric 要求に対して全部固定値を返すようになるので、一瞬になります。

フォントの指定を間違うと、TrueTypeフォントではなくて通常のmiscフォント(k14等)を Xサーバーが勝手にbitmap scalingしようとして時間がかかることがあります。 この場合も、『とりあえず使ってみたい人のために』を参考に、 miscフォントではscalingしない(unscaled)を設定してください。


関連ページ


ずけらん しん / shin@opus.or.jp