Fonts: Difference between revisions

Ad2tba (talk | contribs)
Clarify that bindfs solution can also fix issues with missing icons/cursor themes. Simplify code example.
Phobos (talk | contribs)
m Updated Formating
 
(10 intermediate revisions by 10 users not shown)
Line 3: Line 3:
== Installing fonts on NixOS ==
== Installing fonts on NixOS ==


NixOS has many font packages available, and you can easily search for your favourites on the [https://search.nixos.org/packages NixOS packages site].  
NixOS has many font packages available, and you can easily search for your favorites on the [https://search.nixos.org/packages NixOS packages site].  


Despite looking like normal packages, simply adding these font packages to your <code>environment.systemPackages</code> won't make the fonts accessible to applications. To achieve that, put these packages in the <code>[https://search.nixos.org/options?channel=unstable&show=fonts.packages&from=0&size=50&sort=relevance&type=packages&query=fonts.packages fonts.packages]</code> NixOS options list instead.
Despite looking like normal packages, simply adding these font packages to your <code>environment.systemPackages</code> won't make the fonts accessible to applications. To achieve that, put these packages in the <code>[https://search.nixos.org/options?channel=unstable&show=fonts.packages&from=0&size=50&sort=relevance&type=packages&query=fonts.packages fonts.packages]</code> NixOS options list instead.


''For example:''  
''For example:''


<syntaxhighlight lang="nix">
{{File|3=fonts.packages = with pkgs; [
fonts.packages = with pkgs; [
   noto-fonts
   noto-fonts
   noto-fonts-cjk
   noto-fonts-cjk-sans
   noto-fonts-emoji
   noto-fonts-color-emoji
   liberation_ttf
   liberation_ttf
   fira-code
   fira-code
Line 20: Line 19:
   dina-font
   dina-font
   proggyfonts
   proggyfonts
];
];|name=/etc/nixos/configuration.nix|lang=nix}}{{Note|Be aware that sometimes font names and packages name differ and there is no universal convention in NixOS. </br>See: [https://discourse.nixos.org/t/guidelines-on-packaging-fonts/7683/2&#124; Guidelines for font packaging]}}
</syntaxhighlight>
 
Be aware that sometimes font names and packages name differ and there is no universal convention in NixOS. See [https://discourse.nixos.org/t/guidelines-on-packaging-fonts/7683/2 Guidelines for font packaging]


=== Shorthands for fonts ===
=== Shorthands for fonts ===
Line 29: Line 25:
* <code>fonts.enableGhostscriptFonts</code>: affects the <code>ghostscript</code> package. Ghostscript packages some URW fonts for the standard PostScript typefaces. If <code>true</code>, these fonts will be visible to GUI applications. You could set it to <code>true</code> if you want these fonts, but <code>gyre-fonts</code> (part of <code>fonts.enableDefaultPackages</code>) might be higher-quality depending on your judgement.
* <code>fonts.enableGhostscriptFonts</code>: affects the <code>ghostscript</code> package. Ghostscript packages some URW fonts for the standard PostScript typefaces. If <code>true</code>, these fonts will be visible to GUI applications. You could set it to <code>true</code> if you want these fonts, but <code>gyre-fonts</code> (part of <code>fonts.enableDefaultPackages</code>) might be higher-quality depending on your judgement.


=== Installing all nerdfonts ===
=== Using fonts from TexLive ===
The <code>nerdfonts</code> package includes all fonts from the [https://www.nerdfonts.com/ Nerd Fonts repository], making it quite large and resulting in a longer installation time. If you want to install the entire collection, add the following line to your system configuration:{{file|/etc/nixos/configuration.nix|nix|3=fonts.packages = with pkgs; [ nerdfonts ];}}
You can make use of all TeX/LaTeX fonts from CTAN and [[TexLive]] by passing
the <code>fonts</code> attribute of your TexLive package to <code>fonts.package</code>:


=== Installing specific nerdfonts ===
{{File|3={ pkgs, ... }:
let
  mytex =
    pkgs.texliveConTeXt.withPackages
      (ps: with ps; [
        fandol
        libertinus-fonts
      ]);
in {
  fonts.packages = builtins.attrValues {
    inherit (pkgs)
      dejavu_fonts
      noto-fonts-cjk-serif
      noto-fonts-cjk-sans
      julia-mono;
  } ++ [ mytex.fonts ];
}|name=/etc/nixos/configuration.nix|lang=nix}}


If you only need a selection of fonts from the package, you can overwrite the font selection like so:
=== Installing <code>nerdfonts</code> ===


<syntaxhighlight lang="nix">
Individual Nerd Fonts can be installed like so:
fonts.packages = with pkgs; [
  (nerdfonts.override { fonts = [ "FiraCode" "DroidSansMono" ]; })
];
</syntaxhighlight>


This will cause NixOS to download only the [https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/FiraCode Fira Code] and [https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/DroidSansMono Droid Sans Mono] fonts from [https://github.com/ryanoasis/nerd-fonts nerd-fonts] instead of the whole package. The relevant names can be found by looking [https://github.com/NixOS/nixpkgs/blob/8764d898c4f365d98ef77af140b32c6396eb4e02/pkgs/data/fonts/nerdfonts/shas.nix at the list of the nerdfonts names in this commit].
{{File|3=fonts.packages = with pkgs; [
 
For configurations using later versions of Nixpkgs (after 25.05), individual Nerd Fonts packages can be installed like so:<syntaxhighlight lang="nix">
fonts.packages = with pkgs; [
   nerd-fonts.fira-code
   nerd-fonts.fira-code
   nerd-fonts.droid-sans-mono
   nerd-fonts.droid-sans-mono
];
];|name=/etc/nixos/configuration.nix|lang=nix}}
 
 
 
The available Nerd Font subpackages can be listed by searching for {{nixos:package|nerd-fonts.*}} on the [[Searching packages|NixOS Package Search]] or by running the following command: <syntaxhighlight lang="console">
$ nix-instantiate --eval --expr "with (import <nixpkgs> {}); lib.attrNames (lib.filterAttrs (_: lib.isDerivation) nerd-fonts)"
</syntaxhighlight>
</syntaxhighlight>
==== Installing all <code>nerdfonts</code> ====
Installing all fonts from the [https://www.nerdfonts.com/ Nerd Fonts repository] is as simple as adding all of the individual packages to the NixOS configuration. The following line will do exactly that, by searching for all derivations under the <code>nerd-font</code> attribute:{{file|||<nowiki>
{
  fonts.packages = builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
}
</nowiki>|name=/etc/nixos/configuration.nix|lang=nix}}
=== Patching nerdfonts into fonts ===
Not all fonts have Nerd Fonts variants, thankfully you can easily patch them in yourself.
{{File|3=(pkgs.scientifica.overrideAttrs (o: {
  nativeBuildInputs = [ pkgs.nerd-font-patcher ];
  postInstall = ''
    mkdir -p $out/share/fonts/truetype/{scientifica,scientifica-nerd}
    mv $out/share/fonts/truetype/*.ttf $out/share/fonts/truetype/scientifica/
    for f in $out/share/fonts/truetype/scientifica/*.ttf; do
      nerd-font-patcher --complete --outputdir $out/share/fonts/truetype/scientifica-nerd/ $f
    done
  '';
}))|name=/etc/nixos/configuration.nix|lang=nix}}


=== Let Fontconfig know the fonts within your Nix profile ===
=== Let Fontconfig know the fonts within your Nix profile ===
Line 86: Line 118:
If you want to use other languages alongside English, you may want to set appropriate fonts for each language in your whole OS. For example, a Persian speaker might want to use the [https://rastikerdar.github.io/vazirmatn/ Vazirmatn] font for Persian texts, but [https://design.ubuntu.com/font/ Ubuntu] and Liberation Serif fonts for English texts. Just put these lines into your <code>configuration.nix</code>:
If you want to use other languages alongside English, you may want to set appropriate fonts for each language in your whole OS. For example, a Persian speaker might want to use the [https://rastikerdar.github.io/vazirmatn/ Vazirmatn] font for Persian texts, but [https://design.ubuntu.com/font/ Ubuntu] and Liberation Serif fonts for English texts. Just put these lines into your <code>configuration.nix</code>:


<syntaxhighlight lang="nix">
{{File|3=#----=[ Fonts ]=----#
#----=[ Fonts ]=----#
fonts = {
fonts = {
   enableDefaultPackages = true;
   enableDefaultPackages = true;
Line 104: Line 135:
     };
     };
   };
   };
};
};|name=/etc/nixos/configuration.nix|lang=nix}}
</syntaxhighlight>


NB:
NB:
Line 119: Line 149:
Adding this to your <code>/etc/nixos/configuration.nix</code> should prompt it to use the more similar (and nicer) serif ''Schola'' font instead:
Adding this to your <code>/etc/nixos/configuration.nix</code> should prompt it to use the more similar (and nicer) serif ''Schola'' font instead:


<syntaxhighlight lang="nix">
{{File|3=fonts = {
fonts = {
   packages = with pkgs; [ gyre-fonts ];
   packages = with pkgs; [ gyre-fonts ];
   fontconfig = {
   fontconfig = {
Line 131: Line 160:
     '';
     '';
   };
   };
};
};|name=/etc/nixos/configuration.nix|lang=nix}}
</syntaxhighlight>


For more information and examples on the xml configuration language:
For more information and examples on the xml configuration language:
Line 165: Line 193:


To expose available fonts under <code>/run/current-system/sw/share/X11/fonts</code>, enable <code>fontDir</code> in your NixOS configuration.
To expose available fonts under <code>/run/current-system/sw/share/X11/fonts</code>, enable <code>fontDir</code> in your NixOS configuration.
<syntaxhighlight lang="nix">
fonts.fontDir.enable = true;
</syntaxhighlight>You will then need to link/copy this folder to one of the Flatpak-supported locations - see below.


==== Best Solution: Just copy necessary fonts to <code>$HOME/.local/share/fonts</code> ====
{{File|3=fonts.fontDir.enable = true;|name=/etc/nixos/configuration.nix|lang=nix}}
Create fonts directory <code>$HOME/.local/share/fonts</code> and copy system fonts with option <code>-L, --dereference</code> .<syntaxhighlight lang="bash">
 
mkdir $HOME/.local/share/fonts && cp -L /run/current-system/sw/share/X11/fonts/* $HOME/.local/share/fonts/
You will then need to link/copy this folder to one of the Flatpak-supported locations - see below.
</syntaxhighlight>Note: There is '''no need''' to grant flatpak applications access to <code>$HOME/.local/share/fonts</code>.  
 
==== Solution 1: Copy fonts to <code>$HOME/.local/share/fonts</code> ====
Create fonts directory <code>$HOME/.local/share/fonts</code> and copy system fonts with option <code>-L, --dereference</code>. You will need to repeat this step whenever the fonts change.<syntaxhighlight lang="console">
$ mkdir $HOME/.local/share/fonts && cp -L /run/current-system/sw/share/X11/fonts/* $HOME/.local/share/fonts/
</syntaxhighlight>Note: There is no need to grant flatpak applications access to <code>$HOME/.local/share/fonts</code>.  


Instead, if you do that, some applications (for example, steam) won't work.<blockquote>Internals: How it works?
Instead, if you do that, some applications (for example, steam) won't work.<blockquote>Internals: How it works?
Line 189: Line 218:
</syntaxhighlight>Then flatpak application can read fonts from that to display contents correctly.</blockquote>
</syntaxhighlight>Then flatpak application can read fonts from that to display contents correctly.</blockquote>


==== Another Method: Create symlink to system fonts at  <code>$HOME/.local/share/fonts</code> ====
==== Solution 2: Symlink to system fonts at  <code>$HOME/.local/share/fonts</code> ====
<blockquote>'''Note:''' this method doesn't work for some flatpak applications (for example, steam)!  
<blockquote>'''Note:''' this method doesn't work for some flatpak applications (for example, steam)!  


Line 201: Line 230:
Now you have two options.
Now you have two options.


===== Option 1: allow the Flatpaks to access the font folder and <code>/nix/store</code> =====
===== Option 1: Allow access to the fonts folder and <code>/nix/store</code> =====
By using the Flatpak CLI or the Flatseal Flatpak make the following directory available to all Flatpaks <code>$HOME/.local/share/fonts</code> and <code>$HOME/.icons</code> the appropriate commands for this are:
By using the Flatpak CLI or the Flatseal Flatpak make the following directory available to all Flatpaks <code>$HOME/.local/share/fonts</code> and <code>$HOME/.icons</code> the appropriate commands for this are:


Line 216: Line 245:
</syntaxhighlight>
</syntaxhighlight>


===== Option 2: allow the Flatpaks to access the WHOLE filesystem =====
===== Option 2: Allow access to the WHOLE filesystem =====
Allow them access the WHOLE filesystem of yours: <code>All system files</code> in Flatseal or equivalently <code>filesystem=host</code> available to your application, the command for this is:
Allow them access the WHOLE filesystem of yours: <code>All system files</code> in Flatseal or equivalently <code>filesystem=host</code> available to your application, the command for this is:


Line 225: Line 254:
It is important to keep in mind that some flatpak apps may refuse to launch if given certain permissions, such as the Steam flatpak.  
It is important to keep in mind that some flatpak apps may refuse to launch if given certain permissions, such as the Steam flatpak.  


==== Using bindfs for fonts/cursors/icons support ====
==== Solution 3: Configure bindfs for fonts/cursors/icons support ====
Alternatively, you can expose relevant packages directly under <code>/usr/share/...</code> paths. This will also enable Flatpak to use a custom cursor theme if you have one.<syntaxhighlight lang="nix">
Alternatively, you can expose relevant packages directly under <code>/usr/share/...</code> paths. This will also enable Flatpak to use a custom cursor theme if you have one. This solution doesn't require <code>fonts.fontDir.enable</code> to be enabled.<syntaxhighlight lang="nix">
   system.fsPackages = [ pkgs.bindfs ];
   system.fsPackages = [ pkgs.bindfs ];


Line 256: Line 285:
   ];
   ];
</syntaxhighlight>
</syntaxhighlight>
=== Noto Color Emoji doesn't render on Firefox ===
=== Noto Color Emoji doesn't render on Firefox ===


Enable <code>useEmbeddedBitmaps</code> in your NixOs configuration.
Enable <code>useEmbeddedBitmaps</code> in your NixOS configuration.
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
fonts.fontconfig.useEmbeddedBitmaps = true;
fonts.fontconfig.useEmbeddedBitmaps = true;