Ajustando Fontconfig

Visão Geral do Fontconfig

Se você lê texto somente em inglês e está satisfeito(a) com as fontes livres comuns listadas na próxima página, [então] possivelmente você nunca precise se preocupar com os detalhes do como o "fontconfig" funciona. Mas existem muitas coisas que podem ser alteradas se não atenderem às tuas necessidades.

Embora esta página seja longa, ela mal arranha a superfície e você estará apto(a) a encontrar muitas visões alternativas na "web" (mas, por favor, lembre-se de que algumas coisas mudaram ao longo dos anos; por exemplo, o "autohinter" não mais é o padrão). O objetivo aqui é o de te fornecer informações suficientes para entender as mudanças que você está fazendo.

O Protocolo de Fonte Xft

O protocolo de fonte Xft fornece renderização de fonte suavizada por intermédio do freetype, e as fontes são controladas a partir do lado cliente usando o fontconfig (exceto para o rxvt-unicode-9.31, que consegue usar fontes listadas em ~/.Xresources e o AbiWord-3.0.5 que usa somente a fonte especificada). O caminho de pesquisa padrão é /usr/share/fonts e ~/.local/share/fonts, embora, no momento, o antigo e obsoleto local ~/.fonts ainda funcione. O Fontconfig pesquisa diretórios no caminho dele recursivamente e mantém um cache das características da fonte em cada diretório. Se o cache parecer desatualizado, ele será ignorado e as informações serão obtidas a partir das próprias fontes (isso pode levar alguns segundos se você tiver muitas fontes instaladas).

Se você tiver instalado o Xorg em qualquer prefixo diferente de /usr, nenhuma fonte do X foi instalada em um local conhecido para o Fontconfig. Links simbólicos foram criados a partir dos diretórios de fontes do X OTF e TTF para /usr/share/fonts/X11-{OTF,TTF}. Isso permite que o Fontconfig use as fontes OpenType e TrueType fornecidas pelo X, embora muitas pessoas preferirão usar fontes mais modernas.

O "Fontconfig" usa nomes para definir fontes. Os aplicativos geralmente usam nomes genéricos de fontes, como "Monospace", "Sans" e "Serif". O "Fontconfig" resolve esses nomes para uma fonte que tenha todos os caracteres que cubram a ortografia do idioma indicado pelas configurações de localidade.

Comandos Úteis

Os seguintes comandos possivelmente sejam úteis ao se trabalhar com o "fontconfig":

fc-list | less : mostra uma lista de todas as fontes disponíveis (/caminho/para/nome_do_arquivo: Nome da Fonte:estilo). Se você instalou uma fonte há mais de tinta (30) segundos, mas ela não aparece, então ela ou um dos diretórios dela não está legível pelo(a) teu(ua) usuário(a).

fc-match 'Nome da Fonte' : informa qual fonte será usada se a fonte nomeada for solicitada. Normalmente você usaria isso para ver o que acontece se uma fonte que você não tenha instalado for solicitada, mas você também pode usá-lo se o sistema estiver fornecendo uma fonte diferente da que você esperava (talvez porque o fontconfig não pense que a fonte suporte o teu idioma).

fc-match -a 'Tipo' | less : fornece uma lista de todas as fontes que podem ser usadas para esse tipo (Monospace, Sans, Serif). Observe que, no extremo, o fontconfig pegará um glifo a partir de qualquer fonte disponível, mesmo que ela não seja do tipo especificado, e, a menos que saiba a respeito do tipo da fonte, ele assumirá que é Sans.

Se você deseja saber qual fonte será usada para uma sequência de caracteres de texto (ou seja, um ou mais glifos, precedidos por um espaço), {então} cole o seguinte comando e substitua o "xyz" pelo texto de teu interesse:

FC_DEBUG=4 pango-view --font=monospace -t xyz | grep family : isso exige o "Pango-1.50.14" e o "ImageMagick-7.1.1-15" - ele invocará "display" para mostrar o texto em uma pequena janela, e, depois de fechá-la, a última linha da saída gerada mostrará qual fonte foi escolhida. Isso é particularmente útil para idiomas "CJK", e você também pode passar um idioma, por exemplo, "PANGO_LANGUAGE=en;ja" (inglês, então assuma o japonês) ou apenas "zh-cn" (ou outras variantes - "zh" por si só não é válido).

Os vários arquivos

