psfont: A general way to use PostScript fonts^{∗}

Sebastian Marius Kirsch

               sebastian kirsch@kl.maus.de

1996/06/30

Abstract

This package provides a general way to use PostScript fonts without handling with thousands of style files, one for each font you want to use. It works with a style file, psfont.sty, which contains all the macros, and a configuration file, psfont.cfg, which tells the style file about the available fonts.

1 Introduction

This package lets you use one single package to load every PostScript font you would want. You don’t have to load one file for each font anymore, and the package even warns you if you try to load two contradicting fonts at once, e. g. two roman fonts. If you use the option onlyps, it substitutes the default PS fonts for the families you have not specified.

The package is intended as a replacement for the psfonts package of psNFSS, by Sebastian Rahtz (s.rahtz@elsevier.co.uk). psfonts is not very consequent, because some of its style files redefine all three defaults, while others only change one.

2 The docstrip modules

This file contains five modules to direct docstrip in generating the external files:

driver  A short driver for producing the documentation
package The package itself
config  The local configuration file
Upsy  A font definition file for Adobe Symbol, from psNFSS
Upzd  A font definition file for Adobe Zapf Dingbats, from psNFSS

3 Producing the documentation

This short driver can be extracted by docstrip to produce the documentation.

1 ⟨∗driver⟩

∗This file has version number 1.1, last revised 1996/06/30.

 2 \documentclass{ltxdoc}

3

 4 \newcommand{\NFSS}{\textsf{NFSS}}
 5 \newcommand{\psNFSS}{\textsf{psNFSS}}
 6 \newcommand{\psfont}{\texttt{psfont}}

7

 8 \begin{document}

9

10 \DocInput{psfont.dtx}

11

12 \end{document}

13 ⟨/driver⟩

4 The Code

4.1 Introduction

First we have to introduce ourselves.

14 ⟨∗package⟩

15 \NeedsTeXFormat{LaTeX2e}
16 \ProvidesPackage{psfont}%
17 [\filedate\space v\fileversion\space loading PostScript fonts]

4.2 Switches

Next, we define some switches. They are used to determine whether some fonts have already been loaded, so we can warn the user when he tries to load two colliding fonts.

18 \newif\ifrm@set\rm@setfalse
19 \newif\ifsf@set\sf@setfalse
20 \newif\iftt@set\tt@setfalse

4.3 The default fonts

\DefaultRMFont These are some commands for changing the default fonts.

\DefaultSFFont
\DefaultTTFont

