# Dvips: A DVI-to-PostScript Translator

@defcodeindex fl @defcodeindex op

This document is based on dvips.tex' by Tomas Rokicki. It is in the public domain.

# Why Use dvips?

The dvips program has a number of features that set it apart from other PostScript drivers for TeX. This rather long section describes the advantages of using dvips, and may be skipped if you are just interested in learning how to use the program. Installation is covered in section 14 near the end of this document.

The dvips driver generates excellent, standard PostScript, that can be included in other documents as figures or printed through a variety of spoolers. The generated PostScript requires very little printer memory, so very complex documents with a lot of fonts can easily be printed even on PostScript printers without much memory, such as the original Apple LaserWriter. The PostScript output is also compact, requiring less disk space to store and making it feasible as a transfer format.

Even those documents that are too complex to print in their entirety on a particular printer can be printed, since dvips will automatically split such documents into pieces, reclaiming the printer memory between each piece.

The dvips program supports graphics in a natural way, allowing PostScript graphics to be included and automatically scaled and positioned in a variety of ways.

Printers with resolutions other than 300 dpi are also supported, even if they have a different resolution in the horizontal and vertical directions. High resolution output is supported for typesetters, including an option that compresses the bitmapped fonts so that typesetter virtual memory is not exhausted. This option also significantly reduces the size of the PostScript file and decoding in the printer is very fast.

Missing fonts can be automatically generated if METAFONT exists on the system, or fonts can be converted from gf' to pk' format on demand. If a font cannot be generated, a scaled version of the same font at a different size can be used instead, although dvips will complain loudly about the poor aesthetics of the resulting output.

Users will appreciate features such as collated copies and support for tpic', psfig', emtex', and METAPOST'; system administrators will love the support for multiple printers, each with their own configuration file, and the ability to pipe the output directly to a program such as lpr'. Support for MS-DOS and VMS in addition to UNIX is provided in the standard distribution, and porting to other systems is easy.

One of the most important features is the support of virtual fonts, which add an entirely new level of flexibility to TeX. Virtual fonts are used to give dvips its excellent PostScript font support, handling all the font remapping in a natural, portable, elegant, and extensible way. The dvips afm2tfm' driver even comes with its own afm2tfm' program that creates the necessary virtual fonts and TeX font metric files automatically from the Adobe font metric files.

Source is provided and freely distributable, so adding a site-specific feature is possible. Adding such features is made easier by the highly modular structure of the program.

There is really no reason to use another driver, and the more people use dvips, the less time will be spent fighting with PostScript and the more time will be available to create beautiful documents. So if you don't use dvips on your system, get it today.

# Using dvips

To use dvips, simply type

dvips foo


where foo.dvi' is the output of TeX that you want to print. If dvips has been installed correctly, the document should come out of your default printer.

If you use fonts that have not been used on your system before, they may be automatically generated; this process can take a few minutes. The next time that document is printed, these fonts will already exist, so printing will go much faster.

Many options are available; they are described in a later section. For a brief summary of available options, just type

dvips


# Paper Size and Landscape Mode

Most TeX documents at a particular site are designed to use the standard paper size (for example, letter size in the United States or A4 in Europe.) The dvips program defaults to these paper sizes and can be customized for the defaults at each site or on each printer.