Os arquivos principais estão em "/etc/fonts/conf.d/", que foi destinado a ser um diretório povoado por links simbólicos para alguns dos arquivos em "/usr/share/fontconfig/conf.avail/". Mas, muitas pessoas, e alguns pacotes, criam os arquivos diretamente. Cada nome de arquivo precisa estar na forma de dois dígitos, um travessão, "algumnome.conf" e eles são lidos em sequência.

Por convenção, os números são atribuídos conforme segue:

  • 00-09 diretórios extras de fontes

  • 10-19 padrões de renderização do sistema (tais como suavização)

  • 20-29 opções de renderização de fontes

  • 30-39 substituição de família

  • 40-49 mapeiam família para tipo genérico

  • 50-59 carregar arquivos alternativos de configuração

  • 60-69 apelidos genéricos, mapeia genérico para família

  • 70-79 ajustar quais fontes estão disponíveis

  • 80-89 correspondência de varredura de alvo (modificar padrões escaneados)

  • 90-99 síntese de fontes

Você também pode ter um fonts.conf pessoal em $XDG_CONFIG_HOME (que é ~/.config/fontconfig/).

As regras para escolher uma fonte

Se a fonte solicitada estiver instalada e desde que contenha os pontos de código exigidos para o idioma atual (no fonte, veja-se os arquivos ".orth" no diretório "fc-lang/"), [então] ela será usada.

Entretanto, se o documento ou página solicitou uma fonte que não está instalada (ou, ocasionalmente, não contém todos os pontos de código exigidos), as seguintes regras entram em jogo: Primeiro, 30-metric-aliases.conf é usado para mapear apelidos para algumas fontes com as mesmas métricas (mesmo tamanho, etc.). Depois disso, uma fonte desconhecida será procurada em 45-latin.conf - se for encontrada, será mapeada como Serif ou Monospace ou Sans; caso contrário, será considerada Sans. Então 50-latin.conf fornece listas ordenadas de substitutas - as Fontes Dejavu serão usadas se você as instalou. O cirílico e o grego parecem ser tratados da mesma forma. Existem arquivos semelhantes com um prefixo 65- para o Persa e outros sistemas de escrita não latinos. Todos esses arquivos preferem fontes comerciais, se elas estiverem presentes, embora as fontes livres modernas frequentemente sejam, pelo menos, iguais.

Desde fontconfig-2.12.5, também existe correspondência genérica de família para algumas fontes de emoji e matemáticas; por favor, veja-se {45,60}-generic.conf.

Nos raros casos em que uma fonte não contém todos os pontos de código esperados, veja-se "Trial the First:" em "Eu olhei fixamente para o "fontconfig"" para os detalhes longos.

Dicas e Suavização

É possível mudar como, ou se, as fontes são sugeridas. O arquivo de exemplo a seguir contém as configurações padrão, mas com comentários. As configurações dependem muito das preferências do(a) usuário(a) e da escolha das fontes, de forma que uma mudança que melhora algumas páginas possivelmente piore outras. O local preferido para esse arquivo é: "~/.config/fontconfig/fonts.conf"

Para testar configurações diferentes, você possivelmente precise sair do Xorg e então executar startx novamente, de forma que todos os aplicativos usem as novas configurações. E, se você usa GNOME, KDE, ou LXQt, as áreas de trabalhos deles podem substituir essas mudanças. Para explorar as possibilidades, crie um arquivo para o teu(ua) usuário(a):

