Когда я запускаю fc-mach Sans
, он возвращает , DejaVuSans.ttf: "DejaVu Sans" "Book"
но если он запущен как fc-match "Sans "
или , 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, поскольку здесь все работает правильно, и у меня установлены и 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"
Страница man 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.