NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
17.09k stars 13.4k forks source link

fc-match fails to match fonts set in fonts.defaultFonts #9110

Closed ericsagnes closed 8 years ago

ericsagnes commented 9 years ago

I am trying to set IPA proportional fonts for Japanese serif & sans-serif, but it seems that fonts set via fonts.defaultFonts are not matched by fc-match.

configuration.nix:

  fonts = {
    fonts = [
      pkgs.ipafont
      pkgs.powerline-fonts
      pkgs.baekmuk-ttf
    ];

    fontconfig.defaultFonts = {
      serif = [
        "DejaVu Serif"
        "IPAPMincho"
        "Baekmuk Batang"
      ];
      sansSerif = [
        "DejaVu Sans"
        "IPAPGothic"
        "Baekmuk Dotum"
      ];
      monospace = [
        "DejaVu Sans Mono for Powerline"
        "IPAGothic"
        "Baekmuk Dotum"
      ];
    };
  };

/etc/fonts/conf.d/98-nixos.conf & /etc/fonts/2.11/conf.d/98-nixos.conf are correctly generated:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

  <!-- Default rendering settings -->
  <match target="font">
    <edit mode="assign" name="hinting">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="autohint">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="hintstyle">
      <const>hintfull</const>
    </edit>
    <edit mode="assign" name="antialias">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="rgba">
      <const>rgb</const>
    </edit>
    <edit mode="assign" name="lcdfilter">
      <const>lcddefault</const>
    </edit>
  </match>

  <!-- Default fonts -->
  <alias>
  <family>sans-serif</family>
  <prefer>
    <family>DejaVu Sans</family>
<family>IPAPGothic</family>
<family>Baekmuk Dotum</family>
  </prefer>
</alias>

  <alias>
  <family>serif</family>
  <prefer>
    <family>DejaVu Serif</family>
<family>IPAPMincho</family>
<family>Baekmuk Batang</family>
  </prefer>
</alias>

  <alias>
  <family>monospace</family>
  <prefer>
    <family>DejaVu Sans Mono for Powerline</family>
<family>IPAGothic</family>
<family>Baekmuk Dotum</family>
  </prefer>
</alias>
</fontconfig>

but fc-match seems to ignore it:

> fc-cache -r

> fc-match sans-serif -s                                                                                   ~
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
luxisr.ttf: "Luxi Sans" "Regular"
ipag.ttf: "IPAゴシック" "Regular"
dotum.ttf: "Baekmuk Dotum" "Regular"
gulim.ttf: "Baekmuk Gulim" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
DejaVuSerif-BoldItalic.ttf: "DejaVu Serif" "Bold Italic"
FreeMono.ttf: "FreeMono" "нормален"
FreeSerif.ttf: "FreeSerif" "нормален"
FuraMono-Regular Powerline.otf: "Fira Mono for Powerline" "Regular"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
luximr.ttf: "Luxi Mono" "Regular"
Anonymice Powerline.ttf: "Anonymous Pro for Powerline" "Regular"
Ubuntu Mono derivative Powerline.ttf: "Ubuntu Mono derivative Powerline" "Regular"
LiberationSerif-Italic.ttf: "Liberation Serif" "Italic"
7x13-ISO8859-1.pcf.gz: "Fixed" "Regular"
7x13.pcf.gz: "Fixed" "Regular"
8x13.pcf.gz: "Fixed" "Regular"
12x13ja.pcf.gz: "Fixed" "ja"
6x12.pcf.gz: "Fixed" "SemiCondensed"
6x13.pcf.gz: "Fixed" "SemiCondensed"
9x15.pcf.gz: "Fixed" "Regular"
18x18ja.pcf.gz: "Fixed" "ja"
10x20.pcf.gz: "Fixed" "Regular"

