Как узнать, как совпадает fc-match?

18

Когда я бегу fc-mach Sans, он возвращается, DejaVuSans.ttf: "DejaVu Sans" "Book"но если он работает как fc-match "Sans "или fc-match "Sans 9"он возвращается unifont.ttf: "unifont" "Medium". Я предпочитаю всегда использовать DejaVu Sans, но не могу понять, почему fontconfig выбирает unifont. Кажется, что ни глобальный, ни локальный конфиг grep -ri unifont /etc/fonts/ ~/.fonts.confне упоминают unifont ( ничего не возвращает). Игра с LC_DEBUG мне тоже не помогла. Есть ли способ получить информацию, почему fontconfig ведет себя так?

откровенный
источник

Ответы:

11

На первый взгляд это выглядит как настоящая ошибка 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)и далее примерно подтвердите, что он использует значение по умолчанию / сконфигурировано и определенно подтверждает, что он сначала изменяет поисковый термин, который вы ему передали. Для чего-то еще более глубокого, вам придется проверить код (начните с вышеупомянутой функции).

lynxlynxlynx
источник
5

FontConfig сопоставляет атрибуты на основе «расстояния» от критериев соответствия. Если вы хотите увидеть, что происходит за кулисами, то установите переменную среды FC_DEBUG = 3 и повторите поиск. Это покажет отладочную информацию, которая может быть полезна. Вам не нужно читать код FontConfig.

Крис Шерлок
источник