webdevqa.jp.net

Consolasの場合、fc-matchがCourierの一致と編集のルールを尊重しないのはなぜですか?

XFCEでDebianを使用しています。

デフォルトの動作:一致またはエイリアスなし

まず、〜/ .config/fontconfig/fonts.confに一致タグまたはエイリアスタグがない場合の、システムのデフォルトの動作を示します。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
</fontconfig>

この場合、fc-matchはCourierとConsolasに対して次のように出力します。

[email protected]:~$ fc-match Courier
n022003l.pfb: "Nimbus Mono L" "Regular"
[email protected]:~$ fc-match Consolas
DejaVuSans.ttf: "DejaVu Sans" "Book"

カスタム動作:一致が定義されている場合

これで、〜/ .config/fontconfig /fonts.confに次のものがあります。

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <!-- Courier => DejaVu Sans Mono -->
    <match>
        <test name="family"><string>Courier</string></test>
        <edit name="family"><string>Deja Vu Sans Mono</string></edit>
    </match>

    <!-- Consolas => DejaVu Sans Mono -->
    <match>
        <test name="family"><string>Consolas</string></test>
        <edit name="family"><string>Deja Vu Sans Mono</string></edit>
    </match>
</fontconfig>

この場合、fc-matchは次のように出力します。

[email protected]:~$ fc-match Courier
n022003l.pfb: "Nimbus Mono L" "Regular"
[email protected]:~$ fc-match Consolas
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"

ここでは、システムがConsolasの置換ルールを尊重しているが、Courierの置換ルールを尊重していないことがわかります。 fc-match Courierの出力が「DejaVuSansMono」ではなく「NimbusMonoL」のままであるのはなぜですか?

1
Lone Learner

この質問は時代遅れになる可能性が高いことはわかっていますが、新しいKubuntu Xenial16.04デスクトップで嫌いだったArialのLiberationSansへのシステム置換をオーバーライドするソリューションを自分で探していました。

ユーザーのfontconfigのデフォルトの置換をオーバーライドすることが必要な場合は、Askubuntuに関する私の投稿を読んでください: https://askubuntu.com/a/793363/30642

簡単な要約

最近のシステムでは、fontconfigはユーザー設定を~/.config/fontconfig/fonts.confまたは(分離の目的でより良い)~/.config/fontconfig/conf.dからプルします。

私の場合、FirefoxでCSSフォントファミリーを設定してテキストをレンダリングし、NotoSansを使用してArialを優先するようにしました。 Fontconfigは、デフォルトでLiberation SansをArial(/etc/fonts/conf.avail/30-metric-aliases.conf)のメトリックドロップインとして使用するように構成されています。これは、最初はfontconfigのメイン構成ファイルを変更せずにオーバーライドすることは不可能と思われました。

長い検索、試行錯誤の後、解決策は非常に単純でした。上記のユーザーディレクトリにある場合はオーバーライドが尊重され、fontconfigの期待に従って[0-9][0-9]*.confの形式で名前が付けられます(/ etc/fonts /を参照) conf.avail/50-user.confおよび/ etc/fonts/conf.d/README)。

Arialをオーバーライドするための私の作業構成:

~/.config/fontconfig/conf.d/00-arial-noto.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <!-- Map Arial to Noto Sans instead of Liberation Sans
       (overrides /etc/fonts/conf.d/30-metric-aliases.conf) -->
  <alias binding="same">
    <family>Arial</family>
    <accept>
      <family>Noto Sans</family>
    </accept>
  </alias>
</fontconfig>

ユーザーとしてコンソールのfc-match Arialを確認すると、追加の作業なしで「NotoSans」(または新しい構成)が出力されます。

Fontconfigの領域での勇敢な戦いについての非常に冒険的な話を読むことを含めて、それらすべてを理解するのに半日を費やした後、これが他の人の助けになることを願っています。

4
memartin

デフォルト構成で何も変更していない場合、/etc/fonts/conf.d/のフォント構成ファイルにはConsolasへの参照が含まれていないため、その設定が使用されます。

ただし、それらにはすでにCourierのエントリが含まれており、Nimbus MonoLにエイリアスされています。

したがって、fonts.confが解析されるまでに、Courierはすでに処理されており、作業するCourierはなくなり、Nimbus MonoLのみが処理されます。

ソリューション:

Fonts.confのフォントNimbusMonoLで作業します。
あなたが書くなら

<match>
    <test name="family"><string>Nimbus Mono L</string></test>
    <edit name="family"><string>DejaVu Sans Mono</string></edit>
</match>

次に、fc-match CourierはDejaVuSansMonoを出力します。

または、/ etc/fonts /conf.d内のすべての.confファイルからCourierエイリアスを削除します。

0
Mr Lister