> fc-match serif -s
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
DejaVuSerif-BoldItalic.ttf: "DejaVu Serif" "Bold Italic"
LiberationSerif-Regular.ttf: "Liberation Serif" "Regular"
LiberationSerif-Italic.ttf: "Liberation Serif" "Italic"
ipam.ttf: "IPA明朝" "Regular"
luxirr.ttf: "Luxi Serif" "Regular"
batang.ttf: "Baekmuk Batang" "Regular"
FreeSerif.ttf: "FreeSerif" "нормален"
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
FreeMono.ttf: "FreeMono" "нормален"
FreeSans.ttf: "FreeSans" "нормален"
FuraMono-Regular Powerline.otf: "Fira Mono for Powerline" "Regular"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
luximr.ttf: "Luxi Mono" "Regular"
Anonymice Powerline.ttf: "Anonymous Pro for Powerline" "Regular"
Ubuntu Mono derivative Powerline.ttf: "Ubuntu Mono derivative Powerline" "Regular"
7x13-ISO8859-1.pcf.gz: "Fixed" "Regular"
7x13.pcf.gz: "Fixed" "Regular"
8x13.pcf.gz: "Fixed" "Regular"
12x13ja.pcf.gz: "Fixed" "ja"
6x12.pcf.gz: "Fixed" "SemiCondensed"
6x13.pcf.gz: "Fixed" "SemiCondensed"
9x15.pcf.gz: "Fixed" "Regular"
18x18ja.pcf.gz: "Fixed" "ja"
10x20.pcf.gz: "Fixed" "Regular"
vcunat commented 9 years ago

I'd try to find the cause with help of $FC_DEBUG; see docs.

vcunat commented 9 years ago

BTW, is it possible that this is connected to perhaps font and/or fontconfig files not being immediately "visible" #9027? Have you rebooted after adding the fonts?

ericsagnes commented 9 years ago

Thanks for the advices, I tried to reboot but it didn't help.

The IPA Font is present and japanese characters are displayed fine so it shouldn't be related to #9027 . The problem I face is that by default the non proportional IPA fonts are used (the versions without P), but I would like to use the proportional versions instead.

Match Debug:

