Innstille Fontconfig

Oversikt over Fontconfig

Hvis du kun leser tekst på engelsk, og er fornøyd med vanlige libre fonter som er oppført på neste side, trenger du kanskje aldri å bekymre deg for detaljer om hvordan fontconfig virker. Men det er mange ting som kan endres hvis de ikke passer dine behov.

Selv om denne siden er lang, skraper den knapt overflaten, og du vil være i stand til å finne mange alternative synspunkter på nettet (men husk at noen ting har endret seg gjennom årene, for eksempel autohinter er ikke lenger standard). Målet her er å gi deg nok informasjon for å forstå endringene du gjør.

Xft Font Protokoll

Xft fontprotokollen gir kantutjevnet skriftgjengivelse gjennom freetype, og fonter styres fra klientsiden ved bruk av fontconfig (utenom rxvt-unicode-9.31 som kan bruke fonter oppført i ~/.Xresources, og AbiWord-3.0.5 som bruker kun den angitte fonten). Standard søkesti er /usr/share/fonts og ~/.local/share/fonts, selv om for øyeblikket den gamle og utdaterte plasseringen ~/.fonts virker fortsatt. Fontconfig søker mapper i stien sin rekursivt og opprettholder en hurtigbuffer med fontkarakteristikkene i hver mappe. Hvis hurtiglageret ser ut til å være utdatert, ignoreres den, og informasjon hentes fra selve fonten (det kan ta noen få sekunder hvis du har mange fonter installert).

Hvis du har installert Xorg i et hvilket som helst prefiks annet enn /usr, ingen X fonter ble installert i et sted kjent for Fontconfig. Symbolkoblinger var opprettet fra OTF og TTF X font mapper til /usr/share/fonts/X11-{OTF,TTF}. Dette tillater Fontconfig for å bruke OpenType og TrueType fonter levert av X, selv om mange mennesker vil foretrekke å bruke mer moderne fonter.

Fontconfig bruker navn for å definere fonter. Applikasjoner bruker vanligvis generiske skriftnavn som "Monospace", "Sans" og "Serif". Fontconfig løser disse navnene til en font som har alle tegn som dekker ortografien til språket som er angitt av lokalinnstillingene.

Nyttige kommandoer

Følgende kommandoer kan være nyttige når du arbeider med fontconfig:

fc-list | less : viser en liste over alle tilgjengelige fonter (/sti/til/filnavn: Fontnavn:stil). Hvis du installerte en font mer enn 30 sekunder siden, men det vises ikke, da er det eller en av mappene ikke lesbar av brukeren din.

fc-match 'Font Name' : forteller deg hvilken font som brukes hvis den navngitte fonten er forespurt. Vanligvis vil du bruke dette til å se hva som skjer hvis en font du ikke har installert blir forespurt, men du kan også bruke den hvis systemet gir deg en annen font enn hva du forventet (kanskje fordi fontconfig tror ikke at fonten støtter språket ditt).

fc-match -a 'Type' | less : gir en liste over alle fonter som kan brukes for den typen (Monospace, Sans, Serif). Noter at i ekstreme tilfeller vil fontconfig ta en glyff fra hvilken som helst tilgjengelig font, selv om den ikke er av den angitte typen, og med mindre den vet om skriftens type, vil den anta at det er Sans.

Hvis du ønsker å vite hvilken font vil brukes til en tekststreng (dvs. en eller flere glyfer, innledet av et mellomrom), lim inn følgende kommando og erstatt xyz av teksten du vil sjekke:

FC_DEBUG=4 pango-view --font=monospace -t xyz | grep family : dette krever Pango-1.50.14 og ImageMagick-7.1.1-15 - det vil display vise teksten i et lite vindu, og etter å ha lukket det den siste linjen av utdata vil vise hvilken font som ble valgt. Dette er spesielt nyttig for CJK språk, og du kan også gi et språk, f.eks. PANGO_LANGUAGE=en;ja (engelsk, anta deretter japansk) eller bare zh-cn (eller andre varianter - 'zh' alene er ikke gyldig).

De ulike filene

Hovedfilene er i /etc/fonts/conf.d/, som var ment å være en mappe fylt med symbolkoblinger til noen av filene i /usr/share/fontconfig/conf.avail/. Men mange mennesker, og noen pakker, lager filene direkte. Hvert filnavn må være i form av to sifre, en bindestrek, somename.conf og de leses inn i rekkefølge.

