Full justification with typewriter font

In a typewriter font aka monospaced font each character is given the same width. Monospaced fonts are frequently used by programmers to increase the readability of source code, but long text passages with monospace typeface are considerably less readable than those with variable-width fonts.

The space between words is fixed too, that prevents justification, and hyphenation may be disabled too. That’s useful for presenting source code, but sometimes a typewriter font is wanted but justification is required. This post will give some information how to fulfill that. We will use the Computer Modern Typewriter font (cmtt) you get by default when using \ttdefault, \ttfamily, \texttt.

The following code prints some of the font properties:

\documentclass[a4paper,10pt]{article}
\renewcommand*\familydefault{\ttdefault}
\begin{document}
\begin{description}
  \item[slant] \the\fontdimen1\font
  \item[interword space] \the\fontdimen2\font
  \item[interword stretch] \the\fontdimen3\font
  \item[interword shrink] \the\fontdimen4\font
  \item[extra space] \the\fontdimen7\font
  \item[xspaceskip] \the\xspaceskip
  \item[hyphenchar] \the\hyphenchar\font
\end{description}
\end{document}

The font cmtt10 is used, the result is:
slant 0.0pt
interword space 5.24995pt
interword stretch 0.0pt
interword shrink 0.0pt
extra space 5.24995pt
xspaceskip 0.0pt
hyphenchar -1

The space between words is 1em, the same is valid for the extra space following the end of a sentence. Zero stretch and shrink means the space between the words will always be 1em. The hyphenchar is set to -1, that’s why hyphenation is disabled. Let’s look how a normal text is set when typewriter is used:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\renewcommand*\familydefault{\ttdefault}
\begin{document}
\section{Test}
\begin{minipage}{0.7\textwidth}
\blindtext
\end{minipage}
\end{document}

Output:

monospace typewriter (\ttfamily) flush left

To get justification I just modify some of the font parameters above, that the spaces may be stretched and shrinked. I use the everysel package to ensure that my changes are applied every time the font is selected. Further I set the \hyphenchar to the – symbol.

\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{everysel}
\renewcommand*\familydefault{\ttdefault}
\EverySelectfont{%
\fontdimen2\font=0.4em% interword space
\fontdimen3\font=0.2em% interword stretch
\fontdimen4\font=0.1em% interword shrink
\fontdimen7\font=0.1em% extra space
\hyphenchar\font=`\-% to allow hyphenation
}
\begin{document}
\section{Test}
\begin{minipage}{0.7\textwidth}
\blindtext
\end{minipage}
\end{document}

This is the justified result:

monospace typewriter (\ttfamily) justified

We get full justification and a good grayness of the paragraph. One line shows that hyphenation is active though it was rarely necessary.

This topic was discussed on CQF.info. In the LaTeX Community Forum we talked about similar issues with font dimensions.

14. May 2008 by stefan
Categories: Fonts and Symbols, plain TeX | 11 comments

Comments (11)

  1. Is it possible to set monospaced text accross a vertical grid? I mean, achieving a faithful typewriter effect, in which all horizontal spaces are integer multiples of 1em making all letters fit vertically?

  2. How would this be used without familydefault? I like the look it provides, but I only use typewriter fonts to refer to programming constructs.

  3. Hi Matt,

    you don’t need \familydefault. Have a look at this example, demonstrating it just for a part of the text, surrounded by normal font:

    \documentclass{article}
    \usepackage[english]{babel}
    \usepackage{blindtext}
    \begin{document}
    \section{Test}
    \blindtext
    \bigskip
    \begin{center}
    \begin{minipage}{0.7\textwidth}
    \ttfamily
    \fontdimen2\font=0.4em
    \fontdimen3\font=0.2em
    \fontdimen4\font=0.1em
    \fontdimen7\font=0.1em
    \hyphenchar\font=`\-
    \blindtext
    \end{minipage}
    \end{center}
    \bigskip
    \blindtext
    \end{document}

    Stefan

    • The effect of above is imposing, what would the tex variant be, experimented with \space and \xspace but no real result, as \rightskip 0em, nothing on the topic. And took the easy road by using latin-modern proportional font.

  4. My issue is that I like to change fonts only for selected words or phrases within a paragraph. These monospaced words often hang off the end of my otherwise fully justified text. Do you know a solution for this issue?

  5. Hi Nick,

    take care of proper hyphenation. It may be that those words aren’t hyphenated because of the way they are written. Justification can still happen with real monospaced words in a line because the remaining line can be adjusted.

    Stefan

  6. Pingback: Transkription in LaTeX unter Ubuntu | Mythopoeia 2.0

  7. Awesome! I’ve been looking everywhere for this. Thank you so much.

  8. Hi stefan,

    Thanks a lot.

    Bala S

  9. Very useful.

    I wonder if it is possible to remove stretching.

    This is my use case scenario: composing plain text messages.

    I would like to benefit from the sophisticated hyphenation and
    stretching algorithms in TeX, but really spaces are stretchable
    only by integer multiples.

    The next step is to introduce microtipography.

    Hopefully I can get somewhat close without needing to code
    this by hand =)

    Any ideas or references?

  10. Waouw,

    thank you very much for this.

    I enocuntered no problems with this solution.

Leave a Reply to Stefan Kottwitz Cancel reply

Required fields are marked *