> FC_DEBUG=1 fc-match sans -s
FC_DEBUG=1
Sort Pattern has 23 elts (size 32)
        family: "DejaVu Sans"(s) "Bitstream Vera Sans"(w) "DejaVu Sans"(w) "DejaVu Sans"(s) "Verdana"(w) "Liberation Sans"(s) "Arial"(w) "Liberation Sans"(w) "Liberation Sans"(w) "TeX Gyre Heros"(w) "Arimo"(w) "Albany AMT"(w) "Luxi Sans"(w) "Nimbus Sans L"(w) "Liberation Sans"(s) "TeX Gyre Heros"(s) "Nimbus Sans L"(s) "Helvetica"(w) "TeX Gyre Heros"(w) "Nimbus Sans L"(w) "Droid Sans"(s) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Luxi Sans"(s) "DejaVu Sans Condensed"(s) "Tahoma"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Zemen Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "malayalam"(w) "Sampige"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "SimSun"(w) "PMingLiu"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Modata"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) "AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "TSCu_Paranar"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Bengali"(w) "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannada"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "Noto Sans"(w) "Liberation Sans"(w) "DejaVu Sans"(w) "Nimbus Sans L"(w) "Noto Sans CJK JP"(w) "Noto Sans CJK TC"(w) "Noto Sans CJK KR"(w) "Noto Sans CJK SC"(w) "Noto Sans Cherokee"(w) "Noto Sans"(w) "DDC Uchen"(w) "TharLon"(w) "Noto Sans Myanmar"(w) "Faruma"(w) "Noto Sans Buginese"(w) "Noto Kufi Arabic"(w) "LKLUG"(w) "Noto Sans Sinhala"(w) "Noto Sans Kannada"(w) "Noto Sans"(w) "Noto Sans Khmer"(w) "Noto Sans"(w) "Noto Sans Malayalam"(w) "Noto Sans"(w) "Lohit Devanagari"(w) "Lohit Nepali"(w) "Noto Sans Devanagari"(w) "Noto Sans"(w) "Noto Sans Hebrew"(w) "Noto Sans"(w) "Noto Sans Bengali"(w) "Noto Sans"(w) "Noto Sans Lao"(w) "Noto Sans"(w) "Noto Sans Thai"(w) "Noto Sans"(w) "Noto Sans Telugu"(w) "Noto Sans"(w) "Noto Sans Gujarati"(w) "Noto Sans"(w) "Noto Sans Ethiopic"(w) "Noto Sans"(w) "Noto Sans Tamil"(w) "Noto Sans"(w) "Noto Sans Georgian"(w) "Noto Sans"(w) "Noto Sans Brahmi"(w) "Noto Sans"(w) "Noto Sans Kaithi"(w) "Noto Sans"(w) "Noto Sans Vai"(w) "Noto Sans"(w) "Noto Sans Osmanya"(w) "Noto Sans"(w) "Lohit Odia"(w) "Estrangelo Edessa"(w) "Noto Sans Syriac Estrangela"(w) "Noto Sans Syriac Eastern"(w) "Noto Sans Syriac Western"(w) "Euphemia UCAS"(w) "Noto Sans UI"(w) "Noto Sans"(w) "Droid Sans"(w) "DejaVu Sans"(w) "IPAPGothic"(w) "Baekmuk Dotum"(w) "sans-serif"(s) "Roya"(w) "Koodak"(w) "Terafik"(w) "Helvetica"(w) "Liberation Sans"(w) "Arial"(w) "Noto Serif"(w) "Droid Serif"(w) "DejaVu Serif"(w) "IPAPMincho"(w) "Baekmuk Batang"(w) "serif"(w) "serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "serif"(w) "serif"(w) "serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "serif"(w) "sans-serif"(w) "serif"(w)
        familylang: "ja"(s) "en-us"(w)
        stylelang: "ja"(s) "en-us"(w)
        fullnamelang: "ja"(s) "en-us"(w)
        slant: 0(i)(s)
        weight: 80(i)(s)
        width: 100(i)(s)
        size: 12(f)(s)
        pixelsize: 12.5(f)(s)
        hintstyle: 3(i)(s)
        hinting: True(s)
        verticallayout: False(s)
        autohint: False(s)
        globaladvance: True(s)
        dpi: 75(f)(s)
        scale: 1(f)(s)
        lang: "ja"(w)
        fontversion: 2147483647(i)(s)
        embeddedbitmap: True(s)
        decorative: False(s)
        namelang: "ja"(s)
        prgname: "fc-match"(s)
        bitmap_monospace: False(w)
... rest truncated

The fonts set in fontconfig.defaultFonts appears quite at the end of the sort result ("DejaVu Sans"(w) "IPAPGothic"(w) "Baekmuk Dotum"(w) ). So it seems that for some reason the settings in 98-nixos.conf have a lower priority than other setting files.

Config files loaded:

> FC_DEBUG=1024 fc-match sans -s
FC_DEBUG=1024
        Loading config file /etc/fonts/2.11/fonts.conf
        Scanning config dir /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/10-scale-bitmap-fonts.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/20-unhint-small-vera.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/30-metric-aliases.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/30-urw-aliases.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/40-nonlatin.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/45-latin.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/49-sansserif.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/60-latin.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/65-fonts-persian.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/65-nonlatin.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/69-unifont.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/80-delicious.conf
        Loading config file /nix/store/zqzccqwyz0vaqkq16vk72j2ra8ak6i6s-fontconfig-2.11.1/etc/fonts/conf.d/90-synthetic.conf
        Scanning config dir /etc/fonts/2.11/conf.d
        Loading config file /etc/fonts/2.11/conf.d/00-nixos.conf
        Loading config file /etc/fonts/2.11/conf.d/52-fontconfig-ultimate.conf
        Scanning config dir /nix/store/kid35wdkq2bfck7kmcf4ia2pmkfkxn8y-fontconfig-ultimate-20141123/etc/fonts/presets/free