But many documents are designed for other paper sizes. For instance, you may want to design a document that has the long edge of the paper horizontal. This can be useful when typesetting booklets, brochures, complex tables, or many other documents. This type of paper orientation is called landscape orientation (the normal' orientation is portrait). Alternatively, a document might be designed for ledger or A3 paper.

Since the intended paper size is a document design decision, and not a decision that is made at printing time, such information should be given in the TeX file and not on the dvips command line. For this reason, dvips supports a papersize' special. It is hoped that this special will become standard over time for TeX previewers and other printer drivers.

The format of the papersize' special is

\special{papersize=8.5in,11in}


where the dimensions given above are for a standard letter sheet. The first dimension given is the horizontal size of the page, and the second is the vertical size. The dimensions supported are the same as for TeX; namely, in (inches), cm (centimeters), mm (millimeters), pt (points), sp (scaled points), bp (big points, the same as the default PostScript unit), pc (picas), dd (didot points), and cc (ciceros).

For a landscape document, the papersize' comment would be given as

\special{papersize=11in,8.5in}


An alternate specification of landscape' is to have a special of the form

\special{landscape}


This is supported for backward compatibility, but it is hoped that eventually the papersize' comment will dominate.

Of course, using such a command only informs dvips of the desired paper size; you must still adjust the hsize' and vsize' in your TeX document to actually use the full page.

The papersize' special must occur somewhere on the first page of the document.

# Including PostScript Graphics

Scaling and including PostScript graphics is a breeze--if the PostScript file is correctly formed. Even if it is not, however, the file can usually be accommodated with just a little more work. The most important feature of a good PostScript file--from the standpoint of including it in another document--is an accurate bounding box comment.

## The Bounding Box Comment

Every well-formed PostScript file has a comment describing where on the page the graphic is located, and how big that graphic is. This information is given in terms of the lower left and upper right corners of a box just enclosing the graphic, and is thus referred to as a bounding box. These coordinates are given in PostScript units (there are precisely 72 PostScript units to the inch) with respect to the lower left corner of the sheet of paper.

To see if a PostScript file has a bounding box comment, just look at the first few lines of the file. (PostScript is standard ASCII, so you can use any text editor to do this.) If within the first few dozen lines there is a line of the form

%%BoundingBox: 0 1 2 3


(with any numbers), chances are very good that the file is Encapsulated PostScript and will work easily with dvips. If the file contains instead a line like

%%BoundingBox: (atend)


the file is still probably Encapsulated PostScript, but the bounding box (that dvips needs to position the graphic) is at the end of the file and should be moved to the position of the line above. This can be done with that same text editor, or with a simple Perl script.

If the document lacks a bounding box altogether, one can easily be added. Simply print the file. Now, take a ruler, and make the following measurements. All measurements should be in PostScript units, so measure it in inches and multiply by 72. Alternatively, the bbfig' program distributed with dvips in the contrib' directory can be used to automate this process.

>From the left edge of the paper to the leftmost mark on the paper is llx, the first number. From the bottom edge of the paper to the bottommost mark on the paper is lly, the second number. From the left edge of the paper to the rightmost mark on the paper is urx, the third number. The fourth and final number, ury, is the distance from the bottom of the page to the uppermost mark on the paper.

Now, add a comment of the following form as the second line of the document. (The first line should already be a line starting with the two characters %!'; if it is not, the file probably isn't PostScript.)

%%BoundingBox: llx lly urx ury


Or, if you don't want to modify the file, you can simply write these numbers down in a convenient place and use them when you import the graphic.

If the document does not have such a bounding box, or if the bounding box is given at the end of the document, please complain to the authors of the software package that generated the file; without such a line, including PostScript graphics can be tedious.

## Using the EPSF Macros

Now you are ready to include the graphic into a TeX file. Simply add to the top of your TeX file a line like

@flindex epsf.tex

\input epsf


(or, if your document is in LaTeX or SliTeX, add the epsf' style option, as was done to the following line).

\documentstyle[12pt,epsf]{article}


This only needs to be done once, no matter how many figures you plan to include. Now, at the point you want to include the file, enter a line such as

\epsffile{foo.ps}


If you are using LaTeX or SliTeX, you may need to add a \leavevmode' command immediately before the \epsffile' command to get certain environments to work correctly. If your file did not (or does not currently) have a bounding box comment, you should supply those numbers you wrote down as in the following example:

\epsffile[100 100 500 500]{foo.ps}


(in the same order they would have been in a normal bounding box comment). Now, save your changes and run TeX and dvips; the output should have your graphic positioned at precisely the point you indicated, with the proper amount of space reserved.

The effect of the epsffile' macro is to typeset the figure as a TeX vbox' at the point of the page that the command is executed. By default, the graphic will have its natural' width (namely, the width of its bounding box). The TeX box will have depth zero and a natural' height. The graphic will be scaled by any dvi' magnification in effect at the time.

Any PostScript graphics included by any method in this document (except bop-hook' and its ilk) are scaled by the current dvi' magnification. For graphics included with epsffile' where the size is given in TeX dimensions, this scaling will produce the correct, or expected, results. For compatibility with old PostScript drivers, it is possible to turn this scaling off with the following TeX command:

\special{! /magscale false def}


Use of this command is not recommended because it will make the epsffile' graphics the wrong size if global magnification is used in a dvi' document, and it will cause any PostScript graphics to appear improperly scaled and out of position if a dvi' to dvi' program is used to scale or otherwise modify the document.

You can enlarge or reduce the figure by putting

\epsfxsize=dimen


right before the call to epsffile'. Then the width of the TeX box will be dimen and its' height will be scaled proportionately. Alternatively you can force the vertical size to a particular size with

\epsfysize=dimen


in which case the height will be set and the width will be scaled proportionally. If you set both, the aspect ratio of the included graphic will be distorted but both size specifications will be honored.

By default, clipping is disabled for included EPSF images. This is because clipping to the bounding box dimensions often cuts off a small portion of the figure, due to slightly inaccurate bounding box arguments. The problem might be subtle; lines around the boundary of the image might be half their intended width, or the tops or bottoms of some text annotations might be sliced off. If you want to turn clipping on, just use the command

\epsfclipon


and to turn clipping back off, use

\epsfclipoff


A more general facility for sizing is available by defining the epsfsize' macro. You can redefine this macro to do almost anything. This TeX macro is passed two parameters by epsffile'. The first parameter is the natural horizontal size of the PostScript graphic, and the second parameter is the natural vertical size. This macro is responsible for returning the desired horizontal size of the graph (the same as assigning epsfxsize' above).

In the definitions given below, only the body is given; it should be inserted in

\def\epsfsize#1#2{body}


Some common definitions are:

epsfxsize'
This definition (the default) enables the default features listed above, by setting epsfxsize' to the same value it had before the macro was called.

0pt'
This definition forces natural sizes for all graphics by setting the width to zero, which turns on horizontal scaling.

#1'
This forces natural sizes too, by returning the first parameter only (the natural width) and setting the width to it.

hsize'
This forces all graphics to be scaled so they are as wide as the current horizontal size. (In LaTeX, use textwidth' instead of hsize'.)

0.5#1'
This scales all figures to half of their natural size.

\ifnum#1>\hsize\hsize\else#1\fi'
This keeps graphics at their natural size, unless the width would be wider than the current hsize', in which case the graphic is scaled down to hsize'.

If you want TeX to report the size of the figure as a message on your terminal when it processes each figure, give the command

\epsfverbosetrue


Often in order to get a particular graphic file to work, a certain header file might need to be sent first. Sometimes this is even desirable, since the size of the header macros can dominate the size of certain PostScript graphics files. The dvips program provides support for this with the header=' special command. For instance, to ensure that foo.ps' gets downloaded as part of the header material, the following command should be added to the TeX file:

\special{header=foo.ps}


The dictionary stack will be at the userdict' level when these header files are included.

For these and all other header files (including the headers required by dvips itself and any downloaded fonts), the printer VM budget is debited by some value. If the header file has, in its first 1024 bytes, a line of the form

%%VMusage: min max


then the maximum value is used. If it doesn't, then the total size of the header file in bytes is used as an approximation of the memory requirements.

## Literal PostScript

For simple graphics, or just for experimentation, literal PostScript graphics can be included. Simply use a special command that starts with a double quote ("').

For instance, the following (simple) graphic: was created by typing:

\vbox to 100bp{\vss % a bp is the same as a PostScript unit
\special{" newpath 0 0 moveto 100 100 lineto 394 0 lineto
closepath gsave 0.8 setgray fill grestore stroke}}


(Note that you are responsible for leaving space for such literal graphics.) Literal graphics are discouraged because of their nonportability.

Similarly, you can define your own macros for use in such literal graphics through the use of literal macros. Literal macros are defined just like literal graphics, only you begin the special with an exclamation point instead of a double quote. These literal macros are included as part of the header material in a special dictionary called SDict'. This dictionary is the first one on the PostScript dictionary stack when any PostScript graphic is included, whether by literal inclusion or through the epsffile' macros.

## Other Graphics Support

There are other ways to include graphics with dvips. One is to use an existing package, such as emtex', psfig', tpic', or METAPOST', all of which are supported by dvips.

Other facilities are available for historical reasons, but their use is discouraged, in hope that some sane' form of PostScript inclusion shall become standard. Note that the main advantage of the epsffile' macros is that they can be adapted for whatever form of special eventually becomes standard, and thus only minor modifications to that one file need to be made, rather than revising an entire library of TeX documents.

Most of these specials use a flexible key and value scheme:

\special{psfile=filename.ps[key=value]*}


This will download the PostScript file called filename.ps' such that the current point will be the origin of the PostScript coordinate system. The optional key/value assignments allow you to specify transformations on the PostScript.

The possible keys are:

hoffset'
The horizontal offset (default 0)

voffset'
The vertical offset (default 0)
hsize'
The horizontal clipping size (default 612)
vsize'
The vertical clipping size (default 792)
hscale'
The horizontal scaling factor (default 100)
vscale'
The vertical scaling factor (default 100)
angle'
The rotation (default 0)
clip'
Enable clipping to the bounding box

The dimension parameters are all given in PostScript units. The hscale' and vscale' are given in non-dimensioned percentage units, and the rotation value is specified in degrees. Thus

\special{psfile=foo.ps hoffset=72 hscale=90 vscale=90}


will shift the graphics produced by file foo.ps' right by one inch and will draw it at 0.9 times normal size. Offsets are given relative to the point of the special command, and are unaffected by scaling or rotation. Rotation is counterclockwise about the origin. The order of operations is to rotate the figure, scale it, then offset it.

For compatibility with older PostScript drivers, it is possible to change the units that hscale' and vscale' are given in. This can be done by redefining @scaleunit' in SDict' by a TeX command such as

\special{! /@scaleunit 1 def}


The @scaleunit' variable, which is by default 100, is what hscale' and vscale' are divided by to yield an absolute scale factor.

All of the methods for including graphics we have described so far enclose the graphic in a PostScript save/restore pair, guaranteeing that the figure will have no effect on the rest of the document. Another type of special command allows literal PostScript instructions to be inserted without enclosing them in this protective shield; users of this feature are supposed to understand what they are doing (and they shouldn't change the PostScript graphics state unless they are willing to take the consequences). This command can take many forms, because it has had a torturous history; any of the following will work:

\special{ps:text}
\special{ps::text}
\special{ps::[begin]text}
\special{ps::[end]text}


(with longer forms taking precedence over shorter forms, when they are used). Note that ps::' and ps::[end]' do not do any positioning, so they can be used to continue PostScript literals started with ps:' or ps::[begin]'. There is also the command

\special{ps: plotfile filename}


which will copy the commands from filename verbatim into the output (but omitting lines that begin with %). An example of the proper use of literal specials can be found in the file rotate.tex' which makes it easy to typeset text turned 90 degrees.

To finish off this section, the following examples are presented without explanation:

\def\rotninety{\special{ps:currentpoint currentpoint translate 90
rotate neg exch neg exch translate}}\font\huge=cmbx10 at 14.4truept
\setbox0=\hbox to0pt{\huge A\hss}\vskip16truept\centerline{\copy0
\special{ps:gsave}\rotninety\copy0\rotninety\copy0\rotninety
\box0\special{ps:grestore}}\vskip16truept


\vbox to 2truein{\special{ps:gsave 0.3 setgray}\hrule height 2in
width\hsize\vskip-2in\special{ps:grestore}\font\big=cminch\big
\vss\special{ps:gsave 1 setgray}\vbox to 0pt{\vskip2pt
\line{\hss\hskip4pt NEAT\hss}\vss}\special{ps:0 setgray}%
\hbox{\raise2pt\line{\hss NEAT\hss}\special{ps:grestore}}\vss}


Some caveats are in order when using the above forms. Make sure that each gsave' on a page is matched with a grestore' on the same page. Do not use save' or restore'. Use of these macros can interact with the PostScript generated by dvips if care is not taken; try to understand what the above macros are doing before writing your own. The rotninety' macro especially has a useful trick that appears again and again.

## Dynamic Creation of PostScript Graphics Files

PostScript is an excellent page description language--but it does tend to be rather verbose. Compressing PostScript graphics files can often reduce them by more than a factor of five. For this reason, if the filename parameter to one of the graphics inclusion techniques starts with a backtick ('), the filename is instead interpreted as a command to execute that will send the actual file to standard output. Thus,

\special{psfile="zcat foo.ps.Z"}


will include the uncompressed version of foo.ps'. Since such a command is not accessible to TeX, if you use this facility with the EPSF' macros, you need to supply the bounding box parameter yourself, as in

\epsffile[72 72 540 720]{"zcat screendump.ps.Z"}


to include screendump.ps'. Of course, the commands to be executed can be anything, including using a file conversion utility such as tek2ps' or whatever is appropriate.

This extension is not portable to other dvi2ps' programs.

# Using PostScript Fonts

Thanks to Donald E. Knuth, the dvips driver now supports PostScript fonts through the virtual font capability. PostScript fonts are (or should be) accompanied by a font metric file such as Times-Roman.afm', which describes characteristics of a font called Times-Roman. To use such fonts with TeX, we need tfm' files that contain similar information. These can be generated from afm' files by running the program afm2tfm', supplied with dvips. This program also creates virtual fonts with which you can use normal plain TeX conventions.

Note that non-resident downloaded PostScript fonts tend to use a great deal of printer virtual memory. PostScript printers typically have between 130,000 and 400,000 bytes of available virtual memory; each downloaded font will require approximately 30,000 bytes of that. For many applications, bitmapped fonts work much better, even at typesetter resolutions (with the -Z' option.)

Even resident PostScript fonts can take a fair amount of memory, but less with this release of dvips than previously. Also, bitmapped fonts tend to image faster than PostScript fonts.

## The Afm2tfm Program

In its simplest form, the afm2tfm' program converts an Adobe afm' file (e.g., Times-Roman.afm') into a raw' TeX TFM file (say, rptmr.tfm' with the command

afm2tfm Times-Roman rptmr


This file is raw because it does no character remapping; it simply converts the character information on a one-to-one basis to TeX characters with the same code. (It would be better to have eschewed the use of the r' prefix in favor of using a variant letter to specify the encoding; but we didn't think of that at the time, and it's too late to change existing fonts. See section 'Top' in Filenames for TeX fonts.)

In the following examples, we will use the font Times-Roman to illustrate the conversion process. For the standard 35 LaserWriter fonts, however, it is highly recommended that you use the supplied tfm' and vf' files that come with dvips, as these files contain some additional changes that make them work better with TeX than they otherwise would.

Standard PostScript fonts have a different encoding scheme from that of plain TeX. Although both schemes are based on ASCII, special characters such as ligatures and accents are handled quite differently. Therefore we obtain best results by using a virtual font' interface, which makes TeX see a standard TeX encoding for the PostScript font. Such a virtual font can be obtained, for example, by the command

afm2tfm Times-Roman -v ptmr rptmr


This produces two files as output, namely the virtual property list' file ptmr.vpl', and the raw font metric file rptmr.tfm'. To use the font in TeX, you should first run

vptovf ptmr.vpl ptmr.vf ptmr.tfm


and then install the virtual font file ptmr.vf' where Dvips will see it, and install ptmr.tfm' and rptmr.tfm' where TeX and Dvips will see them.

You can also make more complex virtual fonts by editing ptmr.vpl' before running vptovf'; such editing might add the uppercase Greek characters in the standard TeX positions, for instance. (This has already been done for the font files that come with Dvips.) Once this has been done, you're all set. You can use code like this in TeX henceforth:

\font\myfont = ptmr at 12pt
\myfont Hello, I am being typeset in 12-point Times-Roman.


Thus we have two fonts, one actual (rptmr', which is analogous to the font in the printer) and one virtual (ptmr', which has been remapped to the standard TeX encoding (almost), and has typesetting know-how added. You could also say

\font\PTR = rptmr at 10pt


and typeset directly with that, but then you would have no ligatures or kerning, and you would have to use Adobe character positions for special letters like The virtual font called ptmr' not only has ligatures and kerning, and most of the standard accent conventions of TeX, it also has a few additional features not present in the Computer Modern fonts. For example, it includes all the Adobe characters (such as the Polish ogonek and the French guillemots). The only things you lose from ordinary TeX text fonts are the dotless j' (which can be hacked into the VPL file with literal PostScript specials if you have the patience) and uppercase Greek letters (which just don't exist unless you buy them separately). (1)

The remapped p* fonts mostly follow plain TeX conventions for accents. The exceptions: the Hungarian umlaut (which is at position 0x7D' in cmr10', but position 0xCD' in ptmr'); the dot accent (at positions 0x5F' and 0xC7', respectively); and \AA', which neds different tweaking. In order to use these accents with PostScript fonts or in math mode when \textfont0' is a PostScript font, you will need to use the following definitions. These definitions will not work with the Computer Modern fonts for the relevant accents. They are already part of the distributed psfonts.sty' for use with LaTeX.

\def\H#1{{\accent"CD #1}}
\def\.#1{{\accent"C7 #1}}
\def\dot{\mathaccent"70C7 }
\hbox to \wd0{\hss\char'27\hss}}A}


These PostScript fonts can be scaled to any size. Go wild! Using PostScript fonts, however, does use up a great deal of the printer's memory and it does take time. You may find downloading bitmapped fonts to be faster than using the built-in PostScript fonts!

## Changing a Font's Encoding

The afm2tfm' program also allows you to specify a different encoding for a PostScript font. This can be done at two levels.

You can specify a different output encoding with -t'. This only applies when you are building a virtual font, and it tells afm2tfm' to attempt to remap the font to match the output encoding as closely as possible. In such an output encoding, you can also specify ligature pairs and kerning information that will be used in addition to the information in the afm' file.

You can also specify a different PostScript encoding with -p'. This changes both the raw tfm' file created by Afm2tfm and the vf' and tfm' files created by VPtoVF. It also requires that the encoding file be downloaded as part of any document that uses this font. This is the only way to access characters in a PostScript font that are neither encoded in the afm' file nor built from other characters (constructed characters.) For instance, Times-Roman' contains the extra characters trademark' and registered' (among others) that can only be accessed through such a PostScript reencoding. Any ligature or kern information specified in the PostScript encoding is ignored by afm2tfm'.

Afm2tfm's encoding files have precisely the same format as an encoding vector in any PostScript font. Specifically:

% Comments are ignored, unless the first word after the percent sign
% is LIGKERN -- see below.
/MyEncoding [ /Alpha /Beta /Gamma /Delta ...
/A /B ... /Z % exactly 256 entries, each with a / at the front
/wfooaccent /xfooaccent /yfooaccent /zfooaccent ] def


Comments, which start with a percent sign and continue until the end of the line, are ignored unless they start with LIGKERN'. The first word' of the file must start with a forward slash (a PostScript literal name) and defines the name of the encoding. The next word must be an left bracket ['. Following that must be precisely 256 character names; use /.notdef' for any that you do not want defined. Finally, there must be a matching right bracket ]. A final def' token is optional. All names are case sensitive.

Any ligature or kern information is given in the comments. If the first word after the percent sign is LIGKERN', then the entire rest of the line is parsed for ligature and kern information. This ligature and kern information is given in groups of words, each group of which must be terminated by a semicolon (with a space before and after it, unless it occurs at the end of a line.)

In these LIGKERN' statements, three types of information may be specified. These three types are ligature pairs, kerns to remove or ignore, and the character value of this font's boundary character. Which of the types the particular set of words corresponds to is automatically determined by the allowable syntax.

Throughout a LIGKERN' statement, the boundary character is specified as ||'.

To set the boundary character value, a command such as || = 39 ;' must be used.

To indicate a kern to remove, give the names of the two characters (without the leading slash) separated by {}', as in one {} one ;'. This is similar to the way you might use {}' in a TeX file to turn off ligatures or kerns at a particular location. Either or both of the character names can be given as *', which is a wild card matching any character; thus, all kerns can be removed with * {} * ;'.

To specify a ligature, specify the names of the pair of characters, followed by the ligature operation' (as in METAFONT), followed by the replacing character name. Either (but not both) of the first two characters can be ||' to indicate a word boundary.

Normally the operation' is =:' meaning that both characters are removed and replaced by the third character, but by adding |' characters on either side of the =:', you can specify which of the two leading characters to retain. In addition, by suffixing the ligature operation with one or two >' signs, you can indicate that the ligature scanning operation should skip that many characters before proceeding. This works just like in METAFONT. A typical ligature might be specified with ff i =: ffi ;'. A more convoluted ligature is one one |=:|>> exclam ;' which indicates that every pair of adjacent 1''s should be separated by an exclamation point, and then two of the resulting characters should be skipped over before continuing searching for ligatures and kerns. You cannot give more >''s in an ligature operation as you did |', so there are a total of eight possible ligature operations:

=: |=: |=:> =:| =:|> |=:| |=:|> |=:|>>


The default set of ligatures and kerns built in to afm2tfm' can be specified with:

% LIGKERN question quoteleft =: questiondown ;
% LIGKERN exclam quoteleft =: exclamdown ;
% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
% LIGKERN quoteleft quoteleft =: quotedblleft ;
% LIGKERN quoteright quoteright =: quotedblright ;
% LIGKERN space {} * ; * {} space ; 0 {} * ; * {} 0 ;
% LIGKERN 1 {} * ; * {} 1 ; 2 {} * ; * {} 2 ; 3 {} * ; * {} 3 ;
% LIGKERN 4 {} * ; * {} 4 ; 5 {} * ; * {} 5 ; 6 {} * ; * {} 6 ;
% LIGKERN 7 {} * ; * {} 7 ; 8 {} * ; * {} 8 ; 9 {} * ; * {} 9 ;


## Special Font Effects

Afm2tfm can do other manipulations as well. For example, to make an obliqued variant of Times Roman:

afm2tfm Times-Roman -s .167 -v ptmro rptmro


which creates ptmro.vpl' and rptmro.tfm'. To use this, put the line

rptmro Times-Roman ".167 SlantFont"


@flindex psfonts.map into psfonts.map'. Then rptmro' (our name for the obliqued Times) will act as if it were a resident font, although it is actually constructed from Times-Roman via the PostScript routine SlantFont (which slants everything 1/6 to the right, in this case).

Similarly, you can get an expanded font with

afm2tfm Times-Roman -e 1.2 -v ptmrre rptmrre


and by recording the pseudo-resident font

rptmrre Times-Roman "1.2 ExtendFont"


in psfonts.map'.

You can also create a small caps font with a command such as

afm2tfm Times-Roman -V ptmrc rptmrc


If you change the PostScript encoding of a font, you must specify the input file as a header file, as well as give a reencoding command. For instance, let us say we are using Times-Roman reencoded according to the encoding MyEncoding' (stored in the file myenc.enc') as rptmrx'. In this case, our psfonts.map' entry would look like

rptmrx Times-Roman "MyEncoding ReEncodeFont" <myenc.enc


The afm2tfm' program prints out the precise line you need to add to psfonts.map' to use that font, assuming the font is resident in the printer; if the font is not resident, you must add the header command to download the font yourself. Each identical line only needs to be specified once in the psfonts.map' file, even though many different fonts (small caps variants, or ones with different output encodings) may be based on it.

## Non-Resident PostScript Fonts

If you want to use a non-printer-resident PostScript font for which you have a pfb' or pfa' file (an Adobe Type 1 font program), you can make it act like a resident font by putting a <' sign and the name of the pfb' or pfa' file just after the font name in the psfonts.map' @flindex psfonts.map file entry. For example,

rpstrn StoneInformal <StoneInformal.pfb


will cause dvips to include StoneInformal.pfb' in your document as if it were a header file, whenever the pseudo-resident font StoneInformal is used in a document. Similarly, you can generate transformed fonts and include lines like

rpstrc StoneInformal <StoneInformal.pfb ".8 ExtendFont"


in psfonts.map', in which case StoneInformal.pfb' will be loaded whenever StoneInformal-Condensed is used. Each header file is loaded at most once per document.

If you are using a pfb' file that is also has a different PostScript encoding, you need to download multiple header files in psfonts.map'. If, for instance, Optima' was both non-resident and you wanted to reencode it in PostScript with MyEncoding' stored in myenc.enc', you need:

rpstrnx Optima "MyEncoding ReEncodeFont" <myenc.enc <Optima.pfb


When using PFB files, dvips is smart enough to unpack the binary PFB format into printable ASCII so there is no need to perform this conversion yourself. In addition, it will scan the font to determine its memory usage, as it would for any header file.

Here is a brief description of the contents of psfonts.map'. If a line is empty or begins with a space, asterisk, semicolon, or hash mark, it is ignored. Otherwise, the line is separated into words, where words are separated by spaces or tabs, except that if a word begins with a double quote, it extends until the next double quote or the end of the line. If a word starts with a less than character, it is treated as a font header file (or a downloaded PostScript font). There can be more than one such header for a given font. If a word starts with a double quote, it is a special instruction for generating that font. Otherwise it is a name. The first such name is the TFM file that a virtual font file can refer to. If there is another name, it is used as the PostScript name; if there is only one name, it is used for both the TeX name and the PostScript name.

## Invoking Afm2tfm

The command line switches to afm2tfm' are:

-e ratio'
All characters are stretched horizontally by the stated ratio; if it is less than 1.0, you get a condensed font.

-O'
This option forces all character codes in the output vpl' file be given as octal values; this is useful for symbol or other special-purpose fonts where character names such as A' have no meaning.

-p file'
This specifies a file to use for the PostScript encoding of the font. This file must also be mentioned as a header file for the font in psfonts.map', and that ligature and kern information in this file is ignored.

-T file'
This option specifies that file is to be used for both the PostScript and target TeX encodings of the font.

-t file'
This specifies a file to use for the target TeX encoding of the font. Ligature and kern information may also be specified in this file; the file need not be mentioned in psfonts.map'.

-s slant'
All characters are slanted to the right by slant. If slant is negative, the letters slope to the left (or they might be upright if you start with an italic font).

-v file'
Generate a virtual property list vpl' file as well as a tfm' file.

-V file'
Same as -v', but the virtual font generated is a small caps font obtained by scaling uppercase letters by 0.8 to typeset lowercase. This font handles accented letters and retains proper kerning.

# Command Line Options

The dvips driver has a plethora of command line options. Reading through this section will give a good idea of the capabilities of the driver.

Many of the parameterless options listed here can be turned off by immediately suffixing the option with a zero (0); for instance, to turn off page reversal if it is turned on by default, use -r0'. The options that can be turned off in this way are a', f', k', i', m', q', r', s', E', F', K', M', N', U', and Z'.

This is a handy summary of the options; it is printed out when you run dvips with no arguments.

     Usage: dvips [options] filename[.dvi]
a*  Conserve memory, not time      t s Paper format
b # Page copies, for posters e.g.  x # Override dvi magnification
c # Uncollated copies              C # Collated copies
d # Debugging                      D # Resolution
e # Maxdrift value                 E*  Try to create EPSF
f*  Run as filter                  F*  Send control-D at end
i*  Separate file per section      M*  Don't make fonts
k*  Print crop marks               N*  No structured comments
l # Last page                      O c Set/change paper offset
m*  Manual feed                    P s Load config.$s n # Maximum number of pages S # Max section size in pages o f Output file T c Specify desired page size p # First page U* Disable string param trick q* Run quietly X # Horizontal resolution r* Reverse order of pages Y # Vertical resolution s* Enclose output in save/restore Z* Compress bitmap fonts # = number f = file s = string * = suffix, 0' to turn off c = comma-separated dimension pair (e.g., 3.2in,-32.1cm)  -a' Conserve memory by making three passes over the dvi' file instead of two and only loading those characters actually used. Generally only useful on machines with a very limited amount of memory, like some PCs. -c num' Generate num copies of every page. Default is 1. (For collated copies, see the -C' option below.) -b num' Generate num copies of each page, but duplicating the page body rather than using the #numcopies' option. This can be useful in conjunction with a header file setting \bop-hook' to do color separations or other neat tricks. -d num' Set the debug flags. This is intended only for emergencies or for unusual fact-finding expeditions; it will work only if dvips has been compiled with the DEBUG' option. See section Debug Options, for the possible values of num. Use a value of -1' for maximum output. -e num' Make sure that each character is placed at most this many pixels from its true' resolution-independent position on the page. The default value of this parameter is resolution dependent (it is the number of entries in the list [100, 200, 300, 400, 500, 600, 800, 1000, 1200, 1600, 2000, 2400, 2800, 3200, ...] that are less than or equal to the resolution in dots per inch). Allowing individual characters to drift' from their correctly rounded positions by a few pixels, while regaining the true position at the beginning of each new word, improves the spacing of letters in words. -f' Run as a filter. Read the dvi' file from standard input and write the PostScript to standard output. The standard input must be seekable, so it cannot be a pipe. If you must use a pipe, write a shell script that copies the pipe output to a temporary file and then points dvips at this file. This option also disables the automatic reading of the PRINTER' environment variable, and turns off the automatic sending of control D if it was turned on with the -F' option or in the configuration file; use -F' after this option if you want both. -h name' Prepend file name as an additional header file. (However, if the name is simply -', suppress all header files from the output.) This header file gets added to the PostScript userdict'. -i' Make each section be a separate file. Under certain circumstances, dvips will split the document up into sections' to be processed independently; this is most often done for memory reasons. Using this option tells dvips to place each section into a separate file; the new file names are created replacing the suffix of the supplied output file name by a three-digit sequence number. This option is most often used in conjunction with the -S' option which sets the maximum section length in pages. For instance, some phototypesetters cannot print more than ten or so consecutive pages before running out of steam; these options can be used to automatically split a book into ten-page sections, each to its own file. -k' Print crop marks. This option increases the paper size (which should be specified, either with a paper size special or with the -T' option) by a half inch in each dimension. It translates each page by a quarter inch and draws cross-style crop marks. It is mostly useful with typesetters that can set the page size automatically. -l num' The last page printed will be the first one numbered num. Default is the last page in the document. If the num is prefixed by an equals sign, then it (and any argument to the -p' option) is treated as a sequence number, rather than a value to compare with \count0' values. Thus, using -l =9' will end with the ninth page of the document, no matter what the pages are actually numbered. -m' Specify manual feed for printer. -n num' At most num pages will be printed. Default is 100000. -o name' The output will be sent to file name. If no file name is given, the default name is file.ps' where the dvi' file was called file.dvi'; if this option isn't given, any default in the configuration file is used. If the first character of the supplied output file name is an exclamation mark, then the remainder will be used as an argument to popen'; thus, specifying !lpr' as the output file will automatically queue the file for printing. This option also disables the automatic reading of the PRINTER' environment variable, and turns off the automatic sending of control D if it was turned on with the -F' option or in the configuration file; use -F' after this option if you want both. -p num' The first page printed will be the first one numbered num. Default is the first page in the document. If the num is prefixed by an equals sign, then it (and any argument to the -l' option) is treated as a sequence number, rather than a value to compare with \count0' values. Thus, using -p =3' will start with the third page of the document, no matter what the pages are actually numbered. -q' Run in quiet mode. Don't chatter about pages converted, etc.; report nothing but errors to standard error. -r' Stack pages in reverse order. Normally, page 1 will be printed first. -s' Causes the entire global output to be enclosed in a save/restore pair. This causes the file to not be truly conformant, and is thus not recommended, but is useful if you are driving the printer directly and don't care too much about the portability of the output. -t papertype' This sets the paper type to papertype. The papertype should be defined in one of the configuration files, along with the appropriate code to select it. See the documentation for @'in the configuration file option descriptions. You can also specify -t landscape', which rotates a document by 90 degrees. To rotate a document whose size is not letter, you can use the -t' option twice, once for the page size, and once for landscape'. The upper left corner of each page in the dvi' file is placed one inch from the left and one inch from the top. Use of this option is highly dependent on the configuration file. Note that executing the letter' or a4' or other PostScript operators cause the document to be nonconforming and can cause it not to print on certain printers, so the default paper size should not execute such an operator if at all possible. -x num' Set the magnification ratio to num/1000. Overrides the magnification specified in the dvi' file. Must be between 10 and 100000. -C num' Create num copies, but collated (by replicating the data in the PostScript file). Slower than the -c' option, but easier on the hands, and faster than resubmitting the same PostScript file multiple times. -D num' Set the resolution in dpi (dots per inch) to num. This affects the choice of bitmap fonts that are loaded and also the positioning of letters in resident PostScript fonts. Must be between 10 and 10000. This affects both the horizontal and vertical resolution. If a high resolution (something greater than 400 dpi, say) is selected, the -Z' flag should probably also be used. -E' Makes dvips attempt to generate an EPSF file with a tight bounding box. This only works on one-page files, and it only looks at marks made by characters and rules, not by any included graphics. In addition, it gets the glyph metrics from the tfm' file, so characters that lie outside their enclosing tfm' box may confuse it. In addition, the bounding box might be a bit too loose if the character glyph has significant left or right side bearings. Nonetheless, this option works well for creating small EPSF files for equations or tables or the like. (Note, of course, that dvips' output is resolution dependent and thus does not make very good EPSF files, especially if the images are to be scaled; use these EPSF files with a great deal of care.) -F' Causes Control-D (ASCII code 4) to be appended as the very last character of the PostScript file. This is useful when dvips is driving the printer directly instead of working through a spooler, as is common on extremely small systems. Otherwise, it is not recommended. -K' This option causes comments in included PostScript graphics, font files, and headers to be removed. This is sometimes necessary to get around bugs in spoolers or PostScript post-processing programs. Specifically, the %%Page' comments, when left in, often cause difficulties. Use of this flag can cause some included graphics to fail, since the PostScript header macros from some software packages read portions of the input stream line by line, searching for a particular comment. This option has been turned off by default because PostScript previewers and spoolers have been getting better. -M' Turns off the automatic font generation facility. If any fonts are missing, commands to generate the fonts are appended to the file missfont.log' in the current directory; this file can then be executed and deleted to create the missing fonts. -N' Turns off structured comments; this might be necessary on some systems that try to interpret PostScript comments in weird ways, or on some PostScript printers. Old versions of TranScript in particular cannot handle modern Encapsulated PostScript. -O offset' Move the origin by a certain amount. The offset is a comma-separated pair of dimensions, such as .1in,-.3cm' (in the same syntax used in the papersize' special). The origin of the page is shifted from the default position (of one inch down, one inch to the right from the upper left corner of the paper) by this amount. -P printername' Sets up the output for the appropriate printer. This is implemented by reading in config.printername', which can then set the output pipe (as in, o !lpr -Pprintername') as well as the font paths and any other defaults for that printer only. It is recommended that all standard defaults go in the one master config.ps' file and only things that vary printer to printer go in the config.printername' files. Note that config.ps' is read before config.printername'. In addition, another file called ~/.dvipsrc' is searched for immediately after config.ps'; this file is intended for user defaults. If no -P' command is given, the environment variable PRINTER' is checked. If that variable exists, and a corresponding configuration file exists, that configuration file is read in. -S num' Set the maximum number of pages in each section'. This option is most commonly used with the -i' option; see that documentation above for more information. -T offset' Set the paper size to the given pair of dimensions. This option takes its arguments in the same style as -O'. It overrides any paper size special in the dvi' file. -U' Disable a PostScript virtual memory saving optimization that stores the character metric information in the same string that is used to store the bitmap information. This is only necessary when driving the Xerox 4045 PostScript interpreter. It is caused by a bug in that interpreter that results in garbage' on the bottom of each character. Not recommended unless you must drive this printer. -X num' Set the horizontal resolution in dots per inch to num. -Y num' Set the vertical resolution in dots per inch to num. -Z' Causes bitmapped fonts to be compressed before they are downloaded, thereby reducing the size of the PostScript font-downloading information. Especially useful at high resolutions or when very large fonts are used. Will slow down printing somewhat, especially on early 68000-based PostScript printers. # Configuration File Searching @flindex config.ps The dvips program has a system of loading configuration files such that parameters can be set globally across the system, on a per-printer basis, or by the user. When dvips starts up, first the global config.ps' file is searched for and loaded. This file is looked for along the path for configuration files, which is set in the Makefile' at compilation. After this master configuration file is loaded, a file by the name of @flindex .dvipsrc .dvipsrc' is loaded from the current user's home directory, if such a file exists. This file is loaded in exactly the same way as the global configuration file, and it can override any options set in the global file. Then the command line is read and parsed. If the -P' option is encountered, at that point in the command line a configuration file for that printer is read in. Thus, the printer configuration file can override anything in the global or user configuration file, and it can also override anything seen in the command line up to the point that the -P' option was encountered. After the command line has been completely scanned, if there was no -P' option selected, and also the -o' and -f' command line options were not used, a PRINTER' environment variable is searched for. If this variable exists, and a configuration file for the printer mentioned in it exists, this configuration file is loaded last of all. Note that because the printer-specific configuration files are read after the user's configuration file, the user cannot override things in the printer configuration files. On the other hand, the configuration path usually includes the current directory, and can be set to include the user's home directory (or any other directory of the user), so the user can always provide his or her own printer-specific configuration files that will be found before the system global ones. It is best to give a METAFONT mode as well as a resolution in the printer configuration file. Also make sure that METAFONT knows about the mode, by entering it into your local mode_def' file. (For example, the file modes.mf' @flindex modes.mf which is available from ftp.cs.umb.edu' in pub/tex/modes.mf'.) The most common problem in generating fonts with METAFONT is that this file with the mode definitions is not included when creating the plain.base' file. ## Configuration File Options Most of the configuration file options are similar to the command line options, but there are a few new ones. Again, many may be turned off by suffixing the letter with a zero (0). These options are a', f', q', r', K', N', U', and Z'. Within a configuration file, any empty line or line starting with a space, asterisk, equal sign, or a pound sign is ignored. o name hsize vsize' This option is used to set the paper size defaults and options for the particular printer this configuration file describes. There are three formats for this option. If the option is specified on a line by itself, with no parameters, it instructs dvips to discard all other paper size information (possibly from another configuration file) and start fresh. If three parameters are given, as above, with the first parameter being a name and the second and third being a dimension (as in 8.5in or 3.2cc, just like in the papersize' special), then the option is interpreted as starting a new paper size description, where name is the name and hsize and vsize describe the horizontal and vertical size of the sheet of paper, respectively. If both hsize and vsize are equal to zero (although you must still specify units!) then any page size will match it. If the @' character is immediately followed by a +' sign, then the remainder of the line (after skipping any leading blanks) is treated as PostScript code to send to the printer to select that particular paper size. After all that, if the first character of the line is an exclamation point, then the line is put in the initial comments section of the final output file; else, it is put in the setup section of the output file. For instance, a subset of the paper size information supplied in the default config.ps' looks like @ letterSize 8.5in 11in @ letter 8.5in 11in @+ %%BeginPaperSize: Letter @+ letter @+ %%EndPaperSize @ legal 8.5in 14in @+ ! %%DocumentPaperSizes: Legal @+ %%BeginPaperSize: Legal @+ legal @+ %%EndPaperSize  Note that you can even include structured comments in the configuration file! When dvips has a paper format name given on the command line, it looks for a match by the name; when it has a papersize' special, it looks for a match by dimensions. The first match found (in the order the paper size information is found in the configuration file) is used. If nothing matches, a warning is printed and the first paper size given is used, so the first paper size should always be the default. The dimensions must match within a quarter of an inch. Landscape mode for all of the paper sizes are automatically supported. If your printer has a command to set a special paper size, then give dimensions of 0in 0in'; the PostScript code that sets the paper size can refer to the dimensions the user requested as hsize' and vsize'; these will be macros defined in the PostScript that return the requested size in default PostScript units. Note that virtually all of the PostScript commands you use here are device dependent and degrade the portability of the file; that is why the default first paper size entry should not send any PostScript commands down (although a structured comment or two would be okay). Also, some printers want BeginPaperSize' comments and paper size setting commands; others (such as the NeXT) want PaperSize' comments and they will handle setting the paper size. There is no solution I could find that works for both (except maybe specifying both.) See the supplied config.ps' file for a more realistic example. a' Conserve memory by making three passes over the dvi' file instead of two and only loading those characters actually used. Generally only useful on machines with a very limited amount of memory, like some PCs. b num' Generate num copies of each page, but duplicating the page body rather than using the #numcopies' option. This can be useful in conjunction with a header file setting \bop-hook' to do color separations or other neat tricks. e num' Set the maximum drift parameter to num dots (pixels) as explained above. f' Run as a filter by default. h name' Add name as a PostScript header file to be downloaded at the beginning. i num' Make each section be a separate file, and set the maximum number of pages in a given file to num. Under certain circumstances, dvips will split the document into sections' to be processed independently; this is most often done for memory reasons. Using this option tells dvips to place each section into a separate file; the new file names are created by replacing the suffix of the supplied output file name with a three-digit sequence number. This is essentially a combination of the command line options -i' and -S'; see the documentation for these options for more information. m num' The value num is the virtual memory available for fonts and strings in the printer. Default is 180000. This value must be accurate if memory conservation and document splitting is to work correctly. To determine this value, send the following file to the printer: %! Hey, we're PostScript /Times-Roman findfont 30 scalefont setfont 144 432 moveto vmstatus exch sub 40 string cvs show pop showpage  Note that the number returned by this file is the total memory free; it is often a good idea to tell dvips that the printer has somewhat less memory. This is because many programs download permanent macros that can reduce the memory in the printer. In general, a memory size of about 300000' is plenty, since dvips can automatically split a document if required. It is unfortunate that PostScript printers with much less virtual memory still exist. Some systems or printers can dynamically increase the memory available to a PostScript interpreter, in which case this file might return a ridiculously low number; the NeXT computer is such a machine. For these systems, a value of one million works well. o name' The default output file is set to name. As above, it can be a pipe. Useful in printer-specific configuration files to redirect the output to a particular printer queue. p name' The file to examine for PostScript font aliases is name. It defaults to psfonts.map'. This option allows different printers to use different resident fonts. If the name starts with a +' character, then the rest of the name (after any leading spaces) is used as an additional map file; thus, it is possible to have local map files pointed to by local configuration files that append to the global map file. q' Run in quiet mode by default. r' Reverse the order of pages by default. s' Enclose the entire document in a global save/restore pair by default. Not recommended, but useful in some environments; this breaks the conformance of the document to the Adobe PostScript structuring conventions. D num' Set the vertical and horizontal resolution to num dots per inch. Useful in printer-specific configuration files. E command' Executes the command listed; can be used to get the current date into a header file for inclusion, for instance. Possibly dangerous; in many installations this may be disabled, in which case a warning message will be printed if the option is used. H path' The (colon-separated) path to search for PostScript header files is path. K' Filter comments out of included PostScript files; see the description above for more information. M mode' Set mode as the METAFONT mode to be used when generating fonts. This is passed along to MakeTeXPK' and overrides mode derivation from the base resolution. N' Disable PostScript comments by default. O offset' Move the origin by a certain amount. The offset is a comma-separated pair of dimensions, such as .1in,-.3cm' (in the same syntax as used in the papersize' special). The origin of the page is shifted from the default position (of one inch down, one inch to the right from the upper left corner of the paper) by this amount. P path' The (colon-separated) path to search for bitmap pk' font files is path. The TEXPKS' environment variable will override this. If a %' character is found in path, the following substitutions will be made, and then a search will be made for the resulting filenames. %f' is replaced by the font name. %b' is replaced by the output device horizontal resolution dots per inch. %d' is replaced by the font size in dots per inch. %p' is replaced by the font family; this is always pk'. %m' is replaced by the font mode; this is the mode given in the M' option. Note that, for each path element, if it contains a percent sign, you must give the full file name, including path, rather than just the directory name; a path element such as /fonts/%b' will try to open /fonts/300' when looking for cmr10.329pk', for instance, and this may not be what is intended; /fonts/%b/%f.%dpk' is needed. If a path element does not contain a percent sign, there is no need to specify the entire file name (because you can't, unless you list all possible specific font names!) • R num num ... Sets up a list of default resolutions to search for pk' fonts, if the requested size is not available. The output will then scale the font found using PostScript scaling to the requested size. Note that the resultant output will be ugly, and thus a warning is issued. To turn this off, use a line with just the R' and no numbers. • S path The path to search for special illustrations (Encapsulated PostScript files or psfiles) is path. The TEXINPUTS' environment variable will override this. • T path The path to search for the tfm' files is path. The TEXFONTS' environment variable will override this. This path is used for resident fonts and fonts that can't otherwise be found. It's usually best to make it identical to the path used by TeX. • U Turns off a memory-saving optimization; this is necessary for the Xerox 4045 printer, but not recommended otherwise. See the description above for more information. • V path The path to search for virtual font vf' files is path. This may be device-dependent if you use virtual fonts to simulate actual fonts on different devices. • W string Sends string to stderr, if a parameter is given; otherwise it cancels another previous message. This is useful in the default configuration file if you want to require the user to specify a printer, for instance, or if you want to notify the user that the resultant output has special characteristics. • X num Set the horizontal resolution to num dots per inch. • Y num Set the vertical resolution to num dots per inch. • Z Compress all downloaded fonts by default, as above. • # Automatic Font Generation One major problem with TeX and the Computer Modern fonts is the huge amount of disk space a full set of high resolution fonts can take. The dvips program solves this problem by creating fonts on demand, so only those fonts that are actually used are stored on disk. At a typical site, less than one-fifth of the full set of Computer Modern fonts are used over a long period, so this saves a great deal of disk space. Furthermore, the addition of dynamic font generation allows fonts to be used at any size, including typesetter resolutions and extremely huge banner sizes. Nothing special needs to be done; the fonts will be automatically created and installed as needed. The downside is that it does take a certain amount of time to create a new font if it has never been used before. But once a font is created, it will exist on disk, and the next time that document is printed it will print very quickly. It is the MakeTeXPK' shell script that is responsible for making these fonts. The MakeTeXPK' script supplied invokes METAFONT to create the font and then copies the resultant pk' file to a world-writable font cache area. MakeTeXPK' can be customized to do other things to get the font. For instance, if you are installing dvips to replace (or run alongside) an existing PostScript driver, and that driver demands gf' fonts, you can easily modify MakeTeXPK' to invoke gftopk' to convert the gf' files to pk' files for dvips. This provides the same space savings listed above. Because dvips (and thus MakeTeXPK') is run by a wide variety of users, there must be a system-wide place to put the cached font files. In order for everyone to be able to supply fonts, the directory must be world writable. If your system administrator considers this a security hole, MakeTeXPK' can write to /tmp/pk' or some such directory, and periodically the cached fonts can be moved to a more general system area. Note that the cache directory must exist on the pk' file search path in order for MakeTeXPK' to work. # Path Interpretation These programs use the same environment variables and algorithms for finding font files as does (the Unix port of) TeX and its friends. You specify the default paths in the top-level Makefile. The environment variables TEXFONTS, PKFONTS, TEXPKS, and GFFONTS override those paths. Both the default paths and the environment variable values should consist of a colon-separated list of directories. Specifically, a TFM file is looked for along the path specified by TEXFONTS; a GF file along GFFONTS, then TEXFONTS; a PK file along PKFONTS, then TEXPKS, then TEXFONTS. A leading or trailing colon in an environment variable value is replaced by the default path. A leading ~' or ~user' in a path component is replaced by the current home directory or user's home directory, respectively. If a directory in a path does not exist, it is simply ignored. In either the default value or the environment variable value, if a component directory d ends with two slashes, all subdirectories of d are searched: first those subdirectories directly under d, then the subsubdirectories under those, and so on. At each level, the order in which the directories are searched is unspecified. The subdirectory searching has one known deficiency, for which we know of no good solution. If a directory d being searched for subdirectories contains plain files and symbolic links to other directories, but no real subdirectories, d will be considered a leaf directory, i.e., the symbolic links will not be followed. The only way we know of to fix this is to invoke stat (an expensive system call) on every directory entry. Since font directories often contain hundreds of files, this would make the startup time unacceptably slow. A directory d explicitly named with two trailing slashes, however, is always searched for subdirectories, even if it is a "leaf". We do this since presumably you would not have asked d to be searched for subdirectories if you didn't want it to be, and therefore you don't have hundreds of files in d. For example, the following value for an environment variable says to search the following: all subdirectories of the current user's fonts' directory in his or her home directory, then the directory fonts' in the user karl's home directory, and finally the system default directories specified at compilation time. ~/fonts//:~karl/fonts:  # Environment Variables The dvips program reads a certain set of environment variables to configure its operation. The path variables are read after all configuration files are read, so they override values in the configuration files. (The TEXCONFIG' variable, of course, is read before the configuration files.) The rest are read as needed. Note that all defaults supplied here are just as supplied in the provided Makefile'; they will almost certainly have been changed during installation at your particular site. HOME = no default' This environment variable is automatically set by the shell and is used to replace any occurrences of ~' in a path. MAKETEXPK = MakeTeXPK %n %d %b %m'' This environment variable sets the command to be executed to create a missing font. A %n' is replaced by the base name of the font to be created (such as cmr10'); a %d' is replaced by the resultant horizontal resolution of the font; a %b' is replaced by the horizontal resolution at which dvips is currently generating output, and any %m' is replaced by a string that METAFONT can use as the right hand side of an assignment to mag' to create the desired font at the proper resolution. If a mode for METAFONT is set in a configuration file, that is automatically appended to the command before execution. Note that these substitutions are different than the ones performed on PK paths. PRINTER = no default' This environment variable is read to determine which default printer configuration file to read in. Note that it is the responsibility of the configuration file to send output to the proper print queue, if such functionality is desired. TEXFONTS = /LocalLibrary/Fonts/TeXFonts/tfm:/usr/lib/tex/fonts/tfm'' This is where tfm' files are searched for. A tfm' file only needs to be loaded if the font is a resident (PostScript) font or if for some reason no pk' file could be found. TEXPKS = /LocalLibrary/Fonts/TeXFonts/pk:/usr/lib/tex/fonts/pk'' This environment variable is a path on which to search for pk' fonts. Certain substitutions are performed if a percent sign is found anywhere in the path. See the description of the P' configuration file option for more information. TEXINPUTS = .:..:/usr/lib/tex/inputs'' This environment variable is used to find PostScript figures when they are included. TEXCONFIG = .:/usr/lib/tex/ps'' This environment variable sets the directories to search for configuration files, including the system-wide one. Using this single environment variable and the appropriate configuration files, it is possible to set up the program for any environment. (The other path environment variables can thus be redundant.) VFFONTS = .:/usr/lib/tex/fonts/vf'' This environment variable sets where dvips looks for virtual fonts. A correct virtual font path is essential if PostScript fonts are to be used. # Other Bells And Whistles For special effects, if any of the macros bop-hook', eop-hook', start-hook', or end-hook' are defined in the PostScript userdict', they will be executed at the beginning of a page, end of a page, start of the document, and end of a document, respectively. When these macros are executed, the default PostScript coordinate system and origin is in effect. Such macros can be defined in headers added by the -h' option or the header=' special, and might be useful for writing, for instance, DRAFT across the entire page, or, with the aid of a shell script, dating the document. These macros are executed outside of the save/restore context of the individual pages, so it is possible for them to accumulate information, but if a document must be divided into sections because of memory constraints, such added information will be lost across section breaks. The single argument to bop-hook' is the sequence number of the page in the file; the first page gets zero, the second one, etc. The procedure must leave this number on the stack. None of the other hooks are (currently) given parameters, although this may change in the future. As an example of what can be done, the following special will write a light DRAFT across each page in the document: \special{!userdict begin /bop-hook{gsave 200 30 translate 65 rotate /Times-Roman findfont 216 scalefont setfont 0 0 moveto 0.7 setgray (DRAFT) show grestore}def end}  Note that using bop-hook' or eop-hook' in any way that preserves information across pages will break compliance with the Adobe document structuring conventions, so if you use any such tricks, it is recommended that you also use the -N' option to turn off structured comments. Several of the above tricks can be used nicely together, and it is not necessary that a printer configuration file' be used only to set printer defaults. For instance, a -P' file can be set up to print the date on each page; the particular configuration file will execute a command to put the date into a header file, which is then included with a h' line in the configuration file. Note that multiple -P' options can be used. # MS-DOS The MS-DOS version of dvips differs from UNIX in the following ways. • Path separators are ;' not :'. • Directory separators are \' not /'. • The user's initialization file is dvips.ini' not .dvipsrc'. • Pipes to printers are not supported. Output must go to a file. • MakeTeXPk' is a batch file. Since MS-DOS has insufficient memory to run both dvips and METAFONT at the same time, this batch file will typically write out a set of commands for running METAFONT later. The maketexp.bat' supplied writes out an mfjob' file for emTeX. • Limited emTeX specials. The following ones are supported: \special{em:message xxx} \special{em:point n} \special{em:line a[h|v|p],b[h|v|p] [,width]} \special{em:linewidth width} \special{em:moveto} \special{em:lineto} end  • The \special{{}em:graph xxx{}} ' is not supported. The line cut parameters [h|v|p]' of the \special{{}em:line ...{}}' command are ignored. Lines are ended with a rounded cap. A maximum of 1613 different point numbers are permitted on each page. The program dvips can use emTeX font libraries created with the emTeX fontlib /2' option. If a pxl' font is found within a font library, dvips will complain, and then ignore the pxl' font. The font library names and directory names can be specified with this configuration file option. # Installation To compile and install Dvips: • Run sh configure in the top-level directory. This tries to figure out system dependencies and the installation prefix. See section The configure script, for options and other information about the configure script. • @flindex Makefile, editing @flindex c-auto.h, editing If necessary, edit the paths or other definitions in the top-level Makefile' and in c-auto.h' which configure created. • Run make; i.e., just type make' in the top-level directory. If all goes well, this will compile all the programs. • @flindex MakeTeXPK, editing Update the paths in MakeTeXPK', unless you do not want automatic font generation (in which case you should not install MakeTeXPK' at all). See section Automatic Font Generation. • @flindex config.ps, editing Update the device parameters (available memory, resolution, etc.) in config.ps'. This file is installed as the system-wide configuration file. See section Configuration File Options. • Install the programs and supporting macros, fonts, and data files with make install. • If you want to use Dvips with more than one device, create configuration files for each and install them. If you encounter problems anywhere along the line, let us know. ## The configure script (This section is largely from the Autoconf manual, by David MacKenzie. See section 'Running configure scripts' in Autoconf.) @flindex aclocal.m4 The configure script that comes with the font utilities is generated automatically by the Autoconf program. You can regenerate configure by rerunning Autoconf (for example, if a new version of Autoconf is released); you must arrange for Autoconf to use the macros in ./aclocal.m4' (@xref{Generating configure, , Generating configure, autoconf, Autoconf}). The purpose of configure is to adapt the source code to your system: for example, the name of the directory header file (dirent.h' or sys/dir.h'), whether an install program is available, and so on. Normally, you do not need to give any options to configure; you cd to the directory with the source code and type configure'. Exceptions: if .' is not in your PATH, you must type ./configure'; if you are using a non-Bourne-compatible shell on some old systems, you must samp sh configure'. @flindex /dev/null Running configure takes a minute or two. While it is running, it prints some messages that tell what it is doing. If you don't want to see the messages, run configure with its standard output redirected to /dev/null'; for example, configure >/dev/null'. To compile the package in a different directory from the one containing the source code, you must use a variant of Make that supports the VPATH variable, such as GNU Make. cd to the directory where you want the object files and executables to go and run configure with the option --srcdir=dir', where dir is the directory that contains the source code. Using this option is unnecessary if the source code is in the parent directory of the one in which you are compiling; configure automatically checks for the source code in ..' if it does not find it in .'. configure guesses the default installation prefix (we'll call it $(prefix)) by looking for the directory which contains the command dvips, and using its parent. For example, if dvips is installed as /usr/local/tex/bin/dvips', \$(prefix) will be set to /usr/local/tex'.

@opindex -prefix @opindex -exec-prefix You can override this default guess for the installation prefix by giving configure the option --prefix=path'. You can also specify separate installation prefixes for architecture-specific files and architecture-independent files by giving configure the option --exec_prefix=xpath'. Then xpath will be the prefix for installing programs and libraries. Data files and documentation will still use the regular prefix. Normally, all files are installed using the regular prefix.

@flindex config.status @opindex -no-create @opindex -recheck You can tell configure to figure out the configuration for your system, and record it in config.status', without actually configuring the package. To do this, give configure the --no-create' option. Later, you can run ./config.status' to actually configure the package. This option is useful mainly in Makefile' rules for updating config.status' and the Makefile' itself. You can also give config.status' the --recheck' option, which makes it rerun configure with the same arguments you used before. This is useful if you change configure.

configure ignores any other arguments that you give it.

On systems that require unusual options for compilation or linking that the package's configure script does not know about, you can give configure initial values for variables by setting them in the environment. In Bourne-compatible shells, you can do that on the command line like this:

CC='gcc -traditional' LIBS=-lposix sh configure


The Make variables that you might want to override with environment variables when running configure are:

(For these variables, any value given in the environment overrides the value that configure would choose.)

CC
The C compiler program. The default is gcc if that is in your PATH, cc otherwise.

INSTALL
The program to use to install files. The default is install if you have it, cp otherwise.

(For these variables, any value given in the environment is added to the value that configure chooses.)

DEFS
Configuration options, in the form -Dfoo -Dbar...'. Packages that use the Autoconf macro AC_CONFIG_HEADER (including the file utilities) do not use this variable.

LIBS
Libraries to link with, in the form -lfoo -lbar...'.

@flindex configure.in Of course, problems requiring manual intervention (e.g., setting these variables) should ideally be fixed by updating either the Autoconf macros or the configure.in' file for that package.

# Diagnosing Problems

You've gone through all the trouble of installing dvips, carefully read all the instructions in this manual, and still can't get something to work. This is all too common, and is usually caused by some broken PostScript application out there. The following sections provide some helpful hints if you find yourself in such a situation.

In all cases, you should attempt to find the smallest file that causes the problem. This will not only make debugging easier, it will also reduce the number of possible interactions among different parts of the system.

## Debug Options

The -d' flag to dvips is very useful for helping to track down certain errors. The parameter to this flag is an integer that tells what errors are currently being tracked. To track a certain class of debug messages, simply provide the appropriate number given below; if you wish to track multiple classes, sum the numbers of the classes you wish to track. The classes are:

1
specials
2
paths
4
fonts
8
pages
16
32
font compression
64
files
128
memory

## No Output At All

If you are not getting any output at all, even from the simplest one-character file (for instance, \ \bye'), then something is very wrong. Practically any file sent to a PostScript laser printer should generate some output, at the very least a page detailing what error occurred, if any. Talk to your system administrator about downloading a PostScript error handler. (Adobe distributes a good one called ehandler.ps'.) @flindex ehandler.ps

It is possible, especially if you are using non-Adobe PostScript, that your PostScript interpreter is broken. Even then it should generate an error message. I've tried to work around as many bugs as possible in common non-Adobe PostScript interpreters, but I'm sure I've missed a few.

If dvips gives any strange error messages, or compilation on your machine generated a lot of warnings, perhaps the dvips program itself is broken. Carefully check the types in structures.h' and the declarations in the Makefile', and try using the debug options to determine where the error occurred.

It is possible your spooler is broken and is misinterpreting the structured comments. Try the -N' flag to turn off structured comments and see what happens.

## Output Too Small or Inverted

If some documents come out inverted or too small, your spooler is not supplying an end of job indicator at the end of each file. (This happens a lot on small machines that don't have spoolers.) You can force dvips to do this with the -F' flag, but note that this generates files with a binary character (control-D) in them. You can also try using the -s' flag to enclose the entire job in a save/restore pair.

## Error Messages From Printer

If your printer returns error messages, the error message gives very good information on what might be going wrong. One of the most common error messages is bop undefined'. This is caused by old versions of Transcript and other spoolers that do not properly parse the setup section of the PostScript. To fix this, turn off structured comments with the -N' option, but make sure you get your spooling software updated.

Another error message is VM exhausted'. (Some printers indicate this error by locking up; others quietly reset.) This is caused by telling dvips that the printer has more memory than it actually does, and then printing a complicated document. To fix this, try lowering the parameter to m' in the configuration file; use the debug option to make sure you adjust the correct file.

Other errors may indicate that the graphics you are trying to include don't nest properly in other PostScript documents, or any of a number of other possibilities. Try the output on a QMS PS-810 or other Adobe PostScript printer; it might be a problem with the printer itself.

## 400 DPI Is Used Instead Of 300 DPI

This common error is caused by not editing the config.ps' file to reflect the correct resolution for your site. You can use the debug flags (-d64') to see what files are actually being read.

## Long Documents Fail To Print

This is usually caused by incorrectly specifying the amount of memory the printer has in config.ps'; see the description above.

## Including Graphics Fails

The reasons why graphics inclusions fail are too numerous to mention. The most common problem is an incorrect bounding box; read the section on bounding boxes and check your PostScript file. Complain very loudly to whoever wrote the software that generated the file if the bounding box is indeed incorrect.

Another possible problem is that the figure you are trying to include does not nest properly; there are certain rules PostScript applications should follow when generating files to be included. The dvips program includes work-arounds for such errors in Adobe Illustrator and other programs, but there are certainly applications that haven't been tested.

One possible thing to try is the -K' flag, to strip the comments from an included figure. This might be necessary if the PostScript spooling software does not read the structuring comments correctly. Use of this flag will break graphics from some applications, though, since some applications read the PostScript file from the input stream looking for a particular comment.

Any application which generates graphics output containing raw binary (not hex) will probably fail with dvips.

## Unable to Find Font Files

If dvips complains that it cannot find certain font files, it is possible that the paths haven't been set up correctly for your system. Use the debug flags to determine precisely what fonts are being looked for and make sure these match where the fonts are located on your system.

## Unable to Generate Fonts

This happens a lot if either MakeTeXPK' hasn't been properly edited and installed, or if the local installation of METAFONT isn't correct. If MakeTeXPK' isn't properly edited or isn't installed, an error such as MakeTeXPK not found' will be printed on the console. The fix is to talk to the person who installed dvips and have them fix this.

If METAFONT isn't found when MakeTeXPK' is running, make sure it is installed on your system. The person who installed TeX should be able to install METAFONT easily.

If METAFONT runs but generates fonts that are too large (and prints out the name of each character as well as just a character number), then your METAFONT base file probably hasn't been made properly. To make a proper plain.base', assuming the local mode definitions are contained in local.mf' (on the NeXT, next.mf'; on the Amiga, amiga.mf'), type the following command (assuming csh' under UNIX):

% inimf "plain; input local; dump"

Now, copy the plain.base' file from the current directory to where the base files are stored on your system.

Note that a preloaded cmbase.base' should never be used when creating fonts, and a program such as cmmf' should never exist on the system. The macros defined in cmbase' will break fonts that do not use cmbase'; such fonts include the LaTeX fonts. Loading the cmbase' macros when they are needed is done automatically and takes less than a second--an insignificant fraction of the total run time of METAFONT for a font, especially when the possibility of generating incorrect fonts is taken into account. If you create the LaTeX font circle10', for instance, with the cmbase' macros loaded, the characters will have incorrect widths.

# Using Color with dvips

This new feature of dvips is somewhat experimental so your experiences and comments are welcome. Initially added by Jim Hafner, IBM Research, hafner@almaden.ibm.com', the color support has gone through many changes by Tomas Rokicki. Besides the changes to the source code itself, there are additional TeX macro files: colordvi.tex' and blackdvi.tex'. There are also .sty' versions of these files that can be used with LaTeX and other similar macro packages. This feature adds one-pass multi-color printing of TeX documents on any color PostScript device.

In this section we describe the use of color from the document preparer's point of view and then add some simple instructions on installation for the system administrator.

## The Macro Files

All the color macro commands are defined in colordvi.tex' (or colordvi.sty'). To access these macros simply add to the top of your TeX file the command

\input colordvi


or, if your document uses style files like LaTeX, add the colordvi' style option as in

\documentstyle[12pt,colordvi]{article}


There are basically two kinds of color macros, ones for local color changes to, say, a few words or even one symbol and one for global color changes. Note that all the color names use a mixed case scheme. There are 68 predefined colors, with names taken primarily from the Crayola crayon box of 64 colors, and one pair of macros for the user to set his own color pattern. More on this extra feature later. You can browse the file colordvi.tex' for a list of the predefined colors. The comments in this file also show a rough correspondence between the crayon names and PANTONEs.

A local color command is in the form

\ColorName{this will print in color}


Here ColorName' is the name of a predefined color. As this example shows, this type of command takes one argument which is the text that is to print in the selected color. This can be used for nested color changes since it restores the original color state when it completes. For example, suppose you were writing in green and want to switch temporarily to red, then blue, back to red and restore green. Here is one way that you can do this:

This text is green but here we are \Red{switching to red,
\Blue{nesting blue}, recovering the red} and back to
original green.


In principle there is no limit to the nesting level, but it is not advisable to nest too deep lest you loose track of the color history. The global color command has the form

\textColorName


This macro takes no arguments and immediately changes the default color from that point on to the specified color. This of course can be overriden globally by another such command or locally by local color commands. For example, expanding on the example above, we might have

\textGreen
This text is green but here we are \Red{switching to red,
\Blue{nesting blue}, recovering the red} and back to
original green.
\textCyan
The text from here on will be cyan unless
\Yellow{locally changed to yellow}. Now we are back to cyan.

The color commands will even work in math mode and across math mode boundaries. This means that if you have a color before going into math mode, the mathematics will be set in that color as well. More importantly however, in alignment environments like \halign', tabular' or eqnarray', local color commands cannot extend beyond the alignment characters. Because local color commands respect only some environment and deliminator changes besides their own, care must be taken in setting their scope. It is best not to have then stretch too far. At the present time there are no macros for color environments in LaTeX which might have a larger range. This is primarily to keep the TeX and LaTeX use compatible.

## User Definable Colors

There are two ways for the user to specify colors not already defined. For local changes, there is the command \Color' which takes two arguments. The first argument is a quadruple of numbers between zero and one and specifies the intensity of cyan, magenta, yellow and black (CMYK) in that order. The second argument is the text that should appear in the given color. For example, suppose you want the words "this color is pretty" to appear in a color which is 50% cyan, 85% magenta, 40% yellow and 20% black. You would use the command

\Color{.5 .85 .4 .2}{this color is pretty}


For global color changes, there is a command \textColor' which takes one argument, the CMYK quadruple of relative color intensities. For example, if you want the default color to be as above, then the command

\textColor{.5 .85 .4 .2}
The text from now on will be this pretty color


will do the trick. Making a global color change in the midst of a nested local colors is highly discouraged. Consequently, dvips will give you warning message and do its best to recover by discarding the current color history.

## Subtleties in Using Color

These color macros are defined by use of specialized \special' keywords. As such, they are put in the .dvi' file only as explicit message strings to the driver. The (unpleasant) result is that certain unprotected regions of the text can have unwanted color side effects. For example, if a color region is split by TeX across a page boundary, then the footers of the current page (e.g., the page number) and the headers of the next page can inherit that color. To avoid this effect globally, users should make sure that these special regions of the text are defined with their own local color commands. For example in TeX, to protect the header and footer, use

\headline{\Black{My Header}}
\footline{\Black{\hss\tenrm\folio\hss}}


This warning also applies to figures and other insertions, so be careful!

Of course, in LaTeX, this is much more difficult to do because of the complexity of the macros that control these regions. This is unfortunate, but is somehow inevitable because TeX and LaTeX were not written with color in mind.

Even when writing your own macros, much care must be taken. The color macros that colorize' a portion of the text work by prefixing the text with a special command to turn the color on and postfixing it with a different special command to restore the original color. It is often useful to ensure that TeX is in horizontal mode before the first special command is issued; this can be done by prefixing the color command with \leavevmode'.

## Printing in Black/White, after Colorizing

If you have a TeX or LaTeX document written with color macros and you want to print it in black and white there are two options. On all (good) PostScript devices, printing a color file will print in corresponding grey-levels. This is useful since in this way you can get a rough idea of where the colors are changing without using expensive color printing devices. The second option is to replace the call to input colordvi.tex' with blackdvi.tex' (and similarly for the .sty' files). So in the above example, replacing the word colordvi' with blackdvi' suffices. This file defines the color macros as no-ops, and so will produce normal black/white printing. By this simple mechanism, the user can switch to all black/white printing without having to ferret out the color commands. Also, some device drivers, particularly non-PostScript ones like screen previewers, will simply ignore the color commands and so print in normal black/white. Hopefully, in the future screen previewers for color displays will be compatible with some form of color support.

## Configuring dvips for Color Devices

To configure dvips for a particular color device you need to fine tune the color parameters to match your devices color rendition. To do this, you will need a PANTONE chart for your device. The header file color.lpro' shows a (rough) correspondence between the Crayola crayon names and the PANTONE numbers and also defines default CMYK values for each of the colors. Note that these colors must be defined in CMYK terms and not RGB as dvips outputs PostScript color commands in CMYK. This header file also defines (if they are not known to the interpreter) the PostScript commands setcmykcolor' and currentcmykcolor' in terms of a RGB equivalent so if your device only understands RGB, there should be no problem.

The parameters set in this file were determined by comparing the PANTONE chart of a Tektronics PHASER printer with the actual Crayola Crayons. Because these were defined for a particular device, the actual color rendition on your device may be very different. There are two ways to adjust this. One is to use the PANTONE chart for your device to rewrite color.lpro' prior to compilation and installation. A better alternative, which supports multiple devices, is to add a header file option in the configuration file for each device that defines, in userdict', the color parameters for those colors that need redefining.

For example, if you need to change the parameters defining Goldenrod' (approximately PANTONE 109) for your device mycolordev', do the following. In the PANTONE chart for your device, find the CMYK values for PANTONE 109. Let's say they are {\ 0 0.10 0.75 0.03 }'. Then create a header file named mycolordev.pro' with the commands

userdict begin
/Goldenrod { 0 0.10 0.75 0.03 setcmykcolor} bind def


Finally, in config.mycolordev' add the line

h mycolordev.pro


This will then define Goldenrod' in your device's CMYK values in userdict' which is checked before defining it in TeXdict' by color.pro'.

This mechanism, together with additions to colordvi.tex' and blackdvi.tex' (and the .sty' files), can also be used to predefine other colors for your users.

## Color Support Details

To support color, dvips recognizes a certain set of specials. These specials all start with the keyword color' or the keyword background'.

We will describe background' first, since it is the simplest. The background' keyword must be followed by a color specification. That color specification is used as a fill color for the background. The last background' special on a page is the one that gets issued, and it gets issued at the very beginning of the page, before any text or specials are sent. (This is possible because the prescan phase of dvips notices all of the color specials so that the appropriate information can be written out during the second phase.)

Ahh, but what is a color specification? It is one of three things. First, it might be a PostScript procedure as defined in a PostScript header file. The color.pro' file defines 64 of these, including Maroon'. This PostScript procedure must set the current color to be some value; in this case, Maroon' is defined as 0 0.87 0.68 0.32 setcmykcolor'.

The second possibility is the name of a color model (initially, one of rgb', hsb', cmyk', or gray') followed by the appropriate number of parameters. When dvips encounters such a macro, it sends out the parameters first, followed by the string created by prefixing TeXcolor' to the color model. Thus, the color specification rgb 0.3 0.4 0.5' would generate the PostScript code 0.3 0.4 0.5 TeXrgbcolor'. Note that the case of zero arguments is disallowed, as that is handled by the single keyword case above (where no changes to the name are made before it is sent to the PostScript file.)

The third and final type of color specification is a double quote followed by any sequence of PostScript. The double quote is stripped from the output. For instance, the color specification "AggiePattern setpattern' will set the color' to the Aggie logo pattern (assuming such exists.)

So those are the three types of color specifications. The same type of specifications are used by both the background' special and the color' special. The color' special itself has three forms. The first is just color' followed by a color specification. In this case, the current global color is set to that color; the color stack must be empty when such a command is executed.

The second form is color push' followed by a color specification. This saves the current color on the color stack and sets the color to be that given by the color specification. This is the most common way to set a color.

The final version of the color' special is just color pop', with no color specification; this says to pop the color last pushed on the color stack from the color stack and set the current color to be that color.

The dvips' program correctly handles these color specials across pages, even when the pages are repeated or reversed.

These color specials can be used for things such as patterns or screens as well as simple colors. However, note that in the PostScript, only one color specification' can be active at a time. For instance, at the beginning of a page, only the bottommost entry on the color stack is sent; also, when a color is popped', all that is done is that the color specification from the previous stack entry is sent. No gsave' or grestore' is used. This means that you cannot easily mix usage of the color' specials for screens and colors, just one or the other. This may be addressed in the future by adding support for different categories' of color-like state.

# Index

• \epsffile
• \leavevmode

## a

• a3
• a4
• accents
• accents, in wrong position
• afm
• afm2tfm
• Afm2tfm options
• architecture dependencies and installation

• bop-hook'
• bounding box

## c

• CC variable for configuration
• compilation in another directory
• compression
• config.ps'
• configuration
• configuration files
• configuration problems, fixing properly
• configure output, suppressing
• configure script, running
• control-D
• copies

## d

• debugging
• DEFS variable for configuration
• dot accent
• dvips, location of used for installation

## e

• efficient fonts
• encoding file format
• end-hook'
• EOF
• eop-hook'
• epsfsize
• epsfxsize
• expanded fonts
• ExtendFont

## f

• filter
• font search, slow startup
• fonts, expanded
• fonts, remapping
• fonts, slanted
• fonts, small caps

## g

• GFFONTS environment variable
• graphics

## h

• Hungarian umlaut

## i

• INSTALL variable for configuration
• installation
• installation directories
• installation prefix, default

## k

• kerning
• Knuth, Donald E.

## l

• landscape
• leaf directories, in path searching
• ledger
• legal
• letter
• LIBS variable for configuration
• ligature
• literal PostScript

## m

• MacKenzie, David
• magnification
• magscale
• MakeTeXPK'
• manual feed
• maxdrift
• memory
• METAFONT
• mode
• MS-DOS

## o

• oblique fonts
• obsolete
• options to Afm2tfm
• output
• output encoding of fonts

## p

• pages
• paper type
• PATH, .' omitted from
• pfa font
• pfb font
• pk'
• PKFONTS environment variable
• PostScript encoding of fonts
• PostScript fonts
• PostScript graphics
• prefix for installation directories
• prefix Make variable
• printer configuration files
• psfile

• quiet

## r

• ReEncodeFont
• remapping fonts
• resolution
• reverse

## s

• scaleunit
• SDict
• search paths, defining default
• slanted fonts
• SlantFont
• small caps fonts
• start-hook'
• startup time, excessive
• stat
• subdirectory searching for paths
• suppressing configure output
• Swedish A ring
• symbolic links, in path searching

## t

• TEXFONTS'
• TEXFONTS environment variable
• TEXINPUTS'
• TEXPKS'
• TEXPKS environment variable
• tfm
• tfm'

## v

• verbose configure messages, suppressing
• vf'
• virtual fonts
• VPATH
• vptovf

• `~' in paths