Entry

FreeBSD で TrueType (中編)

2004年09月12日

OpenOffice.org は,いまだにまともな日本語が表示されませんけど,X-TT 周りの TrueType フォント環境は随分とまとまってきたので,この前の続きとして紹介します(参照:「FreeBSD で TrueType (前編)」)。

Gimp で TrueType をテストするの図

上の図は,フリーのフォトレタッチソフト Gimp で TrueType フォントを利用した例です。フォントを増やすメリットは,コンソールの見栄えがよくなることよりも,画像編集の幅が広がる方にあるような気もします。いろいろ試していたら,悪趣味な絵になっちゃいました……。

今回使ったフォントは,DynaLab の DynaFont です。もちろん,フリーな TrueType フォントを使ってもいいんですけれど,質と量では,商用フォントに分があるのは否めません。フリーの UN*X を使う場合,フォントは商用のモノを用意しておくと,何かと便利です。MS系のフォントは,いろいろと角が立ちそうなので,今回は使いません(Ricoh のフォントと言えばいいのかな……)。

今回やること

この前紹介したとおり,X-TT で TrueType フォントを扱うには,

  • xtt モジュールを XFree86 に組み込む
  • fonts.dir を編集する
  • 設定を反映させる

という手順を踏めばいいのでした。そして,この中で一番面倒で難儀するところが,fonts.dir を編集するところだったのでした。

そういうわけで,今回は,fonts.dir の編集方法についてまとめてみました。具体的には,

  • フォントの基礎知識
  • fonts.dir の書き方
  • 実際に Dynafont をインストールしてみる

といった順番で説明します。

フォントの基礎知識

はじめに,フォントをいぢるために必要なことを確認しておきましょう。基本的なことなので,分かっている方は読み飛ばしてもらって構いません。

ビットマップフォントとスケーラブルフォント

まず,フォントの種類には,「ビットマップフォント」と「スケーラブルフォント」の2種類があります。ビットマップフォントは,ドット絵と同じ手法で1ドットずつ描いたもので,スケーラブルフォントは,フォントの形を計算式(ベクトルデータ)で表した形式です。

ビットマップフォントは,極端な言い方をすれば,「絵」と同じなので,フォントの大きさを変えるとギザギザ(シャギー)が目立ちます。このため,通常は,表示する大きさが指定されています。一方,スケーラブルフォントは計算式なので,形を計算してから表示します。その分,スケーラブルフォントは,表示方法に融通を利かせることができるわけです。

もっとも,ビットマップフォントはあらかじめ作り込んである「絵」を表示すればいいのに対して,スケーラブルフォントはいちいち計算しないと表示できないので,処理が重くなります。この他にも,両者は,ファイルの大きさやアンチエイリアスのかけ方などで違いがあるようです。

TrueType フォントは,スケーラブルフォントに分類されます。スケーラブルフォントには,TrueType フォントの他に,Type1 フォントなんかがありますけれど,ちょっと前まで XFree86 では TrueType フォントをサポートしていませんでした。

固定幅フォントとプロポーショナルフォント

フォントには,文字の表示幅で,固定幅フォントとプロポーショナルフォントという分類のしかたもあります。固定幅フォントというのは,文字の幅が一定のもので,プロポーショナルフォントは,文字の幅を表示する文字にあわせて変化させることができるフォントです。

プロポーショナルフォントの例は,上のテスト画像で,「The Gimp with X-TT」という部分を見ると,よく分かると思います。「i」と「m」で文字の幅が明らかに違いますよね。日本語でも,いわゆる組文字や平仮名・片仮名は,文字幅を微妙に調整していて,組んだときに読みやすくなるように工夫されています。

今回使うフォントファイルは複合ファイル(拡張子が「ttc」のファイル)で,固定幅フォントもプロポーショナルフォントも入っていますけど,ここではプロポーショナルフォントだけを使うことにします。

文字集合の話

フォントを扱うには,文字集合の話もしておく必要があります。

文字集合というのは,その名の通り,文字の集まりです。この文字集合には,あちこちの規格団体が規格化していて,例えば,いわゆる「半角英数字」(Latin-1)の類は,ISO8859-1 のように名前が与えられます。

日本語でよく使われる文字集合は,JIS が規格化している

  • JISX0201.1976(ASCII 文字集合に,半角カナを拡張したもの)
  • JISX0208.1983(全角英数字や第1・第2水準の漢字など)
  • JISX0212.1990(いわゆる補助漢字)

です。この他にも,JIS が規格化している文字集合には,第3・第4水準を規定した JISX0213.2000 という規格もあるようですけれど,これを扱えるフォントはまだ少数なので,ここでは扱いません。