... truncating ultimate settings files ...
        Loading config file /etc/fonts/2.11/conf.d/98-nixos.conf
        Loading config file /etc/fonts/2.11/conf.d/99-user.conf
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
luxisr.ttf: "Luxi Sans" "Regular"
ipag.ttf: "IPAゴシック" "Regular"
dotum.ttf: "Baekmuk Dotum" "Regular"
gulim.ttf: "Baekmuk Gulim" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
DejaVuSerif-BoldItalic.ttf: "DejaVu Serif" "Bold Italic"
FreeMono.ttf: "FreeMono" "нормален"
FreeSerif.ttf: "FreeSerif" "нормален"
FuraMono-Regular Powerline.otf: "Fira Mono for Powerline" "Regular"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
luximr.ttf: "Luxi Mono" "Regular"
Anonymice Powerline.ttf: "Anonymous Pro for Powerline" "Regular"
Ubuntu Mono derivative Powerline.ttf: "Ubuntu Mono derivative Powerline" "Regular"
LiberationSerif-Italic.ttf: "Liberation Serif" "Italic"
7x13-ISO8859-1.pcf.gz: "Fixed" "Regular"
7x13.pcf.gz: "Fixed" "Regular"
8x13.pcf.gz: "Fixed" "Regular"
12x13ja.pcf.gz: "Fixed" "ja"
6x12.pcf.gz: "Fixed" "SemiCondensed"
6x13.pcf.gz: "Fixed" "SemiCondensed"
9x15.pcf.gz: "Fixed" "Regular"
18x18ja.pcf.gz: "Fixed" "ja"
10x20.pcf.gz: "Fixed" "Regular"

Caching information:

> FC_DEBUG=32 fc-cache -r -v | grep ipa
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03: caching, new cache contents: 0 fonts, 1 dirs
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share: caching, new cache contents: 0 fonts, 1 dirs
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts: caching, new cache contents: 0 fonts, 1 dirs
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype: Raw pattern:
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipag.ttf"(s)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipag.ttf"(w)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipagp.ttf"(s)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipagp.ttf"(w)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipam.ttf"(s)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipam.ttf"(w)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipamp.ttf"(s)
        file: "/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipamp.ttf"(w)
Re-scanning /nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03: caching, new cache contents: 0 fonts, 1 dirs
Re-scanning /nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share: caching, new cache contents: 0 fonts, 1 dirs
Re-scanning /nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts: caching, new cache contents: 0 fonts, 1 dirs

IPA Fonts availability:

> fc-list :lang=ja
/nix/store/zwcwinijsryax739lim93fb9l6q24hhw-font-misc-misc-1.1.2/lib/X11/fonts/misc/12x13ja.pcf.gz: Fixed:style=ja
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipamp.ttf: IPA P明朝,IPAPMincho:style=Regular
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipagp.ttf: IPA Pゴシック,IPAPGothic:style=Regular
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipag.ttf: IPAゴシック,IPAGothic:style=Regular
/nix/store/zwcwinijsryax739lim93fb9l6q24hhw-font-misc-misc-1.1.2/lib/X11/fonts/misc/18x18ko.pcf.gz: Fixed:style=ko
/nix/store/qjzppncbdidl8wbbkj3q776wn5gcmcrg-ipafont-003.03/share/fonts/opentype/ipam.ttf: IPA明朝,IPAMincho:style=Regular
/nix/store/zwcwinijsryax739lim93fb9l6q24hhw-font-misc-misc-1.1.2/lib/X11/fonts/misc/18x18ja.pcf.gz: Fixed:style=ja
vcunat commented 9 years ago

The first fc-match result certainly seems consistent to me: you have DejaVu fonts as the first in defaultFonts, and that's what fc-match returns. Even fc-match :lang=ja will likely do so, as the fonts claim ja support.

ericsagnes commented 9 years ago

Deja Vu fonts first is correct, but the second entry in fontconfig.defaultFonts.sansSerif IPAPGothic doesn't appear in the match list.

