Chienomi

アプリケーションに固有のfonts.confを使用させる

Live with Linux

  • TOP
  • Old Archives
  • アプリケーションに固有のfonts.confを使用させる

意図

私はどうしても、どうしても!!! ウェブサイトが無意味にフォントを固定してくるのが気に入らない。

いくらでもいいフォントはあるのに、よりによってなぜMS PゴシックだのArialだのHerveticaだの気に食わないフォントを強制されなくてはいけないのか。

「MS Pゴシックはないんだからいいじゃん」と思うかもしれないが、それでは済まない。 「完全にMS Pゴシックに決め打ちしているもの」というのも世の中には存在するので(一番はMSWord文書)どうしてもMS Pゴシックはメトリック互換フォントを設定せざるをえないのだ。

Arialに関してはUI部品に本当に使っていて、はみだすケースが少なくないので、変更はより難しい。

そうでなくても指定されるのは気に入らない。 必要ないのではないか。 私としては読みやすいフォントを使いたいのだ。

最も望ましいのはユーザースタイルシートで上書きすることである。 だが、ご丁寧にどのサイトもbodypではなくスコアの高いところにフォント指定してくれやがるのでそうはいかない。滅びてしまえ。

幸いにも私の場合プロファイル切り替えプログラムを使っているのでそのブラウザで見るサイトというのは決まっている。 だから手っ取り早いのはサイトで指定されているフォントをoverrideすることである。

実際、

 <match target="pattern">
  <test name="family" qual="any">
   <string>Arial</string>
  </test>
  <edit mode="prepend" binding="same" name="family">
   <string>Raleway-v4020</string>
  </edit>
  <edit mode="assign" binding="strong" name="spacing">
   <int>0</int>
  </edit>
 </match>

とかやっているのだが、やはり弊害が大きく、条件は限定したい。

意外とイケてないFontConfigの仕様

FontConfigって結構イケてるソフトウェアだと思っていたのだけれど、そうでもない。

設定にXMLを使っている時点で微妙だし、その文法はさらに微妙だが、 環境変数のような動的要素は全然使えない。

XDG_CONFIG_HOMEだけは理解するのだけど、そのロジックはinclude内のprefix="xdg"である。 このprefixdefault (/)かxdg ($XDG_CONFIG_HOME | ~/.config)のどちらかだけ。 かろうじて~は使えるのだが…

条件式も書けないし、アプリケーションごとの設定もできない。 とにかく自由度が低い。というか、設計がイケてない。

方法はいくつかある。

例えば、~/.application.font.conf.d/をincludeするようにしておいて、 これをシンボリックリンクとして切り替える、というような方法だ。 だが、これは優先度が高いところでincludeするほど影響が大きく、制約される。

ただし、この方法ではアプリケーションがFreeTypeをロードしたあとであればこのリンクを切ってもリンク先のディレクトリをホールドし続ける。FontConfigが再度シンボリックリンクを解決することはない。

だが、よりよいのは環境変数$FONTCONFIG_FILEを使う方法だ。 これによりカスタムのfonts.confを使わせることができる。

だが、これも罠が多い。

まず、ファイル向けの$FONTCONFIG_FILEとディレクトリ向けの$FONTCONFIG_PATHがあるのだが、$FONTCONFIG_PATHにしてもNN-XXXX.confをロードするわけではなく、単にそのディレクトリのfonts.confをロードするだけである。 しかも、どちらも複数指定はできない。

このふたつがある意味がないし、柔軟性が全くない。 やっぱりFontConfigがいまいちだ。

固有のfonts.confを使わせる

だいたいこんな感じである。

#!/bin/bash

export FONTCONFIG_FILE=$HOME/.config/extra-fontconfig/browser.conf
exec chromium

この設定ファイルにはしたいことだけ書けばいいわけではなく、/etc/fonts以下でやっているようなことが全て必要になる。 手っ取り早い方法としては

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <its:rules xmlns:its="http://www.w3.org/2005/11/its" version="1.0">
    <its:translateRule translate="no" selector="/fontconfig/*[not(self::description)]"/>
  </its:rules>

  <description>Load application special configuration.</description>
        <include ignore_missing="yes" prefix="xdg">/etc/fonts/conf.d</include>
        <include ignore_missing="yes" prefix="xdg">/etc/fonts/fonts.conf</include>
</fontconfig>

のように書いておくことだ (いや、多分/etc/fonts/conf.dをここで指定する必要はない)。 これで通常の設定ファイルがロードされる。

この設定ファイル内で書いた内容はincludeの前でも後でも優先され、overrideできる。 だから、この内容を基本として固有の内容を書き足せば良い。

ただし、効力は通常されるどの設定ファイルよりも強いので注意が必要。

この方法は汎用性があり、エディタでフォントを使い分けたいときにも有効に働く。 例えばsans-serifmonospaceのような抽象フォントを指定しておき、それをoverrideすれば良い。 arialhelvetica, MS Pゴシックなどをグローバルに置き換えることも避けられる。

Web browser profile chooser version 2.0

My browser profile chooserが従来はこのような余計なコマンドの実行に適していなかったので、特殊なことをしなくても実現できるように変更した。 これは、既に廃止されたブラウザの削除、設定ファイル指定オプションがなくなったMidoriの削除など懸案だった変更を多数含み、 従来とは互換性がない

従来の強引な手法が訂正されたため、設計も改善された。 これで例えば次のようにして任意のフォントプロファイルで起動できる。

webpf_sample() {
  export FONTCONFIG_FILE="$HOME/fontprofiles/browser.conf"
  cliarg=(--incognito "$cliarg[@]")
  profile="$HOME/browserprofiles/sample"
  viv
}