タイトル通り。 Fontconfig を使ってシステムフォントを設定する。
自分が使っている Arch Linux を入れているラップトップマシンでも、やっぱり日本語は使いたいので日本語フォントをいくつかインストールしている。 ただ具体的なフォント設定に関して言うと、明示的に設定しているのはターミナルアプリケーションくらいでそれ以外は特に設定しておらず表示されるがままになっている。
例えば Google Chrome とかは、UI やコンテンツがこんな感じの所謂中華フォントになったりする。(「与」の字とか分かりやすい)
自分はフォントについての拘りはあまり無く読めればなんでも良いくらいのスタンス 1 だったので、 まぁ良いかと思いそのまま使っていたのだが、 何故かほぼ同じ様にインストールしたはずのデスクトップマシンでは中華フォントになっておらず、 同時に起動して両方を行き来しながら作業してる時とかは流石に気になったりもしていた。
で、ブログのネタにするついでにちゃんと設定するかとなった次第。
Fontconfig について
Linux のフォント周りは基本的に Fontconfig というヤツがフォントの管理全般を行っている。
アプリケーションで何かしら文字を表示する場合、大まかには以下の様な感じで Fontconfig が選んだフォントが使われることになる。
- Fontconfig は予めシステムにインストールされたフォントを認識して、フォント情報をキャッシュとして持つ
- アプリケーションが文字を表示したい場合、必要なフォントを Fontconfig に要求
- Fontconfig は設定に沿ってフォントを選定し、フォントの情報をアプリケーションを返す
- アプリケーションは返ってきたフォントを使って文字を表示する
この流れの中で、要求されたフォントがシステムにインストールされていなかった場合にどのフォントで代替するかや、 汎用フォントファミリーが指定された場合にどのフォントを使うかを決める、といったことも Fontconfig が行っている。
Fontconfig はデフォルトでも多くの場合でいい感じに動くように設定されているのだが、 今回の様に選ばれるフォントをちょっと弄りたいみたいなことは想定されていて、 用意された各種コマンドを使って設定の確認をしたり、 XML 形式の設定ファイルを書いて調整できる様にもなっている。 今回はこの設定を弄ることで別のフォントを使われる様にする。
作業した自分の環境について一応触れておくと、ディストリビューションは ArchLinux でデスクトップ環境としては Xfce 、 Fontconfig のバージョンは以下。
❯ fc-list --version
fontconfig version 2.14.2
デスクトップ環境によっては Fontconfig のフォント指定を上書きするユーティリティがあったり、 アプリケーションによっては別の仕組み( X Logical Font Description )を使っていたりもするっぽいが、 今回は Fontconfig で完結したのでその辺りにはあまり触れない。
設定作業
インストール済フォントの確認
まずシステムにインストールされているフォントの確認方法と、 Fontconfig がそれらをどうやって認識してるかについて。
Fontconfig はフォントを認識するにあたり、以下のディレクトリを走査することでフォントを認識し、 後々の利用のためにフォントの情報をキャッシュする。 (ディレクトリは Fontconfig の設定ファイルで指定されている)
/usr/share/fonts/
/usr/local/share/fonts/
~/.local/share/fonts/
2~/.fonts/
(ただし廃止予定)
ディレクトリの場所は特段変わった配置でもなく、パッケージ等で入れれば基本 /usr/share/fonts/
あたりに入り、
キャッシュへの反映も自動で行われる 3 のでほとんどの場合それほど気にする必要はない。
但し、フォントファイルを手動でダウンロードしてきて配置した場合などはキャッシュの再作成が自動で行われないので、
fc-cache
コマンドを使うなどして別途キャッシュへの反映を行う必要がある。
そうして認識したフォントの確認には fc-list
コマンドを使う。
言語でのフィルタや出力項目の調整も可能で、例えばこんな感じで見ることができる。
❯ fc-list :lang=ja file family style | sort | head -20
/usr/share/fonts/OTF/TakaoGothic.ttf: Takaoゴシック,TakaoGothic:style=Regular
/usr/share/fonts/OTF/TakaoMincho.ttf: Takao明朝,TakaoMincho:style=Regular
/usr/share/fonts/OTF/TakaoPGothic.ttf: Takao Pゴシック,TakaoPGothic:style=Regular
/usr/share/fonts/OTF/TakaoPMincho.ttf: Takao P明朝,TakaoPMincho:style=Regular
/usr/share/fonts/OTF/ipag.ttf: IPAゴシック,IPAGothic:style=Regular
/usr/share/fonts/OTF/ipagp.ttf: IPA Pゴシック,IPAPGothic:style=Regular
/usr/share/fonts/OTF/ipam.ttf: IPA明朝,IPAMincho:style=Regular
/usr/share/fonts/OTF/ipamp.ttf: IPA P明朝,IPAPMincho:style=Regular
/usr/share/fonts/TTF/HackGen-Bold.ttf: HackGen:style=Bold
/usr/share/fonts/TTF/HackGen-Regular.ttf: HackGen:style=Regular
/usr/share/fonts/TTF/HackGen35-Bold.ttf: HackGen35:style=Bold
/usr/share/fonts/TTF/HackGen35-Regular.ttf: HackGen35:style=Regular
/usr/share/fonts/TTF/HackGen35Console-Bold.ttf: HackGen35 Console:style=Bold
/usr/share/fonts/TTF/HackGen35Console-Regular.ttf: HackGen35 Console:style=Regular
/usr/share/fonts/TTF/HackGen35ConsoleNF-Bold.ttf: HackGen35 Console NF:style=Bold
/usr/share/fonts/TTF/HackGen35ConsoleNF-Regular.ttf: HackGen35 Console NF:style=Regular
/usr/share/fonts/TTF/HackGenConsole-Bold.ttf: HackGen Console:style=Bold
/usr/share/fonts/TTF/HackGenConsole-Regular.ttf: HackGen Console:style=Regular
/usr/share/fonts/TTF/HackGenConsoleNF-Bold.ttf: HackGen Console NF:style=Bold
/usr/share/fonts/TTF/HackGenConsoleNF-Regular.ttf: HackGen Console NF:style=Regular
実際に設定ファイルを書く上では、この中の family
の値を使ってフォントを指定することになる。
現在の設定の確認
次に Fontconfig で現在設定されているフォントを確認する方法について。
Fontconfig でどのフォントが設定されているかは fc-match
を使うことで確認できる。
基本的には Fontconfig にどういう要求を投げるとどのフォントを返すかという形で確認することになるが、
--sort
を付けることで優先度順に並べてリストすることもできる。
例えばシステムのデフォルトフォントが何かを確認する場合はこんな感じ。
❯ fc-match
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
また、冒頭で貼った Google 検索結果の画面キャプチャの場合についても見てみたが、
試した感じ Google Chrome のようなウェブブラウザの場合、
ブラウザ自体の UI とは別にページの CSS などに応じても別途 Fontconfig とのやりとりが発生している様子。
例えば Google 検索結果のページでは CSS で font-family: arial,sans-serif;
が指定されているが、
これら2つのフォントを Fontconfig に問い合わせると、自分のシステムでは以下のような感じになる。
❯ fc-match arial
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
❯ fc-match sans-serif
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
この内 Liberation Sans
は日本語非対応のフォントなので、日本語部分は WenQuanYi Zen Hei
で表示され冒頭のキャプチャの様になっていた(ということのはず)。
設定ファイルの構成
実際に設定を書く前に、 Fontconfig の設定ファイル群がどういう構成になっているかについて。
Fontconfig の設定ファイルはデフォルトで結構な数のファイルに分かれているが、
Fontconfig が直接読むのは /etc/fonts/fonts.conf
だけで、その他のファイルは以下のような感じで適宜ディレクトリを include する形で読む様になっている。
❯ find /etc/fonts/ -type f -o -type l | xargs grep '<include'
/etc/fonts/fonts.conf: <include ignore_missing="yes">conf.d</include>
/etc/fonts/conf.d/50-user.conf: <include ignore_missing="yes" prefix="xdg">fontconfig/conf.d</include>
/etc/fonts/conf.d/50-user.conf: <include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>
/etc/fonts/conf.d/50-user.conf: <include ignore_missing="yes" deprecated="yes">~/.fonts.conf.d</include>
/etc/fonts/conf.d/50-user.conf: <include ignore_missing="yes" deprecated="yes">~/.fonts.conf</include>
/etc/fonts/conf.d/51-local.conf: <include ignore_missing="yes">local.conf</include>
また、 /etc/fonts/conf.d
以下に配置されている設定ファイル群は以下の様な感じで全てリンクになってる。
❯ ls -lh /etc/fonts/conf.d/
合計 44K
lrwxrwxrwx 1 root root 57 1月 30 2023 10-hinting-slight.conf -> /usr/share/fontconfig/conf.default/10-hinting-slight.conf
lrwxrwxrwx 1 root root 61 1月 30 2023 10-scale-bitmap-fonts.conf -> /usr/share/fontconfig/conf.default/10-scale-bitmap-fonts.conf
lrwxrwxrwx 1 root root 56 1月 30 2023 10-sub-pixel-rgb.conf -> /usr/share/fontconfig/conf.default/10-sub-pixel-rgb.conf
lrwxrwxrwx 1 root root 56 1月 30 2023 10-yes-antialias.conf -> /usr/share/fontconfig/conf.default/10-yes-antialias.conf
lrwxrwxrwx 1 root root 60 1月 30 2023 11-lcdfilter-default.conf -> /usr/share/fontconfig/conf.default/11-lcdfilter-default.conf
lrwxrwxrwx 1 root root 60 1月 30 2023 20-unhint-small-vera.conf -> /usr/share/fontconfig/conf.default/20-unhint-small-vera.conf
lrwxrwxrwx 1 root root 57 1月 30 2023 30-metric-aliases.conf -> /usr/share/fontconfig/conf.default/30-metric-aliases.conf
lrwxrwxrwx 1 root root 51 1月 30 2023 40-nonlatin.conf -> /usr/share/fontconfig/conf.default/40-nonlatin.conf
lrwxrwxrwx 1 root root 62 1月 30 2023 44-source-han-sans-otc.conf -> /usr/share/fontconfig/conf.default/44-source-han-sans-otc.conf
lrwxrwxrwx 1 root root 63 1月 30 2023 44-source-han-serif-otc.conf -> /usr/share/fontconfig/conf.default/44-source-han-serif-otc.conf
lrwxrwxrwx 1 root root 50 1月 30 2023 45-generic.conf -> /usr/share/fontconfig/conf.default/45-generic.conf
lrwxrwxrwx 1 root root 48 1月 30 2023 45-latin.conf -> /usr/share/fontconfig/conf.default/45-latin.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 46-noto-mono.conf -> /usr/share/fontconfig/conf.default/46-noto-mono.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 46-noto-sans.conf -> /usr/share/fontconfig/conf.default/46-noto-sans.conf
lrwxrwxrwx 1 root root 53 1月 30 2023 46-noto-serif.conf -> /usr/share/fontconfig/conf.default/46-noto-serif.conf
lrwxrwxrwx 1 root root 50 1月 30 2023 48-spacing.conf -> /usr/share/fontconfig/conf.default/48-spacing.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 49-sansserif.conf -> /usr/share/fontconfig/conf.default/49-sansserif.conf
lrwxrwxrwx 1 root root 47 1月 30 2023 50-user.conf -> /usr/share/fontconfig/conf.default/50-user.conf
lrwxrwxrwx 1 root root 48 1月 30 2023 51-local.conf -> /usr/share/fontconfig/conf.default/51-local.conf
lrwxrwxrwx 1 root root 50 1月 30 2023 60-generic.conf -> /usr/share/fontconfig/conf.default/60-generic.conf
lrwxrwxrwx 1 root root 48 1月 30 2023 60-latin.conf -> /usr/share/fontconfig/conf.default/60-latin.conf
lrwxrwxrwx 1 root root 56 1月 30 2023 65-fonts-persian.conf -> /usr/share/fontconfig/conf.default/65-fonts-persian.conf
lrwxrwxrwx 1 root root 51 1月 30 2023 65-nonlatin.conf -> /usr/share/fontconfig/conf.default/65-nonlatin.conf
lrwxrwxrwx 1 root root 53 12月 2 14:10 65-wqy-zenhei.conf -> /usr/share/fontconfig/conf.default/65-wqy-zenhei.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 66-noto-mono.conf -> /usr/share/fontconfig/conf.default/66-noto-mono.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 66-noto-sans.conf -> /usr/share/fontconfig/conf.default/66-noto-sans.conf
lrwxrwxrwx 1 root root 53 1月 30 2023 66-noto-serif.conf -> /usr/share/fontconfig/conf.default/66-noto-serif.conf
lrwxrwxrwx 1 root root 50 1月 30 2023 69-unifont.conf -> /usr/share/fontconfig/conf.default/69-unifont.conf
lrwxrwxrwx 1 root root 54 2月 12 2023 69-urw-bookman.conf -> /usr/share/fontconfig/conf.default/69-urw-bookman.conf
lrwxrwxrwx 1 root root 51 2月 12 2023 69-urw-c059.conf -> /usr/share/fontconfig/conf.default/69-urw-c059.conf
lrwxrwxrwx 1 root root 55 2月 12 2023 69-urw-d050000l.conf -> /usr/share/fontconfig/conf.default/69-urw-d050000l.conf
lrwxrwxrwx 1 root root 65 2月 12 2023 69-urw-fallback-backwards.conf -> /usr/share/fontconfig/conf.default/69-urw-fallback-backwards.conf
lrwxrwxrwx 1 root root 64 2月 12 2023 69-urw-fallback-generics.conf -> /usr/share/fontconfig/conf.default/69-urw-fallback-generics.conf
lrwxrwxrwx 1 root root 65 2月 12 2023 69-urw-fallback-specifics.conf -> /usr/share/fontconfig/conf.default/69-urw-fallback-specifics.conf
lrwxrwxrwx 1 root root 53 2月 12 2023 69-urw-gothic.conf -> /usr/share/fontconfig/conf.default/69-urw-gothic.conf
lrwxrwxrwx 1 root root 61 2月 12 2023 69-urw-nimbus-mono-ps.conf -> /usr/share/fontconfig/conf.default/69-urw-nimbus-mono-ps.conf
lrwxrwxrwx 1 root root 59 2月 12 2023 69-urw-nimbus-roman.conf -> /usr/share/fontconfig/conf.default/69-urw-nimbus-roman.conf
lrwxrwxrwx 1 root root 58 2月 12 2023 69-urw-nimbus-sans.conf -> /usr/share/fontconfig/conf.default/69-urw-nimbus-sans.conf
lrwxrwxrwx 1 root root 51 2月 12 2023 69-urw-p052.conf -> /usr/share/fontconfig/conf.default/69-urw-p052.conf
lrwxrwxrwx 1 root root 66 2月 12 2023 69-urw-standard-symbols-ps.conf -> /usr/share/fontconfig/conf.default/69-urw-standard-symbols-ps.conf
lrwxrwxrwx 1 root root 51 2月 12 2023 69-urw-z003.conf -> /usr/share/fontconfig/conf.default/69-urw-z003.conf
lrwxrwxrwx 1 root root 51 1月 30 2023 70-noto-cjk.conf -> /usr/share/fontconfig/conf.default/70-noto-cjk.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 80-delicious.conf -> /usr/share/fontconfig/conf.default/80-delicious.conf
lrwxrwxrwx 1 root root 52 1月 30 2023 90-synthetic.conf -> /usr/share/fontconfig/conf.default/90-synthetic.conf
-rw-r--r-- 1 root root 979 1月 28 2023 README
これらデフォルトの設定ファイルに関しては、フォントのパッケージインストール時に自動で追加されたりする。
なので、 Fontconfig の設定を自分で管理したい場合もこれらの設定ファイルを全部自前で持つというよりは、
これらはデフォルト設定としてそのまま置いておいて(やるとしてもリンクを削除するくらい)、
前述の 50-user.conf
51-local.conf
を経由して include される設定ファイルを作成して上書き設定する感じでやるのが基本になる。
この辺りの設定ファイルの構成については /etc/fonts/fonts.conf
内のコメントや /etc/fonts/conf.d/README
にも記述があるので、その辺りも眺めておくと良さげ。
設定ファイルの記述
実際に設定を書いていく。
設定ファイルのフォーマットに関しては man fonts-conf
を読めと言われるのだが、個人的にちゃんと読むのが辛かったので、
デフォルトの設定ファイルをコピーしてきてちょっと弄って試すという感じがやりやすかった。
前述のデフォルト設定ファイル群の中のどこにどういう設定をしてるかについては /etc/fonts/conf.d/README
に大まかな構成を書いているのと、
各設定ファイルの中に <description>
という項目もあるので、それらを見るとどの辺りの設定を弄れば良いかなんとなく分かる様になっている。
❯ cat /etc/fonts/conf.d/README
conf.d/README
Each file in this directory is a fontconfig configuration file. Fontconfig
scans this directory, loading all files of the form [0-9][0-9]*.conf.
These files are normally installed in /usr/share/fontconfig/conf.avail
and then symlinked here, allowing them to be easily installed and then
enabled/disabled by adjusting the symlinks.
The files are loaded in numeric order, the structure of the configuration
has led to the following conventions in usage:
Files beginning with: Contain:
00 through 09 Font directories
10 through 19 system rendering defaults (AA, etc)
20 through 29 font rendering options
30 through 39 family substitution
40 through 49 generic identification, map family->generic
50 through 59 alternate config file loading
60 through 69 generic aliases, map generic->family
70 through 79 select font (adjust which fonts are available)
80 through 89 match target="scan" (modify scanned patterns)
90 through 99 font synthesis
❯ find /etc/fonts/conf.d/ -type f -o -type l | xargs grep '<description>' | sort
/etc/fonts/conf.d/10-hinting-slight.conf: <description>Set hintslight to hintstyle</description>
/etc/fonts/conf.d/10-scale-bitmap-fonts.conf: <description>Bitmap scaling</description>
/etc/fonts/conf.d/10-sub-pixel-rgb.conf: <description>Enable sub-pixel rendering with the RGB stripes layout</description>
/etc/fonts/conf.d/10-yes-antialias.conf: <description>Enable antialiasing</description>
/etc/fonts/conf.d/11-lcdfilter-default.conf: <description>Use lcddefault as default for LCD filter</description>
/etc/fonts/conf.d/20-unhint-small-vera.conf: <description>Disable hinting for Bitstream Vera fonts when the size is less than 8ppem</description>
/etc/fonts/conf.d/30-metric-aliases.conf: <description>Set substitutions for similar/metric-compatible families</description>
/etc/fonts/conf.d/40-nonlatin.conf: <description>Set substitutions for non-Latin fonts</description>
/etc/fonts/conf.d/45-generic.conf: <description>Set substitutions for emoji/math fonts</description>
/etc/fonts/conf.d/45-latin.conf: <description>Set substitutions for Latin fonts</description>
/etc/fonts/conf.d/48-spacing.conf: <description>Add mono to the family when spacing is 100</description>
/etc/fonts/conf.d/49-sansserif.conf: <description>Add sans-serif to the family when no generic name</description>
/etc/fonts/conf.d/50-user.conf: <description>Load per-user customization files</description>
/etc/fonts/conf.d/51-local.conf: <description>Load local customization file</description>
/etc/fonts/conf.d/60-generic.conf: <description>Set preferable fonts for emoji/math fonts</description>
/etc/fonts/conf.d/60-latin.conf: <description>Set preferable fonts for Latin</description>
/etc/fonts/conf.d/65-nonlatin.conf: <description>Set preferable fonts for non-Latin</description>
で、ざっと眺めた感じ日本語を表示する際に優先して使うフォントを指定しているのが 65-nonlatin.conf
だったので、
これを ~/.config/fontconfig/fonts.conf
にコピーして以下の様な感じに書き換えた。
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<description>Set preferable fonts for Japanese</description>
<alias>
<family>serif</family>
<prefer>
<family>IPAPMincho</family>
<family>Noto Serif CJK JP</family>
<family>Noto Serif</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>IPAPGothic</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>IPAGothic</family>
<family>Noto Sans Mono CJK JP</family>
<family>Noto Sans Mono</family>
</prefer>
</alias>
<alias>
<family>system-ui</family>
<prefer>
<family>IPAPGothic</family>
<family>Noto Sans CJK JP</family>
<family>Noto Sans</family>
</prefer>
</alias>
</fontconfig>
仕組みは謎だが上記ファイルを作成したらすぐに fc-match
の結果に反映されていて、 Google Chrome にもブラウザ再起動で反映されていた。
Fontconfig への問い合わせの度に設定ファイル読むというのも違和感ある気がしており、この辺りも若干理解不足感がある。
ということで、ファイルを一つ作っただけではあるが冒頭の中華フォントになっていた部分は IPA Pゴシック
になった。
(見比べて初めて気付いたが、設定前は太字が効いてなかったりしたらしい)
ちなみに 65-nonlatin.conf
はファイル名の通り日本語に限らず Non-Latin な様々な言語の <prefer>
フォントを設定しているファイルではあるが、
その辺りを全部削って日本語と英語のみ想定したものにしている。
こうした場合でも元の設定ファイル 65-nonlatin.conf
の内容が全く効かなくなるわけでは無く、
優先度が下がる形で生きているので日本語以外での表示にはほぼ影響無い(はず)。
~/.config/fontconfig/fonts.conf
作成前
❯ fc-match --sort 'serif' | head -30
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
NotoSerif-Regular.ttf: "Noto Serif" "Regular"
NotoSerif-Italic.ttf: "Noto Serif" "Italic"
NimbusRoman-Regular.otf: "Nimbus Roman" "Regular"
ipam.ttf: "IPA明朝" "Regular"
StandardSymbolsPS.otf: "Standard Symbols PS" "Regular"
NotoSerifCJK-Regular.ttc: "Noto Serif CJK JP" "Regular"
NotoNastaliqUrdu-Regular.ttf: "Noto Nastaliq Urdu" "Regular"
NotoSansWarangCiti-Regular.ttf: "Noto Sans Warang Citi" "Regular"
NotoSansAdlam-Regular.ttf: "Noto Sans Adlam" "Regular"
NotoSansDuployan-Regular.ttf: "Noto Sans Duployan" "Regular"
NotoSansMongolian-Regular.ttf: "Noto Sans Mongolian" "Regular"
NotoSansSyriacEastern-Regular.ttf: "Noto Sans Syriac Eastern" "Regular"
NotoSansThaana-Regular.ttf: "Noto Sans Thaana" "Regular"
HackGen-Regular.ttf: "HackGen" "Regular"
HackGen35ConsoleNF-Regular.ttf: "HackGen35 Console NF" "Regular"
NotoSansMath-Regular.ttf: "Noto Sans Math" "Regular"
NotoSerifTangut-Regular.ttf: "Noto Serif Tangut" "Regular"
NotoKufiArabic-Regular.ttf: "Noto Kufi Arabic" "Regular"
NotoSansMyanmar-Regular.ttf: "Noto Sans Myanmar" "Regular"
NotoSansGujarati-Regular.ttf: "Noto Sans Gujarati" "Regular"
NotoSansMalayalam-Regular.ttf: "Noto Sans Malayalam" "Regular"
NotoSerifTibetan-Regular.ttf: "Noto Serif Tibetan" "Regular"
NotoSansEthiopic-Regular.ttf: "Noto Sans Ethiopic" "Regular"
NotoSansHanifiRohingya-Regular.ttf: "Noto Sans Hanifi Rohingya" "Regular"
NotoSansLisu-Regular.ttf: "Noto Sans Lisu" "Regular"
NotoSansSoraSompeng-Regular.ttf: "Noto Sans Sora Sompeng" "Regular"
LiberationMono-Regular.ttf: "Liberation Mono" "Regular"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
SourceCodePro-Regular.otf: "Source Code Pro" "Regular"
前述の ~/.config/fontconfig/fonts.conf
作成後
❯ fc-match --sort 'serif' | head -30
ipam.ttf: "IPA明朝" "Regular"
NotoSerifCJK-Regular.ttc: "Noto Serif CJK JP" "Regular"
NotoSerif-Regular.ttf: "Noto Serif" "Regular"
NotoSerif-Italic.ttf: "Noto Serif" "Italic"
NimbusRoman-Regular.otf: "Nimbus Roman" "Regular"
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
StandardSymbolsPS.otf: "Standard Symbols PS" "Regular"
NotoNastaliqUrdu-Regular.ttf: "Noto Nastaliq Urdu" "Regular"
NotoSansWarangCiti-Regular.ttf: "Noto Sans Warang Citi" "Regular"
NotoSansAdlam-Regular.ttf: "Noto Sans Adlam" "Regular"
NotoSansDuployan-Regular.ttf: "Noto Sans Duployan" "Regular"
NotoSansMongolian-Regular.ttf: "Noto Sans Mongolian" "Regular"
NotoSansSyriacEastern-Regular.ttf: "Noto Sans Syriac Eastern" "Regular"
NotoSansThaana-Regular.ttf: "Noto Sans Thaana" "Regular"
HackGen-Regular.ttf: "HackGen" "Regular"
HackGen35ConsoleNF-Regular.ttf: "HackGen35 Console NF" "Regular"
NotoSansMath-Regular.ttf: "Noto Sans Math" "Regular"
NotoSerifTangut-Regular.ttf: "Noto Serif Tangut" "Regular"
NotoKufiArabic-Regular.ttf: "Noto Kufi Arabic" "Regular"
NotoSansMyanmar-Regular.ttf: "Noto Sans Myanmar" "Regular"
NotoSansGujarati-Regular.ttf: "Noto Sans Gujarati" "Regular"
NotoSansMalayalam-Regular.ttf: "Noto Sans Malayalam" "Regular"
NotoSerifTibetan-Regular.ttf: "Noto Serif Tibetan" "Regular"
NotoSansEthiopic-Regular.ttf: "Noto Sans Ethiopic" "Regular"
NotoSansHanifiRohingya-Regular.ttf: "Noto Sans Hanifi Rohingya" "Regular"
NotoSansLisu-Regular.ttf: "Noto Sans Lisu" "Regular"
NotoSansSoraSompeng-Regular.ttf: "Noto Sans Sora Sompeng" "Regular"
LiberationMono-Regular.ttf: "Liberation Mono" "Regular"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
SourceCodePro-Regular.otf: "Source Code Pro" "Regular"
余談
冒頭の中華フォントについて
そもそも Fontconfig の設定をしていない状態で、何故冒頭のキャプチャの様に中華フォントが表示されていたのかという件。
これについては以下にそのまま答えがあった。
端的には WenQuanYi Zen Hei
というフォントが日本語対応フォント扱いかつ
Fontconfig のデフォルト設定として高い優先順位で設定されているから、とのことだった。
ちなみに自分のシステムで何故該当フォントをインストールしていたのかという部分も見てみたが、 何かの依存関係で一緒に入ったというよりは明示的にインストールしていて、
❯ yay -Ql | grep wqy-zenhei.ttc
wqy-zenhei /usr/share/fonts/wenquanyi/wqy-zenhei/wqy-zenhei.ttc
❯ yay -Qi wqy-zenhei
名前 : wqy-zenhei
バージョン : 0.9.45-9
説明 : A Hei Ti Style (sans-serif) Chinese Outline Font.
アーキテクチャ : any
URL : https://wenq.org/enindex.cgi
ライセンス : GPL2 custom:"font embedding exception"
グループ : なし
提供 : なし
依存パッケージ : sh
提案パッケージ : なし
必要パッケージ : なし
任意パッケージ : なし
衝突パッケージ : なし
置換パッケージ : なし
インストール容量 : 16.02 MiB
パッケージ作成者 : Jan Alexander Steffens (heftig) <[email protected]>
ビルド日時 : 2021年03月29日 06時30分47秒
インストール日時 : 2023年01月01日 11時36分55秒
インストール方法 : 明示的にインストール
インストールスクリプト : Yes
検証方法 : 署名
それがいつかというと、以前やった Steam をインストールしたタイミングで一緒に入れていた。
Arch Linux で Steam Play ( Proton ) を試す - SHIDALOG
このマシンは4年くらい使っていてフォントをインストールしたのが1年くらい前なので、 ある日から中華フォントで表示される様になったということになるが、全く記憶にない。
一応今回理解した Fontconfig の動きを踏まえて見てみたら、以下の様な感じでちゃんと Fontconfig の設定に従って表示されていた。
wqy-zenhei
を削除するとタスクトレイのメニューが豆腐になる件- まずタスクトレイメニューのフォントは Steam 関係無くデスクトップ環境のフォント指定に従う
- 以前の記事ではデスクトップ環境が Fontconfig から
wqy-zenhei
のフォント情報を受け取った状態のまま、フォントの実体(パッケージ)を削除したため豆腐になっていただけ- 再ログインなりしてデスクトップ環境が使うフォントをリセットしてやれば、
wqy-zenhei
が無くても豆腐にならず別のフォントでちゃんと表示される
- 再ログインなりしてデスクトップ環境が使うフォントをリセットしてやれば、
- Steam 本体の UI に関しても Steam が
wqy-zenhei
を要求してるわけでは無いので、 Fontconfig を設定すればちゃんとそれに従って表示される
デスクトップ環境で中華フォントにならなかった件
冒頭で少し触れた、デスクトップマシンの方では何故か中華フォントになってなかった件について。
これは単純にデスクトップマシンに Steam をインストールしてなかったので wqy-zenhei
パッケージがそもそも入っていなかったのと、
Xfce のフォント設定として IPA ゴシックを直で指定していたことによるものだった。
今回試した Fontconfig 設定をデスクトップマシンの方に反映する前に、ラップトップマシンと同じ様に wqy-zenhei
をインストールして、
デスクトップ環境でのフォント指定も同じにしたら、ちゃんと(?) WenQuanYi Zen Hei
で表示されていた。
設定ファイル間の優先度
Fontconfig の設定ファイルの中での優先度について。
今の所込み入った設定をするつもりも無いので分からなくても困りはしないが、ちょっと気になったので軽く試した。
まず /etc/fonts/conf.d/*
の設定ファイル群はプレフィックスになってる数字の順番で読み込まれるので、
Fontconfig が実際に設定を読む際は以下の様な順番になると考えられる。(廃止予定の2つは省略)
/etc/fonts/fonts.conf
/etc/fonts/conf.d/*
(00-*
〜49-*
)~/.config/fontconfig/conf.d/*
(50-user.conf
から include )~/.config/fontconfig/fonts.conf
(50-user.conf
から include )/etc/fonts/local.conf
(51-local.conf
から include )/etc/fonts/conf.d/*
(52-*
〜99-*
)
この中で設定の競合が発生した場合、素朴に考えると後勝ちになるのが自然な気がするが、 実際試してみると優先度的には上の方が高くなるっぽい。 (使う上ではその方が都合良くはあるが)
デフォルト設定とユーザの fonts.conf の場合
今回やった設定だが、 ~/.config/fontconfig/fonts.conf
を作成して以下の様にした場合 65-nonlatin.conf
辺りで行われているデフォルト設定より優先される。
❯ fc-match 'serif'
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
❯ mv fonts.conf ~/.config/fontconfig/
❯ cat ~/.config/fontconfig/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPMincho</family>
</prefer>
</alias>
</fontconfig>
❯ fc-match 'serif'
ipamp.ttf: "IPA P明朝" "Regular"
デフォルト設定と local.conf の場合
/etc/fonts/local.conf
を作成した場合も同様に 65-nonlatin.conf
より優先される。
❯ fc-match 'serif'
wqy-zenhei.ttc: "WenQuanYi Zen Hei" "Regular"
❯ sudo mv local.conf /etc/fonts/
❯ cat /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPGothic</family>
</prefer>
</alias>
</fontconfig>
❯ fc-match 'serif'
ipagp.ttf: "IPA Pゴシック" "Regular"
ユーザの fonts.conf と local.conf の場合
~/.config/fontconfig/fonts.conf
と /etc/fonts/local.conf
だと前者が優先される。
❯ cat ~/.config/fontconfig/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPMincho</family>
</prefer>
</alias>
</fontconfig>
❯ cat /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPGothic</family>
</prefer>
</alias>
</fontconfig>
❯ fc-match 'serif'
ipamp.ttf: "IPA P明朝" "Regular"
ユーザの fonts.conf と conf.d/* の場合
~/.config/fontconfig/fonts.conf
と ~/.config/fontconfig/conf.d/*
の両方に優先フォントの設定をすると後者が優先される。
設定ファイルを分割するというのは将来あり得る気もするので、これは頭の片隅に置いといても良いかもしれない。
❯ cat ~/.config/fontconfig/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPMincho</family>
</prefer>
</alias>
</fontconfig>
❯ cat ~/.config/fontconfig/conf.d/00-hoge.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<alias>
<family>serif</family>
<prefer>
<family>IPAPGothic</family>
</prefer>
</alias>
</fontconfig>
❯ fc-match 'serif'
ipagp.ttf: "IPA Pゴシック" "Regular"
さいごに
Fontconfig の大まかな動きと、最低限の設定の書き方などは理解できたと思う。 ただ調べていると、ウェブサイトが要求するフォント指定を無視して自分好みのフォントに変えてしまったり、 フォントを指定するだけじゃなくレンダリングに関する調整をしたり、 Fontconfig はもう少し色んなことができるものらしい。
今の所フォントを選ぶ以上の何かをしようとは思わないので追加で何か試すとかはしないが、 フォント界隈への理解を深めるという意味で調べてみるのもそれはそれで面白いかもしれない。