summaryrefslogtreecommitdiff
path: root/usergrps/uktug/baskervi/5_3/goossens.tex
blob: 15fe1a70cb02d405fcd6b98a683087f5e5b147dc (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
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
\newcommand{\Lit}[1]{\texttt{#1}}
\let\Lfn\Lit
\let\fn\Lit
\let\vref\ref

\title{Using Adobe Type 1 Multiple Master fonts with \protect\TeX}
\author[Michel Goossens and Sebastian Rahtz]{Michel Goossens\\
CERN, Geneva\\\texttt{m.goossens@cern.ch}\\ and\\
Sebastian Rahtz\\Elsevier Science Ltd\\\texttt{s.rahtz@elsevier.co.uk}}
\begin{Article}

\section{Introduction}
The multiple master font format is an extension of the Type 1 font
format, which allows the generation of a wide variety of typeface
styles from a single font program.  This capability allows users and
applications control over the typographic parameters of
fonts used in their documents, in a manner reminiscent of Knuth's
ground-breaking \MF. This article describes the multiple master system
in some detail, and describes the procedures needed to make instances,
and create the appropriate font metrics for use with \TeX.

\section{Multiple Master overview}
A multiple master font program contains two or more outline typefaces
called \emph{master designs}, which describe one or more \emph{design
  axes}.  The master designs that constitute a design axis represent a
dynamic range of one typographic parameter, such as the weight or
width.  This range of styles is defined in a multiple master font
program by specifying one master design to represent each end of an
axis, such as a \emph{light} and \emph{extra-bold} weight, as well as
any \emph{intermediate master designs} that are required.  The maximum
number of master designs allowed is sixteen.

A \emph{font instance}
consists of a font dictionary derived from the multiple master
font program (or from another font instance).
It contains a \Lit{WeightVector}
array with \emph{k} values that sum to 1.0 and 
which determine the relative contributions of each master design 
to the resulting interpolated design.

All derived font instances share the \Lit{CharStrings} dictionary and
\Lit{Subrs} array of the main multiple master font program, making it
relatively economical to generate a variety of font instances.
Multiple master fonts can be made compatible with the installed base
of PostScript language interpreters by including several PostScript
language procedures and a new set of \Lit{OtherSubrs} routines in the
font program.  The procedures include the new \Lit{makeblendedfont}
operator, the interpolation procedure \Lit{\$Blend} and a new
definition of the \Lit{findfont} operator.

\subsection{Multiple Master Design Space}

It is possible to think of the master designs as being arranged in a
1, 2, 3, or 4 dimensional space with various font instances
corresponding to different locations in that space.  The entries in
the \Lit{FontInfo} dictionary specify what this space is and where the
master designs are located in it.  This information is necessary for
interactive programs that allow users to create new font instances,
and should be included in the font's s Adobe Multiple Font Metrics
(\Lfn{AMFM}) file.

\begin{figure*}
\begin{minipage}{.5\textwidth}
\centerline{\epsfig{file=mmdesign.eps,width=.8\linewidth}}
\caption{Multiple master typeface design space arrangement}
\label{fig:MMdesignspace}
\end{minipage}
\begin{minipage}{.5\textwidth}
\centerline{\epsfig{file=mmfour.eps,width=.8\linewidth}}
\caption{Arrangement of the multiple master design space 
         for a four axis font}
\label{fig:MMfouraxes}
\end{minipage}
\end{figure*}

Fig.~\ref{fig:MMdesignspace} illustrates an example of the design
space of a three axis multiple master font.  In this example, the axes
are \emph{weight}, \emph{width}, and \emph{optical} size.  It is
recommended that a font program be organized to have the lightest
weight, narrowest width, and smallest design size mapped to the origin
of the blend space.

Multiple master coordinates are of two types: those which represent
the design space and those which represent the blend space.  Design
coordinates are integers whose range for a particular typeface is
chosen by the designer.  They are used in font names and in the user
interface for software which creates and manipulates multiple master
font programs.  The theoretical range for a weight or width axis is
from 1 to 999 design units; however a typical typeface, with styles
ranging from light to black, might have a dynamic range of from 200
(for light) to 800 units (for black).

Another type of optional axis would be for optical size, in which the
character design changes with the point size.  The design coordinates
for the optical size axis might have a dynamic range of from 6- to
72-point, which represents the practical extremes of sizes for
typefaces designed for publishing purposes.

\emph{Blend coordinates} are normalized values, in the range of 0 to
1, which correspond to the minimum and maximum design space
coordinates.  They are used by the Type~1 rasterizer because they are
more convenient for mathematical manipulations.  The linear space of
blend coordinates is related to the (potentially) non-linear space of
the design coordinates by the \Lit{BlendDesignMap} entry in the font
dictionary.


Fig.~\vref{fig:MMfouraxes} illustrates how a four axis design might
be represented.  An example of a fourth axis would be having an axis
for a typographic style (serif/sans serif) or contrast (high/low: the
ratio of thick to thin stem widths).  This diagram illustrates that if
four axes are defined, sixteen master designs are required.  Also,
since sixteen is the maximum number of designs allowed, there can be
no intermediate designs with four axes.

\section{Multiple Master Font Programs}

Multiple master typefaces may contain from two to sixteen master 
designs, organized as having from one to four design axes. 
The maximum number of master designs allowed in a multiple master 
font is expressed by the equation \(2^n + x = 16\), where 
\(n\) is the number of design axes, \(x\) is the number of 
intermediate designs, and 16 is the maximum allowed number of 
master designs.

The values used for calculating the weighted average are stored in the
font dictionary in an array named \Lit{WeightVector}.  The multiple
master font program, as shipped by the font vendor, can have a default
setting for the \Lit{WeightVector}; it is recommended that it is set
so the default font instance will be the normal roman design for that
typeface.

\subsection{Multiple Master Keywords}

\Lit{BlendAxisTypes} is a (required) array of \emph{n}
PostScript language strings where \emph{n}
is the dimensionality of the design space and hence the number of
axes. 
Each string specifies the corresponding axis type. 
In the case of 3-axis example, this value would be:
\begin{verbatim}
/BlendAxisTypes [/Weight /Width /OpticalSize]
\end{verbatim}

\Lit{BlendDesignPositions} is a (required) array of \emph{k} arrays
giving the locations of the \emph{k} master designs in the design
space.  Each location subarray has \emph{n} numbers giving the
location of the design in the \emph{n} dimensions of the design space,
with a minimum value of zero and a maximum value of one.
Table~\vref{tab:MMdesign} with eight master designs is based on the
example shown in Fig.~\vref{fig:MMdesignspace}.  It corresponds to
the design space for the Minion 3-axis multiple master font.

\begin{table*}
\centering
\begin{tabular}{@{}l@{\qquad}l}
\hline
\emph{Design label}               & \emph{Blend space coordinates} \\
\hline
design 1: light condensed small   &  0  0  0                       \\
design 2: black condensed small   &  1  0  0                       \\
design 3: light expanded small    &  0  1  0                       \\
design 4: black expanded small    &  1  1  0                       \\
design 5: light condensed large   &  0  0  1                       \\
design 6: black condensed large   &  1  0  1                       \\
design 7: light expanded large    &  0  1  1                       \\
design 8: black expanded large    &  1  1  1                       \\
\hline
\end{tabular}
\caption{Design labels and blend space values for the Minion 3-axis multiple master font}
\label{tab:MMdesign}
\end{table*}

The \Lit{BlendDesignPositions} array corresponding to this
case is:
\begin{verbatim}
/BlendDesignPositions 
        [[0 0 0][1 0 0][0 1 0][1 1 0]
        [0 0 1][1 0 1][0 1 1][1 1 1]] def
\end{verbatim}

\Lit{BlendDesignMap} is a required entry consisting 
of an array of \emph{n} arrays where \emph{n}
is the dimensionality of the design space. 
Each array contains \emph{m} subarrays
that describe the mapping of design coordinates into 
normalized coordinates for that design axis. 
The minimum value allowed for \emph{m} is two, 
and the maximum is twelve. 
The order of the subarrays corresponds to the order 
of design axes in \Lit{BlendAxisTypes}.
In the case of the Minion font this array is
three dimensional ($n=3$) and has the following
form:

\begin{small}
\begin{verbatim}
/BlendDesignMap [ 
 [[345 0] [620 1]]  [[450 0] [600 1]]
 [[6 0] [8 0.35] [11 0.5] [18 0.75] [72 1]] ]
\end{verbatim}
\end{small}
The first number in an individual subarray is in design coordinates
with a minimum value of 1 and a maximum value of 999.  The second
number in the subarray is in normalized coordinates, that is, in the
range of 0 to 1.  In the above example, the weight ranges from 345 to
620, while the width ranges from 450 to 600 in design space.  The
third axis, optical size, ranges from 6 to 72 (corresponding to the
point sizes for which the typeface can be adjusted for optimal
legibility).

\subsection{The \texttt{makeblendedfont} Operator}

\noindent\fbox{\textit{blendedfontdict weightvector}
               \textbf{makeblendedfont} \textit{blendedfontdict}}

This operator creates a font dictionary with blended entries. 
The \textit{blendedfontdict} argument is a font dictionary of 
an existing multiple master font; it can be from either the 
original multiple master font itself, or from an interpolated font 
instance since any \Lit{Blend} dictionary contains all elements
needed to derive additional font instances.

The \textit{weightvector} argument is an array of numbers summing to
1.0 to be used as the weights for creating the new font instance.  The
value of \Lit{WeightVector} in \textit{blendedfontdict'} is set to the
values in the array weightvector.  Blended values are calculated for
entries in the \Lit{Private} and \Lit{FontInfo} dictionaries.  The
result is a font dictionary that can be used as an argument to
\Lit{definefont}.  The resulting dictionary and its contents are still
read-write, so the caller of \Lit{makeblendedfont} can make further
modifications if necessary.

The \Lit{Blend} dictionary data structures provide the 
information needed by the \Lit{makeblendedfont}
operator, without needing to have the specific
list of entries to be blended built into the procedure. 
This allows a single copy of the procedure to be used even 
if the set of entries to be blended varies in future fonts.

\subsection{Multiple Master findfont Procedure}

Multiple master font programs from Adobe include a procedure which
redefines the \Lit{findfont} operator in \Lit{systemdict}.  This is
necessary because of the need to generate font instances on-the-fly to
satisfy multiple master font references in a PostScript language
document.  The procedure creates all necessary font instances before
calling the standard \Lit{findfont} procedure.

Two procedures,
\Lit{NormalizeDesignVector} and \Lit{ConvertDesignVector}, 
which are  referenced in \Lit{findfont}, must be
configured for the number of axes and master designs in the font
program in which they are used.  The \Lit{NormalizeDesignVector}
procedure must calculate the normalized equivalent of the design
coordinates in the FontName, using the values in the
\Lit{BlendDesignMap} array.  These normalized coordinates must be left
on the stack for the \Lit{ConvertDesignVector} procedure.  This
procedure should take the normalized coordinates, generate
\Lit{WeightVector} values, and leave them on the stack for the
\Lit{makeblendfont} operator.
\begin{figure*}
\begin{small}
\begin{verbatim}
/y 140 def
300 100 700 % outer loop on width>>>>>>>>>>>>+
    { /x 25 def       % reset x              v
      /y y 25 sub def % calculate y          v
      /Wi exch def    % width from for loop<<+
      220 100 820 % inner loop on weight>>>>>>>>>>>+
         { x y moveto      % go to new coordinate  v
           /We exch def    % weight from for loop<<+
           /MM /MyriadMM findfont dup begin [
             We Wi NormalizeDesignVector ConvertDesignVector
             ] end makeblendedfont definefont 20 scalefont setfont
             (Hxkp) show
           /x x 55 add def % recalculate x                       
         } for
    } for
\end{verbatim}
\end{small}
\caption[PostScript code to instantiate a multiple master font]%
        {PostScript code for generating a
         a two-dimensional matrix showing instances of the multiple
         master  font Myriad}
\label{fig:minionprogram}

\begin{minipage}{.5\textwidth}
\centering\epsfig{file=myriad.eps,width=\textwidth}
\caption[Two dimensional matrix showing multiple master Myriad font]%
        {Two dimensional grid showing various instances of the two
         axes multiple master Myriad sans serif font. }
\label{fig:minionmatrix}
\end{minipage}
\begin{minipage}{.5\textwidth}
\centering\epsfig{file=minion.eps,width=\textwidth}
\caption[The three axes multiple master Minion serif font]%
        {The three axes multiple master Minion serif font.
         \begin{small}The top line shows various optical sizes (6pt, 8pt,
         11pt, 18pt, 40pt, and 72pt) normalized to 20pt.
         The bottom matrix shows various weights
         (increasing from left to right) and widths
         (increasing from top to bottom).\end{small}}
\label{fig:myriadmatrix}
\end{minipage}
\end{figure*} 

\section{Using Multiple master fonts with \TeX{}}

Multiple master fonts come with a set of multiple master AFM
files, which are called ``AMFM'' (Adobe Master Font Metrics) files.
This file contains information about the number of master designs,
the number of axes, the \texttt{BlendDesignPositions} and 
\texttt{BlendDesignMap} arrays, as well as the names, and \texttt{weightvector}
for the master designs, from which all font instances are derived.

To get the actual metric information for the characters in a font
instance, one has to combine the metric information of the 
master designs (eight, in the case of Minion).
To do this one needs to calculate the \texttt{weightvector} for the 
given instance. Starting from design-coordinate space one can use the
\texttt{NormalizeDesignVector} operator to transform to the normalized
coordinate space, and from there with the \texttt{ConvertDesignVector}
operator one obtains the weightvector.
These two operators are particular to a font (since they depend
on the master designs), and are present in the multiple master
font dictionary. One can decode the \PS{} code for calculating
the weightvector and translate it into another 
computer language, and then use the procedure to combine the
values in the AFM files for the master designs to calculate 
the values needed for the font instance.
For instance, in the case of the MinionMM font, the \PS{} code
defines the eight components of the weightvector 
as follows:

\[
\begin{array}{ccc@{\quad}ccc}
w_1 & = & x y z& w_2 & = & (1-x) y z \\
w_3 & = & x (1-y) z & w_4 & = & (1-x) (1-y) z \\
w_5 & = & x y (1-z) & w_6 & = & (1-x) y (1-z) \\
w_7 & = & x (1-y) (1-z) & w_8 & = & \sum_{n=1}^7 w_n
\end{array}
\]
where $x$ is the normalized weight, $y$ the normalized
width, and $z$ the normalized optical size.

These  eight numbers $w_i$ allow the calculation of all needed
parameters in an \fn{afm} file for a font instance.
One reads each parameter value in turn in the
eight master design \fn{afm} files, applies the relevant weight, 
and the weighted sum thus obtained is the desired interpolated
value of the given parameter for the font instance.

Myriad is a sans serif companion font to Minion.
It has two design axes and four master designs.
The weights for deriving font-instance parameters in 
normalized coordinate space in function of 
the four master designs are given by:
\[
\begin{array}{ccc@{\quad}ccc}
w_1 & = & (1-x)(1-y)& w_2 & = & (1-x) y \\
w_3 & = & x (1-y)   & w_4 & = & xy
\end{array}
\]
where $x$ is the normalized weight and $y$ the normalized
width.
The corresponding mapping parameters between design space and
normalized coordiantes are:

\begin{verbatim}
BlendDesignPositions [ [0 0] [1 0] [0 1] [1 1] ]
BlendDesignMap [[[215 0][830 1]][[300 0][700 1]]]
BlendAxisTypes [/Weight /Width ]
\end{verbatim}

Now one can extract any of the boundingbox and kern entries for
a given font instance by getting the element in question from
the eight (or four, in the case of Myriad) master files and 
calculating the interpolated value.
To make matters simpler an explicit example will be given for 
the Myriad font, since it involves only four numbers in each case.
Fig.~\vref{fig-Myriadcalculate-afm} shows some parts of the
four master-design \fn{afm} files
%%    1322    7802   26322 afm/MyriaMMLigCn.AFM
%%    1322    7802   26322 afm/MyriaMMBlaCn.AFM
%%    1322    7803   26489 afm/MyriaMMLigSemEx.AFM
%%    1322    7803   26731 afm/MyriaMMBlaSemEx.AFM
\begin{figure*}
\begin{tiny}
\begin{multicols}{4}
\begin{verbatim}
FontName MyriadMM-LightCn
FamilyName Myriad MM
Weight Light
ItalicAngle 0
IsFixedPitch false
FontBBox -52 -250 970 818 
...
StartKernPairs 974
KPX A z 10
KPX A y -31
KPX A x 4
KPX A w -36
KPX A v -42
KPX A u -9
KPX A t -17
KPX A s 0
KPX A r -4
KPX A quoteright -90
KPX A quotedblright -90
KPX A q -9
KPX A p -4
KPX A o -12
  ...
EndKernPairs
\end{verbatim}
\newpage
\begin{verbatim}
StartFontMetrics 2.0
FontName MyriadMM-BlackCn
FamilyName Myriad MM
Weight Black
ItalicAngle 0
IsFixedPitch false
FontBBox -64 -250 970 843 
...
StartKernPairs 974
KPX A z 10
KPX A y -10
KPX A x 0
KPX A w -10
KPX A v -10
KPX A u 0
KPX A t 0
KPX A s 10
KPX A r 0
KPX A quoteright -20
KPX A quotedblright -20
KPX A q 0
KPX A p 0
KPX A o 0
  ...
EndKernPairs
\end{verbatim}
\newpage
\begin{verbatim}
FontName MyriadMM-LightSemiEx
FamilyName Myriad MM
Weight Light
ItalicAngle 0
IsFixedPitch false
FontBBox -58 -250 1100 825 
...
StartKernPairs 974
KPX A z 25
KPX A y -10
KPX A x 0
KPX A w -10
KPX A v -25
KPX A u -10
KPX A t 0
KPX A s -10
KPX A r 0
KPX A quoteright -30
KPX A quotedblright -30
KPX A q -10
KPX A p 0
KPX A o -10
  ...
EndKernPairs
\end{verbatim}
\newpage
\begin{verbatim}
FontName MyriadMM-BlackSemiEx
FamilyName Myriad MM
Weight Black
ItalicAngle 0
IsFixedPitch false
FontBBox -48 -250 1432 867 
...
StartKernPairs 974
KPX A z 7
KPX A y -44
KPX A x -6
KPX A w -47
KPX A v -62
KPX A u -22
KPX A t -32
KPX A s -6
KPX A r -10
KPX A quoteright -90
KPX A quotedblright -90
KPX A q -18
KPX A p -10
KPX A o -18
  ...
EndKernPairs
\end{verbatim}
\end{multicols}
\end{tiny}
\caption{The four \fn{afm} files for the Myriad master designs}
\label{fig-Myriadcalculate-afm}
 \centerline{\epsfig{figure=mmblowup.eps,width=.6\textwidth}}
\caption{Minion instances from opposite ends of the optical size axis
  set at the same size (exaggerated)}
\label{mmblowup}
\end{figure*}

When the instance \fn{afm} file has been created, a suitable metric
for \TeX\ can be built with \Lit{afm2tfm} or the \emph{fontinst}
package.

\section{In practice}
We have instantiated the ideas outlined above by developing Unix shell
scripts, and adapting an AFM-parsing program distributed by Adobe.
The main script takes the following actions:
\begin{enumerate}
\item  create a small PostScript file to invoke multiple master operators 
with values passed to the script;
\item run GhostScript on this file to derive normalized weights, and
  write them to a temporary file;
\item run our ``mmafm'' program to read master AFM files, write a
  new instance AFM file, and create a \TeX\ metric (our initial setup
  uses \Lit{afm2tfm} to create 8r base-encoded metrics, and EC-encoded
  virtual fonts for actual use);
\item write a \Lit{dvips} map entry and header file to tell the driver
  about the new font.
\end{enumerate}
Thus a call to our script consists of the parameters \texttt{MinionMM
  zmnl8ac6 360 460 6}; this creates a metric file called
\Lit{zmnl8ac6}, using Karl Berry's scheme to name ``Minion, light
weight, 8a-encoded, condensed, at 6pt design size''. The entry in the
map file reads \texttt{zmnl8rc6 zmnl8ac6 " TeXBase1Encoding
  ReEncodeFont " <8r.enc <MinionMM.pfb <zmnl8ac6.pro}, and
\Lit{zmnl8ac6.pro} contains the code:
\begin{verbatim}
/zmnl8ac6 /MinionMM findfont 
dup begin [
  360 460 6   NormalizeDesignVector 
  ConvertDesignVector
  ] end makeblendedfont definefont  
\end{verbatim}
In addition, we hand-wrote ``fd'' files to tell \LaTeX\ how to match
up the various weight and width instances we created to its notions of
series and shape. The only complication here was that the Minion font
has an optical size axis, and we built four instances which we wanted
\LaTeX\ to use at different user sizes: 
\begin{verbatim}
\DeclareFontShape{T1}{zmn}{lc}{n}{%     
        <-7>zmnl8tc6 %  
        <7-10>zmnl8tc8  %
        <10-15>zmnl8tc11 %      
        <15->zmnl8tc18}
{}
\end{verbatim}
The effect of the optical sizes is demonstrated by Fig.~\ref{mmblowup}
which shows the 6pt and 18pt instances scaled to the same size. The
differences in design are as apparent as a corresponding examples
from Computer Modern would be.

The tools we developed served to test the ideas, and build a set of
metrics; they are available from us on request, but users should
beware that they are neither intuitive in use, nor robust. It is to be
hoped that a more functional, portable, solution will be developed in
time.  The keen \TeX xie may be interested in developing a
\Lit{MakeTeXTFM} script for Unix \Lit{web2c} systems to apply the
programs on the fly from within \TeX.
\afterpage{\clearpage}
\end{Article}
\endinput