UW ttyp0: A Multiscript Monospaced Screen Font Family for X11 and the Linux and BSD Console

Introduction

UW ttyp0 is a family of monospaced bitmap fonts. It covers most of the Latin and Cyrillic alphabet, Greek, Armenian, Georgian (only Mkhedruli), Hebrew (without cantillation marks), Tifinagh, Thai, most of IPA (but no UPA), Braille, standard punctuation, common symbols, some mathematics, line graphics and a few dingbats.

A monospaced bitmap font is obviously a bit of a dinosaur. I started to work on the ASCII part of the 8x15 size in 1992 because I was dissatisfied with the ugly misc-fixed fonts that came with X11; later more sizes, styles and characters were added (with very long breaks in between). The fonts are primarily intended for those old-fashioned computer users who still do most of their work using old-fashioned terminal emulator programs (like me): for programmers, system administrators, and Unix power users. It's a workhorse – it's supposed to “look perfectly normal”, or at least, as normal as possible given the constraints of multiscript monospaced bitmap fonts. It's not supposed to be fancy, or cool, or to attract any attention to itself.

Sizes and Styles

UW ttyp0 comes in thirteen sizes (6x11, 6x12, 7x13, 7x14, 8x15, 8x16, 9x17, 9x18, 11x22, 14x30, 18x40, 28x60, 36x80). In all of the sizes there are regular and bold versions; for 8x15/16, 9x17/18, and 14x30, 18x40, 28x60, and 36x80, there is also an italic. (Due to the relationship between character height, character width, stroke width, and inter-character space, italics do not really fit for the other sizes.) For Hebrew, italics are replaced by semi-bold. The regular styles (except for 11x22) and the 14x30/18x40/28x60/36x80 bold are sans-serifs with mostly constant stroke width, with the obvious exception of some very narrow letters, such as I, J, i, j, where serifs are unavoidable in a monowidth font.

The 28x60 and 36x80 fonts are obtained from the 14x30 and 18x40 fonts by naive scaling using bdfresize. These fonts are intended only for high resolution displays. At low resolutions, they are noticably blocky.

The bold styles (except for 14x30/18x40/28x60/36x80) and the 11x22 regular have varying stroke width and they are hybrid serifs (there are serifs on the horizontal strokes, but usually none on the vertical strokes). This is unorthodox, but a consequence of the low resolution bitmap: A constant stroke width of 2px would be much too dark for an 8x16 or 9x18 font, so alternating between 1px strokes and 2px strokes is the only choice. But then the contrast between thin and thick strokes is so large that serifs on the thin (horizontal) lines become necessary for compensation. On the other hand, for most letters, there is not enough horizontal space to put decently looking serifs on the verticals. The form of the serifs (slab or wedge) is uniform within one size/style, but varies between different font sizes in order to create the right text color. For Hebrew, both horizontal and vertical lines are boldened – if only the horizontal lines were boldened, they would appear too light compared to the other scripts.

There are some spots in the bold fonts where I deviated from the conventional distribution of thick and thin strokes. Examples include the right leg of capital “U”, where a 1px stroke would have been too thin for my taste, and the crossbar of capital “Д, where a 1px stroke would not have been sufficiently visible. I've also used thick strokes for the extenders of some lowercase Armenian letters, such as “գ”, “դ”, “ռ”, in order to compensate for the fact that there was not enough space to make these strokes sufficiently long.

Script-specific Issues

UW ttyp0 uses a relatively large x-height. For Latin and Cyrillic, this should improve legibility; I hope that it's still acceptable for Greek. For Armenian and Georgian, the x-height is reduced a bit; it is still larger than it should be in a monoscript font, but in a multiscript font, reducing it even more would be problematic.

The odd sizes (6x11, 7x13, 8x15, 9x17) of UW ttyp0 are derived rather mechanically from the corresponding even ones (6x12, 7x14, 8x16, 9x18), usually by deleting the lowest pixel row. For the Latin, Cyrillic, Greek and (unpointed) Hebrew script, this means that the vertical space between two lines is reduced by one pixel, so it is rather unproblematic (except for languages with a very high frequency of accents). The Georgian and Armenian letters in UW ttyp0, however, have longer descenders, so in these alphabets there is an actual compression of the letter shapes. The results are not optimal. For pointed Hebrew, Georgian, Armenian, and of course Thai, I'd strongly recommend the even-sized versions.

The Thai font is somewhat experimental – a 6x12 matrix is not really sufficient for Thai, and even the 9x18 and 11x22 versions would benefit from some additional vertical space. Moreover, UW ttyp0 is a bdf font and the bdf format does not provide means for proper positioning of floating accents, so Thai vowel signs and tone marks are implemented by naive overprinting. The results are obviously not optimal. Contextual variants of vowel signs and tone marks are provided in the Private Use Area (both using the Windows XP encoding at U+F700-U+F71A and using the MacOS encoding at U+F884-U+F89E); if applications are able to make use of these, the output looks better. The overprinting problem also affects the display of combining accents (which are necessary for many non-European languages) and Hebrew vowel marks.

Dubious Design Decisions


Uwe Waldmann <uwe@mpi-inf.mpg.de>, 2025-09-08.