How can I make a font monospaced?


Suppose that I have a font in a modestly popular format (.ttf, .otf, etc.), and I have the legal rights to modify it. As it stands, it is a normal font with different charaters (glyphs?) varying in widths and spacings. How would I go about turning said font into a monospaced font (e.g. all characters are same dimensions, etc.)?

If possible, are there any automated tools that can do some of the guesswork for you? (The results don't have to be perfect.) The font may be large (many characters), and editing it could be tedious.

Any suggestions on the problem are much appreciated! :)

Disclaimer: Sorry if this is considered a simple howto, but Google has very little information on the subject, and for a programmer that doesn't deal with graphics or fonts much, it sure isn't simple. Also, sorry if my terminology is off... :P

9/24/2012 11:14:00 PM

If you don't already have any font editing software, the good news is that Fontforge is free and open source. The bad news is that it has a relatively high learning curve and a somewhat unusual user interface.

Basically, for a font to be considered monospace, every glyph has to be the same width, right down to the exact same number of units. This includes even glyphs that should normally be zero width, or a certain width (such as em spaces, em dashes, etc).

See the FAQ entry "How do I mark a font as monospaced?"

To actually edit the width of all glyphs at once in a batch, you can just go to "Metrics" -> "Set Width" on the menu, but I wouldn't expect it to work for all characters. You'll probably have to manually edit all the wide characters such as 'W', 'M', '@', etc so they don't end up overlapping. And combining diacriticals (accents intended to be "combined" with letters at render-time) may have all their positions messed up (which is hard to test if you're American/English and you almost never use them).

A person who knows how to create and edit fonts would be able to do this task but it still wouldn't be straightforward.

9/24/2012 11:59:00 PM