ちなみに,文字集合(character set)と似て非なるものに,文字符号化方式(character encoding)というものがあります。Shift-JIS とか ISO-2022-JP とか EUC-JP とかいったものです。これは,複数の文字集合を数値(符号)として表現する方法であって,文字集合とは異なるものです。

一般に「文字コード」というと,「文字集合」と「文字符号化方式」の2通りの意味で使われるようです。文字符号化方式は,X のクライアントアプリケーションがどうにかすることですから,さしあたってフォントを扱うときに重要なのは,文字集合の方です。

fonts.dir の書き方

全体図

なんだか,前置きが長くなっちゃいましたね。ここから fonts.dir の書き方に移りましょう。

前回も書いたとおり,fonts.dir は,「データとして存在するフォントの実体(物理フォント)」と「X が使うフォントの名前(論理フォント)」を結びつけるファイルです。ですから,ここに書くことは,物理フォントの場所と設定を,論理フォント名に結びつけたものになるわけです。

書き方は単純で,

  • 1行目にエントリの数を書く
  • 2行目以降に「フォントの設定とファイル名」,それと 「フォントの名前(XLFD)」 を並べて書く

というルールに従います。具体的に書くと,

1
ds=y:DFGothic.ttc    -DynaLab-DFGothic-bold-r-normal--0-0-0-0-p-0-iso8859-1

という感じ。この fonts.dir では「ds=y」という設定と「DFGothic.ttc」というファイル名を,「-DynaLab-DFGothic-bold-r-normal--0-0-0-0-p-0-iso8859-1」という名前(XLFD)に結びつけた,という意味になります。1つしか登録していないので,1行目には「1」と入れてありますね。

「設定」と「ファイル名」の間はコロン(:)で区切って,「設定とファイル名を合わせたもの」と「XLFD」は1個以上の空白で区切ります。仕組み自体は簡単ですね……。順番に詳しい書き方を説明します。

フォントの設定

X-TT では,フォントファイルにあるフォントデータを,使いやすいように調整できます。通常,フォントデータは普通の太さで傾きもないものが登録されているので,太字や斜体を作るには,ここで設定する必要があるわけです。

設定はフォントファイル名の前に書いて,設定どうしはコロンで区切ることになっています。設定と,ファイル名の間もコロンで区切ります。具体例は,上にある fonts.dir の例を参照すれば分かると思います。

設定できる内容を,表にしてみます。

オプション意味
fn=整数TrueType コレクションファイル(*.ttc)の face 番号を指定する
ai=実数文字の傾きを指定する
ab=[yn]自動的に太字にする(y)(なお,'ds' を参照)
fs=[pmc]文字間隔を指定する
bw=実数[;整数,整数,整数]バウンディングボックス幅の倍率を指定する
ds=[ymn][b][;整数]二重打ちによって太字を有効(y)にする
vl=[yn]フォントのヘッダ情報に基づいてメトリック計算する(y)
hi=[yn]フォントのヒント情報を使う(y)
cr=範囲[,範囲,...]設定を適用する文字コードの範囲を指定する
eb=[yn]埋め込みビットマップフォントがあるときはそれを使う
fc=範囲強制的に固定幅フォントにする文字コードの範囲を指定する
fm=文字コード
fm=実数,実数,実数
文字メトリックを個別に指定する

設定内容を調べてみたところ,どうもあちこちでばらつきがあるようです。X-TT(モジュール)のバージョンによるものなのか,よく分かりませんけれど,とりあえず上記の設定は受け付けられるようです。

ここら辺は,実際に設定して,自分の目でフェイスを確認していく方が,理解できると思います。

XLFD

XLFD(X Logical Font Description)というのは,X で使う論理フォント名です。訳しただけですけど……。次のような書式になっています(実際は1行)。

-[Foundry]-[Family]-[Weight]-[Slant]-[SetWidth]-[AddStyle]\
-[PixelSize]-[PointSize]-[ResolutionX]-[ResolutionY]-[Spacing]\
-[AverageWidth]-[Registry]-[Encoding]

パラメータが多くて面倒くさいですね……。ただ,スケーラブルフォントの場合は,文字の大きさや解像度が固定されていませんから,「0」を入れておけば大丈夫です。また,'AddStyle' は通常何も書きません(nil)。

TrueType フォントの名前として必要なパラメータは,以下の通りです。

項目意味指定できる値
Foundryフォントのメーカー名任意の文字列
Familyフォントの名前任意の文字列
Weight文字の太さmedium,bold など
Slant文字の傾きr(Roman),o(Oblique),i(Italic),ro(Reversed Oblique),ri(Reversed Italic)
Spacing文字送りc(固定幅),p(プロポーショナル)
Registry と Encoding文字集合の標準名とエンコーディングiso8859-1,jisx0201.1976-0 など

