💾 Archived View for tilde.town › ~hush › gemlog › 2024-05-12.gmi captured on 2024-06-16 at 12:36:07. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2024-05-12)

-=-=-=-=-=-=-

An Adventure in Fonts

or, Terminus, my beloved

I've been messing with fonts of late, more than usual. I've always been quick to switch fonts up, eager to swap when I see something new that catches my eye, or when something bugs me about the font I'm currently using. I'm speaking primarily about my terminal emulator here - on my webpage, I just default to "sans-serif" and let folx' browser styles pick a font for them. I think what sparked this was wanting to use vim to write prose, but with a less cramped font. Most terminal emulators force a monospace font, which results in weird character kerning - squished up little m's and w's, wildly expansive l's and i's. Anti-Aliasing is also an issue for some fonts - I was using Hermit recently, for example, and I couldn't manage to set a size that would prevent the center bar on 'e' from having a weird gray underline.

Here's a few things I've tried:

First, running mlterm with a proportional font (Iosevka Aile). mlterm is one of the only terminal emulators with support for proportional fonts, so it's a unique entry. This actually works pretty great - it's what I'm using to write this entry right now - it's by far the best solution to the font "condensation" issues. Every letter has the room it needs to breathe. It does have drawbacks though: it's still anti-aliased, but more importantly, it cannot be used for general terminal use - curses-based GUIs break entirely, and line numbers in Vim cause the paragraphs to be offset by little bits from each other.

In traditional monospace land, I've given a few fonts a try - ProFont has the boxy look I love, but it has a really heavy stroke width. I compiled my own Iosevka to use the expanded width by default and replace some of the overly-curvy characters with their more normal variants, but even the expanded width has really squished up m's and w's. The best one, I think, is Commit Mono. It does a cool thing with ligatures to essentially move narrower letters over when they're next to wide letters, making words a bit more readable while still adhering to monospace. It's a nice compromise, and what I'm using in my main terminal currently.

Another thing I've tried is enabling and using bitmap fonts in URxvt. This is the best solution for removing the blur from anti-aliasing - letters are super clear because the pixels are directly mapped. The trouble with this is that I have a high-ish dpi display, and the biggest bitmap font I could find is terminus 16x32, which is just slightly too small (Spleen has a pixelsize 64 variant, but that's double the size and much too big). Aesthetically, terminus is my favorite font of the ones I've tried, though. So, I decided to try making my own bitmap font in the size I wanted - I used font forge to build a pixelsize 45 font that ended up being too big, so I created doubled-size versions of Tamzen 9x18, terminus 9x18, terminus 10x20, and fixed 9x18. I didn't go through and edit the glyphs to take advantage of the extra pixels, so they look exactly how you'd expect a scaled-up bitmap to look - and for some reason, the 18x36 variant of Terminus doesn't have quite the same magic as the native 16x32 version. hmm.

The work involved in creating a bitmap font for each size has me wondering if it'd be possible to create a script that generates fonts at arbitrary sizes. The BDF font format is, after all, simply plaintext. Perhaps such a script would take as input the bit-width and pixel size, and calculate font sizes from that (cap-height, descender, x-height, etc.). Maybe each letter could be broken down into a series of pieces that are repeatable - p and q are both just 'o' with a descender-bar on the side, for example. I wonder if someone's already done this?