summaryrefslogtreecommitdiff
path: root/dviware/driv-standard/level-0/dvi.tex
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/driv-standard/level-0/dvi.tex')
-rw-r--r--dviware/driv-standard/level-0/dvi.tex570
1 files changed, 570 insertions, 0 deletions
diff --git a/dviware/driv-standard/level-0/dvi.tex b/dviware/driv-standard/level-0/dvi.tex
new file mode 100644
index 0000000000..acff75ceb0
--- /dev/null
+++ b/dviware/driv-standard/level-0/dvi.tex
@@ -0,0 +1,570 @@
+% $Id: dvi.tex,v 3.4.1.1 1991/08/08 16:03:50 schrod Released schrod $
+%------------------------------------------------------------
+% taken from DVItype 3.4
+
+%
+% definition of DVI format
+% LaTeX markup
+%
+
+
+% $Log: dvi.tex,v $
+% Revision 3.4.1.1 1991/08/08 16:03:50 schrod
+% CHANGES BY DON HOSEK:
+% -- Inserted \subsection's.
+% -- Deleted WEB defines.
+% -- `e.g.' now in italics, to be consistent with the rest of the
+% standard.
+%
+% CHANGES BY JOACHIM SCHROD:
+% -- Changed \bigbreak between WEB sections to \medbreak.
+% -- Added + signs to length specifications in \cmd tags, to show that
+% the param is signed.
+% -- Make formulas look more `math-like' and less `Pascal-like.'
+% -- DVItype not mentioned any more in the text.
+%
+% Revision 3.4 1990/10/31 00:00:00 schrod
+% updated from DVItype 3.2 to 3.4
+%
+% Revision 3.2.1.1 90/07/16 00:00:00 schrod
+% inserted \endinput
+%
+% Revision 3.2 90/07/04 00:00:00 schrod
+% extracted from DVItype 3.2
+%
+
+
+
+
+\section{Device-Independent File Format}
+\label{dvi-format}
+
+\subsection{Introduction}
+
+The form of \str{DVI} files was designed by {\sc David R. Fuchs} in
+1979. Almost any reasonable typesetting device can be driven by a
+program that takes \str{DVI} files as input, and a lot of such
+\str{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 \str{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
+`\id{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$.
+
+A \str{DVI} file consists of a ``preamble,'' followed by a sequence
+of one or more ``pages,'' followed by a ``postamble.'' The preamble
+is simply a \id{pre} command, with its parameters that define the
+dimensions used in the file; this must come first. Each ``page''
+consists of a \id{bop} command, followed by any number of other
+commands that tell where characters are to be placed on a physical
+page, followed by an \id{eop} command. The pages appear in the order
+that they were generated, not in any particular numerical order. If
+we ignore \id{nop} commands and \id{fnt\_def} commands (which are
+allowed between any two commands in the file), each \id{eop} command
+is immediately followed by a \id{bop} command, or by a \id{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 \str{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 \id{bop} command points
+to the previous \id{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 \str{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 \id{bop} that starts in byte 1000 points to 100 and the \id{bop}
+that starts in byte 2000 points to 1000. (The very first \id{bop},
+i.e., the one that starts in byte 100, has a pointer of $-1$.)
+
+\medbreak
+
+The \str{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
+\str{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 \id{fnt} and \id{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 \str{DVI}
+commands \id{push} and \id{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.
+
+
+
+\subsection{Summary of {\tt DVI} commands}
+
+Here is a list of all the commands that may appear in a \str{DVI}
+file. Each command is specified by its symbolic name ({\it e.g.},
+\id{bop}), its opcode byte ({\it e.g.}, 139), and its parameters (if any).
+The parameters are followed by a bracketed number telling how many
+bytes they occupy; for example, `$p[4]$' means that parameter $p$ is
+four bytes long.
+
+\cmd \id{set\_char\_0} 0,.
+ Typeset character number~0 from font~$f$ such that the reference
+point of the character is at $(h,v)$. Then increase $h$ by the width
+of that character. Note that a character may have zero or negative
+width, so one cannot be sure that $h$ will advance after this
+command; but $h$ usually does increase.
+
+\cmd \id{set\_char\_1} through \id{set\_char\_127} (opcodes 1 to 127),.
+ Do the operations of \id{set\_char\_0}; but use the character whose
+number matches the opcode, instead of character~0.
+
+\cmd \id{set1} 128, c[1].
+ Same as \id{set\_char\_0}, except that character number~$c$ is
+typeset. \TeX82 uses this command for characters in the range $128\le
+c<256$.
+
+\cmd \id{set2} 129, c[2].
+ Same as \id{set1}, except that $c$~is two bytes long, so it is in
+the range $0\le c<65536$. \TeX82 never uses this command, which is
+intended for processors that deal with oriental languages; but a
+\DVI{} processor should allow character codes greater than 255. The
+processor may then assume that these characters have the same width
+as the character whose respective codes are $c \bmod 256$.
+
+\cmd \id{set3} 130, c[3].
+ Same as \id{set1}, except that $c$~is three bytes long, so it can be
+as large as $2^{24}-1$.
+
+\cmd \id{set4} 131, c[+4].
+ Same as \id{set1}, except that $c$~is four bytes long, possibly even
+negative. Imagine that.
+
+\cmd \id{set\_rule} 132, a[+4] b[+4].
+ Typeset a solid black rectangle of height $a$ and width $b$, with
+its bottom left corner at $(h,v)$. Then set $h\gets h+b$. If either
+$a\le 0$ or $b\le 0$, nothing should be typeset. Note that if $b<0$,
+the value of $h$ will decrease even though nothing else happens.
+Programs that typeset from \str{DVI} files should be careful to make
+the rules line up carefully with digitized characters, as explained
+in connection with the \id{rule\_pixels} subroutine below.
+
+\cmd \id{put1} 133, c[1].
+ Typeset character number~$c$ from font~$f$ such that the reference
+point of the character is at $(h,v)$. (The `put' commands are exactly
+like the `set' commands, except that they simply put out a character
+or a rule without moving the reference point afterwards.)
+
+\cmd \id{put2} 134, c[2].
+ Same as \id{set2}, except that $h$ is not changed.
+
+\cmd \id{put3} 135, c[3].
+ Same as \id{set3}, except that $h$ is not changed.
+
+\cmd \id{put4} 136, c[+4].
+ Same as \id{set4}, except that $h$ is not changed.
+
+\cmd \id{put\_rule} 137, a[+4] b[+4].
+ Same as \id{set\_rule}, except that $h$ is not changed.
+
+\cmd \id{nop} 138,.
+ No operation, do nothing. Any number of \id{nop}'s may occur between
+\str{DVI} commands, but a \id{nop} cannot be inserted between a
+command and its parameters or between two parameters.
+
+\cmd \id{bop} 139, c_0[+4] c_1[+4] \ldots c_9[+4] p[+4].
+ Beginning of a page: Set $(h,v,w,x,y,z)\gets (0,0,0,0,0,0)$ and set
+the stack empty. Set the current font $f$ to an undefined value. The
+ten $c_i$ parameters can be used to identify pages, if a user wants
+to print only part of a \str{DVI} file; \TeX82 gives them the values
+of \str{\\count0} $\ldots$ \str{\\count9} at the time \str{\\shipout}
+was invoked for this page. The parameter $p$ points to the previous
+\id{bop} command in the file, where the first \id{bop} has $p=-1$.
+
+\cmd \id{eop} 140,.
+ End of page: Print what you have read since the previous \id{bop}.
+At this point the stack should be empty.
+
+\cmd \id{push} 141,.
+ Push the current values of $(h,v,w,x,y,z)$ onto the top of the
+stack; do not change any of these values. Note that $f$ is not
+pushed.
+
+\cmd \id{pop} 142,.
+ Pop the top six values off of the stack and assign them to
+$(h,v,w,x,y,z)$. The number of pops should never exceed the number of
+pushes, since it would be highly embarrassing if the stack were empty
+at the time of a \id{pop} command.
+
+\cmd \id{right1} 143, b[+1].
+ Set $h\gets h+b$, i.e., move right $b$ units. The parameter is a
+signed number in two's complement notation, $-128\le b<128$; if
+$b<0$, the reference point actually moves left.
+
+\cmd \id{right2} 144, b[+2].
+ Same as \id{right1}, except that $b$ is a two-byte quantity in the
+range $-32768\le b<32768$.
+
+\cmd \id{right3} 145, b[+3].
+ Same as \id{right1}, except that $b$ is a three-byte quantity in the
+range $-2^{23}\le b<2^{23}$.
+
+\cmd \id{right4} 146, b[+4].
+ Same as \id{right1}, except that $b$ is a four-byte quantity in the
+range $-2^{31}\le b<2^{31}$.
+
+\cmd \id{w0} 147,.
+ Set $h\gets h+w$; i.e., move right $w$ units. With luck, this
+parameterless command will usually suffice, because the same kind of
+motion will occur several times in succession; the following commands
+explain how $w$ gets particular values.
+
+\cmd \id{w1} 148, b[+1].
+ Set $w\gets b$ and $h\gets h+b$. The value of $b$ is a signed
+quantity in two's complement notation, $-128\le b<128$. This command
+changes the current $w$~spacing and moves right by $b$.
+
+\cmd \id{w2} 149, b[+2].
+ Same as \id{w1}, but $b$ is a two-byte-long parameter, $-32768\le
+b<32768$.
+
+\cmd \id{w3} 150, b[+3].
+ Same as \id{w1}, but $b$ is a three-byte-long parameter, $-2^{23}\le
+b<2^{23}$.
+
+\cmd \id{w4} 151, b[+4].
+ Same as \id{w1}, but $b$ is a four-byte-long parameter, $-2^{31}\le
+b<2^{31}$.
+
+\cmd \id{x0} 152,.
+ Set $h\gets h+x$; i.e., move right $x$ units. The `$x$' commands are
+like the `$w$' commands except that they involve $x$ instead of $w$.
+
+\cmd \id{x1} 153, b[+1].
+ Set $x\gets b$ and $h\gets h+b$. The value of $b$ is a signed
+quantity in two's complement notation, $-128\le b<128$. This command
+changes the current $x$~spacing and moves right by $b$.
+
+\cmd \id{x2} 154, b[+2].
+ Same as \id{x1}, but $b$ is a two-byte-long parameter, $-32768\le
+b<32768$.
+
+\cmd \id{x3} 155, b[+3].
+ Same as \id{x1}, but $b$ is a three-byte-long parameter, $-2^{23}\le
+b<2^{23}$.
+
+\cmd \id{x4} 156, b[+4].
+ Same as \id{x1}, but $b$ is a four-byte-long parameter, $-2^{31}\le
+b<2^{31}$.
+
+\cmd \id{down1} 157, a[+1].
+ Set $v\gets v+a$, i.e., move down $a$ units. The parameter is a
+signed number in two's complement notation, $-128\le a<128$; if
+$a<0$, the reference point actually moves up.
+
+\cmd \id{down2} 158, a[+2].
+ Same as \id{down1}, except that $a$ is a two-byte quantity in the
+range $-32768\le a<32768$.
+
+\cmd \id{down3} 159, a[+3].
+ Same as \id{down1}, except that $a$ is a three-byte quantity in the
+range $-2^{23}\le a<2^{23}$.
+
+\cmd \id{down4} 160, a[+4].
+ Same as \id{down1}, except that $a$ is a four-byte quantity in the
+range $-2^{31}\le a<2^{31}$.
+
+\cmd \id{y0} 161,.
+ Set $v\gets v+y$; i.e., move down $y$ units. With luck, this
+parameterless command will usually suffice, because the same kind of
+motion will occur several times in succession; the following commands
+explain how $y$ gets particular values.
+
+\cmd \id{y1} 162, a[+1].
+ Set $y\gets a$ and $v\gets v+a$. The value of $a$ is a signed
+quantity in two's complement notation, $-128\le a<128$. This command
+changes the current $y$~spacing and moves down by $a$.
+
+\cmd \id{y2} 163, a[+2].
+ Same as \id{y1}, but $a$ is a two-byte-long parameter, $-32768\le
+a<32768$.
+
+\cmd \id{y3} 164, a[+3].
+ Same as \id{y1}, but $a$ is a three-byte-long parameter, $-2^{23}\le
+a<2^{23}$.
+
+\cmd \id{y4} 165, a[+4].
+ Same as \id{y1}, but $a$ is a four-byte-long parameter, $-2^{31}\le
+a<2^{31}$.
+
+\cmd \id{z0} 166,.
+ Set $v\gets v+z$; i.e., move down $z$ units. The `$z$' commands are
+like the `$y$' commands except that they involve $z$ instead of $y$.
+
+\cmd \id{z1} 167, a[+1].
+ Set $z\gets a$ and $v\gets v+a$. The value of $a$ is a signed
+quantity in two's complement notation, $-128\le a<128$. This command
+changes the current $z$~spacing and moves down by $a$.
+
+\cmd \id{z2} 168, a[+2].
+ Same as \id{z1}, but $a$ is a two-byte-long parameter, $-32768\le
+a<32768$.
+
+\cmd \id{z3} 169, a[+3].
+ Same as \id{z1}, but $a$ is a three-byte-long parameter, $-2^{23}\le
+a<2^{23}$.
+
+\cmd \id{z4} 170, a[+4].
+ Same as \id{z1}, but $a$ is a four-byte-long parameter, $-2^{31}\le
+a<2^{31}$.
+
+\cmd \id{fnt\_num\_0} 171,.
+ Set $f\gets 0$. Font 0 must previously have been defined by a
+\id{fnt\_def} instruction, as explained below.
+
+\cmd \id{fnt\_num\_1} through \id{fnt\_num\_63} (opcodes 172 to 234),.
+ Set $f\gets 1$, \dots, $f\gets 63$, respectively.
+
+\cmd \id{fnt1} 235, k[1].
+ Set $f\gets k$. \TeX82 uses this command for font numbers in the
+range $64\le k<256$.
+
+\cmd \id{fnt2} 236, k[2].
+ Same as \id{fnt1}, except that $k$~is two bytes long, so it is in
+the range $0\le k<65536$. \TeX82 never generates this command, but
+large font numbers may prove useful for specifications of color or
+texture, or they may be used for special fonts that have fixed
+numbers in some external coding scheme.
+
+\cmd \id{fnt3} 237, k[3].
+ Same as \id{fnt1}, except that $k$~is three bytes long, so it can be
+as large as $2^{24}-1$.
+
+\cmd \id{fnt4} 238, k[+4].
+ Same as \id{fnt1}, except that $k$~is four bytes long; this is for
+the really big font numbers (and for the negative ones).
+
+\cmd \id{xxx1} 239, k[1] x[k].
+ This command is undefined in general; it functions as a $(k+2)$-byte
+\id{nop} unless special \str{DVI}-reading programs are being used.
+\TeX82 generates \id{xxx1} when a short enough \str{\\special}
+appears, setting $k$ to the number of bytes being sent. It is
+recommended that $x$ be a string having the form of a keyword
+followed by possible parameters relevant to that keyword.
+
+\cmd \id{xxx2} 240, k[2] x[k].
+ Like \id{xxx1}, but $0\le k<65536$.
+
+\cmd \id{xxx3} 241, k[3] x[k].
+ Like \id{xxx1}, but $0\le k<2^{24}$.
+
+\cmd \id{xxx4} 242, k[4] x[k].
+ Like \id{xxx1}, but $k$ can be ridiculously large. \TeX82 uses
+\id{xxx4} when \id{xxx1} would be incorrect.
+
+\cmd \id{fnt\_def1} 243, k[1] c[4] s[4] d[4] a[1] l[1] n[a+l].
+ Define font $k$, where $0\le k<256$; font definitions will be
+explained shortly.
+
+\cmd \id{fnt\_def2} 244, k[2] c[4] s[4] d[4] a[1] l[1] n[a+l].
+ Define font $k$, where $0\le k<65536$.
+
+\cmd \id{fnt\_def3} 245, k[3] c[4] s[4] d[4] a[1] l[1] n[a+l].
+ Define font $k$, where $0\le k<2^{24}$.
+
+\cmd \id{fnt\_def4} 246, k[+4] c[4] s[4] d[4] a[1] l[1] n[a+l].
+ Define font $k$, where $-2^{31}\le k<2^{31}$.
+
+\cmd \id{pre} 247, i[1] \id{num}[4] \id{den}[4] \id{mag}[4] k[1] x[k].
+ Beginning of the preamble; this must come at the very beginning of
+the file. Parameters $i$, \id{num}, \id{den}, \id{mag}, $k$, and $x$
+are explained below.
+
+\cmd \id{post} 248,.
+ Beginning of the postamble, see below.
+
+\cmd \id{post\_post} 249,.
+ Ending of the postamble, see below.
+
+\smallskip
+
+\noindent Commands 250--255 are undefined at the present time.
+
+
+
+\subsection{The preamble}
+
+The preamble contains basic information about the file as a whole. As
+stated above, there are six parameters:
+ $$
+ i[1]\ \id{num}[4]\ \id{den}[4]\ \id{mag}[4]\ k[1]\ x[k].
+ $$
+ The $i$ byte identifies \str{DVI} format; currently this byte is
+always set to~2. (The value $i=3$ is currently used for an extended
+format that allows a mixture of right-to-left and left-to-right
+typesetting. Some day we will set $i=4$, when \str{DVI} format makes
+another incompatible change---perhaps in the year 2048.)
+
+The next two parameters, \id{num} and \id{den}, are positive integers
+that define the units of measurement; they are the numerator and
+denominator of a fraction by which all dimensions in the \str{DVI}
+file could be multiplied in order to get lengths in units of
+$10^{-7}$ meters. (For example, there are exactly 7227 \TeX\ points
+in 254 centimeters, and \TeX82 works with scaled points where there
+are $2^{16}$ sp in a point, so \TeX82 sets $\id{num}=25400000$ and
+$\id{den}= 7227 \cdot 2^{16} =473628672$.)
+
+The \id{mag} parameter is what \TeX82 calls \str{\\mag}, i.e., 1000
+times the desired magnification. The actual fraction by which
+dimensions are multiplied is therefore $mn/1000d$. Note that if a
+\TeX\ source document does not call for any `\str{true}' dimensions,
+and if you change it only by specifying a different \str{\\mag}
+setting, the \str{DVI} file that \TeX\ creates will be completely
+unchanged except for the value of \id{mag} in the preamble and
+postamble. (Fancy \str{DVI}-reading programs allow users to override
+the \id{mag}~setting when a \str{DVI} file is being printed.)
+
+Finally, $k$ and $x$ allow the \str{DVI} writer to include a comment,
+which is not interpreted further. The length of comment $x$ is $k$,
+where $0\le k<256$.
+
+
+
+\subsection{Font definitions}
+
+Font definitions for a given font number $k$ contain further
+parameters
+ $$
+ c[4]\ s[4]\ d[4]\ a[1]\ l[1]\ n[a+l].
+ $$
+ The four-byte value $c$ is the check sum that \TeX\ (or whatever
+program generated the \str{DVI} file) found in the \str{TFM} file for
+this font; $c$ should match the check sum of the font found by
+programs that read this \str{DVI} file.
+
+Parameter $s$ contains a fixed-point scale factor that is applied to
+the character widths in font $k$; font dimensions in \str{TFM} files
+and other font files are relative to this quantity, which is always
+positive and less than $2^{27}$. It is given in the same units as the
+other dimensions of the \str{DVI} file. Parameter $d$ is similar to
+$s$; it is the ``design size,'' and (like~$s$) it is given in
+\str{DVI} units. Thus, font $k$ is to be used at
+$\id{mag} \cdot s/1000d$ times its normal size.
+
+The remaining part of a font definition gives the external name of
+the font, which is an ASCII string of length $a+l$. The number $a$ is
+the length of the ``area'' or directory, and $l$ is the length of the
+font name itself; the standard local system font area is supposed to
+be used when $a=0$. The $n$ field contains the area in its first $a$
+bytes.
+
+Font definitions must appear before the first use of a particular
+font number. Once font $k$ is defined, it must not be defined again;
+however, we shall see below that font definitions appear in the
+postamble as well as in the pages, so in this sense each font number
+is defined exactly twice, if at all. Like \id{nop} commands,
+font definitions can appear before the first
+\id{bop}, or between an \id{eop} and a \id{bop}.
+
+
+
+\subsection{The postamble}
+
+The last page in a \str{DVI} file is followed by `\id{post}'; this
+command introduces the postamble, which summarizes important facts
+that \TeX\ has accumulated about the file, making it possible to
+print subsets of the data with reasonable efficiency. The postamble
+has the form
+%
+ \begin{center}
+ \begin{tabular}{l}
+ $\id{post}\ p[4]\ \id{num}[4]\ \id{den}[4]\ \id{mag}[4]\
+ l[4]\ u[4]\ s[2]\ t[2]$\\
+ $\langle\,$font definitions$\,\rangle$\cr
+ $\id{post\_post}\ q[4]\ i[1]\ \hbox{223's}[\ge 4]$\\
+ \end{tabular}
+ \end{center}
+%
+ Here $p$ is a pointer to the final \id{bop} in the file. The next
+three parameters, \id{num}, \id{den}, and \id{mag}, are duplicates of
+the quantities that appeared in the preamble.
+
+Parameters $l$ and $u$ give respectively the height-plus-depth of the
+tallest page and the width of the widest page, in the same units as
+other dimensions of the file. These numbers might be used by a
+\str{DVI}-reading program to position individual ``pages'' on large
+sheets of film or paper; however, the standard convention for output
+on normal size paper is to position each page so that the upper
+left-hand corner is exactly one inch from the left and the top.
+Experience has shown that it is unwise to design \str{DVI}-to-printer
+software that attempts cleverly to center the output; a fixed
+position of the upper left corner is easiest for users to understand
+and to work with. Therefore $l$ and~$u$ are often ignored.
+
+Parameter $s$ is the maximum stack depth (i.e., the largest excess of
+\id{push} commands over \id{pop} commands) needed to process this
+file. Then comes $t$, the total number of pages (\id{bop} commands)
+present.
+
+The postamble continues with font definitions, which are any number
+of \id{fnt\_def} commands as described above, possibly interspersed
+with \id{nop} commands. Each font number that is used in the
+\str{DVI} file must be defined exactly twice: Once before it is first
+selected by a \id{fnt} command, and once in the postamble.
+
+\medbreak
+
+The last part of the postamble, following the \id{post\_post} byte
+that signifies the end of the font definitions, contains $q$, a
+pointer to the \id{post} command that started the postamble. An
+identification byte, $i$, comes next; this currently equals~2, as in
+the preamble.
+
+The $i$ byte is followed by four or more bytes that are all equal to
+the decimal number 223 (i.e., \O{337} in octal). \TeX\ puts out four
+to seven of these trailing bytes, until the total length of the file
+is a multiple of four bytes, since this works out best on machines
+that pack four bytes per word; but any number of 223's is allowed, as
+long as there are at least four of them. In effect, 223 is a sort of
+signature that is added at the very end.
+
+This curious way to finish off a \str{DVI} file makes it feasible for
+\str{DVI}-reading programs to find the postamble first, on most
+computers, even though \TeX\ wants to write the postamble last. Most
+operating systems permit random access to individual words or bytes
+of a file, so the \str{DVI} reader can start at the end and skip
+backwards over the 223's until finding the identification byte. Then
+it can back up four bytes, read $q$, and move to byte $q$ of the
+file. This byte should, of course, contain the value 248 (\id{post});
+now the postamble can be read, so the \str{DVI} reader discovers all
+the information needed for typesetting the pages. Note that it is
+also possible to skip through the \str{DVI} file at reasonably high
+speed to locate a particular page, if that proves desirable. This
+saves a lot of time, since \str{DVI} files used in production jobs
+tend to be large.
+
+
+
+
+\endinput