summaryrefslogtreecommitdiff
path: root/fonts/utilities/ps2mf/pfb2mf.tex
blob: 500097916361db212b5a1490ef823bd1a8f03334 (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
% Gerard, je zult waarschijnlijk  de header een beetje moeten editen.
% Maar dit is mijn verhaal uit de Proceedings van Praag (met verbeterde
% typefouten)

\documentstyle[euro92]{article}

\font\times=times
\font\manfnt=manfnt
\def\METAFONT{{\manfnt META}\-{\manfnt FONT}}

\title{Incorporating PostScript fonts in \TeX{}}
\author{Erik-Jan Vens}
\titlehead{PostScript Type One to \METAFONT{}}
\authorhead{E.J. Vens}
\affiliation{Rijks Universiteit Groningen\\
	ICCE\\
	P.O.Box 335\\
	9700 AH \ Groningen\\
	the Netherlands\\
	{\tt E.J.Vens@icce.rug.nl}}

\begin{document}

\maketitle

\begin{abstract}
\noindent {\tt pfb2mf} Provides the \TeX{} community with an interface to the
PostScript Type One fonts. There is an overwhelming amount of these fonts for
sale and there are a lot of fonts in the Public Domain, so it extends the
range of typefaces the \TeX{} user can choose from.
\end{abstract}

\section{The typical look of a \TeX-ed document}

\subsection{Some of my background}

As a novice \TeX{}\footnote{Just as some people do mention that they denote
`he and/or she' by just using `he', my usage of `\TeX' means `\TeX{} and/or
\LaTeX'.} user, one will often be very enthousiastic about the program. At
least, from those days when I was a rookie \TeX{} user, I remember a sort of
passion for what was possible with this incredible program. It was in 1985 and
our university's computing centre had a Canon BLP-8 hooked up to their
VAX~8650. I was a student then and used to work there almost every evening,
sometimes nights. There was this typical small group of people working in the
only room which was open to general users. And typically we would gather
around the coffee-machine and discuss all sorts of things.

One of us knew about this program called \TeX. He showed me some results and I
was so impressed that the next day I visited the library to pick up `The \TeX
book'. (Needless to say, of course it was `\TeX{} and \METAFONT: New
Directions in Typesetting', so it was of little help.) Anyways, I spent many
hours trying to create masterpieces of the publishing art. I was very
enthousiastic about the program.

And I became even more enthousiastic when I met fellow \TeX ers, or saw
publications made with \TeX. But, how did I see these were made \TeX? It was
precisely because they were all typeset with the Computer Modern font family.

\subsection{How and why did Knuth create the Computer Modern font family}

When Knuth decided to write \TeX, he wanted to be able to finish his series
`The Art of Computer Programming' with digital typography. As he writes in
`The Errors of \TeX': `The genesis of \TeX{} probably took place on
1~February~1977, when~I first chanced to see the output of a high-resolution
typesetting machine. I was told that this fine typography [$\ldots$] was
produced by entirely digital methods; yet I could see no difference between
the digital type and `real' type. Therefore I realized that a central aspect
of printing had been reduced to bit manipulation. As a computer scientist, I
could not resist the challenge to improve print quality by manipulating those
bits better. [$\ldots$] By 13~February I~had changed my plan to spend a
forthcoming sabbatical year in South America; instead of travelling to an
exotic place and working on Volume~4 of {\it The Art of Computer Programming},
I~had decided to stay at Stanford and work on digital typography.'

He also needed a typeface. He chose Monotype Modern No.~8A, of which he says
in `Computers~\&~Typesetting, Vol.~E': `In letterpress printing, modern fonts
were technically troublesome because their delicate hairlines and serifs were
particularly susceptible to damage; the broken letters produced a degraded
text image. In digital typography with sufficient resolution, the delicate
forms of modern can be rendered precisely. Computer typesetting and
photolithographic printing are capable of reproducing modern typefaces with a
clarity and sharpness unobtainable at the time of the original development of
the style'.

Undoubtly, this is true. Anyone who has ever seen a text set in Computer
Modern come out of a phototypesetter, knows this striking feeling of beauty.
Only, most applications of \TeX{} that I have seen, do not end up on a
2400~dpi phototypesetter. The typical outputresolution is~300~dpi for a
laserprinter, 240~dpi for a dotmatrix printer and 400~dpi for the NeXT
laserprinter. So choosing fonts that render well at low resolutions is
certainly worthwhile.

\subsection{Why there are no serious attempts at creating other faces}

Creating a typeface from scratch is an extremely difficult task that takes
lots of time, patience and maybe energy. The only other complete family of
typefaces designed with \METAFONT{} is Neenie Billawala's Pandora. This is not
just a recreation of an existing font, it is a series of tools, drivers and
parameters that make up a family of faces, as she has described in TUGboat,
Vol.~10, (1989), No.~4, pp.~481--489. 

I am still working on a font together with a friend, where I~do most of the
programming and he does most of the designing. But this is our long, cold
winter's sunday afternoon project, so it's not nearly finished, even though we
started out one-and-a-half-year ago.

And there are more people who have done some work in this area. Yannis
Haralambous did some. He and other people have created new fonts, notably for
Indian languages, Greek, Hebrew and Russian. But the \TeX{} community is not a
very large one, and so the field of font creation remains a largely
undiscovered one.

\section{The wealth of the world of PostScript fonts}

But maybe we do not need to wait for new fonts written in \METAFONT. One of
the many attractions of the PostScript world is it's large range of available
typefaces. Even in the Public Domain one can find numerous nice looking fonts.
And if you consider buying them, there is such a large choice, that it becomes
virtually impossible to get to know them all before taking your pick. So one
tends to start at the traditional, standard PostScript look of a document.

\subsection{The standard Times Roman plus Courier document}

In much the same way that a \TeX ed document can be recognized by the use of
Computer Modern, can a standard PostScript document be recognized by the
combination of Times Roman and Courier, with Courier being slightly too thin
next to the Times. Most people who come from the world of computer science
know this combination from books as Kernighan~\&~Ritchie's `The C Programming
Language' and `Kernighan~\&~Pike's `The UNIX Programming Environment'.

Other traditional PostScript fonts include AvantGarde, Bookman, Helvetica, New
Century Schoolbook, Palatino and some loose fonts as Zapf Dingbats and Zapf
Chancery.

\subsection{But there are more fonts}

The past few years --as fonts grew cheaper and cheaper-- many users have
gotten used to be able to buy fonts. If one looks at the Top~40 bestsellers
list of Adobe, one will notice that both in Europa and in the USA, Adobe
Garamond is in the Top~10. On the other hand, Neville Brody's Arcadia,
Industria and Insignia are the number one in the USA, where in Europe they
rank only at~27. In Europe e.g.\ the GillSans ranks very high. Even in the
`Jobs' section of a widely read Dutch newspaper one can find many, many uses
of GillSans. Even Flora and Praxis (both by Dutch designer Gerard Unger) can
be found often.

\section{Combing the worlds of \TeX{} and PostScript fonts}

Wouldn't it be nice if the user of \TeX{} could incorporate the use of
PostScript fonts in a \TeX{} document? \TeX{} still is one of the best, if not
{\bf the best} where the production of neatly spaced text and beautifully
typeset mathematics is concerned. We --as \TeX{} users-- shiver in awe when we
are confronted with the Swiss cheese output produced by WorstPervert, let
alone the {\tt eqn}-based formula editor it now provides. We don't even want
to think about WordStar, and we have seen instances where the output of
Ventura doesn't look extremely bad. We have heard that Word4Windows is nice.
But still, \TeX{} outranks them when pure text and mathematics is concerned.

\subsection{Choosing a scheme}

There are several possibilities open to the non Computer Modern user.

\begin{enumerate}

\item Completely switch to PostScript output. There is a Public Domain
      PostScript emulator, written by L.~Peter Deutsch, in the GNU
      distribution. One will also have to use a {\tt dvi} to {\tt ps}
      translator, e.g.\ Tom Rokicki's {\tt dvips}.

\item Use Piet Tutelaer's {\tt ps2pk} package, based on the X-Windows,
      Release~5 distribution, which can translate a PostScript Type One font
      to \TeX's {\tt pk} format. This is extremely useful for those users who
      want fast, production quality fonts.

\item Use my {\tt pfb2mf} package, which can translate a PostScript Type One
      font to \METAFONT{} format. To create a bitmap, one will still have to
      run \METAFONT. This last part of the job can be frustratingly slow, but
      it does provide the \TeX{} user with options to change the output.
      
\end{enumerate}

\noindent Beware. A caveat should be here. Producing beautifully typeset
documents is just combining spaces and faces. But remember that this is an
art, rather than a job which can be automated.

\section{What does a \METAFONT{} file look like}

A \METAFONT{} file consists of a combination of commands to set up the
communication with \TeX, commands to set up plottable functions and commands
to set up a plot.

\subsection{The macro-biotic aspects of \METAFONT{}}

Just as with \TeX, macro's play an important role. And just as with \TeX,
macro's are essentialy build up from other macro's and primitives. Only
because with \TeX{} one has to make a distinction between pure text and
macro's, the macro's have to be escaped with a backslash. \METAFONT{} macro's
on the other hand do not need the escape. And \METAFONT{} macro's can even
handle binary operators. An example on p.~178 of `The \METAFONT book' states:

${\bf primarydef } w {\rm\ dotprod } z = {}$

\quad $({\rm xpart } w \ast{} {\rm xpart } z + {\rm ypart } w \ast{} {\rm
ypart } z) {\bf\ enddef}$.

\noindent I will not discuss this in in-depth, but basically this defines an
infix operator `{\tt dotprod}' which takes a left and a right operand, it then
returns a value.

There a couple of important macro's and primitives:

\begin{itemize}

\item `{\tt beginchar}' sets up the beginning of the definition of a glyph. It
      takes four parameters:

      \begin{enumerate}

      \item the character number, this can be given as a decimal, octal or
            hexadecimal number, or as the representation of the character,
            e.g.~{\tt"a"}.
      \item the width of the surrounding box. The character's shape can stick
	    out of it's box, but this box provides the metrics with which
	    \TeX{} will do it's calculations.
      \item the height of the surrounding box. This is the height the
            characters extends above the baseline.
      \item the depth of the surrounding box.
      \end{enumerate}

\item `{\tt endchar}' declares the end of the definition.

\item One can assign values to constants and variables. $u := 3.5$, or
      $width\# := 3.5pt\#$, where the $\#$ denotes a sharped, i.e.\ reallife,
      or not-rounded-to-the-raster value.

\item One can declare points in space, or just their x- and y-values: $x_3 =
      x_2 - x_1$, or $z_1 = ({1\over 2}width, .8h - 3.5pt)$.

\item The points can be connected with several types of lines. E.g.\ a
      straight line: $z_1 {\tt--} z_2 {\tt--} z_3$, or a smooth curve: $z_1
      {\tt..} z_2 {\tt..}  z_3$.

\item One can draw these lines with a pen, or one can fill the area that is
      defined by a shape. Or combining these two. One can also erase a line,
      or an area. {\tt draw} $z_1 {\tt--} z_2$ draws a straight line from
      $z_1$ to $z_2$ with the current pen. {\tt fill} $z_1 {\tt..} z_2 {\tt--}
      z_3 {\tt..} cycle$ fills an area defined by a smooth line from $z_1$ to
      $z_2$, from there with a straight line to $z_3$, and from there with a
      smooth line back to the beginning.

\end{itemize}

\section{What does a Type One font look like}

We will have to do some work before we can take a look at Type One fonts with
a plain text editor.

\subsection{From {\tt pfb} via {\tt pfa} to {\tt ps}}

Type One fonts typically come in two flavors: binary or ascii representation.
The binary representation is just an encoded form of the ascii representation.
So, one needs a program to translate from the first to the last form. In the
{\tt pfb2mf} package that would be {\tt pfb2pfa}. The ascii version, however,
is a readable hexadecimal version of an encrypted series of PostScript
commands. Once this encryption was secret, but it is now given to the world.
So, one can translate the ascii version to human-readable PostScript. In the
{\tt pfb2mf} package this would be done with {\tt pfa2ps}.

\subsection{What does it mean}

All Type One fonts are outline fonts which are filled. The PostScript language
uses a reverse polish notation for it's commands, so `{\tt dx dy rlineto}'
means `draw a straight line from the currentpoint to the point which lies at a
distance $(dx, dy)$. There are very few commands:

\begin{itemize}

\item `{\tt endchar}' finishes a charstring outline definition.

\item `{\tt seac}' makes an accented character from two other characters in
      the font program.

\item `{\tt closepath}' closes a subpath. (Surprise!)

\item All sorts of drawing and moving commands. These are all relative to the
      currentpoint. Some commands are abbreviations for others, one can say,
      e.g.\ {\tt dx hmoveto}, which means {\tt dx 0 rmoveto}. All lines are
      straight lines. The curves are B\'ezier cubics, so {\tt dx1 dy1 dx2 dy2
      dx3 dy3 rrcurveto} means `construct a curve from $currentpoint$ to
      $currentpoint + (dx1 + dx2 + dx3, dy1 + dy2 + dy3)$, using $currentpoint
      + (dx1, dy1)$ and $currentpoint + (dx1 + dx2, dy1 + dy2)$ as
      controlpoints.

\item Then there are the stem commands. This is the most difficult to
      understand part of a Type One font. I am still not sure whether I really
      do. Anyways, stem commands define zones within which the renderer can
      choose a position so that the output will look good. It is strongly
      related to \METAFONT's commands for `Discreteness and Discretion'.

\item We can define subroutines and call them from within the Type One font
      program. So, any translation program must learn these subroutines and
      apply them when called.

\item `{\tt setcurrentpoint}' sets the currentpoint, for how else can we start
      a curve where each point is defined in terms of it's predecessor?
      
\end{itemize}

\section{The uninteresting bits and pieces}

The definition of how this is all done is not very interesting, so I will give
just one example and leave it to the reader to pick up the sources if this
reader is interested in more details.

\subsection{An example of the font}

There is a freely distributable version of Times New Roman out on the net in
TrueType format. I have translated this to Type One format. This is an example
of what the fonts looks like:

\bigskip

{\times Times New Roman}

\subsection{An example of the letter A in sourceform}

\begin{verbatim}
/A {7 722 hsbw 450 221 rmoveto -256 hlineto -45 -104 rlineto
    -12 -26 -5 -20 0 -12 rrcurveto 0 -10 5 -9 10 -8
    rrcurveto 9 -7 21 -5 32 -2 rrcurveto -18 vlineto -209
    hlineto 18 vlineto 28 4 18 7 8 8 rrcurveto 16 15 19 32
    20 48 rrcurveto 233 545 rlineto 17 hlineto 231 -551
    rlineto 18 -44 17 -29 15 -13 rrcurveto 15 -13 21 -8 27
    -1 rrcurveto -18 vlineto -261 hlineto 18 vlineto 27 1 17
    4 10 8 rrcurveto 9 7 5 9 0 11 rrcurveto 0 14 -7 23 -13
    31 rrcurveto -40 95 rlineto -14 36 rmoveto -112 268
    rlineto -115 -268 rlineto 227 hlineto endchar } ND
\end{verbatim}

\begin{verbatim}
beginchar(65,722*FX#,677*FY#,0*FY#); "A";
fill ((457,221) -- (201,221) -- (156,117) ..  controls
     (144,91) and (139,71) ..  (139,59) .. controls (139,49)
     and (144,40) .. (154,32) .. controls (163,25) and
     (184,20) ..  (216,18) -- (216,0) -- (7,0) -- (7,18) ..
     controls (35,22) and (53,29) ..  (61,37) .. controls
     (77,52) and (96,84) .. (116,132) -- (349,677) --
     (366,677) -- (597,126) ..  controls (615,82) and
     (632,53) ..  (647,40) ..  controls (662,27) and
     (683,19) ..  (710,18) -- (710,0) -- (449,0) -- (449,18)
     .. controls (476,19) and (493,23) ..  (503,31) ..
     controls (512,38) and (517,47) .. (517,58) .. controls
     (517,72) and (510,95) ..  (497,126) -- (457,221) --
     cycle) xscaled FX# yscaled FY#;
unfill ((443,257) -- (331,525) -- (216,257) -- (443,257) --
     cycle) xscaled FX# yscaled FY#;
endchar;
\end{verbatim}

\section{Does it meet realworld constraints?}

No, as of yet, it doesn't. However, the process of hinting is time-consuming
and therefor very, very slow. So, if it is fast production quality you are
after, you are well advised to pick up Piet Tutelaer's {\tt ps2pk}.

I want to extend the possibilities of the program to provide the user with
ways of implementing meta-ness. So if you'd like to fiddle with the font's
parameters, {\tt pfb2mf} is what you want. It will provide a great deal of
tuneable parameters, and you can lift out part of a font an use that as a
basis for other things.

\section{And where can I get all this?}

Both {\tt pfb2mf} and {\tt ps2pk} are ftp-able. E.g.\ from my home machine
{\tt obelix.icce.rug.nl}. It can be found in {\tt pub/erikjan}.

\section{A warning}

Be careful! If you plan on using more fonts, you will not only have to worry
about you text, and the layout you choose, you will also have to worry about
what font you are going to use.

\end{document}