Fontconfig (13日目) - フォントを無効にする

昨日はFreeSerifを消すためにパッケージからアンインストールしてしまいました。 Fontconfigの機能としてフォントを無効にする方法はちゃんとありますのでそれを試してみます。

ちなみに1日目にKDEの機能でフォントを無効にできることを紹介しましたがファイル名の先頭に "." を付けてFontconfigやアプリケーションから見えなくするものでした。 パッケージマネージャーからも見えなくなりますしそうすると厄介なことも起きそうですので、リネームなどせずに無効化できるならその方がいいですよね。

余計なフォントへの依存

余計なフォントへの依存を持っているパッケージは意外に多いです。

vlc-plugin-skins2ぐらいでしたらアンインストールしても違いがよくわかりませんが、消そうとするとアプリケーションやDEごと消えてしまうのは困りものですよね。 DependsではなくRecommendsに留めて欲しいです。

例えばKDE neonのneon-desktopはfonts-hack-ttf、fonts-noto-color-emoji、fonts-noto-hintedを必須としています。 DEのメタパッケージは大抵テーマで使うフォントを依存関係に含めていて、ubuntu-mate-desktopでしたらfonts-dejavu-coreとfonts-freefont-ttfを必須としています。

fonts-urw-base35はlibgs9-commonに必須とされていて消そうとするとghostscriptだけではなく印刷関連のパッケージや印刷をオプションではなく必須機能としているアプリケーションまでごそっと消えます。

Liberation Sans、Liberation Serif、Liberation Monoにはバージョン違いでfonts-liberationとfonts-liberation2の2つのパッケージがあります。 ディレクトリは異なりますので同時にインストールはできますがファミリー名は同じですので結局どちらか片方しか使えません。 それなのにアプリケーションAがfonts-liberation、アプリケーションBがfonts-liberation2を必須としている場合がありまして……。

……等々。

無効化

フォントもただインストールされているだけですと無害なのですけれども、FreeSerifのように意外なところで優先されてしまったりすると消したくなります。

手軽に消せない場合は無効化しましょう。

今回もまたFreeSerifで試します。 (実験環境には再インストールしました。)

$ LANG=und-zmth fc-match 'XITS Math'
FreeSerif.ttf: "FreeSerif" "Regular"

<selectfont>, <acceptfont>, <rejectfont>...

Fontconfigのマニュアルを見る限りではこのあたりのタグを使えば良いというところまではアタリを付けられますが、実際の使い方はさっぱりわかりません。 困ったときの ArchWiki を参考にさせていただきました。

まずはパスを指定する方法。

10-reject.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <selectfont>
  <rejectfont>
   <glob>/usr/share/fonts/truetype/freefont/FreeSerif*.ttf</glob>
  </rejectfont>
 </selectfont>
</fontconfig>

この設定ファイルを置いておきますと

$ LANG=und-zmth fc-match 'XITS Math'
DejaVuMathTeXGyre.ttf: "DejaVu Math TeX Gyre" "Regular"

FreeSerifが出てこなくなりました。 fc-list | grep FreeSerif からも消えています。

次に属性を指定する方法。

10-reject.conf (修正)
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <selectfont>
  <rejectfont>
   <pattern>
    <patelt name="family">
     <string>FreeSerif</string>
    </patelt>
   </pattern>
  </rejectfont>
 </selectfont>
</fontconfig>

この方法ですと *.ttc に含まれる特定のフォントファミリー名だけを無効にすることもできます。

同じ <pattern> タグの中に <patelt> タグを複数並べると論理積になります。

10-reject.conf (修正)
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <selectfont>
  <rejectfont>
   <pattern>
    <patelt name="family">
     <string>FreeSerif</string>
    </patelt>
    <patelt name="weight">
     <int>80</int>
    </patelt>
   </pattern>
  </rejectfont>
 </selectfont>
</fontconfig>

特定のウェイト、今回はregular(80)だけ無効にしてみました。

$ LANG=und-zmth fc-match -s 'XITS Math' | grep FreeSerif
$ LANG=und-zmth fc-match -s 'XITS Math:weight=bold' | grep FreeSerif
FreeSerifBold.ttf: "FreeSerif" "Bold"

bold(200)を要求すると出てきます。

ちなみに <glob><pattern> タグを複数並べるのは論理和のようです。