Fonts

xterm 顯示斜體而不是正常

  • November 23, 2016

golang以使用者身份安裝了 Google Go 字型

  • 我掉進go*.ttf了 ~/.fonts
  • 我跑了fc-cache -fv

現在我可以在任何地方使用新字型,除了xterm

$ fc-match gomono
GoMono-Regular.ttf: "GoMono" "Regular"
$ xterm -fa gomono

我得到

在此處輸入圖像描述

如您所見,xterm抓取字型的斜體變體…我gomono在其他程序中使用過,例如,emacs我得到的當然是正常的羅馬字型…

我錯過了一些東西,或者它是一個特定的怪癖xterm

我正在使用 debian sid,xterm確實很好,很舊xterm

實際上這是 xterm 無法解決的 fontconfig 的一個怪癖。您可能想到的其他一些應用程序用附加參數代替字型系列,因此可能會有一些改進。

如果你跑

xterm -report-fonts -fa 'gomono'

你會看到到底載入了什麼:

Loaded XftFonts(gomono[normal])
               first char:    32
               last char:     64258
               missing-chars: 63567
               present-chars: 660
       Go Mono-8
       familylang=en
       style=Italic
       stylelang=en
       fullname=Go Mono Italic
       fullnamelang=en
       slant=100
       weight=80
       width=100
       pixelsize=10.6712
       spacing=100
       foundry=b&h
       antialias=True
       hintstyle=3
       hinting=True
       verticallayout=False
       autohint=False
       globaladvance=True
       file=/users/tom/.fonts/gomono/Go-Mono-Italic.ttf

並且fontconfig 使用者手冊說 110 是oblique。fontconfig 在以下位置看到此文件列表gomono

Go-Bold-Italic.ttf
Go-Bold.ttf
Go-Italic.ttf
Go-Medium-Italic.ttf
Go-Medium.ttf
Go-Mono-Bold-Italic.ttf
Go-Mono-Bold.ttf
Go-Mono-Italic.ttf
Go-Mono.ttf
Go-Regular.ttf

並且更喜歡基於其內部評分系統的斜體字型。如果您還將環境變數設置FC_DEBUG為 127(每個位都表示某種含義),那麼您可以看到分數。這是比較正常字型和斜體字型的摘錄:

正常的:

slant: 100001  0(i)(s),  100(i)(w)
weight: 20001  100(i)(s),  80(i)(w)
width: 1  100(i)(s),  100(i)(w)
lang: 1001  "en-US"(s),  aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|ki|kl|kum|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(w)
fontversion: 2.14735e+12  2147483647(i)(s),  131269(i)(w)
decorative: 1  FcFalse(s),  FcFalse(w)
Score 0 0 1 1001 1002 0 0 0 100001 20001 1 1 0 0 0 2.14735e+12
Font 21 Pattern has 20 elts (size 20)
       family: "Go Mono"(w)
       familylang: "en"(w)
       style: "Regular"(w)
       stylelang: "en"(w)
       fullname: "Go Mono"(w)  
       fullnamelang: "en"(w)
       slant: 0(i)(w)
       weight: 80(i)(w)
       width: 100(i)(w)
       spacing: 100(i)(w)
       foundry: "b&h"(w)   
       file: "/users/tom/.fonts/gomono/Go-Mono.ttf"(w)   

斜體:

slant: 1  0(i)(s),  0(i)(w)
weight: 80001  100(i)(s),  180(i)(w)
width: 1  100(i)(s),  100(i)(w)
spacing: 1  100(i)(s),  100(i)(w)   
lang: 1001  "en-US"(s),  aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|ki|kl|kum|la|lb|lez|lt|lv|mg|mh|mk|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za(w)
fontversion: 2.14735e+12  2147483647(i)(s),  131269(i)(w)
decorative: 1  FcFalse(s),  FcFalse(w)
Score 0 0 1 1001 1002 1 0 0 1 80001 1 1 0 0 0 2.14735e+12 
Font 20 Pattern has 19 elts (size 19)
       family: "Go Mono"(w)
       familylang: "en"(w)
       style: "Italic"(w)
       stylelang: "en"(w)
       fullname: "Go Mono Italic"(w)
       fullnamelang: "en"(w)
       slant: 100(i)(w)
       weight: 80(i)(w)
       width: 100(i)(w)
       foundry: "b&h"(w)
       file: "/users/tom/.fonts/gomono/Go-Mono-Italic.ttf"(w)

最後

slant: 1  0(i)(s),  0(i)(w)
weight: 20001  100(i)(s),  80(i)(w)
width: 1  100(i)(s),  100(i)(w)
lang: 2001  "en-US"(s),  (w)
fontversion: 2.14748e+12  2147483647(i)(s),  0(i)(w)
decorative: 1  FcFalse(s),  FcFalse(w)
Score 0 0 1001 2001 1002 0 0 0 1 20001 1 1 0 0 0 2.14748e+12
Best score 0 0 1 1001 1002 0 0 0 100001 20001 1 1 0 0 0 2.14735e+12
Pattern has 19 elts (size 19)
       family: "Go Mono"(w)
       familylang: "en"(w)  
       style: "Italic"(w)  
       stylelang: "en"(w) 
       fullname: "Go Mono Italic"(w)
       fullnamelang: "en"(w)
       slant: 100(i)(w)
       weight: 80(i)(w)
       width: 100(i)(w)
       foundry: "b&h"(w)
       file: "/users/tom/.fonts/gomono/Go-Mono-Italic.ttf"(w)

只有第 8 項和第 9 項(從 0 開始計數)不同;fontconfig 對這些數字一視同仁,並且(參見原始碼fcmatch.c)碰巧選擇了最後一個檢查的字型,該字型提高了(降低)任何這些數字的分數:

       for (i = 0; i < PRI_END; i++)
       {   
           if (best && bestscore[i] < score[i])
               break;
           if (!best || score[i] < bestscore[i])
           {   
               for (i = 0; i < PRI_END; i++)
                   bestscore[i] = score[i];
               best = s->fonts[f];
               break;
           }
       }

在我的跟踪中,這恰好是斜體字型,使用間距和寬度作為決定因素的細節。查看目前來源,我可以看到檢查了附加功能(因此您的詳細資訊可能會有​​所不同),但基本算法是相同的。

一項小調查表明,觸發 fontconfig 怪癖的原因是 xterm 要求使用等寬字型。選擇是(參見使用者手冊):

 proportional    spacing         0
 dual            spacing         90
 mono            spacing         100
 charcell        spacing         110

或者讓它不受約束。如果您碰巧選擇了比例字型,那看起來不太好,但消除 xterm 原始碼中的限制是最明顯的解決方法。fontconfig 無法讓您覆蓋模式中已有的設置。

這不是 xterm 中的錯誤,而是一種解決方法。2000 年11 月,Keith Packard(他也是 Xft 和 fontconfig 的原作者)將使用該spacing=mono屬性的原始更改添加到 xterm 。

您可以通過執行以下操作輕鬆展示 fontconfig 中的錯誤:

fc-match 'Go Mono:spacing=monospace'

這給了我

Go-Mono-Italic.ttf: "Go Mono" "Italic"

引用自:https://unix.stackexchange.com/questions/324941