mkdir -pv ~/.config/fontconfig &&
cat > ~/.config/fontconfig/fonts.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

  <match target="font" >
    <!-- autohint era o antigo prompt automático quando as dicas eram protegidas
    por patente, de forma que desligue-o para garantir que qualquer informação de
    dicas na própria fonte seja usada; esse é o padrão -->
    <edit mode="assign" name="autohint">  <bool>false</bool></edit>

    <!-- a dica está habilitada por padrão -->
    <edit mode="assign" name="hinting">   <bool>true</bool></edit>

    <!-- para o "lcdfilter", veja-se https://www.spasche.net/files/lcdfiltering/ -->
    <edit mode="assign" name="lcdfilter"> <const>lcddefault</const></edit>

    <!-- opções para estilo de dica:
    hintfull: é presumido fornecer uma fonte nítida que se alinhe bem à
    grade de células de caracteres, mas ao custo do formato adequado dela.

    hintmedium: mal documentado, talvez um sinônimo para "hintfull".
    "hintslight" é o padrão: - presumido ser mais confuso, mas mantém a forma.

    hintnone: parece desligar a dica.
    As variações são marginais e os resultados variam com diferentes fontes -->
    <edit mode="assign" name="hintstyle"> <const>hintslight</const></edit>

    <!-- a suavização está ligada por padrão e realmente ajuda para caracteres fracos
    e também para fontes "xft": fontes usadas em "rxvt-unicode" -->
    <edit mode="assign" name="antialias"> <bool>true</bool></edit>

    <!-- subpixels são usualmente "rgb"; veja-se
    http://www.lagom.nl/lcd-test/subpixel.php -->
    <edit mode="assign" name="rgba">      <const>rgb</const></edit>

    <!-- agradecimentos ao "wiki" da "Arch" pelos links "lcd" e subpixel -->
  </match>

</fontconfig>
EOF

Você precisará agora editar o arquivo no teu editor preferido.

Para mais exemplos, veja-se o tópico do "blfs-support" que começou em "2016-09/00128", particularmente o "2016-09/00137", e a solução preferida do postador original em "2016-09/00147". Existem outros exemplos em ""Fontconfig" no "wiki" do "Arch"" e ""Fontconfig" no "wiki" do "Gentoo"".

Desabilitando as Fontes "Bitmap"

Nas versões anteriores do BLFS, as feias e antigas fontes de bitmap do Xorg foram instaladas. Agora, muitas pessoas não precisarão instalar nenhuma delas. Mas, se por algum motivo, você tiver instalado uma ou mais fontes de bitmap, você consegue evitar que elas sejam usadas pelo fontconfig criando o seguinte arquivo como o(a) usuário(a) root:

cat > /etc/fonts/conf.d/70-no-bitmaps.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- Rejeita fontes de "bitmap" -->
 <selectfont>
  <rejectfont>
   <pattern>
     <patelt name="scalable"><bool>false</bool></patelt>
   </pattern>
  </rejectfont>
 </selectfont>
</fontconfig>
EOF

Adicionando diretórios extras de fontes

Normalmente, as fontes do sistema e as fontes do(a) usuário(a) são instaladas em diretórios abaixo dos locais especificados em "O Protocolo de Fonte Xft" e não existe razão óbvia para colocá-las em outro lugar. No entanto, uma instalação completa do BLFS do "texlive-20230313" coloca muitas fontes em "/opt/texlive/2023/texmf-dist/fonts/" nos subdiretórios "opentype/" e "truetype/". Embora extrair todos esses arquivos possivelmente pareça útil (permite usá-los em aplicativos que não sejam do "TeX"), existem vários problemas com essa abordagem:

  1. Existem centenas de arquivos, o que torna difícil selecionar fontes.

  2. Alguns dos arquivos fazem coisas estranhas, como exibir sinalizadores de semáforo em vez de letras "ASCII" ou mapear pontos de código cirílicos para formas de caracteres apropriadas ao antigo eslavo eclesiástico em vez das formas atuais esperadas: ótimo se for isso que você precisa, mas doloroso para uso normal.

  3. Várias fontes tem vários tamanhos e nomes curtos impenetráveis, o que torna ainda mais difícil selecionar a fonte correta.

  4. Quando uma fonte é adicionada ao "CTAN", ela é acompanhada por pacotes do "TeX" para usá-la nos motores antigos ("xelatex" normalmente não precisa disso), e então a versão frequentemente é congelada enquanto a fonte é mantida separadamente. Algumas dessas fontes, como as "Fontes Dejavu", provavelmente já estão instaladas em teu sistema BLFS em uma versão mais recente, e se você tiver múltiplas versões de uma fonte, [então] não fica claro qual delas será usada pelo "fontconfig".

No entanto, às vezes é útil olhar para essas fontes em aplicativos não "TeX", se somente para ver se você deseja instalar uma versão atual. Se você tiver instalado todo o "texlive", [então] o exemplo a seguir disponibilizará uma das fontes "Arkandis Open Type" para outros aplicativos e todas as três fontes "TrueType" "ParaType". Ajuste ou repita as linhas conforme desejado para, ou disponibilizar todas as fontes "opentype/" ou "truetype", ou para selecionar diferentes diretórios de fontes. Como o(a) usuário(a) "root":

