Metafont
Metafont is a description language used to define raster fonts. It is also the name of the interpreter that executes Metafont code, generating the bitmap fonts that can be embedded into e.g. PostScript. Metafont was devised by Donald Knuth as a companion to his TeX typesetting system.
One of the characteristics of Metafont is that the points defining the shapes of the glyphs—for example top of a stem, or intersection of a stem and crossbar—are defined with geometrical equations; the intent that the three stems of an ‘m’ are equally spaced horizontally might be expressed as if points 1, 2, and 3 are at the bottom ends of the three stems, whereas the intent that they all end on the same vertical position would be. Another characteristic is that Metafont is a macro language, where operations such as "draw a lower case top of stem serif at point 4" might appear as one macro instruction in the program for a letter. For describing shapes, Metafont has a rich set of path construction operations that mostly relieves the user of having to calculate control points. Finally, many families of Metafont fonts are set up so that the main source file for a font only defines a small number of design parameters, then calling a separate source file common for a whole range of fonts to actually draw the individual glyphs; this is the meta aspect of the system.
Modes of operation
Metafont is most often run as a helper to output device drivers; in those cases, its job is to generate bitmaps for a font for a specific combination of output device and resolution. These bitmaps are typically stored for later reuse, so that Metafont does not have to be run every time a document is displayed, but on the other hand TeX distributions with a Metafont component have typically not included any prebuilt bitmap fonts, since they would be rather large in comparison to the sources from which they could be generated. Since Metafont fonts were traditionally the TeX default from which other font formats were exceptions, an incomplete installation of a non-Metafont font can sometimes result in Metafont being called and emitting a confusing "somefont.mf not found" error message.Equally important, but not as common, is running Metafont to generate a font metric file; a TFM file is only generated if the fontmaking variable is positive. Traditionally TeX distributions have often come with all TFM files pregenerated, but someone installing a Metafont font from sources will have to generate its TFM file before TeX can use it.
A third way of operating Metafont is proof mode: if the proofing variable is positive then the bitmap font file also contains additional information provided via
special
commands, in particular the positions and names of points the font designer considered important for the design. If using the separate gftodvi
utility to generate enlarged images of the font glyphs, this information from specials is included; point positions are not limited to pixel resolution.Metafont can also be run interactively, and has commands for displaying on the screen the images it produces. Knuth has said that he uses Metafont as a kind of desk calculator for solving complicated equations, though he now uses MetaPost for mathematical illustrations.
Metafont can render any kind of graphical output, not just glyphs. However, MetaPost and Asymptote are preferred for mathematical illustrations. Metafont is most commonly invoked without a direct request from the user. DVI files can only contain references to typefaces, rather than the sets of raster or vector glyphs that other formats like PostScript allow. Consequently, the glyphs in the typefaces need to be accessed whenever a request is made to view, print or convert a DVI file.
Output files
Metafont outputs several kinds of files: for a file called NAME.mf, it can output:- NAME.NNNNgf – File with raster output at resolution NNNN.
- NAME.tfm – File with TeX font metric information, which is the information TeX needs. Usually metafont has to be told to generate this file.
- NAME.log – Log file output from processing
In the TeX Directory Structure standard, filenames are limited to 8+3 characters, so GF and PK files would only have extensions
.gf
and .pk
. Files for different resolutions are kept apart by placing them in separate directories, named dpi
NNNN, e.g. dpi300/cmr10.pk
.Language
The Metafont language is an interpreted language for programs that are essentially declarative rather than imperative.Variables and equations
Variables in Metafont can be of eight different types:- Numeric: fixed-point signed numbers with an epsilon of, capped to be less than 4096. This is the default for variables not declared to be of another type.
- Pair: a pair of numerics, used primarily for representing points in the plane.
- Path: as in PostScript/PDF/SVG, a parametric curve in the plane whose coordinate functions are piecewise cubic polynomials. As in those other systems, path segments are encoded as Bézier curves in terms of knots and control points.
- Transform: an affine transformation of the plane, equivalent to a " matrix" in PostScript/PDF.
- Pen: a convex polygon, representing the shape of a "pen" used for drawing.
- Picture: a raster image with a signed integer value for each pixel.
- Boolean
- String
Unusually, the names of variables are not simple tokens, but sequences of symbolic tokens and numeric indices; the variable name
x2r
is thus not one alphanumeric token, but a sequence of the three tokens x
, 2
, and r
. Record and array types may be simulated through collections of variables that share a common name prefix, an idiom supported by the type declaration system giving all variables whose names which differ only in numeric indices the same type while keeping variables whole name differ in some symbolic token separate.A very distinctive feature of Metafont is the use of equations to define variables. A numeric variable may be in the three states known, unknown independent, and unknown dependent. When Metafont executes an equation statement, it turns one of the independents involved into a dependent and eliminates it from the expressions for all other dependents; when no independents remain in the expression for a dependent variable, that variable becomes known. Solving linear equation systems thus is a built-in feature of the Metafont language, and the recommended method of assigning most variables is to state equations determining their values. Equation systems frequently mix numeric equations with pair equations.
An exception to the above is the class of internal quantity variables. These have names consisting of just one symbolic token, are always numeric, and are always known. They have a more direct internal representation than ordinary variables, making it convenient for primitive operations in Metafont to use them implicitly.
Syntax
Metafont has numeric and string constant tokens with mainstream syntaxes; strings are delimited by"
quotes, numeric constants can have decimals but not an exponent part. All other tokens are classified as symbolic, and can be redefined arbitrarily; there is no restriction that tokens with certain meanings must have names consisting of certain characters. At runtime, there can additionally be capsule tokens, which are effectively constant value tokens of arbitrary type; in the source code those appear as symbolic tokens.Except where characters are involved in numeric or string constants, the extent of the token containing a particular character depends on to which class the character belongs; unlike TeX, Metafont has fixed character classes. The characters
,
, ;
,
are "loners" and only form single character tokens. For the character classes <=>:|
, ‘’
, +-
, /*\
, !?
, #&@$
, ^~
,
,
, and .
, as well as the class of underscore together with upper and lower case A–Z, the token consists of the longest consecutive sequence of characters from the same class. Whitespace characters don't contribute tokens. %
starts a comment lasting until end of line.A notable application of these rules is that
#
is frequently appearing as part of variable names in Metafont code, e.g. em#
and pt#
.Delimiters do not have built-in meanings, instead there is a command that turns two symbolic tokens into a pair of matching delimiters, but normally Metafont programs use only the ordinary parentheses. Besides to override priorities in expressions, delimiters are also required around certain kinds of macro arguments.
Graphics
Curves in Metafont are defined as cubic splines rather than quadratic, for greater versatility at the cost of more complex arithmetic.Unlike more common outline font formats, a Metafont font is primarily made up of strokes with finite-width "pens", along with filled regions. Thus, rather than describing the outline of the glyph directly, a Metafont file describes the pen paths. Some simpler Metafont fonts, such as the calligraphic mathematics fonts in the Computer Modern family, use a single pen stroke with a relatively large pen to define each visual "stroke" of the glyphs. More complex fonts such as the Roman text fonts in the Computer Modern family use a small pen to trace around the outline of the visual "strokes", which are then filled; the result is much like an outline font, but with slightly softened corners defined by the pen shape.
Since the font shapes are defined by equations rather than directly coded numbers, it is possible to treat parameters such as aspect ratio, font slant, stroke width, serif size, and so forth as input parameters in each glyph definition. Thus, by changing the value of one of these parameters at one location in the Metafont file, one can produce a consistent change throughout the entire font. Computer Modern Roman illustrates many uses of this feature; a typical TeX installation includes a number of versions of the font in sizes from 5pt to 17pt, with the stroke widths the same in all sizes and aspect ratios widening in the smaller sizes for increased legibility. In addition, the Computer Modern typewriter and sans-serif fonts are defined using essentially the same Metafont file as the Roman font, but with different global parameters.
Use
While well-known type designers, such as Hermann Zapf, have collaborated with Knuth to create new fonts using Metafont, the system has not been widely adopted by professional type designers. Knuth attributes this to the fact that"asking an artist to become enough of a mathematician to understand how to write a font with 60 parameters is too much." Jonathan Hoefler commented that the Metafont system ultimately became "a technology behind zero of your favourite fonts...Knuth's idea that letters start with skeletal forms is flawed."
The Metafont system allows fonts to be processed in unusual ways; in 1982 Knuth showed how it could be used to morph fonts, with a serif font slowly transitioning into a sans-serif design over the course of a text.
History
started work on font creation software in 1977, and produced the first version of Metafont in 1979. Due to shortcomings in the original Metafont language, Knuth developed an entirely new Metafont system in 1984, and it is this revised system that is used today; Metafont has a versioning system similar to that of TeX, where the number asymptotically approaches e with each revision.Example
The following example creates a closed beanlike shape for the character "B" of a font:%file name: beta.mf
%mode_setup;
% Define a beanlike shape for the character B
beginchar;
% Setup coordinates as an equation system
y1=y2=y3=0;
y4=y5=y6=h;
x1=x4=0;
x2=x5=w;
x3=x6=2*w;
% Define pen
pickup pencircle xscaled 0.2w yscaled 0.04w rotated 45;
% Draw the character curve
% z1 is the same as
draw z1..z3..z6..z5..z4..cycle;
endchar;
end
This yields the following glyph:
The above example will be processed with a command line such as:
gftopk beta.600gf beta.600pk
Then it can be used in a LaTeX file such as :
\documentclass
\newfont
\newcommand
\begin
Let's try having a strange \otherbeta\ here.
\end
The resulting PDF file should look like this:
Producing PostScript Type 1 fonts
There are several tools for converting Metafont programs to PostScript Type 1 fonts. Most make use of MetaPost's ability to convert a subset of Metafont's language into EPS outlines, which can subsequently be converted to PostScript Type 1 fonts. Generating vector outlines of Metafont pen strokes is nontrivial, as the Metafont model of a glyph is a raster image and the exact outlines of most strokes are not Bézier curves.- The Polish JNS team developed METATYPE1 for creating PostScript Type 1 fonts. Its big disadvantage is that no pens may be used which highly reduces the power of Metafont language. Initially, tool has been used by the Polish GUST typeface foundry to produce a modernized and extended variant of Computer Modern, called Latin Modern.
- mf2pt1, which is also based on Metapost, was developed by Scott Pakin with some contributions from Werner Lemberg. It also has several limitations detailed in its manual, the most significant one being the restriction that each glyph must be drawn entirely from closed paths. In order to overcome the limitations of mf2pt1, the EPS output by Metapost can be post-processed with FontForge, which is capable of interpreting complex PostScript paths generated by Metapost from Metafont's elliptic pens, and also capable of removing contour overlaps. Since FontForge supports scripting, this post-processing step can also be automated. This approach was used to produce Type 1 outlines for the MnSymbol mathematical font developed by Achim Blumensath; MnSymbol was designed as a companion to Minion Pro.
- MetaFog is a proprietary converter that can analytically convert pen strokes, but it requires manual post processing to eliminate degenerate cases, and it is not publicly available. It can process only Metapost output.