複数のフォント名を単一のフォント名と一致させる方法要素?

複数のフォント名を単一のフォント名と一致させる方法要素?

もし欲しいならソンナラいつ黒体 または デザビューサンス要件:この構成はうまく機能します。

<match target="pattern">
  <test name="family"><string>Helvetica</string></test>
  <edit binding="strong" mode="prepend" name="family">
    <string>Arial</string>
  </edit>
</match>

<match target="pattern">
  <test name="family"><string>DejaVu Sans</string></test>
  <edit binding="strong" mode="prepend" name="family">
    <string>Arial</string>
  </edit>
</match>

クイックテスト:

$ echo Terminus Helvetica | xargs -n1 fc-match
ter-x12n.pcf.gz: "Terminus" "Regular"
arial.ttf: "Arial" "Regular"

しかし、長すぎます。 Fontconfigのマニュアルには<or>要素が記載されていますが、正しく使用する方法の例がありません。 githubで検索しました。 https://github.com/search?q=match+test+or+extension%3Aconf、これは次のようないくつかの例を返します。

<match target="font">
  <or>
    <test name="family"><string>Nasu</string></test>
    <test name="family"><string>NasuM</string></test>
  </or>
  <edit name="autohint"><bool>false</bool></edit>
</match>

残念ながら、素直に私の設定を次のように書き直すと

<match target="pattern">
  <or>
    <test name="family"><string>Helvetica</string></test>
    <test name="family"><string>DejaVu Sans</string></test>
  </or>
  <edit binding="strong" mode="prepend" name="family">
    <string>Arial</string>
  </edit>
</match>

これにより、すべての一致が中断されます。

$ echo Terminus Helvetica | xargs -n1 fc-match
arial.ttf: "Arial" "Regular"
arial.ttf: "Arial" "Regular"

ベストアンサー1

残念ながら、<match>一致させたい各姓の要素全体を繰り返すよりも良い解決策はありません。これはFonts-conf(5)のマニュアルページに記載されています。

   <--
        The example of the requirements of OR operator;
        If the 'family' contains 'Courier New' OR 'Courier'
        add 'monospace' as the alternative
   -->
   <match target="pattern">
        <test name="family" compare="eq">
             <string>Courier New</string>
        </test>
        <edit name="family" mode="prepend">
             <string>monospace</string>
        </edit>
   </match>
   <match target="pattern">
        <test name="family" compare="eq">
             <string>Courier</string>
        </test>
        <edit name="family" mode="prepend">
             <string>monospace</string>
        </edit>
   </match>

見ているフォント構成のバグ #33644、誰かが要素<string>内のいくつかの要素のルールが<test>期待どおりに機能しないと文句を言いました。ルールはあなたのルールによく似ており、次のようになります。

<match target="pattern"> <test name="family"> <string>Helvetica</string> <string>DejaVu Sans</string> </test> <edit binding="strong" mode="prepend" name="family"> <string>Arial</string> </edit> </match>

これらのルールの問題は、ルールに記載されている値がパターンに複数存在する場合、その値がパターン内の他の一致する値の後に表示されても、ルールは以前にルールで指定された値と一致することです。 ;これにより、mode="prepend"目的の効果が得られない可能性があります。あなたの例:

  • パターンに「Helvetica、DejaVu Sans」が含まれている場合、ルールは「Helvetica」と一致して「Arial、Helvetica、DejaVu Sans」を生成します。
  • パターンに「DejaVu Sans、Helvetica」が含まれている場合、ルールはまだ「Helvetica」と一致し、結果として「DejaVu Sans、Arial、Helvetica」になるため、Arialは必要に応じて選択されません。

別のルールを使用する場合、両方のルールが両方のケースに適用され、「Arial、Helvetica、Arial、DejaVu Sans」または「Arial、DejaVu Sans、Arial、Helvetica」が表示されるため、どちらの場合もArialケースが選択されます。状況。

このバグレポートに答えてください。<test>設定で複数の値を持つ要素が見つかった場合、警告を印刷するようにフォント設定が変更されました。したがって、機能が機能しても使用しないでください。

要素の場合、<or>2つ以上のブール値を取得してブール値を返す式でのみ機能するため、操作には適していません。

おすすめ記事