Notes on using fonts in computers.

I am writing this file as a guide for using fonts. Fonts have been disproportionately difficult to use because of two reasons:

  1. A lot of terminology is coming from the times of Gutenberg, and is also constantly changing and inconsistent.
  2. Computing is largely driven by Latin-writing companies and communities, which have no incentive to make sure that all fonts work across all alphabets.

This file is not about the practice of using fonts for UI in computers, it is about using fonts with documents.

1. References

  1. Typeface features and legibility research, by Charles Bigelow :: https://www.sciencedirect.com/science/article/pii/S0042698919301087
  2. Wikipedia
  3. The Ails of Typographic Anti-Aliasing :: https://www.smashingmagazine.com/2009/11/the-ails-of-typographic-anti-aliasing/
  4. Modern text rendering with Linux :: https://mrandri19.github.io/2019/07/24/modern-text-rendering-linux-overview.html
  5. Higher Quality 2D Text Rendering :: https://inria.hal.science/hal-00821839/document
  6. Overleaf Font typefaces :: https://www.overleaf.com/learn/latex/Font_typefaces
  7. Fonts and TeX :: https://tug.org/fonts/
  8. Recent additions to TEX’s font repertoire :: https://tug.org/TUGboat/tb35-2/tb110sharpe.pdf
  9. The STIX Project — From Unicode to fonts :: https://tug.org/TUGboat/tb28-3/tb90beet.pdf
  10. Microsoft’s ClearType Font Collection :: https://typographica.org/on-typography/microsofts-cleartype-font-collection-a-fair-and-balanced-review/
  11. How do I identify a substituted font? :: https://ask.libreoffice.org/t/how-do-i-identify-a-substituted-font/32271
  12. The LaTeX Font Catalogue :: https://tug.org/FontCatalogue/
  13. Unicode fonts and tools for X11 :: https://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html

2. Terminology and basic introduction

2.1. Some basic terms

  1. Character :: ?
  2. Symbol :: ?
  3. Glyph :: ?
  4. Grapheme :: ?
  5. Typeface :: ? The way the letters look like?
  6. Script :: A font imitating handwriting.
  7. Orthography :: A subset of writing system. Say, "writing system"=Han, orthographies: Simplified Chinese, Traditional Chinese, Japanese
  8. Shape :: ?
  9. Hinting :: Making character pixels fit the monitor grid.
  10. Anti-aliasing :: Interpolating diagonal lines to avoid "stairs" effects.
  11. Kerning :: Moving characters left-right to remove excessive space?
  12. Serif :: Font with triangular marks which indicate ends of strokes.
  13. Sans/Sans-Serif :: Font without marks which indicate ends of strokes.
  14. Slab :: Font with rectangular marks.
  15. Mono (monospace) :: Font which has all characters of the same width. In reality not actually so, because Han characters are usually 2x wide.
  16. Half-width :: the width of normal characters in a text, especially when intermingled with wide Asian characters.
  17. Full-width :: when normal characters are made 2x wide, the same size as Asian characters.
  18. Term :: Monospace, and also without ligatures and other "helpful" features, text on a grid. Usually Sans.
  19. Typewriter :: Usually the same as Term, but also often with Slab-Serif.
  20. Font Set :: When many fonts are combined to make a single set of characters which covers all of Unicode.
  21. Latin :: Not what you think. Latin usually means "ASCII+diacritical marks", that is, a Latin alphabet combined with é, è, and similar characters for French, Czech, Vietnamese, Latin languages beyond English.
  22. Roman :: Upright.
  23. Italic :: Slanted like rotated.
  24. Oblique :: Slanted like distorted.
  25. Sample :: Means nothing.
  26. Fallback :: Also means nothing.
  27. Regular :: Medium thickness.
  28. Medium :: ? no idea, but not "medium thickness".
  29. Normal :: ?
  30. Light :: Lighter than Regular.
  31. Bold :: Bold.
  32. Heavy :: Bolder than bold.
  33. Black :: Very bold.
  34. Vector font :: Font drawn using special micro programs, mathematical expressions. May also include pixel fields, if people draw them intentionally.
  35. Raster font :: Font consisting from pixel fields (which may be generated from a vector-drawing program).
  36. Hēitǐ (黑体) :: Font in which beginnings and ends of strokes are indistinguishable.
  37. Sòngtǐ (宋体) :: Font which has beginnings and ends of strokes marked with "fish scale".
  38. FǎngSòngTǐ (仿宋体) :: No idea.
  39. MíngTǐ (明体) :: Sòngtǐ.
  40. KǎiTǐ (楷体) :: Font in which beginnings and ends of strokes differ by width.
  41. PostScript :: A programming language for drawing vector graphics.
  42. PDF :: A programming language for drawing vector graphics, incompatible with PostScript.
  43. TTF (TrueType) :: Vector font format.
  44. OTF (OpenType) :: Vector font format.
  45. OTB (OpenType Bitmap) :: Vector fonts format consisting entirely of bitmaps.
  46. bdf :: Raster font format.
  47. pcf :: Raster font format.
  48. psf :: Raster font format.

