Xterm's woes with Greek letter Pi and box-drawing

The weirdest bug I have ever encountered

This post is archived. Opinions expressed herein may no longer represent my current views. Links, images and other media might not work as intended. Information may be out of date. For further questions contact me.

UPDATE 2019-07-01: I submitted a bug report. Details here.

UPDATE 2019-06-01: Upon further inspection, I am using the following font-related settings, which address the issue discussed herein. Some typefaces might still have minor issues with drawing boxes.

! Font settings
! The font settings address the issue discussed in this blog post:
! https://protesilaos.com/codelog/2019-05-26-xterm-letter-pi-bug/
xterm*faceName: Hack,DejaVu Sans Mono,Monospace
xterm*faceSize: 9.5
xterm*renderFont: true
xterm*boldColors: false
xterm*faceSize1: 8
xterm*faceSize2: 12
xterm*faceSize3: 15
xterm*faceSize4: 18.25
xterm*faceSize5: 20.5
xterm*faceSize6: 25.5
xterm*forceBoxChars: false
xterm*limitFontsets: 3
xterm*scaleHeight: 1.0

Original text below…

Given certain font configuration combinations, the current version of Xterm on Debian ‘buster’ has problems displaying the lower case Greek letter Pi (π). The terminal will print that letter form as a fixed font while keeping everything else as a proportional font. The flow of text breaks.

This behaviour is exhibited with a variety of typefaces (Debian package in parentheses):

  • Hack (fonts-hack)
  • IBM Plex Mono (fonts-ibm-plex)
  • Iosevka
  • Monoid (fonts-monoid)
  • Mononoki (fonts-mononoki)
  • Source Code Pro
  • Ubuntu Mono (fonts-ubuntu-console)

A workaround is to define awkard point sizes when using one of the offending typefaces, such as 10.5, while also tweaking the scaleHeight property. This, however, has an undesirable side effect: it prevents tmux and other applications that draw boxes from creating continuous lines for their borders. Lines appear dashed and, depending on the distance between the dashes (and point size), may exhibit a “halo effect” around them. Lines become blurry and outright annoying to stare at.

DejaVu Sans Mono displays lower case Pi correctly at point size 10 (my preferred choice), but has problems with drawing borders. Box drawing can be fixed by tweaking its size and the scaleHeight property. However, that prevents it from properly drawing Pi.

The only font family that faces no such trade-off is Fira Code, aka fonts-firacode (based on Fira Mono, which is not in the Debian archives). Fira {Code,Mono} prints minuscule Pi (π) in its proper form and draws continuous lines as expected.

All of the above are based on the assumption that forceBoxChars is set to false. Otherwise none of the afore-mentioned typefaces can pass the test.

Modifying the fontconfig rules for aliasing and hinting causes other undesired effects. Besides, it makes no sense to distort all letter forms across the system for Xterm to draw Pi and box lines as expected.

I ultimately do not know what it is specifically about Fira {Code,Mono} that lends to its adaptability in this scenario. I would assume it has to do with the inherent proportions of its hyphen - and column |, though this has not been researched further.