Fonts/Font Switching

From Wiki
< Fonts
Revision as of 19:41, 17 May 2024 by Garulfoo (talk | contribs) (→‎What defines the size in a font?)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

In ConTeXt there are four ways to switch fonts:

Before you start ...

1. Placing a font switch at the beginning of a paragraph can sometimes generate unexpected side-effects. This can be avoided by forcing horizontal mode before any font change:

\dontleavehmode{\bf Warning!} Care must be taken when a font switch is used at the beginning of a paragraph.\par

2. It is usually a bad style to use explicit font switches in the text. It is better to define a semantic command that takes care of the font switching. For example, instead of using {\bf\red important text}

\definehighlight[important][style=bold, color=red]

and then use \important{important text} in the text.

Font styles and alternatives

There are three main types of font styles: serif, sans serif, and teletype. To switch between these styles, use \rm for serif, \ss for sans serif, and \tt for teletype.

Each of these styles comes in different alternatives: normal, bold, italic, slanted, bold-italic, bold-slanted, and small-capped. To switch to a different alternative, use \tf ("typeface") for normal, \bf for bold, \it for italic, \sl for slanted, \bi for bold-italic, \bs for bold-slanted, and \sc for small-capped.

You can generally combine font styles with alternatives, so if you want to switch to bold sans serif, you can use either \bf\ss or \ss\bf. The various combinations look like the following.

A font switch remains valid for the rest of the group. So, if you want to temporarily switch to a different font, use the font style command inside a group. The easiest way to start a group is to enclose the text within braces (also called curly brackets), for example

This is serif text
{\ss This is sans serif}
This is serif again
{\tt and this is typewriter}
And serif again

which gives (notice the braces in the above lines)

Emphasizing text

There is a font switch \em to emphasize text. This is somewhat special: it does automatic italic correction and changes the alternative depending on the current alternative. For example, if the current font alternative is normal (i.e. upright), \em switches to slanted; and if the current font alternative is slanted, \em switches to normal.

ConTeXt uses the Latin Modern fonts by default; these fonts look similar to the original Computer Modern fonts, but have a much larger character repertoire. As it happens, in the Latin Modern (and Computer Modern) fonts, the slanted font does not stand out from the upright font enough for some tastes; so, many people prefer to use the italic font for emphasis. To do that use


NOTE: For Opentype fonts, italic correction needs to be set using

Font sizes

Occasionally one needs to use a font size different from the bodyfont. ConTeXt provides two series of commands for that. For a larger font size, you can use \tfa to scale the font size by a factor of 1.2, \tfb to scale by a factor of (1.2)^2 = 1.44, \tfc to scale by (1.2)^3 = 1.728 and \tfd to scale by (1.2)^4 = 2.074. The scale is relative to the current bodyfont size.

To decrease the font size, you can use \tfx to scale the font by a factor of 0.8 and \tfxx to scale by a factor of 0.6.

The complete set of relative font sizes are listed below:

size factor 4pt 5pt 6pt 7pt 8pt 9pt 10pt 11pt 12pt 14.4pt 17.3pt 20.7pt
xx 0.6 4 5 5 5 5 5 6 7 8 10 12 14.4
x 0.8 4 5 5 6 6 7 8 9 10 12 14.4 17.3
tf 1.0 4 5 6 7 8 9 10 11 12 14.4 17.3 20.7
a 1.2 4.8 6.0 7.2 8.4 9.6 10.8 12.0 13.2 14.4 17.3 20.7 24.8
b 1.44 5.8 7.2 8.6 10.1 11.5 13.0 14.4 15.8 17.3 20.7 24.9 29.8
c 1.728 6.9 8.6 10.4 12.1 13.8 15.6 17.3 19.0 20.7 24.9 29.9 35.8
d 2.074 8.3 10.4 12.4 14.5 16.6 18.7 20.7 22.8 24.9 29.9 35.9 42.9
scriptscript 0.5 4 5 5 5 5 5 5 6 7 9 10 12
script 0.7 4 5 5 6 6 7 7 8 9 11 12 14.4
small 0.8 4 4 5 5 6 7 8 9 10 12 14.4 17.3
big 1.2 6 7 8 9 10 11 12 12 14.4 17.3 20.7 20.7