As a test, I changed my fontconfig options as below:

  fonts = {
    fonts = [ 
      pkgs.ipafont
      pkgs.powerline-fonts
      pkgs.baekmuk-ttf
    ];

    fontconfig = { 
      defaultFonts = {
        monospace = [ 
          "IPAGothic"
        ];
        serif = [ 
          "IPAPMincho"
        ];
        sansSerif = [
          "IPAPGothic"
        ];
      };
    };
  };

The generated /etc/fonts/2.11/conf.d/98-nixos.conf is correct:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

  <!-- Default rendering settings -->
  <match target="font">
    <edit mode="assign" name="hinting">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="autohint">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="hintstyle">
      <const>hintfull</const>
    </edit>
    <edit mode="assign" name="antialias">
      <bool>true</bool>
    </edit>
    <edit mode="assign" name="rgba">
      <const>rgb</const>
    </edit>
    <edit mode="assign" name="lcdfilter">
      <const>lcddefault</const>
    </edit>
  </match>

  <!-- Default fonts -->
  <alias>
  <family>sans-serif</family>
  <prefer>
    <family>IPAPGothic</family>
  </prefer>
</alias>

  <alias>
  <family>serif</family>
  <prefer>
    <family>IPAPMincho</family>
  </prefer>
</alias>

  <alias>
  <family>monospace</family>
  <prefer>
    <family>IPAGothic</family>
  </prefer>
</alias>
</fontconfig>

But fc-match for sans-serif still match DejaVu and there is no IPAPGothic in the results:

> fc-match sans -s 
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
luxisr.ttf: "Luxi Sans" "Regular"
ipag.ttf: "IPAゴシック" "Regular"
dotum.ttf: "Baekmuk Dotum" "Regular"
gulim.ttf: "Baekmuk Gulim" "Regular"
FreeSans.ttf: "FreeSans" "нормален"
FreeMono.ttf: "FreeMono" "нормален"
FreeSerif.ttf: "FreeSerif" "нормален"
FuraMono-Regular Powerline.otf: "Fira Mono for Powerline" "Regular"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
luximr.ttf: "Luxi Mono" "Regular"
Anonymice Powerline.ttf: "Anonymous Pro for Powerline" "Regular"
Ubuntu Mono derivative Powerline.ttf: "Ubuntu Mono derivative Powerline" "Regular"
DejaVuSerif-Italic.ttf: "DejaVu Serif" "Italic"
LiberationSerif-Italic.ttf: "Liberation Serif" "Italic"
7x13-ISO8859-1.pcf.gz: "Fixed" "Regular"
7x13.pcf.gz: "Fixed" "Regular"
8x13.pcf.gz: "Fixed" "Regular"
12x13ja.pcf.gz: "Fixed" "ja"
6x12.pcf.gz: "Fixed" "SemiCondensed"
6x13.pcf.gz: "Fixed" "SemiCondensed"
9x15.pcf.gz: "Fixed" "Regular"
18x18ja.pcf.gz: "Fixed" "ja"
10x20.pcf.gz: "Fixed" "Regular"

Detailed output:

> FC_DEBUG=1 fc-match sans -s
FC_DEBUG=1
Sort Pattern has 23 elts (size 32)
        family: "DejaVu Sans"(s) "Bitstream Vera Sans"(w) "DejaVu Sans"(w) "DejaVu Sans"(s) "Verdana"(w) "Liberation Sans"(s) "Arial"(w) "Liberation Sans"(w) "Liberation Sans"(w) "TeX Gyre Heros"(w) "Arimo"(w) "Albany AMT"(w) "Luxi Sans"(w
) "Nimbus Sans L"(w) "Liberation Sans"(s) "TeX Gyre Heros"(s) "Nimbus Sans L"(s) "Helvetica"(w) "TeX Gyre Heros"(w) "Nimbus Sans L"(w) "Droid Sans"(s) "Lucida Sans Unicode"(w) "BPG Glaho International"(w) "Luxi Sans"(s) "DejaVu Sans Conden
sed"(s) "Tahoma"(w) "Nachlieli"(w) "Lucida Sans Unicode"(w) "Yudit Unicode"(w) "Kerkis"(w) "ArmNet Helvetica"(w) "Artsounk"(w) "BPG UTF8 M"(w) "Waree"(w) "Loma"(w) "Garuda"(w) "Umpush"(w) "Saysettha Unicode"(w) "JG Lao Old Arial"(w) "GF Ze
men Unicode"(w) "Pigiarniq"(w) "B Davat"(w) "B Compset"(w) "Kacst-Qr"(w) "Urdu Nastaliq Unicode"(w) "Raghindi"(w) "Mukti Narrow"(w) "malayalam"(w) "Sampige"(w) "padmaa"(w) "Hapax Berbère"(w) "MS Gothic"(w) "UmePlus P Gothic"(w) "SimSun"(w)
 "PMingLiu"(w) "WenQuanYi Zen Hei"(w) "WenQuanYi Bitmap Song"(w) "AR PL ShanHeiSun Uni"(w) "AR PL New Sung"(w) "MgOpen Modata"(w) "VL Gothic"(w) "IPAMonaGothic"(w) "IPAGothic"(w) "Sazanami Gothic"(w) "Kochi Gothic"(w) "AR PL KaitiM GB"(w) 
"AR PL KaitiM Big5"(w) "AR PL ShanHeiSun Uni"(w) "AR PL SungtiL GB"(w) "AR PL Mingti2L Big5"(w) "MS ゴシック"(w) "ZYSong18030"(w) "TSCu_Paranar"(w) "NanumGothic"(w) "UnDotum"(w) "Baekmuk Dotum"(w) "Baekmuk Gulim"(w) "KacstQura"(w) "Lohit Benga "Lohit Gujarati"(w) "Lohit Hindi"(w) "Lohit Marathi"(w) "Lohit Maithili"(w) "Lohit Kashmiri"(w) "Lohit Konkani"(w) "Lohit Nepali"(w) "Lohit Sindhi"(w) "Lohit Punjabi"(w) "Lohit Tamil"(w) "Meera"(w) "Lohit Malayalam"(w) "Lohit Kannad
a"(w) "Lohit Telugu"(w) "Lohit Oriya"(w) "LKLUG"(w) "FreeSans"(w) "Arial Unicode MS"(w) "Arial Unicode"(w) "Code2000"(w) "Code2001"(w) "Noto Sans"(w) "Liberation Sans"(w) "DejaVu Sans"(w) "Nimbus Sans L"(w) "Noto Sans CJK JP"(w) "Noto Sans
 CJK TC"(w) "Noto Sans CJK KR"(w) "Noto Sans CJK SC"(w) "Noto Sans Cherokee"(w) "Noto Sans"(w) "DDC Uchen"(w) "TharLon"(w) "Noto Sans Myanmar"(w) "Faruma"(w) "Noto Sans Buginese"(w) "Noto Kufi Arabic"(w) "LKLUG"(w) "Noto Sans Sinhala"(w) "