cat > /etc/fonts/conf.d/09-texlive.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <dir>/opt/texlive/2023/texmf-dist/fonts/opentype/arkandis/berenisadf</dir>
  <dir>/opt/texlive/2023/texmf-dist/fonts/truetype/paratype</dir>
</fontconfig>
EOF

Se você fizer isso, [então] lembre-se de mudar todas as instâncias do ano nesse arquivo ao atualizar o "texlive" para um lançamento posterior.

Preferindo certas fontes

Existem muitos motivos pelos quais as pessoas possivelmente desejem que páginas que especifiquem uma fonte específica usem uma fonte diferente ou prefiram fontes específicas em "Monospace", "Sans" ou "Serif". Como você esperará, existem várias maneiras de conseguir isso.

Documentos de usuário(a) do "Fontconfig"

O "Fontconfig" instala a documentação de usuário(a) que inclui um exemplo de "Arquivo de usuário(a) de configuração" que, entre outras coisas, prefere a "WenQuanYi ZenHei" (uma fonte "Sans") se uma fonte "Serif" for solicitada para chinês (essa parte pode ser anacrônica, a menos que você tenha fontes chinesas não-livres, porque em "65-nonlatin.conf" essa fonte já está entre as fontes preferidas quando "Serif" é especificada para chinês) e prefere a moderna fonte "VL Gothic" se uma fonte "Sans" for especificada em uma página em japonês (caso contrário, algumas outras fontes seriam preferidas se tivessem sido instaladas).

Se você tiver instalado a versão atual, a documentação de usuário(a) estará disponível em versões HTML, PDF e texto em /usr/share/doc/fontconfig-2.14.2/: mude a versão se você instalou uma diferente.

Prefira uma fonte específica

Como um exemplo, se por algum motivo você desejou usar a fonte "Nimbus Roman No9 L" sempre que a "Times New Roman" for referenciada (ela é metricamente semelhante e preferida para "Times Roman", mas a fonte "Serif" originária das "Fontes Liberation" será preferida para a fonte "Times New Roman" se instalada), como um(a) usuário(a) individual, você poderia instalar a fonte e então criar o seguinte arquivo:

mkdir -pv ~/.config/fontconfig/conf.d &&
cat >  ~/.config/fontconfig/conf.d/35-prefer-nimbus-for-timesnew.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<!-- prefira a "Nimbus Roman No9 L" para "Times New Roman", bem como para "Times";
sem isso, "Tinos" e "Liberation Serif" tem precedência para "Times New Roman" antes
que o "fontconfig" volte para o que corresponde a "Times" -->
    <alias binding="same">
        <family>Times New Roman</family>
        <accept>
            <family>Nimbus Roman No9 L</family>
        </accept>
    </alias>
</fontconfig>
EOF

Isso é algo que você normalmente faria nas configurações de um(a) usuário(a) individual, mas o arquivo nesse caso recebeu o prefixo "35-", de forma que pudesse, se desejado, ser usado abrangente a todo o sistema em "/etc/fonts/conf.d/".

Prefira fontes escolhidas "CJK"

