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.

Observações de Usuário(a): https://wiki.linuxfromscratch.org/blfs/wiki/Fontconfig

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, [então] ele será ignorado e as informações serão obtidas a partir das próprias fontes (isso pode levar alguns segundos se você instalou muitas fontes).

Se você tiver instalado o "Xorg" em qualquer prefixo diferente de "/usr", {então} 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' : informará 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 concorde que a fonte suporte o teu idioma).

fc-match -a 'Tipo' | less : fornecerá 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.12" e o "ImageMagick-7.1.0-61" - 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 (suavização, etc.)

  • 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.

Mas, 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), [então] 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, [então] será mapeada como "Serif" ou "Monospace" ou "Sans"; caso contrário, [então] 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, os iguais delas.

Desde "fontconfig-2.12.5", também existe correspondência genérica de família para algumas fontes "emoji" e matemáticas; 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 novamente o "startx" de forma que todos os aplicativos usem as novas configurações. E, se você usa "Gnome" ou "KDE", [então] 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 "bitmap", [então] 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-20220321" coloca muitas fontes em "/opt/texlive/2022/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 dificulta a seleção da fonte.

  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/2022/texmf-dist/fonts/opentype/arkandis/berenisadf</dir>
  <dir>/opt/texlive/2022/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, [então] 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 arquivos antigos de configuração podem ser corrigidos se você desejar usá-los. O exemplo a seguir é 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 todo o bloco 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".