diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /usergrps/uktug/baskervi/5_3/goossens.tex |
Initial commit
Diffstat (limited to 'usergrps/uktug/baskervi/5_3/goossens.tex')
-rw-r--r-- | usergrps/uktug/baskervi/5_3/goossens.tex | 570 |
1 files changed, 570 insertions, 0 deletions
diff --git a/usergrps/uktug/baskervi/5_3/goossens.tex b/usergrps/uktug/baskervi/5_3/goossens.tex new file mode 100644 index 0000000000..15fe1a70cb --- /dev/null +++ b/usergrps/uktug/baskervi/5_3/goossens.tex @@ -0,0 +1,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 |