\DefaultRMFont{⟨NFSS font family⟩}
\DefaultSFFont{⟨NFSS font family⟩}
\DefaultTTFont{⟨NFSS font family⟩}
21 \newcommand{\DefaultRMFont}[1]{\renewcommand{\def@rmfont}{#1}}
22 \newcommand{\DefaultSFFont}[1]{\renewcommand{\def@sffont}{#1}}
23 \newcommand{\DefaultTTFont}[1]{\renewcommand{\def@ttfont}{#1}}
24 \newcommand{\def@rmfont}{}
25 \newcommand{\def@sffont}{}
26 \newcommand{\def@ttfont}{}

4.4 Declaring the options

\AvailableRMFont These commands are needed later in the configuration file. There is one command

\AvailableRMFont
\AvailableRMFont

for each font family, ie. roman, sans serif or typewriter.

\AvailableRMFont[⟨additional code⟩]{⟨long name⟩}{⟨NFSS family name⟩} \AvailableSFFont[⟨additional code⟩]{⟨long name⟩}{⟨NFSS family name⟩} \AvailableTTFont[⟨additional code⟩]{⟨long name⟩}{⟨NFSS family name⟩}

They declare their first argument as an option.

If the option is called, and the font family has already been defined, a \PackageError is reported. If not, the second argument is defined as the approriate family default.

When the family default has successfully been set, the approriate switch is turned, so it is not redefined anywhere else in this file.

The optional argument contains some code that is to be executed when the defaults have been set. I do not need this now, but this hook could be useful later.

27 \newcommand{\AvailableRMFont}[3][]{%
28 \DeclareOption{#2}{%
29  \ifrm@set\PackageError{psfont}{%
30  \protect\rmfamily\space already defined as \rmdefault
31  }{%
32  You tried to load two roman families at the same time,\MessageBreak
33  e.g. times and palatino}
34  \else\renewcommand{\rmdefault}{#3}\rm@settrue
35  #1
36  \fi}

37 }

38

39 \newcommand{\AvailableSFFont}[3][]{%
40 \DeclareOption{#2}{%
41  \ifsf@set\PackageError{psfont}{%
42  \protect\sffamily\space already defined as \sfdefault
43  }{%
44  You tried to load two sans serif families at the same time,\MessageBreak
45  e.g. gill and helvetica}
46  \else\renewcommand{\sfdefault}{#3}\sf@settrue
47  #1
48  \fi}

49 }

50

51 \newcommand{\AvailableTTFont}[3][]{%
52 \DeclareOption{#2}{%
53  \iftt@set\PackageError{psfont}{%
54  \protect\ttfamily\space already defined as \ttdefault
55  }{%
56  You tried to load two typewriter families at the same time,\MessageBreak
57  e.g. courier and typewriter}
58  \else\renewcommand{\ttdefault}{#3}\tt@settrue
59  #1
60  \fi}

61 }

4.5 One command fits all

\AvailableFont With the macro \AvailableFont, all three defaults are set with one option. This is useful for managing combinations of three fonts under one name, as well as for fonts that have the variants sans serif and typewriter. (I’m told Lucida is one of those.)

62 \newcommand{\AvailableFont}[5][]{%
63 \DeclareOption{#2}{%
64  \ifrm@set\PackageError{psfont}{%
65  \protect\rmfamily\space already defined as \rmdefault
66  }{%
67  You tried to load two roman families at the same time,\MessageBreak
68  e.g. times and palatino}
69  \else\renewcommand{\rmdefault}{#3}\rm@settrue
70  \fi
71  \ifsf@set\PackageError{psfont}{%
72  \protect\sffamily\space already defined as \sfdefault
73  }{%
74  You tried to load two sans serif families at the same time,\MessageBreak
75  e.g. gill and helvetica}
76  \else\renewcommand{\sfdefault}{#4}\sf@settrue
77  \fi
78  \iftt@set\PackageError{psfont}{%
79  \protect\ttfamily\space already defined as \ttdefault
80  }{%
81  You tried to load two typewriter families at the same time,\MessageBreak
82  e.g. courier and typewriter}
83  \else\renewcommand{\ttdefault}{#5}\tt@settrue
84  \fi
85  #1

86 } 87 }

4.6 Loading the configuration file

Next, the configuration file is loaded. If it is not found, an error is issued, because the package is quite useless without it.

88 \InputIfFileExists{psfont.cfg}{}{%
89 \PackageError{psfont}{%
90  No local configuration file found
91  }{%
92  The psfont package was loaded without a local\MessageBreak
93  configuration file, so it doesn't know which fonts\MessageBreak
94  are available.}

95 } 96 ⟨/package⟩

4.7 The configuration file

The configuration file looks like this:

4.7.1 Introduction

As usual…

97 ⟨∗config⟩

98 \NeedsTeXFormat{LaTeX2e}
99 \ProvidesFile{psfont.cfg}
100 [\filedate\space v\fileversion\space Local configuration for psfont.sty]

4.7.2 Declaring default fonts

Here, the default PS fonts are defined. They are needed later, if the author does not define all PS fonts he wants to use, but wants his document to contain only PS fonts.

101 \DefaultRMFont{ptm}
102 \DefaultSFFont{phv}
103 \DefaultTTFont{pcr}

4.7.3 Available fonts

Now the available PS fonts are defined. They are divided into three categories, roman fonts, sans serif fonts and typewriter fonts, as it is done in L^{A}TEX 2ε itself.

They are defined using the \Available… macros. These macros define a symbolic name to be used as an option to the package, and take the name of the NFSS font family as a second argument.

104 \AvailableRMFont{times}{ptm}
105 \AvailableRMFont{palatino}{ppl}
106 \AvailableRMFont{newcent}{pnc}

107

108 \AvailableSFFont{helv}{phv}
109 \AvailableSFFont{gill}{pgs}

110

111 \AvailableTTFont{courier}{pcr}

112 ⟨/config⟩

And that’s the configuration. Of course one could do much more with this configuration file, declaring new options and all. It’s probably the biggest hook a package could have. :-)

4.8 onlyps: Using only PS fonts

onlyps This option redefines all other family defaults that have not yet been \renewcommanded to PS fonts. It uses the default fonts as defined in the configuration file. If no default fonts have been defined, it reports a warning and does nothing.

113 ⟨∗package⟩

114 \DeclareOption{onlyps}{
115 \ifrm@set\else
116  \ifx\empty\def@rmfont
117  \PackageWarning{psfont}{No default roman font defined!}
118  \else\renewcommand{\rmdefault}{\def@rmfont}\fi
119 \fi
120 \ifsf@set\else
121  \ifx\empty\def@sffont
122  \PackageWarning{psfont}{No default sans serif font defined!}
123  \else\renewcommand{\sfdefault}{\def@sffont}\fi
124 \fi
125 \iftt@set\else
126  \ifx\empty\def@ttfont
127  \PackageWarning{psfont}{No default typewriter font defined!}
128  \else\renewcommand{\ttdefault}{\def@ttfont}\fi
129 \fi

130 }

4.9 Parts of psfonts

The psfont package ist ultimately intended as a replacement for psfonts of psNFSS. I therefore use the code of some files of psfonts and wrap it up in an option. All code and comments of this section are from psfonts, v5.2 by Sebastian Rahtz. Many thanks to Sebastian for letting me use his code!

pifont
131 \DeclareOption{pifont}{

Now some useful commands for Pi fonts (Dingbats, Symbol etc); they all assume you know the character number of the (unmapped) font

132 \newcommand{\Pifont}[1]{\fontfamily{#1}\fontencoding{U}%
133 \fontseries{m}\fontshape{n}\selectfont}
134 \newcommand{\Pisymbol}[2]{{\Pifont{#1}\char#2}}
135 \newcommand{\Pifill}[2]{\leaders\hbox{\makebox[0.2in]{%
136  \Pisymbol{#1}{#2}}}\hfill\kern\z@}
137 \newcommand{\Piline}[2]{\par\noindent\hspace{0.5in}\Pifill{#1}{#2}%
138  \hspace{0.5in}\kern\z@\par}
139 \newenvironment{Pilist}[2]%
140 {\begin{list}{\Pisymbol{#1}{#2}}{}}%
141 {\end{list}}%

A Pi number generator (from ideas by David Carlisle), for use in lists where items are suffixed by symbols taken in sequence from a Pi font. Usage is in lists just like enumerate.

\Pinumber outputs the appropriate symbol, where #2 is the name of a L^{A}TEX counter and #1 is the font family.

142 \def\Pinumber#1#2{\protect\Pisymbol{#1}{\arabic{#2}}}
143 \newenvironment{Piautolist}[2]{%
144 \ifnum \@enumdepth >3 \@toodeep\else
145  \advance\@enumdepth \@ne

We force the labels and cross-references into a very plain style (eg no brackets around ‘numbers’, or dots after them).

146  \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
147 \expandafter\def\csname p@enum\romannumeral\the\@enumdepth\endcsname{}%
148 \expandafter\def\csname labelenum\romannumeral\the\@enumdepth\endcsname{%
149  \csname theenum\romannumeral\the\@enumdepth\endcsname}%
150 \expandafter\def\csname theenum\romannumeral\the\@enumdepth\endcsname{%
151  \Pinumber{#1}{enum\romannumeral\the\@enumdepth}}%
152 \list{\csname label\@enumctr\endcsname}{%
153  \@nmbrlisttrue
154  \def\@listctr{\@enumctr}%
155  \setcounter{\@enumctr}{#2}%
156  \addtocounter{\@enumctr}{-1}%
157  \def\makelabel##1{\hss\llap{##1}}}
158 \fi
159 }{\endlist}

All the old Dingbat commands still work.

160 \newcommand{\ding}{\Pisymbol{pzd}}
161 \def\dingfill#1{\leaders\hbox{\makebox[0.2in]{\Pisymbol{pzd}{#1}}}\hfill}
162 \def\dingline#1{\Piline{pzd}{#1}}
163 \newenvironment{dinglist}[1]{\begin{Pilist}{pzd}{#1}}%
164 {\end{Pilist}}

165 \newenvironment{dingautolist}[1]{\begin{Piautolist}{pzd}{#1}}%
166 {\end{Piautolist}}
167 {\Pifont{pzd}}
168 {\Pifont{psy}}

169 }

mathptm
170 \DeclareOption{mathptm}{

This package loads the Adobe Times fonts and the mathptm fonts; The virtual fonts are produced by fontinst; they can be built by running tex on fontptcm.tex from the fontinst package.

171 % The main text family is Times Roman
172 \def\rmdefault{ptm}
173 \DeclareSymbolFont{operators}   {OT1}{ptmcm}{m}{n}
174 \DeclareSymbolFont{letters}     {OML}{ptmcm}{m}{it}
175 \DeclareSymbolFont{symbols}     {OMS}{pzccm}{m}{n}
176 \DeclareSymbolFont{largesymbols}{OMX}{psycm}{m}{n}
177 \DeclareSymbolFont{bold}        {OT1}{ptm}{bx}{n}
178 \DeclareSymbolFont{italic}      {OT1}{ptm}{m}{it}

If we’re in compatibility mode, defined \mathbf and \mathit.

179 \@ifundefined{mathbf}{}{\DeclareMathAlphabet{\mathbf}{OT1}{ptm}{bx}{n}}
180 \@ifundefined{mathit}{}{\DeclareMathAlphabet{\mathit}{OT1}{ptm}{m}{it}}

An \omicron command, to fill the gap.

181 \DeclareMathSymbol{\omicron}{0}{operators}{`\o}

Reduce the space around math operators

182 \thinmuskip=2mu
183 \medmuskip=2.5mu plus 1mu minus 1mu
184 \thickmuskip=4mu plus 1.5mu minus 1mu

No bold math.

185 \def\boldmath{%
186 \@warning{there is no bold Symbol font}%
187 \global\let\boldmath=\relax

188 }

189 \DeclareMathSizes{5}{5}{5}{5}
190 \DeclareMathSizes{6}{6}{5}{5}
191 \DeclareMathSizes{7}{7}{5}{5}
192 \DeclareMathSizes{8}{8}{6}{5}
193 \DeclareMathSizes{9}{9}{7}{5}
194 \DeclareMathSizes{10}{10}{7.4}{6}
195 \DeclareMathSizes{10.95}{10.95}{8}{6}
196 \DeclareMathSizes{12}{12}{9}{7}
197 \DeclareMathSizes{14.4}{14.4}{10.95}{8}
198 \DeclareMathSizes{17.28}{17.28}{12}{10}
199 \DeclareMathSizes{20.74}{20.74}{14.4}{12}
200 \DeclareMathSizes{24.88}{24.88}{17.28}{14.4}

201 }

4.10 The end

At last, the options are processed.

202 \ProcessOptions

203 ⟨/package⟩

5 Additional font definitions from psfonts

This is again code from psfonts by Sebastian Rahtz. It contains some font definitions for Adobe Symbol and Adobe Zapf Dingbats.

5.1 Adobe Symbol font

204 ⟨∗Upsy⟩

205 \typeout{File \space Upsy.fd\space loading \space Adobe\space Symbol}%
206 \DeclareFontFamily{U}{psy}{}%
207 \DeclareFontShape{U}{psy}{m}{n}{<->psyr}{}%
208 \DeclareFontShape{U}{psy}{m}{i}{<->ssub * psy/m/n}{}%

209 ⟨/Upsy⟩

5.2 Adobe Zapf Dingbats

210 ⟨∗Upzd⟩

211 \typeout{File \space Upzd.fd\space loading \space Adobe\space ZapfDingbats}%
212 \DeclareFontFamily{U}{pzd}{}%
213 \DeclareFontShape{U}{pzd}{m}{n}{<->pzdr}{}%

214 ⟨/Upzd⟩

6 ToDo

There is mainly one things that this package is missing till now:

• If the package has been loaded without any local options, it should act as if the option onlyps had been called. I unfortunately do not know how to detect this.

7 Legal rubbish

psfont: A L^{A}TEX 2ε package for using PostScript fonts Copyright \begin{matrix}c \\ ◯ \end{matrix} 1996 Sebastian Marius Kirsch ⟨sebastian kirsch@kl.maus.de⟩ This program is free software; you can redistribute it and/or modify it under

the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.