Noto Sans Kannada"(w) "Noto Sans"(w) "Noto Sans Khmer"(w) "Noto Sans"(w) "Noto Sans Malayalam"(w) "Noto Sans"(w) "Lohit Devanagari"(w) "Lohit Nepali"(w) "Noto Sans Devanagari"(w) "Noto Sans"(w) "Noto Sans Hebrew"(w) "Noto Sans"(w) "Noto Sa
ns Bengali"(w) "Noto Sans"(w) "Noto Sans Lao"(w) "Noto Sans"(w) "Noto Sans Thai"(w) "Noto Sans"(w) "Noto Sans Telugu"(w) "Noto Sans"(w) "Noto Sans Gujarati"(w) "Noto Sans"(w) "Noto Sans Ethiopic"(w) "Noto Sans"(w) "Noto Sans Tamil"(w) "Not
o Sans"(w) "Noto Sans Georgian"(w) "Noto Sans"(w) "Noto Sans Brahmi"(w) "Noto Sans"(w) "Noto Sans Kaithi"(w) "Noto Sans"(w) "Noto Sans Vai"(w) "Noto Sans"(w) "Noto Sans Osmanya"(w) "Noto Sans"(w) "Lohit Odia"(w) "Estrangelo Edessa"(w) "Not
o Sans Syriac Estrangela"(w) "Noto Sans Syriac Eastern"(w) "Noto Sans Syriac Western"(w) "Euphemia UCAS"(w) "Noto Sans UI"(w) "Noto Sans"(w) "Droid Sans"(w) "IPAPGothic"(w) "sans-serif"(s) "Roya"(w) "Koodak"(w) "Terafik"(w) "Helvetica"(w) 
"Liberation Sans"(w) "Arial"(w) "Noto Serif"(w) "Droid Serif"(w) "IPAPMincho"(w) "serif"(w) "serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-se
rif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "serif"(w) "serif"(w) "serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-
serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans
-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "san
s-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "sans-serif"(w) "serif"(w) "sans-serif"(w) "serif"(w)
        familylang: "ja"(s) "en-us"(w)
        stylelang: "ja"(s) "en-us"(w)
        fullnamelang: "ja"(s) "en-us"(w)
        slant: 0(i)(s)
        weight: 80(i)(s)
        width: 100(i)(s)
        size: 12(f)(s)
        pixelsize: 12.5(f)(s)
        hintstyle: 3(i)(s)
        hinting: True(s)
        verticallayout: False(s)
        autohint: False(s)
        globaladvance: True(s)
        dpi: 75(f)(s)
        scale: 1(f)(s)
        lang: "ja"(w)
        fontversion: 2147483647(i)(s)
        embeddedbitmap: True(s)
        decorative: False(s)
        namelang: "ja"(s)
        prgname: "fc-match"(s)
        bitmap_monospace: False(w)

First font Pattern has 22 elts (size 22)
        family: "DejaVu Sans"(w)
...
vcunat commented 9 years ago

IPAPGothic is in your detailed list. Anyway, I don't know the exact semantics of fontconfig and I don't see it directly in the docs. I would think this font gets pruned (see the -a parameter) because whatever additional font requirements you specify, DejaVu will be in front and shadowing it.

ericsagnes commented 9 years ago

After some research, it seems that priorities for families alias are set by the order of parsing conf files. 98-nixos.conf being one of the last files read, its settings get the lowest priority.

But there is a binding property that when set to strong forces priority of configuration rules. I tried with a user defined ~/.config/fontconfig/fonts.conf as below:

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <alias binding="strong">
    <family>serif</family>
    <prefer>
      <family>DejaVu Serif</family>
      <family>IPAPMincho</family>
      <family>Baekmuk Batang</family>
    </prefer>
  </alias>
  <alias binding="strong">
    <family>sans-serif</family>
    <prefer>
      <family>DejaVu Sans</family>
      <family>IPAPGothic</family>
      <family>Baekmuk Dotum</family>
    </prefer>
  </alias>
  <alias binding="strong">
    <family>monospace</family>
    <prefer>
      <family>DejaVu Sans Mono for Powerline</family>
      <family>IPAGothic</family>
      <family>Baekmuk Dotum</family>
    </prefer>
  </alias>
</fontconfig>

And fc-match matches correctly the preferred fonts:

> fc-match sans -s 
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
luxisr.ttf: "Luxi Sans" "Regular"
ipagp.ttf: "IPA Pゴシック" "Regular"
dotum.ttf: "Baekmuk Dotum" "Regular"
....

I suppose that adding binding="strong" to the alias tags for defaultFonts in https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/config/fonts/fontconfig.nix should make it work as expected for most of users. (what is the point to set default fonts if they have the lowest priority?)

I am pretty new to NixOS and don't know yet how to make changes to local configuration modules. If someone could point to some documentation or update https://nixos.org/wiki/NixOS_Modifying_Modules , I will be very happy to test the changes and submit a patch if it works as expected.

vcunat commented 9 years ago

The docs give an explanation of what binding means:

There is one special case to this rule; family names are split into two bindings; strong and weak. Strong family names are given greater precedence in the match than lang elements while weak family names are given lower precedence than lang elements. This permits the document language to drive font selection when any document specified font is unavailable.

My understanding is that if we use a strong one, the first font in the defaultFonts list will be used even if it doesn't support the requested language. That doesn't seem a good default behavior to me.

/cc @ttuegel: you seem to know more about this, judging from 9707ffd973.

ttuegel commented 9 years ago

My understanding is that if we use a strong one, the first font in the defaultFonts list will be used even if it doesn't support the requested language. That doesn't seem a good default behavior to me.

Yes, that is correct. That would be inappropriate behavior for the default settings.

While the configuration files are parsed in order, that does not mean that later ones have lower priority. On the contrary, consider this, from the manual:

<alias> Alias elements provide a shorthand notation for the set of common match operations needed to substitute one font family for another. They contain a <family> element followed by optional <prefer>, <accept> and <default> elements. Fonts matching the <family> element are edited to prepend the list of <prefer>ed families before the matching <family>, append the <accept>able families after the matching <family> and append the <default> families to the end of the family list.

We may need to move that config file. According to the README the standard ranges are:

 00 through 09          Font directories
 10 through 19          system rendering defaults (AA, etc)
 20 through 29          font rendering options
 30 through 39          family substitution
 40 through 49          generic identification, map family->generic
 50 through 59          alternate config file loading
 60 through 69          generic aliases, map generic->family
 70 through 79          select font (adjust which fonts are available)
 80 through 89          match target="scan" (modify scanned patterns)
 90 through 99          font synthesis

Therefore, it may be more appropriate to do these settings in 60-nixos-generic-aliases.conf. Moving the settings to a higher precedence would very likely solve this problem.

ericsagnes commented 9 years ago

Thanks!

Just to give some feedback, as a test, I tried to rename my ~/.config/fontconfig/fonts.conf to ~/.config/fontconfig/conf.d/60-nixos-generic-aliases.conf (removing the binding="strong" attributes) but fc-match failed to match the proportional IPA fonts.

In the same file, putting binding="same" to the alias tag makes fc-match match the proportional IPA fonts.

Please ignore if it is not relevant information.

ttuegel commented 9 years ago

Just to give some feedback, as a test, I tried to rename my ~/.config/fontconfig/fonts.conf to ~/.config/fontconfig/conf.d/60-nixos-generic-aliases.conf (removing the binding="strong" attributes) but fc-match failed to match the proportional IPA fonts.

The filename should only affect the order a file is loaded in compared to other files in the same directory. Though, come to think of it, that may hose my fix. I will have to think on this more.

If binding="same" works, then probably some file that ships with fontconfig or fontconfig-ultimate is probably using binding="strong" where it should not.

vcunat commented 9 years ago

Yes, I'm afraid we might have a problem from the fact that within a single conf.d/ the file reading order is alphabetical, but we include several dirs and these aren't read "interleaved". I believe the split pushed now only changes order wrt. the "infinality" configs and not wrt. any upstream configs.

To truly interleave the reading, we'd have to join our system conf.d trees, e.g. by buildEnv. (However, I'm not yet certain if all should be joined, and it's probably impossible to join system and per-user config together.)

ttuegel commented 9 years ago

@vcunat buildEnv might be a little overkill; we really just want something like lndir. But that's the way we need to go for the system config files. Upstream intends that all the system files be interleaved. We don't need to worry about the user configuration, I think, as that isn't intended to be interleaved.

vcunat commented 9 years ago

User config: personally, I would expect that if I put some files into the user config instead of the system one, it will create the same result for that user. But that's probably just nitpicking ATM.

Another minor twist that got introduced: controlling the default font for a family by a file conf.d/30-familyName.conf installed with the fonts. #6793 That allows choosing among them also by standard nix-env priorities. I think interleaving isn't needed for those and it's enough to process them after the upstream config.

ericsagnes commented 8 years ago

Works perfectly, thanks! Sorry for the late closing.