2.2. What is a font.

  1. In a common human understanding, a font is a mapping from characters to character shapes.
  2. In a common programmer understanding, a font is a file which has a mapping from a codepage entry (say, unicode 263A, ☺) to a raster image.
  3. In a typographer's understanding, a font can be any sort of confusing, weird, unclear and mystical stuff.

This creates a lot of confusion, because everyone sees things differently, and because common intuition always fails.

2.2.1. Overlapping fonts

Fonts may have different NAMES but have identical SHAPES.

For example the Sarasa font claims to combine the shapes from the Iosevka font and the shapes from the Adobe Source Han font.

2025-05-08_07-55-10_screenshot.png Hmmm… it seems that somebody is lying here. Sarasa Mono CL and Iosevka are, indeed, identical (although I did not do a pixel-to-pixel verification), but Source Han Sans is clearly different.

Alas, font people are lying all the time. I can only guess that Sarasa's authors did not really take the latin part of the font, they only took the Han (Chinese) part.

2.2.2. Font variations

Very naturally, people often want to add emphasis to their words, without radically changing the shape of the characters. Sometimes they also want to create titles or footnotes, for which they need bigger or smaller characters.

Now, normal people naturally call these small augmentations "font variations", and naturally assume that they are algorithmically generated. It is such an obvious allegation, since it is very natural to imagine those variations to be systematic changes.

Especially since Microsoft Word, LibreOffice, HTML, and other text processing packages pretend as if it is so, and let you apply those variations as if they are systematic programmatic alterations, and that they are independent of each other.

2025-05-08_09-06-25_screenshot.png

NOT SO. In reality they are NOT programmatic or systematic. Let us have a look at the font-manager presentation.

2025-05-08_09-14-26_screenshot.png

You can see the distribution of fonts between weights. These weights are built into fonts, and are not programmatic augmentations.

Let us look at italics:

2025-05-08_09-16-35_screenshot.png

The randomly chosen font on the screenshot actually exists in an italic shape, but the list on the left shows that only 287 out of 1415 fonts available on my machine support this shape. As you have guessed "Bold Italic" is a variation which has both weight and slant changed, and this is done by hand when designing the font.

  1. Weight :: bold, but can also be written as a degree (Extra Light, Light, Semi-Light, Thin, Medium, Normal, Regular, Thick, Extra Thick, Semi-Bold, Bold, Ultra-Bold, Black, Heavy, Ultra-Heavy). I have NO IDEA what those mean, and no, Black is not a colour.
  2. Italic :: the angle of the letters with respect to the vertical axis. Can be italic or oblique, and I have not managed to spot the difference.
  3. Interline spacing :: in many text processors interline spacing can be adjusted, but most fonts do not produce characters which are strictly limited to the bounding box, and have a certain empty margin between the bounding box and the character boundary. This matters in practice.

But LibreOffice manages to give me Bold Italic characters regardless of the font! Yes, but I have NO idea how.

Moreover, the text rendering engine "pango" lets you explicitly select font size, without specifying the font!

<span weight="ultralight">Hello, world</span>

Emacs allows specifying font parameters inside the font name:

(set-face-font 'shr-text "Liberation Serif-30:weight=light")

I have no idea how this works. Does it transform the symbols automatically or tries to substitute something?

2.2.3. Incomplete fonts

You might be baffled by this, but publishing fonts which do not cover all of Unicode is not a capital offence.

Indeed, some fonts only support Latin, and some fonts do not even support Latin!

Moreover, some fonts only support a part of a writing system.

  1. Versioned fonts

    In the old times, a font required working with liquid metal and casting character shapes in iron. This made fonts relatively stable.

    But in the time of computing, everything changes every year, and new "versions" of fonts are released. So, before lambasting your font as ugly and not supporting the characters you need, first check if you have the most recent version.

  2. Tofu

    Tofu happens when a font does not support a character, but the program tries to behave somehow user-friendly, and at least shows the number of the character in a tiny box, so that a user can find a font with those characters present, and install it.

    However, some "too user-friendly" fonts actually contain the tofu symbols inside of it. Which means that even if a program is capable of using some other font, which has all the required symbols, it wouldn't know that the current one does not support them.

    This is evil, and unless you have to, do not use such fonts.

    2025-05-08_09-33-30_screenshot.png

    The screenshot above only has 4-tofu, but there are also 6-tofu for characters with more letters.

    2025-05-08_10-06-48_screenshot.png
  3. White squares

    This case is even more sinister. The missing characters are represented as empty boxes.

    Again, I have no idea whether this is a property of the font, or the property of the rendering system, but overall it is disgusting.

    2025-05-08_09-32-27_screenshot.png
  4. Completely empty fonts
    2025-05-08_09-39-00_screenshot.png

    No, this is not a joke. The complete piece of shit called "Adobe Blank" pretends that it has all of the Unicode symbols, but in reality all of those symbols have not paint at all. You will not even know that something is written on your screen.

    1. Adobe Blank
  5. Character substitution

    Some programs are clever enough to substitute missing symbols with symbols taken from another font. Microsoft Word and similar text processing suites like doing this, without even letting the typesetter choose the font from which the substituting characters are taken.

    But the most amazing surprises happen when this software opaquely chooses Adobe Blank as the substitution font. Then it believes that it has substituted everything correctly, but the only thing you see is the background.

  6. Font set

    Font sets are the true programmer's way of dealing with missing characters.

    This concept expects somebody to explicitly write which character (or, rather, character group, for example "Latin Letters") should be coming from which font.

    Theoretically, this solves the problem of incomplete coverage completely, except nobody in their sane mind would be writing a font set, unless he is a programmer.

    Moreover, the only program using font sets which I am aware of is Emacs.

    Well, TeX has some concept of using different fonts for different purposes, but it is, by itself, very hard to grasp.

  7. Giant disorganized fonts

    Of course, nobody in their sane mind, beyond Emacs fanboys and text processor developers would care about font sets.

    Most people just throw all the possible glyphs into a single font file, and call it a day. This produces files which have a colossal size, up to 100 megabytes, but modern computers are strong and are expected to withstand that.

2.2.4. Dingbats and lying fonts

  1. Dingbats

    Dingbats are not really fonts, they just contain funny symbols in place of normal characters:

    2025-05-08_10-00-31_screenshot.png

    They are relatively benign, are mostly used with text processors, but do not try to write anything useful out of them. What is more important, do not try to send them instead of smileys to your friends, because they likely have a different font, and will not see the smiley copied from a dingbat font.

    Dingbat fonts:

    1. Wingdings {1,2,3}
    2. Webdings
  2. Intentional substitutions
    1. Fake ruby-script
      2025-05-08_10-24-32_screenshot.png

      The font does not contain many Simplified Chinese characters, so the first line has tofu, but the second line is more interesting. The built-in shapes of the characters have phonetics (in ZhuYin) attached to them. This is not some magical trick from the rendering engine, it just has the characters drawn like this.

      This is not as crazy as it sounds, if you are learning Chinese, it lets you automatically have phonetics attached, letting you read the text as if it was an Indo-European text, and it needs NO support from the program beyond the ability to switch fonts.

      Well, sort of. It does not deal with characters with multiple readings, such as 行 (xíng/háng).

      1. Han Wang Ming Medium Chu In
      2. Han Wang Kai Medium Chu In
    2. Fake Traditional-Simplified transformations
      2025-05-08_10-32-08_screenshot.png

      Make no mistake, the characters didn't change from the previous section. The first line is still missing the symbols attributed to "Simplified Chinese", and the second line is still written in "Traditional Chinese". But character shapes in the second line are, in fact, from the Simplified shapes.

      You can do a "poor man's" Traditional-to-Simplified conversion like this, or get horribly confused if you are doing a Chinese class online, and the program picks up the wrong font.

      1. HanWang Wei Bei
      2. HanWang Sin Song
      3. HanWang Kai
      4. HanWang FangSong

      Unfortunately, I have not found a font doing the opposite conversion, Simplified-to-Traditional.

2.2.5. Marketing bullshit

This is an excerpt from the official website of "Google Roboto".

Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves.

Have you understood anything? I understood nothing.

This is very typical of the font jargon to bury you in a mixture of terms and marketing.

2.2.6. Character widths

There is a big issue with character widths. It is not at all clear whether characters should all have the same width, or whether they should have a width proportional to the way they are typically written. Both conventions might be more fit for some cases and unfit for others.

  1. Mono fonts

    Fonts in which all characters have the same width generally look uglier, but they have a nice property: words with an identical number of characters have identical length, which makes lists automatically aligned.

    2025-05-08_10-50-55_screenshot.png

    Chinese fonts are naturally having identical widths, so the first two lines are aligned. Having the Cyrillic and the Latin (Translit) lines have identical lengths is also nice, even though the spaces are clearly ugly.

    But the bottom two likes are funnier: you see, there are no spaces around the bottom parenthesised "Privet". The spaces are coming from the parentheses themselves, because "monospace" in the case of Latin-Chinese punctuation was solved in a bizarre way, by creating "Latin" parentheses and "Asian" parentheses, with different widths. So, Sarasa, even though it is claiming to be "monospace", that is that its characters are all of the same width, but in reality its Latin and its Han characters have different widths.

    2025-05-08_10-57-22_screenshot.png

    Sarasa is fairly accurate, and is solving it in the way: making Han characters twice wider than Latin ones, and keeping the whitespace a single-width Latin. However, a full-width space also exists, and full-width punctuation exists. Cyrillic does not exist in full-width, Japanese Kana and Korean Hangul exist in both sizes, but in Sarasa, half-width (Latin-sized) Hangul is rendered full-width. :(

    2025-05-08_11-07-22_screenshot.png

    But not all fonts which claim to be monospace are actually monospace:

    2025-05-08_11-11-09_screenshot.png

    Noto Mono clearly does not enforce full (double) width of the tofu characters.

    2025-05-08_11-13-03_screenshot.png

    WenQuanYi Micro Hei Mono is not actually mono with respect to punctuation.

  2. Proportional fonts, kerning.

    I do not like proportional fonts and I use them less than mono. However, as has already been mentioned, not all features are available for all fonts.

    When I need to have a text printed in a font with "Serifs" (see the next section), I am out of choice, because I have not found a monospace font with serifs.

    With proportional fonts, kerning starts to matter.

    Kerning is when the system algorithmically adjusts how close together are symbols.

    2025-05-08_11-30-12_screenshot.png

2.2.7. Stroke style

Some font drawing details are so prominent that we cannot avoid noticing them.

  1. Serifs

    In particular, most Latin fonts are either Serif or Sans Serif. (Sans is French for "without".)

    What are "serifs"? Serifs are those tiny marks/strokes at the ends of most of the character strokes, which are supposed to make it more readable.

    2025-05-08_12-05-41_screenshot.png Times New Roman has serifs.

    2025-05-08_12-06-49_screenshot.png Arial does not have serifs.

    It is believed that Sans Serif fonts are better for computer screens, and that Serif fonts are better for printed books and articles, but studies do not really support this claim. I prefer using Sans-Serif everywhere.

    Slab fonts are like serif, but the serifs are not pointy, but blunt.

    2025-05-08_12-31-10_screenshot.png

    Standard Sarasa does not have slabs.

    2025-05-08_12-31-53_screenshot.png
    1. Sarasa Slab has slabs for Cyrillic.
  2. Stroke direction
    1. European fonts

      In Latin fonts, the issue of stroke direction only appears in fonts which imitate handwriting, and this is a seldom-happening thing.

      2025-05-08_12-08-59_screenshot.png

      Even for the example above, stroke direction is only really visible for "в", "т", "i".

      1. The font is called "Bad script".
      2025-05-08_12-34-28_screenshot.png
      1. Marck Script.

      The stroke direction is more visible, but still less prominent than in Han.

      But for Han fonts this is much more frequent.

    2. KaiTi

      Kaiti (also known as KaiShu, ZhengTi, ZhengKai, ZhengShu) is a style of writing in which stroke direction is visible But make no mistake the strokes do not necessarily start thick and end pointy, often they do not.

      2025-05-08_12-41-17_screenshot.png
      1. HanWang Kai is honestly doing its job for Han, but for Latin it just adds serifs instead of stroke ends.
      2025-05-08_12-43-58_screenshot.png
      1. LXGW WenKai does it much more faithfully.

      The Han script is clear Kai, but even Latin and Cyrillic have stroke endings marked a bit.

      2025-05-08_12-45-33_screenshot.png
      1. TW-Kai does not even care about Cyrillic whatsoever, it seems that the Cyrillic characters are added just out of greediness.

      However, the fact that Cyrillic characters are rendered as wide as Han characters, amuses me.

    3. MingTi-SongTi

      MingTi (also called SongTi)script is like Kai in that beginnings and ends are visible, but they are marked explicitly (the marks are called "fish scales", "lín"), instead of being represented by widths.

      2025-05-08_12-49-56_screenshot.png
      1. cwTeX Q Ming

      Traditional Chinese has end marks, but Latin and Cyrillic are just serifs. But the rest of the fonts on my machine are even worse.

      2025-05-08_19-34-57_screenshot.png
      1. TW-Sung, has at least some of Simplified Han, Traditional Han.

      Serifs in Latin even look a little bit like "fish scales", but Cyrillic is just some bizarre font with Serifs, and Cyrillic letters to be "like full-width".

      There is also a version of Song/Ming called FangSong, but the fonts I have which claim to implement it are inconsistent.

    4. Asian Gothic, HeiTi

      HēiTǐ, 黑体, literally means "black body", but this "black" is unrelated to the font weight. HeiTi differes from Ming/Song/Kai in that the beginnings/ends of the strokes are not marked. Sometimes it is also called "Gothic", but this makes no sense.

      They can be with square ends or rounded ends.

      2025-05-08_19-52-45_screenshot.png
      1. WenQuanYi Micro Hei.

      It has square ends. This version is proportional and tries to be faithful with Cyrillic and Latin.

      2025-05-08_19-54-46_screenshot.png
      1. HanWang Hei has rounded endings, and also tries to be faithful to Latin, but has tofu instead of Cyrillic.

      Rounded Simplified Chinese Hei Font does not exist, or I have not found it.

2.2.8. File formats and symbol encoding

  1. Rendering details

    We all know that graphics can be raster and vector.

    Raster images are encoded as a two-dimensional array or field or numbers, each number representing a colour. Raster images are "easy" to make for a photo camera, and for a digital artist, essentially every piece of software allows exporting into raster images.

    Vector images are not even images, they are tiny (and sometimes not at all tiny) programs that "draw" an image as they are executed. In the simplest case the "program" is a mathematical function, and usually executed by a state machine not by a full-fledged Turing machine. In more malignant cases the program is executed by a true programming language.

    Consequently, raster images are easy to create, but are inflexible:

    1. You cannot scale them, as they become distorted when enlarged.
    2. If the original DPI of the computer where the picture was created, does not match the DPI of the target machine, expect bad rendering.

    All of that did not particularly matter in the 90s, when almost all displays had the DPI of 72 pixels per inch. I am not sure there was any agreement on that, it has just happened by itself.

    But in the 2000s already things started to change. 90 dots per inch became a more prevalent resolution, and more and more often we started to see irregular resolutions: 120, 200, and all the way up to 600.

    (Presumably, people do not need anything more than 600 DPI, because most printers, printing on paper, have a physical DPI of 600, and nobody complains. Scanning with a higher DPI does make sense, when you are scanning film.)

    To avoid the issues with raster fonts, where each character is represented by a raster image, people started to create vector fonts. Vector fonts are better than raster in that you can scale them indefinitely, but they have a different problem: fitting mathematical functions to the display grid of pixels. You see, most functions are continuous, not discreet, and most designers who are creating vector images (tiny programs), are drawing the characters with something similar to Bezier curves (which are models of how people draw strokes), which are continuous, and know nothing about pixels and grids. If your DPI is exorbitant, this is not a problem, because a fine DPI approximates a continuous function well enough, but if the DPI is somewhere between 72 and 250, expect rendering artefacts.

    The process of bashing continuous functions into a crude grid is called "hinting". Here the word "hint" comes from the idea that you give hints to the renderer on how to behave in less-than-ideal situations.

    There are two ways to "hint" – manual and automatic, so-called "auto-hinting". Hinting can also negatively affect rendering on high DPI displays.

    Integer hinting is about making font strokes fit the grid of whole pixels, whereas sub-pixel hinting exploits the fact that in real life display pixels are not actually white, and consist of several smaller colourful sub-pixels (red, green, blue). Microsoft Windows "ClearType" is an algorithm of sub-pixel auto-hinting.

    2025-05-09_08-20-40_screenshot.png Integer hinting.

    2025-05-09_08-21-01_screenshot.png Sub-pixel hinting.

    Anti-aliasing is, in some sense, one of auto-hinting algorithms, which is usually applied after normal hinting, to avoid characters having a "stairs" effect. It is not unequivocally good. Insufficient anti-aliasing makes shapes look crude, whereas excessive anti-aliasing makes them look blurry.

    2025-05-09_08-19-06_screenshot.png

    Having three parameters already make very hard to find a point of good-looking fonts.

  2. File formats

    Naturally, since there are raster and vector fonts, there should be file formats for raster and vector fonts.

    1. BDF (.bdf) :: Raster font, black-white, not grey-scale. https://en.wikipedia.org/wiki/Glyph_Bitmap_Distribution_Format
      1. X11 and system storage on my machine do not have bdf fonts
      2. The GNU "intlfonts" package ships a lot of bdf fonts for different writing systems, seemingly, most of them pre-unicode, which means that there is a need for KOI<->Unicode translation to use them. They are most often used as a part of GNU Emacs, when system-wide fonts are not available.
      3. TeX 2023 is shipping bdf files as a part of the babelbib package, but they are not actual bdf fonts.
      4. In short, you can forget about bdf.
    2. PCF (.pcf) :: Raster font, considered to be slightly better than bdf.
      1. GNU intlfonts is shipping a lot of pcf files for Emacs.
      2. x11 by default has quite a few pcf fonts, and they are broken into many files.
    3. PSF (.psf, .psfu, .psf.gz, .psfu.hz) PC Screen Fonts :: https://en.wikipedia.org/wiki/PC_Screen_Font
      1. Font used by Linux Kernel for console fonts.
      2. Shipped by consolefonts, kbd, psftools, and univga-font
      3. Unless you care about Linux console, you can forget about PSF fonts
    4. Type1 (.pfa (ascii), .pfb (binary)) :: Fonts that draw characters with a limited set of PostScript commands.
      1. Older Adobe fonts
      2. Fonts actively used by the TeX project, with a log of stock fonts being distributed as Type1 files.
    5. Type3 (.t3) :: Fonts that draw characters with a full set of PostScript commands.
      1. I have only ever seen TeX using Type3.
    6. TrueType (.ttf) :: The most popular format of vector fonts.
    7. OpenType (.otf) :: A newer than TrueType format of vector fonts.
    8. Metafont (.mf) :: A vector format for generating raster fonts, only used in TeX and not fully compatible with Type1.

    The section 2.2.8.1 mentioned that fonts can be raster or vector. However, the boundary always becomes blurry, for two reasons:

    1. Raster fonts are often generated from vector sources, for example, with Metafont.
    2. Advanced vector font files (otf,ttf), may include pre-rendered, or even completely unrelated pictures for some specific sizes or shapes (usually small scales).

2.3. Software tools

  1. Fontconfig :: Transform a "font request" into a font file and parameters.
  2. Freetype :: Render characters on screen on paper.
  3. Xft :: A library to make X11 use Freetype.
  4. Harfbuzz :: Some ligature-related mumbo-jumbo, but
  5. Font-manager :: A powerful font browser, in some respects better than gucharmap. https://github.com/FontManager/font-manager .
  6. Gucharmap :: A GUI for fonts and characters browsing.
  7. Fontforge :: A font-creation multi-tool.
  8. xgridfit :: A tool to write hinting scripts for fonts.
  9. Metafont :: A TeX-related tool to create fonts programmatically.
  10. Fontaine :: https://www.unifont.org/fontaine/
  11. xlsfonts :: lists fonts available from an X server.

2.3.1. fontconfig

Fontconfig contains utilities for working with font files and properties. It is most often used for translating a font "request", written in an ill-defined format, into a file name and, possibly, a few variation indications, allowing to choose a font from within a file (if a file contains several fonts).

fc-query <filename> will list font details found in the file. fc-match <Font Name> will show file name where a font will be loaded. You can actually feed a kinds of weird crap there:

fc-match badgfsafsdfds

fc-pattern <request> will show how the request is parsed. fc-list shows installed fonts. fc-configlist will show parameters from /etc/fonts/. fc-scan will parse all font files from a directory. fc-list has a nice way to display only fonts which have certain characters. fc-query prints a lot of useful information about a font, in particular, it lists sub-fonts in a big file with many fonts, it is extremely useful. fc-cache caches font info, run it after installing each font.

2.3.2. xlsfonts

xlsfonts lists fonts. mkfontdir creates font cache files (fonts.dir) in font directories.

3. The safest font choice for minimal thinking.

fc-list has a nice way to display only fonts which have certain characters:

characters="abcdefghijklomnopqrstyvwABCDEFGHIJKLOMNOPQRSTYVWабвгдеёжзиклмнопрстуфхцчшщъыьэюя甲乙丙丁機會東紅东方红太阳升"
request_string=""
for (( i=0; i<${#characters}; i++ )); do
  char=${characters:i:1}
  request_string="${request_string}"$(printf '%x' \'"$char")","
done
fc-list ":charset=$request_string" | awk '{print $1;}' | sort -V | uniq | grep -v -E '(Bold|Light|Medium|Thin)'

Ignoring the variations, it seems that the variety of available fonts is very small:

  1. Unifont :: Bitmap and ugly
  2. IBM Plex Sans :: Propotional, Sans, Hei-Square
  3. Hanazono :: Mono, Serif, Ming
  4. LXGW WenKai :: Proportion, Sans-Ming, Kai
  5. LXGW WenKai Mono :: Mono, Sans-Ming, Kai
  6. Google Noto Sans CJK :: Proportiondal, Sans, Hei-Square
  7. Google Noto Sans Mono CJK :: Lying Proportional, Sans, Hei-Square
  8. Google Noto Serif :: Proportional, Serif, Ming
  9. Sarasa Gothic :: Proportional, Sans, Hei-Square
  10. Sarasa Mono :: Mono, Sans, Hei-Square
  11. Sarasa Mono Slab :: Mono, Slab-Serif, Hei-Square
  12. Adobe Source Han Sans :: Lying Proportional, Sans, Hei-Squared
  13. TW Kai :: Proportional, Serif, Kai, Full-width Cyrillic (ugly)
  14. TW Sung :: Proportional, Serif, Ming, Full-width Cyrillic (ugly)
  15. WenQuanYi Micro Hei :: Proportional, Sans, Hei-Square, broken Korean
  16. WenQuanYi Micro Hei Mono :: Mono, Sans, Hei-Square
  17. WenQuanYi Zen Hei :: Proportional, Sans, Hei-Square
  18. WenQuanYi Zen Hei Mono :: Lying Proportional, Sans, Hei-Square
  19. Kurinto TMod (Times) :: Proportional, Serif
  20. Kurinto Seri :: Proportional, Sans, Hei
  21. Kurinto Book :: Proprtional, Sans, Ming
  22. Kurinto Arte :: Proportional, Serif, Ming
  23. Kurinto Mono :: Mono, Sans, Hei
  24. Kurinto Cali :: Proportional, Sans, Hei
  25. Kurinto Text :: Proportional, Serif, Ming

With respect to "looking differently" and being practical:

  1. Hanazono :: Ming+Serif
  2. LXGW :: Kai+Sans
  3. Plex
  4. Noto :: Ming+Serif
  5. Sarasa :: Hei+Sans
  6. Source :: Hei+Sans
  7. WenQuanYi Micro :: Hei+Sans (broken Korean)
  8. WenQuanyi Zen :: Hei+Sans (a bit ugly)
  9. Kurinto :: I discovered it later. Seems a decent choice.

Of those, most look almost identical. (There was some governmental project to standardise Simplified character shapes, most fonts come from there.)

For printing, Kai+Sans looks okay, and thus LXGW wins. For displays, Hei+Sans is a win, and Sarasa wins. Sarasa has Hei+Slab-Serif, but it is mono, print with it, if you dare, it's not too bad, just spaces are a bit wide.

The choices Hei+Serif and Hei-Round are nonexistent. :(

Check for Kurinto again.

3.1. Target software

  1. LibreOffice
  2. TeX
  3. Firefox
  4. Emacs
  5. X11/Fontconfig

LibreOffice, Firefox, Emacs, and Fontconfig can use system-wide fonts in /usr/share/fonts.

LibreOffice does not support Type1 fonts.

Emacs can also use its own fonts.

TeX can use system-wide fonts if called via LuaLaTeX.

\usepackage{fontspec}
\begin{document}
{ \setmainfont{URWGothic-Book.otf}[Path=/usr/share/fonts/OTF/] Your Text! }
\end{document}

4. Different font projects

Even though the following projects claim to be making fonts, they are not making fonts in conventional sense. They are rewriting the same fonts using different generating methods, and often "improving" them.

  1. Knuth and Computer Modern
  2. GUST :: TeX Gyre (https://www.gust.org.pl/projects/e-foundry/tex-gyre) and Latin Modern
  3. STIX :: https://en.wikipedia.org/wiki/STIX_Fonts_project
  4. Sarasa :: https://picaq.github.io/sarasa/
  5. Microsoft Webcore Fonts
  6. Microsoft Asian Fonts Pack
  7. Droid
  8. Roboto
  9. Noto
  10. ParaType PT Fonts
  11. Adobe Source
  12. Adobe PostScript Type 1 Fonts
  13. Liberation
    1. RedHat Liberation
    2. Libertine
    3. Libertinus
    4. Liberastika
  14. Firefox OS (Fira Sans)
  15. Gnome Cantarell
  16. ChromeOS Core Fonts
  17. Ubuntu
  18. EB (Garamond)
  19. DejaVu
  20. URW
  21. Bitstream (Vera+Charter)
  22. Kurinto :: https://kurinto.com/
  23. GNU FreeFont
  24. Hanazono
  25. BabelStone
  26. Iosevka
  27. ShangGu :: https://github.com/GuiWonder/Shanggu
  28. Terminus
  29. LOCALFONTS

5. Fonts for work

Most of these fonts only support Latin, some support Cyrillic, and only, if any, a few support Han.

Here is the list of commonly encountered fonts:

  1. AvantGarde :: Sans, Latin-only
    1. MS Century Gothic
    2. TeX Gyre Adventor :: No Cyrillic
    3. URW Gothic L :: Has Cyrillic
    4. Bauer Futura
  2. Bookman :: Serif
    1. URW Bookman :: Has Cyrillic
    2. TeX Gyre Bonum :: No Cyrillic
  3. Courier :: Serif, Mono
    1. Microsoft Courier New :: Slab-Serif
    2. FreeMono :: Slab-Serif, Has Cyrillic
    3. URW++ Nimbus Mono L :: Slab-Serif, Has Cyrillic
    4. TeX Gyre Cursor :: No Cyrillic Slab-Serif
    5. ChromeOS Crosscore Cousine :: Sans, compatible, actually very different
    6. PT Mono :: Compatible, Has Cyrillic
    7. Kurinto CMod :: Sans
    8. Kurinto CNew :: Serif
  4. Helvetica/Arial :: Sans , default font in Windows 3-ME
    1. Microsoft Arial (almost)
    2. ChromeOS Crosscore Arimo
    3. FreeSans
    4. URW++ Nimbus Sans L :: Has Cyrillic
    5. Tex Gyre Heros :: No Cyrillic
    6. MS Sans Serif
    7. Google Android Roboto (old)
    8. Kurinto Aria
  5. Century Schoolbook :: Serif
    1. MS Century
    2. Tex Gyre Schola :: No Cyrillic
    3. Old Standard :: Has Cyrillic, minor variations
    4. URW C059
  6. Palatino :: Serif
    1. MS Palatino Linotype
    2. URW Palladio (P052) :: Has Cyrillic
    3. TeX Gyre Pagella :: No Cyrillic
    4. MS Book Antiqua :: Has Cyrillic
    5. Domitian
  7. Times New Roman :: Serif
    1. Liberation Serif
    2. Linux Libertine Serif
    3. Libertinus Serif
    4. Localfonts Common-Serif
    5. ChromeOS Crosscore Tinos
    6. FreeSerif
    7. URW++ Nimbus Roman No. 9 L
    8. STIX
    9. XITS
    10. TeX Gyre Termes :: No Cyrillic
    11. PT Astra Serif
    12. PT Astra Sans :: compatible
    13. Kurinto TMod
    14. Kurinto TRom
  8. ZapfChancery :: Serif
    1. TeX Gyre Chorus :: No Cyrillic
    2. URW Chancery L (Z003) :: Has Cyrillic
    3. Monotype Corsiva
  9. Optima :: Sans
    1. Linux Biolinum
    2. Libertinus Sans
    3. Liberastika
  10. Andale Mono/Sans :: Sans
    1. Droid Sans Mono
    2. Webcore Andale Mono
  11. MS Georgia :: Serif
    1. Webcore Georgia
    2. Kurinto Grga
  12. MS Verdana :: Sans
    1. Bitstream Vera Sans
    2. DejaVu Sans
    3. PT Astra Fact
    4. Webcore Verdana
  13. Impact :: Sans, Heavy
    1. Webcore Impact
  14. MS Trebuchet :: Sans, default font in Windows XP
    1. Webcore Trebuchet
  15. MS Tahoma :: Sans, default font in Window 2000, 2003
    1. Wine Tahoma
    2. Webcore Tahoma
  16. Lucida Console :: Sans, Mono
    1. MS Consolas (slightly different i, l, g)
    2. Inconsolata
    3. Computer Modern typewriter
    4. Bitstream Vera Sans Mono :: No Cyrillic
  17. Lucida Sans/Lucida Grande :: Sans
    1. Webcore Lucida Sans Unicode
  18. Frutiger Univers :: Sans
    1. URW Classic Sans
    2. MS Corbel :: Has Cyrillic
    3. Bitstream Vera Sans :: No Cyrillic
    4. Bera Sans :: No Cyrillic
    5. MS Segoe UI :: Sans, default font in Windows 7,8,2008 (technically different)
    6. MS Selawik (technically different)
    7. MS YaHei (Chinese)
    8. Open Sans
  19. Bitstream Vera Serif :: Serif
    1. DejaVu Serif :: Has Cyrillic
    2. TeX Bera Serif :: No Cyrillic
    3. arev
  20. Bitstream Charter :: Slab-Serif
    1. Charis SIL
  21. Gentium Plus :: Serif
  22. MS Calibri :: Sans, default font in MS Office > 2007
    1. Google Carlito
    2. Lato
    3. Computer Modern Unicode Sans
    4. Kurinto Cali
  23. MS Cambria :: Serif
    1. Google Chrome Caladea
    2. Kurinto Bria
  24. [missing] Janson :: Serif, Random House font
    1. <Available implementation missing>
  25. Franklin :: Sans
    1. Libre Franklin :: Has Cyrillic
  26. Knuth Computer Modern :: Serif, Default TeX font
    1. CMU (Computer Modern Unicode)
    2. GUST Latin Modern
    3. New Computer Modern
    4. ML Modern
    5. CM-Super
  27. Clarendon :: Slab-Serif, Wild-West poster font
    1. Montagu Slab :: No Cyrillic
    2. Libre Clarendon :: ?
    3. Kurinto Roma
  28. Ubuntu :: Sans, default Ubuntu font after 10.10
  29. Ubuntu Titling :: Sans, default Ubuntu before 10.10
  30. Cantarell :: Sans, default GNOME 3.0-47
    1. Cambay
    2. Petra Sans
  31. Inter :: Sans
    1. Adwaita Sans :: default GNOME 48
    2. Apple San Francisco :: default MacOS 2015+
    3. New Roboto
  32. Fira :: Sans, default Firefox OS, Iceland government, Deutsche Post
    1. FF Meta
  33. Noto Sans :: Sans
    1. Droid Sans :: Sans, early Android, "low-resolution" font
  34. Noto Serif :: Serif
    1. Droid Serif
  35. PT Sans :: Sans
  36. PT Serif :: Serif
  37. Garamond :: Serif
    1. EB Garamond
    2. TeX garamondx
    3. Adobe Garamond
    4. Monotype Garamond
    5. URW++ Garamond No. 8 :: APL
    6. Apple Garamond :: No Cyrillic
    7. Cormorant
    8. Kurinto Gara
  38. Baskerville :: Serif
    1. Baskervville :: No Cyrillic
    2. Libre Baskerville :: No Cyrillic
    3. Baskerville PT :: Proprietary
    4. TeX Baskervaldx :: TeX only
    5. Cyrillic Version unavailable
  39. Utopia :: Serif
    1. TeX Heuristica :: No Cyrillic
    2. Linguistics Pro :: Has Cyrillic
    3. Localfonts Ezerovo :: Has Cyrillic
  40. Sarasa Gothic :: Sans
    1. Iosevka :: Has Cyrillic
  41. Sarasa Slab :: Slab-Serif
    1. Iosevka Slab/Iosevka Etoile :: Has Cyrillic
  42. Terminus :: Sans, Mono
    1. ax86 Terminus raster
    2. Terminalia vector :: Has Cyrillic
  43. [not demoed] Swiss Type :: Sans
    1. Localfonts Common-Sans
  44. Google Literata :: Serif (specially for ebooks)

In total it is 44 fonts that anybody realistically has a chance of seeing. Frankly speaking, Sarasa is an obscure font, I have added it here for the sole reason of my personal affinity.

6. Fonts with Han

I am not qualified enough to find out which Chinese fonts are equivalent to which, so I will just write down them all. In real life you would be only choosing from among these fonts, because it is the safest choice.

6.4. Hanazono

Hanazono.png

6.10. Kurinto Sans

Kurinto_Sans.png

6.11. Kurinto Seri

Kurinto_Seri.png

6.12. Kurinto TMod

Kurinto_TMod.png

6.13. Kurinto Text

Kurinto_Text.png

6.22. Fandol Hei

Fandol_Hei.png

6.23. Fandol Song

Fandol Song works if you only have a TeX installation, and quickly need to have something done, and do not need diacritics.

Fandol_Song.png

6.25. Fandol Kai

Fandol_Kai.png

7. Fonts for fun

  1. Misc Fixed, X11, XFree86
  2. VGA/DOS
  3. oldschools fonts collection
  4. MS Comic Sans
    1. Webcore Comic Sans
  5. Script/Bad Script
    1. Google Bad Script
  6. Zapfino
  7. Blackletter
    1. Fraktur
    2. Kurinto Olde

7.1. Misc Fixed

This is the default font of X11, XFree86, X.Org.

I have not found how to load an otb file in LuaLaTeX, message me if you have.

2025-05-12_12-05-51_screenshot.png

7.2. univga VGA

Standard VGA and DOS font.

2025-05-12_12-06-33_screenshot.png

7.4. Comic Sans

Comic_Sans.png

7.6. Fraktur ↔ Kurinto Olde

This is the font the King James Bible is published in.

Kurinto_Olde.png