Etter konvensjon er tallene tildelt som følger:

  • 00-09 ekstra fontmapper

  • 10-19 systemgjengivelsesstandarder (som kantutjevnelse.)

  • 20-29 alternativer for fontgjengivelse

  • 30-39 familiesubstitusjon

  • 40-49 kartlegg familie til generisk type

  • 50-59 last inn alternative konfigurasjonsfiler

  • 60-69 generiske aliaser, kartlegg generisk til familie

  • 70-79 justere hvilke skrifter som er tilgjengelige

  • 80-89 samsvar med målskanning (endre skannede mønstre)

  • 90-99 fontsyntese

Du kan også ha en personlig fonts.conf i $XDG_CONFIG_HOME (which is ~/.config/fontconfig/).

Reglene for å velge en font

Hvis den forespurte fonten er installert, og forutsatt at den inneholder kodepunkter nødvendig for gjeldende språk (i kilden, se .orth-filene i fc-lang/ mappen), vil den bli brukt.

Derimot, hvis dokumentet eller siden ba om en font som ikke er installert (eller noen ganger ikke inneholder alle de nødvendige kodepunktene) følgende regler kommer inn: Først, 30-metric-aliases.conf brukes til å kartlegge aliaser for noen fonter med samme beregninger (samme størrelse osv.). Etter det, en ukjent font vil bli søkt etter i 45-latin.conf - hvis det blir funnet, vil det bli kartlagt som Serif eller Monospace eller Sans, ellers vil antas å være Sans. Deretter 50-latin.conf gir ordnede lister over reservene - Dejavu fonts vil bli brukt hvis du installerte dem. Kyrillisk og gresk ser ut til å bli behandlet på samme måte. Det finnes lignende filer med et 65- prefiks for Persiske og andre ikke-latinske skriftsystemer. Alle disse filene foretrekker kommersielle fonter hvis de er til stede, selv om moderne libre fonter er ofte minst like.

Siden fontconfig-2.12.5, er det også generisk familietilpasning for noen emoji og matematiske fonter, se {45,60}-generic.conf.

I de sjeldne tilfellene hvor en font ikke inneholder alle forventede kodepunkter, se 'Prøv den første:' på I stared into the fontconfig for de lange detaljene.

Antyding og Anti-aliasing

Det er mulig å endre hvordan, eller om, fonter antydes. Følgende eksempelfil inneholder standardinnstillingene, men med kommentarer. Innstillingene er mye ned til brukerens preferanser og til valget av fonttyper, så en endring som forbedrer noen sider kan forverre andre. Den foretrukket plassering for denne filen er: ~/.config/fontconfig/fonts.conf

For å prøve ut forskjellige innstillinger, må du kanskje avslutte Xorg og deretter kjøre startx en gang til slik at alle applikasjoner bruker de nye innstillingene. Hvis du bruker Gnome, KDE eller LXQt, kan skrivebordene deres overstyre disse endringene. For å utforske mulighetene, lag en fil for brukeren din:

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

  <match target="font" >
    <!-- autohint was the old automatic hinter when hinting was patent
    protected, so turn it off to ensure any hinting information in the font
    itself is used, this is the default -->
    <edit mode="assign" name="autohint">  <bool>false</bool></edit>

    <!-- hinting is enabled by default -->
    <edit mode="assign" name="hinting">   <bool>true</bool></edit>

    <!-- for the lcdfilter see https://www.spasche.net/files/lcdfiltering/ -->
    <edit mode="assign" name="lcdfilter"> <const>lcddefault</const></edit>

    <!-- options for hintstyle:
    hintfull: is supposed to give a crisp font that aligns well to the
    character-cell grid but at the cost of its proper shape.

    hintmedium: poorly documented, maybe a synonym for hintfull.
    hintslight is the default: - supposed to be more fuzzy but retains shape.

    hintnone: seems to turn hinting off.
    The variations are marginal and results vary with different fonts -->
    <edit mode="assign" name="hintstyle"> <const>hintslight</const></edit>

    <!-- antialiasing is on by default and really helps for faint characters
    and also for 'xft:' fonts used in rxvt-unicode -->
    <edit mode="assign" name="antialias"> <bool>true</bool></edit>

    <!-- subpixels are usually rgb, see
    http://www.lagom.nl/lcd-test/subpixel.php -->
    <edit mode="assign" name="rgba">      <const>rgb</const></edit>

    <!-- thanks to the Arch wiki for the lcd and subpixel links -->
  </match>

</fontconfig>
EOF

Du må nå redigere filen i ditt foretrukne redigeringsprogram.

