如何找出 fc-match 的匹配情況?

如何找出 fc-match 的匹配情況?

當我運行時fc-mach Sans,它會返回DejaVuSans.ttf: "DejaVu Sans" "Book",但如果它像fc-match "Sans "or一樣運行,fc-match "Sans 9"它就會返回unifont.ttf: "unifont" "Medium"。我更喜歡始終使用 DejaVu Sans,但我不明白為什麼 fontconfig 選擇 unifont。全域配置和本機配置似乎都沒有提到 unifont (grep -ri unifont /etc/fonts/ ~/.fonts.conf不回傳任何內容)。使用 LC_DEBUG 也沒有幫助我。有沒有辦法取得 fontconfig 為何如此行為的資訊?

答案1

快速瀏覽一下,對我來說,它看起來像是一個真正的 fontconfig bug,因為它在這裡工作正常,而且我確實安裝了 DejaVu 和 Unifont:

$ fc-match Sans
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans"
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans "
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match "Sans 9"
DejaVuSans.ttf: "DejaVu Sans" "Book"

但是,仔細觀察,我們可以看到更多細節。某處仍然可能存在 fontconfig 錯誤,但fc-match顯然當找不到任何內容時會傳回預設值。我的系統上預設是 DejaVu:

$ fc-match uni
DejaVuSans.ttf: "DejaVu Sans" "Book"
$ fc-match unifont
Unifont.ttf: "unifont" "Medium"
$ fc-match 4e5zedrkbxp
DejaVuSans.ttf: "DejaVu Sans" "Book"

手冊頁fc-match(1)確認該命令不執行精確匹配,而是返回它認為的最佳匹配。您可以使用以下-a命令或更簡潔地查看它們-s

$ fc-match -s uni # now it also finds unifont
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
n019003l.pfb: "Nimbus Sans L" "Regular"
helvR12-ISO8859-1.pcf.gz: "Helvetica" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
KanjiStrokeOrders.ttf: "KanjiStrokeOrders" "Medium"
Eadui.ttf: "Eadui" "Medium"
Unifont.ttf: "unifont" "Medium"
FreeSerif.ttf: "FreeSerif" "нормален"
cu12.pcf.gz: "ClearlyU" "Regular"
cu-pua12.pcf.gz: "ClearlyU PUA" "Regular"
10x20.pcf.gz: "Fixed" "Regular"

您可以簡單地說“管你的”,然後在其上添加另一個搜索,以按照您期望的方式進行匹配:

$ fc-match -s uni | grep -i uni
Unifont.ttf: "unifont" "Medium"

但是,您的問題是它到底如何進行匹配。FcFontMatch(3)並進一步粗略地確認它使用預設/配置的值,並明確確認它首先修改您傳遞給它的搜尋字詞。對於更深層的東西,你必須檢查程式碼(從上面提到的函數開始)。

答案2

FontConfig 根據與符合標準的「距離」來匹配屬性。如果你想看看幕後發生了什麼,那麼設定環境變數FC_DEBUG=3 並重新運行搜尋。這將顯示可能有用的調試資訊。您不需要閱讀 FontConfig 程式碼。

相關內容