summaryrefslogtreecommitdiff
path: root/dviware/driv-standard/level-0/tfm.tex
blob: ef0ed2d41722332210813c0d7f936a592bb9d032 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
% $Id: tfm.tex,v 3.1.1.1 1991/08/08 16:04:39 schrod Released schrod $
%------------------------------------------------------------
% taken from TFtoPL 3.1

%
% definition of TFM format
% LaTeX markup
%


% $Log: tfm.tex,v $
% Revision 3.1.1.1  1991/08/08  16:04:39  schrod
% CHANGES BY DON HOSEK:
%  -- Inserted \subsection's.
%  -- Deleted WEB defines.
%  -- `e.g.' now in italics, to be consistent with the rest of the
%     standard.
%
% CHANGES BY JOACHIM SCHROD:
%  -- Changed \bigbreak between WEB sections to \medbreak.
%  -- Added + signs to length specifications in \cmd tags, to show that
%     the param is signed.
%  -- Make formulas look more `math-like' and less `Pascal-like.'
%  -- Reformatted table of TFM header to fit in a TUGboat column. The
%     same with the definition of the |lf| entry.
%
% Revision 3.1  1990/11/15  17:51:05  schrod
% corrected comment which explains where this text comes from.
% (TFtoPL 3.1 instead of VFtoVP 1.0). Updated version number accordingly.
%
% Revision 1.0.1.1  90/07/16  00:00:00  schrod
% appended \endinput.
% 
% Revision 1.0  90/07/04  00:00:00  schrod
% Initial revision
% 



\section{Font metric data}
\label{tfm-format}

\subsection{Introduction}

The idea behind \str{TFM} files is that typesetting routines like
\TeX\ need a compact way to store the relevant information about
several dozen fonts, and computer centers need a compact way to store
the relevant information about several hundred fonts. \str{TFM} files
are compact, and most of the information they contain is highly
relevant, so they provide a solution to the problem.

The information in a \str{TFM} file appears in a sequence of 8-bit
bytes. Since the number of bytes is always a multiple of 4, we could
also regard the file as a sequence of 32-bit words; but \TeX\ uses
the byte interpretation, and so do we. Note that the bytes are
considered to be unsigned numbers.



\subsection{Summary of {\tt TFM} files}

\subsubsection{The header}

The first 24 bytes (6 words) of a \str{TFM} file contain twelve
16-bit integers that give the lengths of the various subsequent
portions of the file. These twelve integers are, in order:
 %
 \begin{center}
 \begin{tabular}{r@{${}={}$}l}
   \id{lf} & length of the entire file, in words;\\
   \id{lh} & length of the header data, in words;\\
   \id{bc} & smallest character code in the font;\\
   \id{ec} & largest character code in the font;\\
   \id{nw} & number of words in the width table;\\
   \id{nh} & number of words in the height table;\\
   \id{nd} & number of words in the depth table;\\
   \id{ni} & number of words in the\\
             \multicolumn2{r}{italic correction table;}\\
   \id{nl} & number of words in the lig/kern table;\\
   \id{nk} & number of words in the kern table;\\
   \id{ne} & number of words in the\\
             \multicolumn2{r}{extensible character table;}\\
   \id{np} & number of font parameter words.\\
\end{tabular}
\end{center}
%
 They are all nonnegative and less than $2^{15}$. We must have
$\id{bc}-1\le \id{ec}\le 255$, $\id{ne}\le 256$, and
$$
   \displaylines{
      \quad \id{lf} = 6+\id{lh}+(\id{ec}-\id{bc}+1)+\id{nw}+\id{nh}\hfill\cr
\noalign{\nobreak}
      \hfill {} +\id{nd}+\id{ni}+\id{nl}+\id{nk}+\id{ne}+\id{np}.\quad\cr
      }
$$
 Note that a font may contain as many as 256 characters (if
$\id{bc}=0$ and $\id{ec}=255$), and as few as 0 characters (if
$\id{bc}=\id{ec}+1$).

Incidentally, when two or more 8-bit bytes are combined to form an
integer of 16 or more bits, the most significant bytes appear first
in the file. This is called BigEndian order.



\subsubsection{{\tt TFM} data}

