- Synopsis
- Improving Font Rendering and Compatibility on Arch Linux
- Sources
- License
After installing Arch Linux, you may wonder why the fonts in Arch Linux look so bland compared to Windows and macOS. The reason is that out of the box, Arch Linux doesn't implement many font rendering techniques to make the fonts look clear and legible. Essentially, there isn't much happening behind the scenes, so the text appears rather plain. Additionally, some apps or websites may display tofu (□) due to missing font support. Fortunately, these issues are relatively easy to fix, and this guide will discuss the solutions.
Tip
Arch has actually started enabling a couple of these improvements by default in recent years. Basic hinting (hintslight) and LCD filtering now come pre-enabled out of the box on a fresh install. So fonts aren't quite as bare as they used to be, but there's still plenty of room for improvement, which is what the rest of this guide covers.
Caution
The following tweaks should work fine for most people, but as with anything in life, results may vary. If you need further assistance, feel free to leave a comment or consult the Arch Wiki. Furthermore, if you wish not to have any emoji support, be sure to ignore packages ending in or containing the word "emoji" and remove them if present.
Note
These tips were created specifically for Arch Linux, but they should work for other Linux distributions with slight modifications. If something doesn't work for your particular distro, please use your distro's official documentation or support forum(s).
Download and install the recommended fonts.
Tip
If the fonts aren't available in the main repositories, check the AUR.
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extrasudo pacman -S ttf-liberation ttf-dejavu ttf-robotoTip
For AUR packages you'll have to either install them manually or use an AUR helper. In this guide, I'll be using paru, but feel free to use whatever you want.
Caution
ttf-symbola's upstream file is hosted on the font author's personal site, which frequently goes down or 404s. If the build fails, try building it again later.
paru -S ttf-symbolasudo pacman -S ttf-jetbrains-mono ttf-fira-code ttf-hack adobe-source-code-pro-fontsCreate a local or global XML file to apply font rendering effects.
Global directory: /etc/fonts/local.conf
Per user directory: ~/.config/fontconfig/fonts.conf
Tip
Feel free to modify this XML file if you don't need emoji support or certain features. If you don't know what you're doing, just leave it as is.
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<!-- Apply text rasterization, hinting, and anti-aliasing -->
<match target="font">
<edit name="antialias" mode="assign">
<bool>true</bool>
</edit>
<edit name="hinting" mode="assign">
<bool>true</bool>
</edit>
<edit name="rgba" mode="assign">
<const>rgb</const>
</edit>
<edit name="hintstyle" mode="assign">
<const>hintslight</const>
</edit>
<edit name="lcdfilter" mode="assign">
<const>lcddefault</const>
</edit>
</match>
<!-- Configure default fonts & fallback fonts -->
<!-- Replace fonts with preferred fonts -->
<!-- Noto Color Emoji allows for emojis to render in all apps including the terminal, remove it if not needed -->
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif</family>
<family>Noto Color Emoji</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans</family>
<family>Noto Color Emoji</family>
</prefer>
</alias>
<alias>
<family>sans</family>
<prefer>
<family>Noto Sans</family>
<family>Noto Color Emoji</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono</family>
<family>Noto Color Emoji</family>
</prefer>
</alias>
<alias>
<family>mono</family>
<prefer>
<family>Noto Sans Mono</family>
<family>Noto Color Emoji</family>
</prefer>
</alias>
</fontconfig>Bitmap fonts are used as fallbacks for some fonts. This can lead to some very blurry, pixelated, or abnormally large fonts. Some users have reported Microsoft fonts being affected by this, and therefore it's recommended for users to disable bitmap fonts on a per font basis or globally. Be careful with disabling it globally as it may break some fonts (additional testing is required). According to the Arch Wiki, users may use the 70-no-bitmaps-except-emoji.conf preset to disable this behavior or use an XML file instead.
Path: ~/.config/fontconfig/conf.d/20-no-embedded.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<match target="font">
<edit name="embeddedbitmap" mode="assign">
<bool>false</bool>
</edit>
</match>
</fontconfig>Note
This excerpt was taken directly from the Arch Wiki so all credit goes to the Arch Wiki and all of its contributors.
Tip
Newer fontconfig versions ship a ready-made preset for exactly this case, so you can skip writing XML by hand:
sudo ln -s /usr/share/fontconfig/conf.avail/70-no-bitmaps-except-emoji.conf /etc/fonts/conf.d/Use the XML version below instead if you want finer control over which bitmap fonts (besides emoji) get kept.
Tip
If emojis stop working after using the previous XML file, then feel free to use this one instead:
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
<fontconfig>
<match target="font">
<edit name="embeddedbitmap" mode="assign">
<bool>false</bool>
</edit>
</match>
<match target="font">
<test name="family" qual="any">
<string>Noto Color Emoji</string>
</test>
<edit name="embeddedbitmap" mode="assign">
<bool>true</bool>
</edit>
</match>
</fontconfig>Note
If you are using Wayland, you can skip this step as these settings are handled by Fontconfig or the compositor directly.
Install xorg-xrdb (if needed).
sudo pacman -S xorg-xrdbEdit the ~/.Xresources file OR create one if not present.
Tip
Backup the file just in case.
vim ~/.XresourcesTip
Replace vim with your preferred text editor.
Add the following lines to that file and save changes.
Xft.lcdfilter: lcddefault
Xft.hintstyle: hintslight
Xft.hinting: 1
Xft.antialias: 1
Xft.rgba: rgbRun this command when finished.
xrdb -merge ~/.XresourcesCreate required symbolic links for text rendering effects to work:
Note
On current Arch installs, 10-hinting-slight.conf and 11-lcdfilter-default.conf are usually already enabled by default (fontconfig now pre-links some presets via /usr/share/fontconfig/conf.default/). If you see File exists for those two, that just means they're already active, so there's nothing to fix. 10-sub-pixel-rgb.conf is typically the only one still missing. The -f flag below makes all three commands safe to run regardless.
sudo ln -sf /usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d/
sudo ln -sf /usr/share/fontconfig/conf.avail/10-hinting-slight.conf /etc/fonts/conf.d/
sudo ln -sf /usr/share/fontconfig/conf.avail/11-lcdfilter-default.conf /etc/fonts/conf.d/Note
truetype:interpreter-version=40 has been Arch's default since FreeType 2.7, so on a stock system this step currently has no visible effect. It's still worth doing explicitly if you (or a different guide) previously set a different interpreter version and want to reset it back to the default.
Edit the freetype2.sh file.
sudo vim /etc/profile.d/freetype2.shUncomment the following line from the file.
export FREETYPE_PROPERTIES="truetype:interpreter-version=40"Fontconfig-aware software normally refreshes the cache when needed, so this step is usually unnecessary. If you want to rebuild the cache manually, run:
fc-cache -fvRestart any applications that were already running so they load the new Fontconfig configuration. A full system reboot is normally unnecessary.
Add the following line to your "/etc/environment" file.
FREETYPE_PROPERTIES="cff:no-stem-darkening=0 autofitter:no-stem-darkening=0"Note
This command enables stem darkening, which slightly thickens font "stems" to improve contrast and readability on low-DPI monitors. This results in a "richer" look similar to macOS font rendering.
cff:no-stem-darkening=0enables it for OpenType/CFF fonts.autofitter:no-stem-darkening=0enables it for other fonts (like TrueType) when using the auto-hinter.- Setting these to
0(false) enables the feature because the property is named "no-stem-darkening".
https://wiki.archlinux.org/title/Font_configuration
https://wiki.manjaro.org/index.php/Improve_Font_Rendering
https://www.freetype.org/freetype2/docs/reference/ft2-properties.html#no-stem-darkening