As defined in font-ini. All sizes in pt, except factor.

The mapping of particular command suffixes (a, x, etc.) and current bodyfont size to effective font size can be changed by \definebodyfontenvironment. The default values defined in font-ini are:

  [        \s!text=1.0,
                 *=\currentfontscale, % wildcard

N.B.: script and scriptsize are used in math mode.

It is also possible to set the scaling factors for specific font sizes. For example, if you want \tfa to set the effective font size to 12pt when the bodyfont size is 10pt, and to set the effective font size to 14pt when the bodyfont size is 11pt, then add

\definebodyfontenvironment [10pt] [a=12pt]
\definebodyfontenvironment [11pt] [a=14pt]

Note: When the first parameter is default, the scaling factors must have numerical values. When the first parameter is a font size (e.g., 12pt), the scaling factors can either be numerical value or a dimension.

\definebodyfontenvironment is described in detail in the ConTeXt manual and the font-ini source file.

Font size can be combined with font styles. As a shortcut, you can use \bfa to get bold font scaled by 1.2, \bfx to get a bold font scaled by 0.8 and similar commands for other font styles.

These quick font switches are meant for changing the font style, alternative, or size of a few words: they do not change the bodyfont, so they don't affect interline spacing or math font sizes. So, if you want to change the font size of an entire paragraph, use \switchtobodyfont described below in Complete font (bodyfont) change.

These caveats also hold when the font switches are used as style directives for style=... in any setup command that accepts style option. For example, if you are defining a block quote environment that uses a smaller font size, instead of


you should use


Note however that \setupinterlinespace is added automatically for section heads, so


works correctly.

Mnemonic font switches

While learning a document markup language like ConTeXt, it can be hard to remember all the commands. ConTeXt provides other, easy-to-remember font switches. So for bold you can use \bold, for italic you can use \italic, for slanted you can use \slanted, and so on. You can probably guess what the following do:

\normal \slanted
\boldslanted \slantedbold
\bolditalic \italicbold
\small \smallnormal
\smallbold \smallslanted
\smallboldslanted \smallslantedbold
\smallbolditalic \smallitalicbold
\sans \sansserif
\sansbold \smallcaps

In addition, the commands \smallbodyfont and \bigbodyfont can be used to change the font size. The relative size depends on the value of big and small in \definebodyfontenvironment.

These mnemonic font switches are pretty smart. You can either use them as font style switches inside a { group }, or as a font changing command that takes an argument. For example,

This is {\bold bold} and so is \bold{this}. But this is not.

These mnemonic font switches can also be used for all style=... options, and while using them as style options, you can just give the command name without the backslash. For example:


(\boldface shown above is also defined to parallel the \typeface and \swapface switches.)

Capitalizing words

  • Note that \WORD, \Word and all following macros aren't switches, but commands (brackets behind, not around): {\em switch}, vs \Word{macro}.

Underline, strike through, and overline

The canonical way is \overstrike{text}. However, it you're using mycrotypography with \setupalign[hz,hanging] expect the rule to be placed over the character (with the Latin Modern fonts you should not have this problem, experienced with Linux Libertine and mkiv). This is not what is expected. The workaround is to put the overstriked text in a \inframed[frame=off]{}.


bla bla bla \inframed[frame=off]{\overstrike{striked}} bla bla

Disabling mycrotypography also works, but probably not desiderable.


Complete font (bodyfont) change with \switchtobodyfont

If you need to change to a different font size and take care of interline spacing, you can change the bodyfont by using \switchtobodyfont. For example, to switch to 12pt you can use \switchtobodyfont[12pt].

ConTeXt provides two relative sizes, called big and small. So, to increase the bodyfont size, use \switchtobodyfont[big] (or \setbigbodyfont), and to decrease the bodyfont size, use \switchtobodyfont[small] (or \setsmallbodyfont). The exact size used for big and small can be set using \definebodyfontenvironment.

The \setupbodyfont command accepts all the same arguments as \switchtobodyfont. The difference between the two is that \setupbodyfont also changes the font for headers, footers and other page markings, while \switchtobodyfont does not. So you should use \setupbodyfont for global font definitions to apply to the whole document, and \switchtobodyfont for local font changes (i.e. changes to the running text only). The effect of \switchtobodyfont can be localized within a group as usual.

Switching typefaces

So far we have discussed style and size changes within a given typeface family. If you want to use a different typeface altogether, such as Times or Palatino, use \switchtobodyfont[times] or \switchtobodyfont[palatino]. Here times and palatino refer to the name of the typescript definitions for the font. ConTeXt distribution comes with some pre-defined typescripts; if you want to switch to another font, you need to define your own typescript. For details, see the page on fonts.

From font-var.mkvi [1]

% fontclass       % modern dejavu
% fontbody        % ... 10pt 11pt 12pt ...
% fontstyle       % rm ss tt mm hw cg ...
% fontalternative % tf bf sl it bs bi sc ...
% fontsize        % a b c d ...
% fontface        % 0=normal 1=text 2=script 3=scriptscript 4=x 5=xx (math are temporary)

class: \fontclass

body : \fontbody

style: \fontstyle

alternative: \fontalternative

size: \fontsize

face: \fontface

What defines the size in a font?

  • This page is based on Taco's explanation in the list [2018-12-19].

The font designer decides on the ‘natural’ size of the font

There are two parts to this:

  • What the ‘natural’ size indicates.

First, what the ‘natural’ size indicates is the designer’s _intended use size_ for the font, such that when you plan to use the font “Times-Roman” without any special rescaling, it should in fact be equivalent to “Times-Roman at ’natural size’”.

For most fonts, this ‘natural size’ is 10 pt, but special display or footnote fonts may have a different intended use size, and the font designer may have made special glyph adjustments for that purpose. For example, the computer modern family has special fonts with a ‘natural’ size anywhere between 5 pt and 17 pt.

The glyphs in the specific fonts with a smaller ‘natural’ size (like 8 pt) are in fact a little bit bolder and wider than the same glyphs in the font designed to be used at 10 pt. This makes sense when you consider that the 8 pt font is likely be used along with the 10pt font for e.g. footnotes. The 10 pt font used at 8 pt size would look thinner and weaker than the actual font designed for 8 pt.

  • What the ‘design’ size indicates.

Second, a design size in points like ‘10 pt’ is somewhat misleading, because what it actually is, is just a different way of saying “at the expected size for traditional main text”. The “10 pt" is notf necessarily a measure of _anything_ in the font. In fact, font designers sometimes do not use a “XX pt” design size at all. The Minion font family has fonts with names like "Minion Pro Caption" and "Minion Pro Display”, which is actually a better indication of the information the font designer wants to convey.

That leaves the question of what the actual size is of a font used at “10 pt”. As explained above, there are no hard rules. But usually for a modern font the “10 pt" is the _vertical_ space needed to enclose all of the ascenders and descenders in the font when all the glyphs are overlaid on top of each other. Traditionally, this was also the with of an ‘em’, going back to the Roman era, where inscribed text fitted characters into a square. But these days that is no longer always the case, since some font families have condensed or extended members (and it really only applied to ‘upright’ fonts anyways).

If two fonts have the same size, is a dimension which has the same length in both. Which one is this?

No, there is no such thing. "TeX Gyre Bonum and TeX Gyre Adventor at twelve point” really only means this:

 "TeX Gyre Bonum at a somewhat larger size than the TeX Gyre Bonum designer
 intended and TeX Gyre Adventor at a somewhat larger size than the TeX Gyre
 Adventor designer intended."