For flere eksempler se blfs støttetråden som startet på 2016-09/00128, spesielt 2016-09/00137, og originaloppretteren sin foretrukne løsning på 2016-09/00147. Det er andre eksempler i Fontconfig in the Arch wiki og Fontconfig in the Gentoo wiki.

Deaktivering av Bitmap Fonter

I tidligere versjoner av BLFS var de stygge gamle Xorg bitmap fontene installert. Nå er det mange som ikke trenger å installere noen av dem. Men hvis du av en eller annen grunn har installert en eller flere punktgrafikkfonter, kan du hindre dem i å bli brukt av fontconfig ved å opprette følgende fil som root bruker :

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

Legge til ekstra fontmapper

Normalt er systemfonter og brukerfonter installert i mapper under stedene spesifisert i Xft Font Protokoll og det er ingen åpenbar grunn til å plassere dem andre steder. Imidlertid en full BLFS installasjon av texlive-20230313 putter mange fonter i /opt/texlive/2023/texmf-dist/fonts/ i opentype/ og truetype/ undermapper. Selv om å trekke inn alle disse filene kan virke nyttige (det lar deg bruke dem i ikke TeX programmer), det er flere problemer med en slik tilnærming:

  1. Det er hundrevis av filer, noe som gjør det vanskelig å velge fonter.

  2. Noen av filene gjør rare ting, for eksempel å vise semaforflagg i stedet for ASCII bokstaver, eller kartlegge kyrilliske kodepunkter til tegnformer passende for gammelkirkeslavisk i stedet for det forventede nåværende form: greit hvis det er det du trenger, men smertefullt for normalt bruk.

  3. Flere fonter har flere størrelser og ugjennomtrengelige korte navn, som begge gjør det enda vanskeligere å velge riktig font.

  4. Når en font legges til CTAN, er den ledsaget av TeX pakker for å bruke de i gamle motorene (xelatex trenger normalt ikke dette), og da er versjonen ofte frosset mens fonten vedlikeholdes separat. Noen av disse fontene som f.eks Dejavu fonts er sannsynligvis allerede installert på BLFS systemet i en nyere versjon, og hvis du har flere versjoner av en font er det uklart hvilken som skal brukes av fontconfig.

Noen ganger er det imidlertid nyttig å se på disse skriftene i ikke-TeX applikasjoner, om bare for å se om du ønsker å installere en nåværende versjon. Hvis du har installert alle texlive, følgende eksempel vil lage en av Arkandis Open Type fontene tilgjengelig for andre applikasjoner, og alle tre av ParaType TrueType fonter. Juster eller gjenta linjene etter ønske, for enten å lage alle opentype/ eller truetype fonter tilgjengelig, eller for å velge forskjellige fontmapper. Som root bruker:

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

Hvis du gjør dette, husk å endre alle forekomster av året i den filen når du oppgraderer texlive til en senere utgivelse.

Foretrekke visse fonter

Det er mange grunner til at folk ønsker å ha sider som spesifiserer en bestemt font ved bruk av en annen font, eller foretrekker spesifikke fonter i Monospace eller Sans eller Serif. Som du vil forvente, er det en rekke ulike måter å oppnå dette på.

Fontconfig brukerdokumenter

Fontconfig installerer brukerdokumentasjon som inkluderer et eksempel 'Brukerkonfigurasjonsfil' som bl.a foretrekker WenQuanYi ZenHei (en Sans font) hvis en Serif font er forespurt for kinesisk (denne delen kan være anakronistisk med mindre du har ikke-gratis kinesiske fonter, fordi i 65-nonlatin.conf denne fonten er allerede blant foretrukne fonter når Serif er spesifisert for kinesisk) og å foretrekke moderne VL Gothic font hvis en Sans font er spesifisert på en Japansk side (ellers ville et par andre fonter være foretrukket hvis de er installert).

Hvis du har installert gjeldende versjon, er brukerdokumentasjonen tilgjengelig i HTML, PDF og tekstversjoner på /usr/share/doc/fontconfig-2.14.2/ : endre versjonen hvis du installerte en annen.

Foretrekke en bestemt font

Som et eksempel, hvis du av en eller annen grunn ønsker å bruke Nimbus Roman No9 L fonten når det refereres til Times New Roman (de er metrisk lik, og foretrukket for Times Roman, men Serif fonten fra Liberation fonts vil bli foretrukket for Times New Roman font hvis installert), som en individuell bruker kan du installere fonten og deretter lage følgende fil:

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>
<!-- prefer Nimbus Roman No9 L for Times New Roman as well as for Times,
 without this Tinos and Liberation Serif take precedence for Times New Roman
 before fontconfig falls back to whatever matches Times -->
    <alias binding="same">
        <family>Times New Roman</family>
        <accept>
            <family>Nimbus Roman No9 L</family>
        </accept>
    </alias>