The rest of the \str{TFM} file may be regarded as a sequence of ten
data arrays having the informal specification
$$
   \def\arr$[#1]#2${$\colon \res{array}\ [#1]$ \res{of} #2}
\vbox{\ialign{\hfil\id{#}& \arr#\hfil\cr
   header&$[0\to\id{lh}-1]\id{stuff}$\cr
   char\_info&$[\id{bc}\to\id{ec}]\id{char\_info\_word}$\cr
   width&$[0\to\id{nw}-1]\id{fix\_word}$\cr
   height&$[0\to\id{nh}-1]\id{fix\_word}$\cr
   depth&$[0\to\id{nd}-1]\id{fix\_word}$\cr
   italic&$[0\to\id{ni}-1]\id{fix\_word}$\cr
   lig\_kern&$[0\to\id{nl}-1]\id{lig\_kern\_command}$\cr
   kern&$[0\to\id{nk}-1]\id{fix\_word}$\cr
   exten&$[0\to\id{ne}-1]\id{extensible\_recipe}$\cr
   param&$[1\to\id{np}]\id{fix\_word}$\cr
}}
$$
 The most important data type used here is a \id{fix\_word}, which is
a 32-bit representation of a binary fraction. A \id{fix\_word} is a
signed quantity, with the two's complement of the entire word used to
represent negation. Of the 32 bits in a \id{fix\_word}, exactly 12
are to the left of the binary point; thus, the largest \id{fix\_word}
value is $2048-2^{-20}$, and the smallest is $-2048$. We will see
below, however, that all but one of the \id{fix\_word} values will
lie between $-16$ and $+16$.

\medbreak

The first data array is a block of header information, which contains
general facts about the font. The header must contain at least two
words, and for \str{TFM} files to be used with Xerox printing
software it must contain at least 18 words, allocated as described
below. When different kinds of devices need to be interfaced, it may
be necessary to add further words to the header block.

\begin{description}

\item[{$\id{header}[0]$}] is a 32-bit check sum that \TeX\ will
copy into the \str{DVI} output file whenever it uses the font.  Later
on when the \str{DVI} file is printed, possibly on another computer,
the actual font that gets used is supposed to have a check sum that
agrees with the one in the \str{TFM} file used by \TeX. In this way,
users will be warned about potential incompatibilities. (However, if
the check sum is zero in either the font file or the \str{TFM} file,
no check is made.)  The actual relation between this check sum and
the rest of the \str{TFM} file is not important; the check sum is
simply an identification number with the property that incompatible
fonts almost always have distinct check sums.

\item[{$\id{header}[1]$}] is a \id{fix\_word} containing the design
size of the font, in units of \TeX\ points (7227 \TeX\ points = 254
cm).  This number must be at least 1.0; it is fairly arbitrary, but
usually the design size is 10.0 for a ``10 point'' font, i.e., a font
that was designed to look best at a 10-point size, whatever that
really means. When a \TeX\ user asks for a font `\str{at} $\delta$
\str{pt}', the effect is to override the design size and replace it
by $\delta$, and to multiply the $x$ and~$y$ coordinates of the
points in the font image by a factor of $\delta$ divided by the
design size.  {\sl All other dimensions in the\/ \str{TFM} file are
\id{fix\_word}\kern-1pt\ numbers in design-size units.} Thus, for
example, the value of $\id{param}[6]$, one \str{em} or \str{\\quad},
is often the \id{fix\_word} value $2^{20}=1.0$, since many fonts have
a design size equal to one em. The other dimensions must be less than
16 design-size units in absolute value; thus, $\id{header}[1]$ and
$\id{param}[1]$ are the only \id{fix\_word} entries in the whole
\str{TFM} file whose first byte might be something besides 0 or 255.

\item[{$\id{header}[2\ldots11],$}] if present, contains 40 bytes that
identify the character coding scheme. The first byte, which must be
between 0 and 39, is the number of subsequent ASCII bytes actually
relevant in this string, which is intended to specify what
character-code-to-symbol convention is present in the font.  Examples
are \str{ASCII} for standard ASCII, \str{TeX text} for fonts like
\str{cmr10} and \str{cmti9}, \str{TeX math extension} for
\str{cmex10}, \str{XEROX text} for Xerox fonts, \str{GRAPHIC} for
special-purpose non-alphabetic fonts, \str{UNSPECIFIED} for the
default case when there is no information.  Parentheses should not
appear in this name. (Such a string is said to be in {\small BCPL}
format.)

\item[{$\id{header}[12\ldots16]$,}] if present, contains 20 bytes that
name the font family ({\it e.g.}, \str{CMR} or \str{HELVETICA}), in {\small
BCPL} format. This field is also known as the ``font identifier.''

\item[{$\id{header}[17]$,}] if present, contains a first byte
called the \id{seven\_bit\_safe\_flag}, then two bytes that are
ignored, and a fourth byte called the \id{face}. If the value of the
fourth byte is less than 18, it has the following interpretation as a
``weight, slope, and expansion'':  Add 0 or 2 or 4 (for medium or
bold or light) to 0 or 1 (for roman or italic) to 0 or 6 or 12 (for
regular or condensed or extended).  For example, 13 is 0+1+12, so it
represents medium italic extended.  A three-letter code ({\it e.g.},
\str{MIE}) can be used for such \id{face} data.

\item[{$\id{header}[18\ldots{\rm whatever}]$}] might also be present;
the individual words are simply called $\id{header}[18]$,
$\id{header}[19]$, etc., at the moment.

\end{description}

\medbreak

Next comes the \id{char\_info} array, which contains one
\id{char\_info\_word} per character. Each \id{char\_info\_word}
contains six fields packed into four bytes as follows.

\begin{description}

\item[first byte] \id{width\_index} (8 bits)

\item[second byte] \id{height\_index} (4 bits) times 16, plus
\id{depth\_index} (4~bits)

\item[third byte] \id{italic\_index} (6 bits) times 4, plus \id{tag}
(2~bits)

\item[fourth byte] \id{remainder} (8 bits)

\end{description}
% 
 The actual width of a character is $\id{width}[\id{width\_index}]$,
in design-size units; this is a device for compressing information,
since many characters have the same width. Since it is quite common
for many characters to have the same height, depth, or italic
correction, the \str{TFM} format imposes a limit of 16 different
heights, 16 different depths, and 64 different italic corrections.

Incidentally, the relation
$\id{width}[0]=\id{height}[0]=\id{depth}[0]=\id{italic}[0]=0$ should
always hold, so that an index of zero implies a value of zero. The
\id{width\_index} should never be zero unless the character does not
exist in the font, since a character is valid if and only if it lies
between \id{bc} and \id{ec} and has a nonzero \id{width\_index}.

\medbreak

The \id{tag} field in a \id{char\_info\_word} has four values that
explain how to interpret the \id{remainder} field.

\begin{description}

\item[$\id{tag}=0\ (\id{no\_tag})$] means that \id{remainder} is
unused.

\item[$\id{tag}=1\ (\id{lig\_tag})$] means that this character has a
ligature/kerning program starting at
$\id{lig\_kern}[\id{remainder}]$.

\item[$\id{tag}=2\ (\id{list\_tag})$] means that this character is
part of a chain of characters of ascending sizes, and not the largest
in the chain.  The \id{remainder} field gives the character code of
the next larger character.

\item[$\id{tag}=3\ (\id{ext\_tag})$] means that this character code
represents an extensible character, i.e., a character that is built
up of smaller pieces so that it can be made arbitrarily large. The
pieces are specified in $\id{exten}[\id{remainder}]$.

\end{description}

\medbreak

The \id{lig\_kern} array contains instructions in a simple
programming language that explains what to do for special letter
pairs. Each word is a \id{lig\_kern\_command} of four bytes.

\begin{description}

\item[first byte] \id{skip\_byte}, indicates that this is the
final program step if the byte is 128 or more, otherwise the next
step is obtained by skipping this number of intervening steps.

\item[second byte] \id{next\_char}: ``if \id{next\_char} follows the
current character, then perform the operation and stop, otherwise
continue.''

\item[third byte] \id{op\_byte}, indicates a ligature step if less
than~128, a kern step otherwise.

\item[fourth byte] \id{remainder}.

\end{description}
%
 In a kern step, an additional space equal to
$\id{kern}[256(\id{op\_byte}-128)+\id{remainder}]$ is inserted
between the current character and \id{next\_char}. This amount is
often negative, so that the characters are brought closer together by
kerning; but it might be positive.

There are eight kinds of ligature steps, having \id{op\_byte} codes
$4a+2b+c$ where $0\le a\le b+c$ and $0\le b,c\le 1$. The character whose
code is \id{remainder} is inserted between the current character and
\id{next\_char}; then the current character is deleted if $b=0$, and
\id{next\_char} is deleted if $c=0$; then we pass over $a$~characters
to reach the next current character (which may have a
ligature/kerning program of its own).

Notice that if $a=0$ and $b=1$, the current character is unchanged;
if $a=b$ and $c=1$, the current character is changed but the next
character is unchanged.

If the very first instruction of the \id{lig\_kern} array has
$\id{skip\_byte}=255$, the \id{next\_char} byte is the so-called
right boundary character of this font; the value of \id{next\_char}
need not lie between \id{bc} and~\id{ec}. If the very last
instruction of the \id{lig\_kern} array has $\id{skip\_byte}=255$,
there is a special ligature/kerning program for a left boundary
character, beginning at location
$256\id{op\_byte}+\id{remainder}$. The interpretation is that
\TeX\ puts implicit boundary characters before and after each
consecutive string of characters from the same font. These implicit
characters do not appear in the output, but they can affect ligatures
and kerning.

If the very first instruction of a character's \id{lig\_kern} program
has $\id{skip\_byte}>128$, the program actually begins in location
$256\id{op\_byte}+\id{remainder}$. This feature allows access to
large \id{lig\_kern} arrays, because the first instruction must
otherwise appear in a location $\le 255$.

Any instruction with $\id{skip\_byte}>128$ in the \id{lig\_kern}
array must have $256\id{op\_byte}+\id{remainder}<\id{nl}$. If
such an instruction is encountered during normal program execution,
it denotes an unconditional halt; no ligature command is performed.

\medbreak

Extensible characters are specified by an \id{extensible\_recipe},
which consists of four bytes called \id{top}, \id{mid}, \id{bot}, and
\id{rep} (in this order). These bytes are the character codes of
individual pieces used to build up a large symbol. If \id{top},
\id{mid}, or \id{bot} are zero, they are not present in the built-up
result. For example, an extensible vertical line is like an
extensible bracket, except that the top and bottom pieces are
missing.

\medbreak

\noindent The final portion of a \str{TFM} file is the \id{param}
array, which is another sequence of \id{fix\_word} values.

\begin{description}

\item[{$\id{param}[1]=\id{slant}$}] is the amount of italic slant,
which is used to help position accents. For example,
$\id{slant}=0.25$ means that when you go up one unit, you also go
0.25 units to the right. The \id{slant} is a pure number; it's the
only \id{fix\_word} other than the design size itself that is not
scaled by the design size.

\item[{$\id{param}[2]=\id{space}$}] is the normal spacing between words
in text. Note that character \str{"\ "} in the font need not have
anything to do with blank spaces.

\item[{$\id{param}[3]=\id{space\_stretch}$}] is the amount of glue
stretching between words.

\item[{$\id{param}[4]=\id{space\_shrink}$}] is the amount of glue
shrinking between words.

\item[{$\id{param}[5]=\id{x\_height}$}] is the height of letters for
which accents don't have to be raised or lowered.

\item[{$\id{param}[6]=\id{quad}$}] is the size of one em in the font.

\item[{$\id{param}[7]=\id{extra\_space}$}] is the amount added to
$\id{param}[2]$ at the ends of sentences.

\end{description}

When the character coding scheme is \str{TeX math symbols}, the font
is supposed to have 15 additional parameters called \id{num1},
\id{num2}, \id{num3}, \id{denom1}, \id{denom2}, \id{sup1}, \id{sup2},
\id{sup3}, \id{sub1}, \id{sub2}, \id{supdrop}, \id{subdrop},
\id{delim1}, \id{delim2}, and \id{axis\_height}, respectively. When
the character coding scheme is \str{TeX math extension}, the font is
supposed to have six additional parameters called
\id{default\_rule\_thickness} and \id{big\_op\_spacing1} through
\id{big\_op\_spacing5}.




\endinput