この書式だと,かなり厳密にフォントのフェイス(見た目)を指定できますけど,実際の使用には,これほど厳密なものはかえって煩雑になるように思います。例えば,Oblique(斜体)と Italic(イタリック体)というのは,タイポグラフィーの世界では別に扱うんでしょうけれど,特に必要のない限り,どちらかにまとめてしまってもいいんじゃないでしょうか。

Weight にいたっては,thin,extralight,light,book,medium,demibold,bold,heavy,black と,9段階も指定できます。普通は,medium と bold だけで足りると思います。

何度も書いていますけど,fonts.dir は,実際にあるフォントデータに「論理名」を与えるファイルです。ですから,「DFGot3.ttc」(太さ3のゴシック体)というファイルにあるデータを DFGothic というフォント名の medium に当てて,「DFGot5.ttc」(太さ5のゴシック体) を同じフォント名の bold に当てるということもできます。fonts.dir には,

2
DFGot3.ttc   -DynaLab-DFGothic-medium-r-normal--0-0-0-0-p-0-iso8859-1
DFGot5.ttc   -DynaLab-DFGothic-bold-r-normal--0-0-0-0-p-0-iso8859-1

と書くことになります('ds' による太字は使わない)。こうすると,X のクライアント側からは,DFGothic というファイル名しか見えないし,2つあるはずのフォントファイルも1つのフォントの異なる字体という扱いになります。

DynaFont の fonts.dir を書いてみる

フォントをコピーする

AIAN が持っている,「DynaFont Font Museum 100」というパッケージには,日本語フォントが100個も入っています。よく使うのは,明朝体とゴシック体でしょうけど,この際全部インストールすることにします。

XF86Config で設定した FontPath が通っているディレクトリに *.ttc ファイルをコピーしましょう。うちでは,以下のように,/usr/X11R6/lib/X11/fonts/dynalab 以下にインストールしました。

aian:~ % ls /usr/X11R6/lib/X11/fonts/dynalab/
DCAi5.ttc*      DFFry2.ttc*     DFKai3.ttc*     DFMrg9.ttc*     DFRule5.ttc*
DCAil5.ttc*     DFFuu7.ttc*     DFKai5.ttc*     DFMrgc.ttc*     DFRule7.ttc*
DCAis5.ttc*     DFFuuc.ttc*     DFKai7.ttc*     DFMrge.ttc*     DFRys9.ttc*
DCCry5.ttc*     DFGihi7.ttc*    DFKai9.ttc*     DFMrm3.ttc*     DFSKai7.ttc*
DCHLei5.ttc*    DFGotP2.ttc*    DFKaiC.ttc*     DFMrm5.ttc*     DFSgyo5.ttc*
DCHgm5.ttc*     DFGotP3.ttc*    DFKaiE.ttc*     DFMrm7.ttc*     DFSht5.ttc*
DCInl5.ttc*     DFGotP5.ttc*    DFKbt3.ttc*     DFMrm9.ttc*     DFSht7.ttc*
DCKgmc.ttc*     DFGsk7.ttc*     DFKoin4.ttc*    DFOyj5.ttc*     DFSoge5.ttc*
DCLKai5.ttc*    DFGys3.ttc*     DFKtl8.ttc*     DFPOP1-C.ttc*   DFSoge7.ttc*
DCYsm7.ttc*     DFHeiA.ttc*     DFKyks3.ttc*    DFPOP2-9.ttc*   DFSoge9.ttc*
DFBrr7.ttc*     DFHeiC.ttc*     DFKyks4.ttc*    DFPOP2-C.ttc*   DFSokn3.ttc*
DFBrrc.ttc*     DFHeiE.ttc*     DFLgs9.ttc*     DFPocl7.ttc*    DFSso3.ttc*
DFBrs5.ttc*     DFHsg3.ttc*     DFLis6.ttc*     DFPoco7.ttc*    DFSumoc.ttc*
DFBrs9.ttc*     DFHsg5.ttc*     DFMimP3.ttc*    DFPococ.ttc*    DFTlei5.ttc*
DFBrsc.ttc*     DFHsg7.ttc*     DFMimP5.ttc*    DFPop3.ttc*     DFTlei7.ttc*
DFCrd3.ttc*     DFHsg9.ttc*     DFMinC.ttc*     DFPop5.ttc*     DFTlei9.ttc*
DFCrs9.ttc*     DFHsm3.ttc*     DFMinE.ttc*     DFPop7.ttc*     fonts.cache-1
DFCry5.ttc*     DFHsm5.ttc*     DFMrg2.ttc*     DFPop9.ttc*     fonts.dir
DFCry7.ttc*     DFHsm7.ttc*     DFMrg3.ttc*     DFPost7.ttc*
DFFrs2.ttc*     DFHsm9.ttc*     DFMrg5.ttc*     DFRula5.ttc*
DFFrs3.ttc*     DFHsr4.ttc*     DFMrg7.ttc*     DFRula9.ttc*