O exemplo a seguir de uma configuração local (ou seja, uma que se aplica para todos(as) os(as) usuários(as) da máquina) faz várias coisas:

  1. Se uma fonte "Serif" for especificada, [então] ela preferirá as variantes "UMing", de forma que nos idiomas "zh-cn", "zh-hk" e "zh-tw" as coisas deveriam parecer boas (também "zh-sg" que na verdade usa as mesmas configurações que "zh-cn") sem afetar o japonês.

  2. Ela prefere as "Fontes IPAex" do japonês se elas tiverem sido instaladas (embora a "VL Gothic" terá precedência para a "Sans" (japonês) se ela também tiver sido instalada.

  3. Como a "WenQuanYi ZenHei" abrange glifos "Hangul" coreanos e também é preferida para "Serif" em "65-nonlatin.conf", se instalada, ela será usada por padrão para "Serif" coreano. Para obter uma fonte "Serif" adequada, a fonte "UnBatang" é especificada aqui - mude essa linha se você instalou uma fonte "Serif" diferente da escolha das "Fontes coreanas".

  4. As fontes "Monospace" são forçadas para as fontes preferidas "Sans". Se o texto estiver em coreano, então a "WenQuanYi ZenHei" será usada.

Em uma localidade não "CJK", o resultado é que fontes adequadas serão usadas para todas as variantes de chinês, japonês e coreano "Hangul". Todos os outros idiomas já deveriam funcionar se uma fonte estiver presente. Como o(a) usuário(a) "root":

cat > /etc/fonts/local.conf << "EOF"
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
    <alias>
        <family>serif</family>
        <prefer>
            <family>AR PL UMing</family>
            <family>IPAexMincho</family>
            <!-- "WenQuanYi" é preferida como "Serif" em "65-nonlatin.conf";
            substitua isso, de forma que uma fonte real coreana possa ser usada para "Serif" -->
            <family>UnBatang</family>
        </prefer>
    </alias>
    <alias>
         <family>sans-serif</family>
         <prefer>
             <family>WenQuanYi Zen Hei</family>
             <family>VL Gothic</family>
             <family>IPAexGothic</family>
         </prefer>
    </alias>
    <alias>
         <family>monospace</family>
         <prefer>
             <family>VL Gothic</family>
             <family>IPAexGothic</family>
             <family>WenQuanYi Zen Hei</family>
         </prefer>
    </alias>
</fontconfig>
EOF

Editando Arquivos de Configuração no Estilo Antigo

Algumas fontes, especialmente fontes chinesas, vem com arquivos de configuração que podem ser instalados em "/etc/fonts/conf.d". No entanto, se você fizer isso e então usar um terminal para executar qualquer comando que use o "fontconfig", [então] você possivelmente veja mensagens de erro como:

Aviso do Fontconfig: "/etc/fonts/conf.d/69-odofonts.conf", linha 14: Ter-se várias <famílias> em <apelido> não é suportado e possivelmente não funcione conforme o esperado.

Na prática, essas regras antigas não funcionam. Para usuários não "CJK", o "fontconfig" geralmente fará um bom trabalho sem essas regras. A origem delas remonta a quando os usuários "CJK" precisavam que os "bitmaps" feitos à mão fossem legíveis em tamanhos pequenos, e eles pareciam feios perto dos glifos latinos suavizados - eles preferiam usar a mesma fonte "CJK" para os glifos latinos. Existe um efeito colateral em fazer isso: a fonte ("Serif") também é frequentemente usada para "Sans", e em tal situação o texto (em inglês) nos menus do "Gtk" usará essa fonte - comparadas às fontes do sistema, além de ser serifada, é fraca e bastante pequena. Isso pode tornar a leitura desconfortável.

No entanto, esses antigos arquivos de configuração podem ser corrigidos se você desejar usá-los. O seguinte exemplo é a primeira parte do 64-arphic-uming.conf, originário de UMing - existem muitos outros itens semelhantes que também precisam de mudanças:


   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-cn</string>
           <string>zh-sg</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>

O processo para corrigir isso é simples, mas tedioso - para cada item que produzir uma mensagem de erro, usando o teu editor (como o(a) usuário(a) root) edite o arquivo instalado para repetir o bloco inteiro, tantas vezes quantas forem as múltiplas variáveis, então reduza cada exemplo para ter somente uma delas. Você possivelmente deseje trabalhar em um erro de cada vez, salvar o arquivo depois de cada correção e, a partir de um terminal separado, executar um comando como fc-list 2>&1 | less para ver se a correção funcionou. Para o bloco acima, a versão corrigida será:


   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-cn</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>
   <match target="pattern">
       <test qual="any" name="lang" compare="contains">
           <string>zh-sg</string>
       </test>
       <test qual="any" name="family">
           <string>serif</string>
       </test>
       <edit name="family" mode="prepend" binding="strong">
           <string>AR PL UMing CN</string>
       </edit>
    </match>

Veja-se Também

Eu olhei fixamente para o "fontconfig" ...

As entradas do blog de "Eevee" são particularmente úteis se o "fontconfig" não pensar que a tua fonte escolhida suporta o teu idioma e para preferir algumas fontes japonesas não "MS" quando uma fonte feia "MS" já estiver instalada.

"Fontconfig" no "wiki" do "Arch"

"Arch" tem muitas informações no "wiki" dela em "font_configuration".

"Fontconfig" no "wiki" do "Gentoo"

"Gentoo" tem algumas informações no "wiki" dela em "Fontconfig", embora muitos detalhes (o que habilitar e "Infinality") sejam específicos para "Gentoo".