</fontconfig>
EOF

Dette er noe du vanligvis ville gjort i en individuell brukerinnstilling, men filen i dette tilfellet har fått prefikset '35-' slik at den kan om ønskelig brukes over hele systemet i /etc/fonts/conf.d/.

Foretrekk valgte CJK fonter

Følgende eksempel på en lokal konfigurasjon (dvs. en som gjelder for alle brukere av maskinen) gjør flere ting:

  1. Hvis en Serif font er spesifisert, vil den foretrekke UMing varianter, slik at i zh-cn, zh-hk og zh-tw språk ting skal se bra ut (også zh-sg som faktisk bruker samme innstillinger som zh-cn) uten å påvirke Japansk.

  2. Den foretrekker Japaneske IPAex fonts hvis de har blitt installert (skjønt VL Gothic vil ha forrang for (Japansk) Sans hvis den også er installert.

  3. Fordi WenQuanYi ZenHei dekker Koreansk Hangul glyffer og er også foretrukket for Serif i 65-nonlatin.conf, hvis den er installert, vil den bli brukt som standard for Koreansk serif. For å få en skikkelig Serif font, UnBatang fonten er spesifisert her - endre den linjen hvis du har installert en annen Serif font enn de valgte Korean fonts.

  4. Monospace fontene tvinges til de foretrukne Sans skriftene. Hvis teksten er på Koreansk da vil WenQuanYi ZenHei bli brukt.

I en ikke-CJK lokalitet er resultatet at passende fonter vil bli brukt for alle varianter av kinesisk, japansk og Hangul-koreansk. Alle andre språk bør allerede fungere hvis en font er til stede. Som root bruker:

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 is preferred as Serif in 65-nonlatin.conf,
            override that so a real Korean font can be used for 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

Redigering av gammeldagse conf filer

Noen skrifter, spesielt kinesiske skrifter, leveres med conf filer som kan være installert i /etc/fonts/conf.d. Men hvis du gjør det og deretter bruker en terminal til å kjøre en hvilken som helst kommando som bruker fontconfig du kan se feilmeldinger som f.eks som :

Fontconfig warning: "/etc/fonts/conf.d/69-odofonts.conf", line 14: Having multiple <family> in <alias> isn't supported and may not work as expected.

I praksis fungerer ikke disse gamle reglene. For ikke-CJK brukere, fontconfig vil vanligvis gjøre en god jobb uten disse reglene. Deres opprinnelse går tilbake til når CJK brukere trengte håndlagde punktgrafikk for å være lesbare i små størrelser, og de så stygge ut ved siden av kantutjevnede latinske glyfer - de foretrakk å bruke samme CJK skrift for de latinske tegnene. Det er en bivirkning ved å gjøre dette : fonten (Serif) brukes ofte også for Sans, og i en slik situasjon den (engelsk) teksten i Gtk menyene vil bruke denne fonten - sammenlignet med systemfonter, i tillegg til at den er serif både svak og ganske liten. Det kan gjøre det ubehagelig å lese.

Likevel kan disse gamle conf filene fikses hvis du ønsker å bruke dem. Følgende eksempel er den første delen av 64-arphic-uming.conf fra UMing - det er mange flere lignende elementer som også må endres :


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

Prosessen for å rette opp dette er grei, men kjedelig - for alle elementer som produserer en feilmelding ved å bruke redigeringsprogrammet (som root bruker) rediger den installerte filen for å gjenta hele blokken så mange ganger som det er flere variabler, reduser deretter hvert eksempel til å ha bare ett av dem. Du kan ønske å jobbe med en feil om gangen, lagre filen etter hver rettelse, og fra en eget terminal kjør en kommando som f.eks fc-list 2>&1 | less for å se at reparasjonen fungerte. For blokken ovenfor, den reparerte versjonen vil være :


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

Se Også

I stared into the fontconfig ...

Blogginnleggene av Eevee er spesielt nyttige hvis fontconfig ikke tror den valgte fonten støtter språket ditt, og for å foretrekke noen ikke-MS japanske fonter når en stygg MS-font allerede er installert.

Fontconfig in the Arch wiki

Arch har mye informasjon i sin wiki på font_configuration.

Fontconfig in the Gentoo wiki

Gentoo har noe informasjon i sin wiki på Fontconfig selv om mange av detaljene (hva du skal aktivere, og Infinality) er spesifikke for Gentoo.