Fontconfig (3日目) - フォントパターンの書き方

いよいよFontconfigの動作……に入る前に、フォントパターンの書き方の話です。 Fontconfigの動作は fc-* で始まるコマンドラインツールを使って確認していくわけですが、その際にフォントパターンは文字列で渡すことになります。 その文字列にもルールがあります。

CSSの font-family を書くときは、スペースを含むフォント名はクォーテーションで括るとかフォント名の間にはカンマを入れるとかそういう話です。

本当は文法規則を書いてしまいたいのですけれども、そこまで詳しく調べられていませんごめんなさい。 ですのでゆるく「書き方」で。

属性

フォントファミリー名やサイズ、言語など指定可能な種類を属性(property)と呼びます。

CSSでも font-familyfont-sizefont-style 等のことをプロパティと呼ぶことがあり、それと同じです。

日本語で「属性」と書くのと、英語のカタカナ表記で「プロパティ」と書くのとどちらがわかりやすいでしょうか? とりあえず「属性」にしておきます。

family

文字列が意図通りに解釈されているかどうかは fc-pattern で確認できます。

$ fc-pattern "sans-serif"
Pattern has 1 elts (size 16)
        family: "sans"(s)

あれ? sans-serif にしたつもりですのに sans になってますね?

実はフォントパターン文字列の中では - はファミリー名とサイズの区切りとして解釈されます。

$ fc-pattern "sans-12"
Pattern has 2 elts (size 16)
        family: "sans"(s)
        size: 12(f)(s)

ですので - そのものをファミリー名に含めたい場合はバックスラッシュでエスケープする必要があります。

$ fc-pattern "sans\-serif"
Pattern has 1 elts (size 16)
        family: "sans-serif"(s)

size

サイズは上で見ましたように - でファミリー名に続けて書けます。

$ fc-pattern 'DejaVu Sans Mono-12'
Pattern has 2 elts (size 16)
        family: "DejaVu Sans Mono"(s)
        size: 12(f)(s)

属性の一般的な記法として : で区切り属性名を明記する書き方もあります。

$ fc-pattern 'DejaVu Sans Mono:size=12'
Pattern has 2 elts (size 16)
        family: "DejaVu Sans Mono"(s)
        size: 12(f)(s)

サイズは範囲を受け付けます。 範囲をフォントパターン文字列で指定するには次のようにすればいいようです。

$ fc-pattern 'DejaVu Sans Mono:size=[10 20]'
Pattern has 2 elts (size 16)
        family: "DejaVu Sans Mono"(s)
        size: [10 20](s)

その他の属性

残る他の属性は : を使います。

$ fc-pattern 'serif:style=bold:lang=ja'
Pattern has 3 elts (size 16)
        family: "serif"(s)
        style: "bold"(s)
        lang: ja(s)

CSSでは値がどのような構造になっているかはプロパティによりまちまちですが、Fontconfigでは属性の値は全てリストです。

$ fc-pattern 'YuMincho,serif-12,13:lang=ja,en'
Pattern has 3 elts (size 16)
        family: "YuMincho"(s) "serif"(s)
        size: 12(f)(s) 13(f)(s)
        lang: ja(s) en(s)

また、サイズ(size)はDouble、ウェイト(weight)はIntのように型が決まっています。

$ fc-pattern 'sans:size=serif'
Unable to parse the pattern

$ fc-pattern 'sans:size=0x10p0'
Pattern has 2 elts (size 16)
        family: "sans"(s)
        size: 16(f)(s)

こうして size を明記したときはエラーにしてくれますのに上でも挙げました sans-serif ですとエラーにならず -serif 部分が無視されてしまうのはいただけませんね……。

$ fc-pattern 'sans-serif'
Pattern has 1 elts (size 16)
        family: "sans"(s)

罠としか思えませんのでエラーにして欲しいです。

属性の型によっては特定の文字列が定数値として解釈されることもあります。

$ fc-pattern ':weight=bold'
Pattern has 1 elts (size 16)
        weight: 200(f)(s)

逆に数値が定数文字列になる場合もあります。

$ fc-pattern ':color=1'
Pattern has 1 elts (size 16)
        color: True(s)

リファレンスマニュアル

今日はフォントパターンの書き方自体がメインですので、どのような属性や型や定数があるかはマニュアルを参照してください。

Fontconfigのサイト に文書がありますし man fonts-conf にも書いてあります。