0. Foreword

This purpose of this page is to provide documentation for the DVI file format. Much of the content on this page was taken directly from the dvitype.web program, written by Donald Knuth (this explains the several references to the DVItype program; these can be ignored).

1. The DVI File Format

Before we get into the details of DVItype, we need to know exactly what DVI files are. The form of such files was designed by David R. Fuchs in 1979. Almost any reasonable typesetting device can be driven by a program that takes DVI files as input, and dozens of such DVI-to-whatever programs have been written. Thus, it is possible to print the output of document compilers like TeX on many different kinds of equipment.

A DVI file is a stream of 8-bit bytes, which may be regarded as a series of commands in a machine-like language. The first byte of each command is the operation code, and this code is followed by zero or more bytes that provide parameters to the command. The parameters themselves may consist of several consecutive bytes; for example, the set_rule command has two parameters, each of which is four bytes long. Parameters are usually regarded as nonnegative integers; but four-byte-long parameters, and shorter parameters that denote distances, can be either positive or negative. Such parameters are given in two's complement notation. For example, a two-byte-long distance parameter has a value between -2^15 and 2^15-1. [NOTE: DVI files use big endian format for multiple byte integer parameters.]

A DVI file consists of a ``preamble,'' followed by a sequence of one or more ``pages,'' followed by a ``postamble.'' The preamble is simply a pre command, with its parameters that define the dimensions used in the file; this must come first. Each ``page'' consists of a bop command, followed by any number of other commands that tell where characters are to be placed on a physical page, followed by an eop command. The pages appear in the order that they were generated, not in any particular numerical order. If we ignore nop commands and fnt_def commands (which are allowed between any two commands in the file), each eop command is immediately followed by a bop command, or by a post command; in the latter case, there are no more pages in the file, and the remaining bytes form the postamble. Further details about the postamble will be explained later.

Some parameters in DVI commands are ``pointers.'' These are four-byte quantities that give the location number of some other byte in the file; the first byte is number 0, then comes number 1, and so on. For example, one of the parameters of a bop command points to the previous bop; this makes it feasible to read the pages in backwards order, in case the results are being directed to a device that stacks its output face up. Suppose the preamble of a DVI file occupies bytes 0 to 99. Now if the first page occupies bytes 100 to 999, say, and if the second page occupies bytes 1000 to 1999, then the bop that starts in byte 1000 points to 100 and the bop that starts in byte 2000 points to 1000. (The very first bop, i.e., the one that starts in byte 100, has a pointer of -1.)

The DVI format is intended to be both compact and easily interpreted by a machine. Compactness is achieved by making most of the information implicit instead of explicit. When a DVI-reading program reads the commands for a page, it keeps track of several quantities: (a) The current font f is an integer; this value is changed only by fnt and fnt_num commands. (b) The current position on the page is given by two numbers called the horizontal and vertical coordinates, h and v. Both coordinates are zero at the upper left corner of the page; moving to the right corresponds to increasing the horizontal coordinate, and moving down corresponds to increasing the vertical coordinate. Thus, the coordinates are essentially Cartesian, except that vertical directions are flipped; the Cartesian version of (h,v) would be (h,-v). (c) The current spacing amounts are given by four numbers w, x, y, and z, where w and x are used for horizontal spacing and where y and z are used for vertical spacing. (d) There is a stack containing (h,v,w,x,y,z) values; the DVI commands push and pop are used to change the current level of operation. Note that the current font f is not pushed and popped; the stack contains only information about positioning.

The values of h, v, w, x, y, and z are signed integers having up to 32 bits, including the sign. Since they represent physical distances, there is a small unit of measurement such that increasing h by 1 means moving a certain tiny distance to the right. The actual unit of measurement is variable, as explained below.

3. Table of Opcodes

The following table gives the instruction set for DVI. The parameters are listed in the order they would appear in a DVI file; the number in brackets gives the size of the parameter (in bytes).

The DVI Instruction Set
Opcode Instruction Name Parameters Description
0...127 set_char_i typeset a character and move right
128 set1 c[1] typeset a character and move right
129 set2 c[2]
130 set3 c[3]
131 set4 c[4]
132 set_rule a[4], b[4] typeset a rule and move right
133 put1 c[1] typeset a character
134 put2 c[2]
135 put3 c[3]
136 put4 c[4]
137 put_rule a[4], b[4] typeset a rule
138 nop no operation
139 bop c_0[4]..c_9[4], p[4] beginning of page
140 eop ending of page
141 push save the current positions
142 pop restore previous positions
143 right1 b[1] move right
144 right2 b[2]
145 right3 b[3]
146 right4 b[4]
147 w0 move right by w
148 w1 b[1] move right and set w
149 w2 b[2]
150 w3 b[3]
151 w4 b[4]
152 x0 move right by x
153 x1 b[1] move right and set x
154 x2 b[2]
155 x3 b[3]
156 x4 b[4]
157 down1 a[1] move down
158 down2 a[2]
159 down3 a[3]
160 down4 a[4]
161 y0 move down by y
162 y1 a[1] move down and set y
163 y2 a[2]
164 y3 a[3]
165 y4 a[4]
166 z0 move down by z
167 z1 a[1] move down and set z
168 z2 a[2]
169 z3 a[3]
170 z4 a[4]
171...234 fnt_num_i set current font to i
235 fnt1 k[1] set current font
236 fnt2 k[2]
237 fnt3 k[3]
238 fnt4 k[4]
239 xxx1 k[1], x[k] extension to DVI primitives
240 xxx2 k[2], x[k]
241 xxx3 k[3], x[k]
242 xxx4 k[4], x[k]
243 fnt_def1 k[1], c[4], s[4], d[4],
a[1], l[1], n[a+l]
define the meaning of a font number
244 fnt_def2 k[2], c[4], s[4], d[4],
a[1], l[1], n[a+l]
245 fnt_def3 k[3], c[4], s[4], d[4],
a[1], l[1], n[a+l]
246 fnt_def4 k[4], c[4], s[4], d[4],
a[1], l[1], n[a+l]
247 pre i[1], num[4], den[4], mag[4],
k[1], x[k]
preamble
248 post p[4], num[4], den[4], mag[4],
l[4], u[4], s[2], t[2]

< font definitions >
postamble beginning
249 post_post q[4], i[1]; 223's postamble ending
250...255 undefined

4. Description of Opcodes