フォントファイルは *.ttc のファイルです。100個も日本語ファイルがあると,コピーが終わるまでしばらくかかります。

ttmkfdir を使ってみる

次に,fonts.dir を作ります。初めから手打ちで作ってもいいんですけれど,いくら時間があっても足りないので,適当なツールを使うことにしましょう。以前は,ディレクトリにあるフォント情報を読んで fonts.dir を出力する,mkttfdir というツールがありましたけど,現在は配布されていないようです。

代わりに,ttmkfdir というツールが ports にあるので(x11-fonts/ttmkfdir),これを使ってみました。使い方は,フォントのあるディレクトリで,ttmkfdir とコマンド入力すれば,fonts.dir の中身が標準出力に出力されます。

Dynafont のあるディレクトリで使ったところ,以下のような出力を得られました。

aian:/usr/X11R6/lib/X11/fonts/dynalab % ttmkfdir
200
DFGsk7.ttc -DynaLab-DFGanShinKei_W7-medium-r-normal--0-0-0-0-m-0-ascii-0
DFGsk7.ttc -DynaLab-DFGanShinKei_W7-medium-r-normal--0-0-0-0-m-0-iso10646-1
DCLKai5.ttc -DynaLab-DCLeiKaiSho_W5-medium-r-normal--0-0-0-0-m-0-ascii-0
DCLKai5.ttc -DynaLab-DCLeiKaiSho_W5-medium-r-normal--0-0-0-0-m-0-iso10646-1
DCKgmc.ttc -DynaLab-DCKagoMoji_W12-medium-r-normal--0-0-0-0-m-0-ascii-0
DCKgmc.ttc -DynaLab-DCKagoMoji_W12-medium-r-normal--0-0-0-0-m-0-iso10646-1
DCInl5.ttc -DynaLab-DCInline_W5-medium-r-normal--0-0-0-0-m-0-ascii-0
DCInl5.ttc -DynaLab-DCInline_W5-medium-r-normal--0-0-0-0-m-0-iso10646-1
...

ちょっと……これは使い物になりませんね……。

太さ(Weight)が medium だけしかないし,何といっても,文字集合が ASCII と ISO10646-1 だけしかありません。ちなみに,ISO10646-1 というのは,Unicode で使われる文字セットで,UCS と呼ばれるモノです。

やっぱり,こまかいことは自分で書かなくちゃいけないようです。

自分で書く

自分で書くといっても,手打ちは最悪なので,まずは1つのフォントで必要となるエントリを考えてみます。

数えてみると,太さで2種類(medium,bold),傾きで5種類(Roman,Oblique,Italic,Reverse Oblique,Reverse Italic),文字集合で4種類(ISO8859-1,JISX0201.1976-0,JISX0208.1983-0,JISX0212.1990-0)といったところ……。全部掛け合わせると,合計して40通りになります。

1つのフォントで40通りですから,100個のフォントでは4000のエントリになります。うん……手打ちでは絶対無理ですね……。

考えてみると,40種類のエントリを作っておけば,後は「ファイル名」と「フォント名」を変えてコピーするだけで足りそうです。「ファイル名」と「フォント名」は,さっきの ttmkfdir の出力から得られるので,40種類のエントリだけは,頑張って作ることにしましょう……。後はスクリプトまかせです。

そんなわけで,一応,次のような Ruby スクリプトを作ってみました。

使い方は,ttmkfdir の出力を,このスクリプトに食べさせるだけです。スクリプトのコマンド名を mkfontsdir とすると,

% ttmkfdir | mkfontsdir

みたいにします。

即席で作ったもんで,ほとんどが決め打ちになっているけれど,適当に変えれば,他のフォントでも使えるかもしれません。

一応,できあがったものを置いておきます。スクリプトは1行目のエントリ数まで出力しないので,補完して fonts.dir として使えるようにしておきました。

フォント名が化けているところがあるけれど,これは ttmkfdir の出力ですから仕方ありません。あたしは気にならないんですけれど,気持ち悪いと思う方は,適当なフォント名に置換するといいと思います。

今回はここまで

軽い気持ちで書いたつもりが,結構な大部になってしまいました……。「中編」と銘打ったのにも,ちょっと後悔していたりして……。

fonts.dir を作るには,あれこれ難儀します。たしかに,フォントのフェイスや,フォント名を自由に決められるのは便利なんですけれど,優柔不断なあたしにとっては,選択肢が多くて決めかねてしまうからです。こういう類のモノは,人のマネをしたり,運用例をみたりして少しずつ調整するもんなのかもしれません。

今回で,X-TT の話はオシマイです。次回は,Xft 周りをいぢれればいいなぁ……。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN