fontconfigの設定(1)

fontconfigの設定ぐらい手打ちでできないと人間として認められないそうなので、がんばって調べてみました。しかし折角人間と認められても、数ヶ月後には再び人間でない何かになってしまいそうなので、未来の自分も人間と認められ続けるべく、ここに記録を残しておきます。nヶ月後の私も、どうかこれを見て人間を続けられるように頑張ってください。もっとも調べたと言っても9割方はmanの情報です。

最初にfontconfigの基本的な事項を解説し、それを元にフォントを決定するまでの大まかな流れを示します。その後、設定ファイル(XML)の各要素について、擬似的なプログラミング言語を用いた処理を交えながら解説します。
かなり内容が多くなってしまいましたので、今回のこの記事では、基本的な事項について解説します。

フォント

このシリーズの記事で言う「フォント」とは、「字形情報のセット」という意味です。「フォント名」「フォントの名前」は「字形情報のセットに付けられた名前」です。「フォントファイル」は「字形情報のセットが格納されているファイル」です。一応本文中に出てくるこれらの言葉は、ここに挙げた意味通りに使っているつもりですが、もしかしたらそうでないこともあるかも知れません。ごめんなさい。

font name

"name" とは言いますが、これは「IPA ゴシック-8:bold:antialias=true」のように、フォントの名前以外に大きさや太さその他のオプションまで含めることができます(含めなくてもいいです)。Xftに対応しているアプリケーションなら、.Xresourcesなどでフォントや大きさやその他もろもろを指定するとき、この書式で指定できます。font nameに含まれている、フォントの名前、大きさその他の色々な項目は、プロパティといいます。一般的に表わすと「<family>-<size>:<propety1>=<value11>,<value12>…:<property2>=<value21>,<value22>…:…」という感じです。フォント名も、familyというプロパティです。いくつかのプロパティのいくつかの値については省略記法が用意されていて、「bold」や「weight=bold」は、「weight=200」と同じ意味になります。
一つのプロパティに対して複数の値を指定できます。指定した順に優先度が高い要求となります。要するに本命要求以外の代替案を付けられるということです。font nameで表わすと「IPA ゴシック-9:width=thin,normal,bold」と書きます。この場合、thinがいいけどなかったらnormalでもいいよ、それもなかったらboldで、みたいな感じです。familyも複数指定できて、「IPA ゴシック-9:family=M+2P+IPAG,sans-serif」とすればIPA ゴシックがなければM+2P+IPAGが、それもなければsans-serifが選ばれます。sizeも同様にIPAG ゴシック-9:size=12,10,15みたいな指定ができます。別に連続した数値である必要はないですし、昇順、降順になっている必要もありません。自分が優先したい順に並べてください。
先にでてきた例の"sans-serif"というのを見れば分かるように、このfamily名というのは特定のフォント名であるとは限らないです。fontconfigの設定ファイルで、いくつかのフォント名をセットにして一つの名前を付けることができます。sans-serifはもちろんゴシック体フォントの集合に対する名前で、要するに、「とにかく何かゴシック体のやつで」と言っているわけです。

pattern

font nameの抽象表現がpatternです。というか、patternを文字列で表現したものがfont nameです。
システムにインストールされているフォントも全てpatternで表現することができます。ここでちょっとポイントですが、例えばTimesがインストールされているなら、8ptで普通の太さ傾きなしで名前がTimesというpatternと、8ptで太字傾きなしで(略)と、8ptで普通の太さ斜体で(略)と、8ptで太字斜体で(略)と、9ptで(略)と、…というpatternが全てインストールされている、という考えかたをします。もちろんプロパティはここに挙げた以外にもいっぱいあるので、それら全ての組み合わせ分だけpatternがあることになります。fontconfigは、このインストールされたpatternの中から、要求されたpatternに最も近いものを選びます。

fontconfig設定ファイルの概要

fontconfigの設定ファイルは、定められたDTDに従っている妥当なXML文書である必要があります。正直言ってXMLという時点で人間が読み書きするには不便なフォーマットですが、そこに文句を言っても始まらないのでやめておきます。このDTDを記述しているファイルは、システムのどこかに置いてあるでしょう。ArchLinuxの場合は/etc/fonts.d/fonts.dtdがそれでした。fonts.dtdはコメントで注釈を付けてくれてますので、これも書き方のヒントになるかと思います。
設定ファイルはいくつかに分割することができます。その場合も、一つ一つのファイルは妥当なXML文書でないといけません。デフォルトの状態で大本の設定ファイルである/etc/fonts.d/fonts.confに、~/.font.confと.font.conf.dを読みこむように書いてあるので、それらのファイルに設定を書く、またはディレクトリ下に設定ファイルを置くなどすれば、読まれます。

fontconfigがフォントを決定する流れ

fontconfigは、所望するpatternを受け取り、そのpatternを各<match target="pattern">要素の内容に従って修正します。
それから、修正したpatternに一番近いpatternを、システム内で見つかる全patternから選びます。この「近さ」を測定するためのルールについては、そんなに気にしなくても多分大丈夫です。詳しくはmanでも読んでください。
最後に、選ばれたpatternを、今度は各<match target="font">要素の内容に従って修正します。こうしてできたpatternが示すフォントを、最終的なフォントとして返します。