summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx')
-rw-r--r--Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx986
1 files changed, 0 insertions, 986 deletions
diff --git a/Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx b/Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx
deleted file mode 100644
index 59930102a17..00000000000
--- a/Master/texmf-dist/source/plain/pdcmac/pdcoput5.dtx
+++ /dev/null
@@ -1,986 +0,0 @@
-% pdcoput5.dtx -- documentation & source for outpout routine -*-tex-*-
-
-%%%@TeX-document-file {
-%%% title = "PDCOPUT5 -- An output routine for zines",
-%%% filename = "$texmf/doc/plain/pdcmac/pdcoput5.dtx",
-%%% version = "$Revision: 5.3 $",
-%%% package = "pdcmac 1.0",
-%%% date = "$Date: 1995/04/06 11:51:03 $",
-%%% author = "P. Damian Cugley",
-%%% email = "damian.cugley@comlab.ox.ac.uk",
-%%% address = "Oxford University Computing Laboratory,"
-%%% Parks Road, Oxford OX1 3QD, UK",
-%%% abstract = "This document describes and is the source code for
-%%% the TeX definitions file pdcoput5.tex.
-%%% Running plain TeX on this file produces both the
-%%% definitions file and the printed documentation.",
-%%% copyright = "Copyright (c) 1991-1995 P. Damian Cugley",
-%%% copying = "This program is free software; you can redistribute
-%%% it and/or modify it under the terms of the GNU
-%%% General Public License as published by the Free
-%%% Software Foundation; either version 2 of the License,
-%%% or (at your option) any later version.",
-%%% notice = "This program is distributed in the hope that it will
-%%% be useful, but WITHOUT ANY WARRANTY; without even the
-%%% implied warranty of MERCHANTABILITY or FITNESS FOR A
-%%% PARTICULAR PURPOSE. See the GNU General Public
-%%% License for more details.",
-%%% notice = "You should have received a copy of the GNU General
-%%% Public License along with this program; if not, write
-%%% to the Free Software Foundation, Inc., 675 Mass Ave,
-%%% Cambridge, MA 02139, USA.",
-%%% codetable = "USASCII",
-%%% dependencies = "pdccode.tex"
-%%%}
-
-%{{{ pdcoput5.tex
-%{{{ preamble
-
-\relax
-\input pdccode
-\input epsf
-
-\document
-\rcs$Id: pdcoput5.dtx,v 5.3 1995/04/06 11:51:03 pdc Exp $\endrcs
-
-\codefile{pdcoput5.tex}
-
-\countdef\counta=255 \newcount\countb
-\counta=`a \countb="7461
-\loop \ifnum\counta<"7B
- \mathcode\counta\countb
- \advance\counta1 \advance\countb1
-\repeat
-\counta=`A \countb="7441
-\loop \ifnum\counta<"5B
- \mathcode\counta\countb
- \advance\counta1 \advance\countb1
-\repeat
-
-%}}} preamble
-%{{{ introduction
-
-\title{PDCOPUT5---an output routine for zines}
-
-\section{Introduction}
-
- This document describes |pdcoput5.tex|, a \TeX\ definition file
- that defines an output routine for \TeX\ documents. The
- complete text of the macros is reproduced, with brief
- descriptions of how to exploit them.
-
- In fact, running plain \TeX\ on the file |pdcoput5.dtx|
- generates a copy of the macros in a file called |pdcoput5.tex|
- in the current directory, as well as the printed
- documentation.\footnote*{The \LaTeX~2e distribution uses files
- with the suffix |dtx| for similar purposes.} This should help
- ensure that the printed documentation matches the file it
- describes.
-
- The name ends with `-|5|' to distinguish this file from its
- predecessor (version 4.1.7), so that documents based on the old
- macros can still be printed.
-
-%{{{ output routines
-\subsec{Output routines}
-
- In a \TeX\ document, there is a special sequence of \TeX\
- commands called the {\it output routine} which controls the
- assembly of pages for output to the |dvi| file.
- Plain \TeX\ comes with an output routine that handles simple
- documents (with footnotes and topinserts); \LaTeX\ has a more
- complex output routine that has many extra features (margin
- paragraphs, \LaTeX's floats).
-%}}} output routines
-%{{{ backgorund
-
-\subsec{Background to this output routine}
-
- I have been using \TeX\ to typeset fanzines\footnote\dag{The
- word {\it fanzine} comes from science fiction fans' jargon: {\it
- fan} for amateur (in the sense of unpaid, not necessarily
- amateurish) + {\it magazine}. (They call professional magazines
- {\it prozines}.) Thus a fanzine (or zine for short) is a small
- magazine, often produced by photocopying or cheap printing by
- its editor. The word {\it zine} rhymes with {\it scene} not
- {\it sign}, and isn't spelled with an apostrophe (unless you are
- the sort of person who spells {\it phone}, {\it cello} and {\it
- bus} with an apostrophe).} for some years. Unfortunately, for
- magazine layouts, the `floating' insertions provided by plain
- \TeX\ and \LaTeX\ do exactly the wrong thing---in a magazine,
- the designer wants to lay out the components of the page
- (illustrations, text, headings) exactly where he or she wants
- them, whereas the standard \TeX\ formats are designed to let the
- formatter place components according to its own complex rules.
-
- Originally I~tried browbeating \LaTeX\ into doing the zine
- layouts I~wanted. I realized eventually that by the time I~had
- redefined enough of \LaTeX's kernel to get the effects I~wanted
- I~would more or less have written everything from scratch. The
- sort of typesetting I~wanted is so unlike what \LaTeX\ is
- designed for that \LaTeX\ was getting in the way.
-
- Thus I~developed a set of \TeX\ definition files,\footnote\ddag{We
- can ignore the intermediate stage, which involved writing a
- `user-friendly' format in the style of \LaTeX\ and Texinfo, with
- structures very different from plain \TeX's syntax. In the end
- I realized that a format that requires disguising or renaming
- plain \TeX\ constructs makes using and modifying the macros
- harder, not easier, because the user has to understand the new
- conventions in addition to plain \TeX\ syntax.} with an output
- routine that allowed a page to be peppered with inserts with the
- text flowing in between them (with a more restricted class of
- inserts than, say, a DTP program, but still flexible enough to
- be useful). The output routine also does multi-column text---in
- this respect it is very similar to the |multicol| package in
- \LaTeX~2e. The routine presented here has been rewritten from
- scratch a few times, each time shedding some cruft as I~have a
- better understanding of \TeX.
-%}}} backgorund
-%{{{ layout model
-
-\subsec{The layout model}
-
-\topinsert
- \line{\vbox{\advance\hsize-1pc \hsize=0.333\hsize
- \noindent{\bf Figure 1}\quad Page layout. This shows a
- page without the optional extra boxes. In this example,
- text columns each span two grid cells. The left-hand
- column has an illo (space for an illustration) with caption.
- }%
- \epsfxsize=\hsize \advance\epsfxsize-1pc
- \epsfxsize=0.667\epsfxsize \epsffile{oput01.eps}\hfil
-}
-\medskip\hrule\medskip
-\endinsert
-
-\topinsert
- \line{\epsfxsize=\hsize \advance\epsfxsize-1pc
- \epsfxsize=0.667\epsfxsize \epsffile{oput02.eps}\hfil
- \vbox{\advance\hsize-1pc \hsize=0.333\hsize
- \noindent{\bf Figure 2}\quad Page layout parameters.
- This page has with
- all the optional boxes (shown with dashed lines). One text
- column has a space left for artwork. Text columns are the same
- width as grid cells.
- }}
-\medskip\hrule\medskip
-\endinsert
-
- The main part of the page (everything except the headline and
- footline) is called the {\it body}. The body is divided into a
- grid of cells. The cells are conceptually the framework on
- which page components like text columns and illustrations are
- hung. For example, text columns may span two cells. Figure~1
- shows a simple layout. Fitting on the grid usually means the
- width of the object is $N\times gridwd + (N-1)\times colsep$ and
- its left edge is $K\times(gridwd + colsep)$ from the left edge
- of the page body.
-
- The aim of using a grid layout is to combine flexibility with
- enough structure that the result is not a chaotic mess. The
- example grid is 5~cells wide, so that text columns can probably
- be 2 or 3 cells wide without being too narrow or too wide.
- Illustrations may be anything from 1 to 5 cells wide, or may
- bleed off the page.
-
-
-
-
-%}}} layout model
-%}}} introduction
-%{{{ identification
-\section{File identification}
-
- Macro files nowadays tend to start with a whole slew of header
- comments designed to be useful to people comign across the file
- in some archive and unaware of what it is for.
-
-\code
- \|\% \filename~\fileversion~\filedate~-- output routine for zines
- |
- |%%%@TeX-definition-file {
- |%%% filename = "$texmf/tex/plain/pdcmac/pdcoput5.tex",
- \|\%\%\% version~~~~~~~~= "\fileversion",
- \|\%\%\% date~~~~~~~~~~~= "\filedate",
- |%%% package = "pdcmac 1.0",
- |%%% author = "P. Damian Cugley",
- |%%% email = "damian.cugley@comlab.ox.ac.uk",
- |%%% address = "Oxford University Computing Laboratory,
- |%%% Parks Road, Oxford OX1 3QD, UK",
- |%%% codetable = "USASCII",
- |%%% keywords = "TeX, plain TeX, macros",
- |%%% supported = "Maybe",
- |%%% abstract = "TeX output routine for magazine-style layout.
- |%%% This file was generated by running
- \|\%\%\%~~~~~~~~~~~~~~~~~~~plain TeX on \jobname.dtx",
- |%%% copyright = "Copyright (c) 1991-1995 P. Damian Cugley",
- |%%% copying = "DO NOT DISTRIBUTE THIS FILE.
- \|\%\%\%~~~~~~~~~~~~~~~~~~~Distribute \jobname.dtx only as part of the
- |%%% package it came in.",
- |%%% dependencies = "",
- |%%% }
- |
- \|\\message\{\fileversion~<pdc \filedate>\}
- |
-\endcode
-%}}} identification
-%{{{ internals
-\section{Miscellaneous internal definitions}
-\subsec{Scratch registers}
-
- These are one-token names for some handy non-global temporary
- registers (in plain \TeX\ these are given names with |@| in
- them; these definitions give them names I can use).
-\code
- |\countdef\counta=255
- |\dimendef\dimena=0 \dimendef\dimenb=2
- |\toksdef\toksa=0 \toksdef\toksb=2
-\endcode
- I~don't use |\dimen1| and |\toks1| because they are supposed to
- be used only globally (as discussed in {\it\TeX book}
- Appendix~B).
-
-\subsec{Queues}
-
- These macros manipulate queues of instructions for the ouytput
- routine, represented as list macros of a form similar to those
- described in {\it\TeX book} Appendix~D Section~2 (the parameters
- in different order).
-
-\notepar
- All of these work by making assignments and so will not work in
- \TeX's mouth.
-\endnotepar
-
- We can describe these briefly using letters like $x$ to stand
- for elements (enclosed in braces) and $xs$ to stand for a list
- macro of $x$s. Each macr has a duplicate starting with `|g|-'
- which does the same operation globally.
-
-% |\prepend| $xs$ $x$ --- $xs:=\langle x\rangle + xs$
-%\code
-% |\long\def\prepend#1#2{%
-% | \toksa={\\{#2}}\toksb=\expandafter{#1}%
-% | \edef#1{\the\toksa\the\toksb}%
-% |}
-%\smallbreak
-% |\long\def\gprepend#1#2{%
-% | \toksa={\\{#2}}\toksb=\expandafter{#1}%
-% | \xdef#1{\the\toksa\the\toksb}%
-% |}
-%\endcode
- |\qappend| $xs$ $x$ --- $xs:= xs + \langle x\rangle $
-\code
- |\long\def\qappend#1#2{%
- | \toksa={\\{#2}}\toksb=\expandafter{#1}%
- | \xdef#1{\the\toksb\the\toksa}%
- |}
-\endcode
-% |\catenate| $xs$ $ys$ $zs$ --- $xs:=ys + zs$
-%\code
-% |\def\catenate#1#2#3{%
-% | \toksa=\expandafter{#2}\toksb=\expandafter{#3}%
-% | \edef#1{\the\toksa\the\toksb}%
-% |}
-%\smallbreak
-% |\def\gcatenate#1#2#3{%
-% | \toksa=\expandafter{#2}\toksb=\expandafter{#3}%
-% | \xdef#1{\the\toksa\the\toksb}%
-% |}
-%\endcode
- |\qremove| $x$ $xs$ --- $x, xs := hd(xs), tl(xs)$
- (where $xs = \langle hd(xs)\rangle + tl(xs)$)
-\code
- |\def\qremove#1#2{%
- | \expandafter\glopoff#2\glopoff#1#2%
- |}
- |\long\def\glopoff\\#1#2\glopoff#3#4{%
- | \gdef#3{#1}\gdef#4{#2}%
- |}
-\endcode
-
-%}}} internals
-%{{{ parameters
-\section{Parameters}
-
- We collect here definitions for parameters that customizate the
- layout. In documents, many of these are set in using
- higher-level macros.
-
- The abbreviations |mg| (margin), |wd| (width) and |ht| (height)
- are used a lot in dimen names.
-
-\subsec{Heights and depths}
- The physical size of the paper is $paperwd\times paperwd$. The
- area which will be filled with text columns is $bodywd\times
- bodyht$. This area is divided in to a grid of cells each
- $gridwd\times gridht$, with cells separated by $colsep$
- horizontally but butting vertically (there are $n$ cells, so
- $n\times gridwd + (n-1)\times colsep = bodywd$). Finally,
- $colwd$ is the width of text columns ($colwd = k\times gridwd +
- (k-1)\times colsep$) and $colht$ is the height of text columns
- on the current page (it is equal to $bodyht$ iff therte is no
- topbox or botbox).
-\code
- |\newdimen\paperwd \newdimen\paperht
- |\newdimen\bodywd \newdimen\bodyht
- |\newdimen\gridwd \newdimen\gridht
- |\newdimen\colwd \newdimen\colht
-\endcode
-
-
-\subsec{Margins and separators}
- These margins measure from the edge of the paper as defined by
- |\paperwd| and |\paperht|. The inner margin (|\innermg|) is on
- the left on odd pages and on the right for even pages.
-
- The bottom margin will be increased slightly later on to make
- $$vsize=N\times baselineskip + topskip\quad.$$
-
-\code
- |\newdimen\topmg \topmg=20mm
- |\newdimen\outermg \outermg=20mm
- |\newdimen\innermg \innermg=20mm
- |\newdimen\botmg \botmg=27mm
-\endcode
-
- Parameters for the distance between the baselines of the
- headline and the first line of text the corresponding distance
- for footlines.
-\code
- |\newskip\headlineskip \headlineskip=10mm
- |\newskip\footlineskip \footlineskip=10mm
-\endcode
-
-
- The parameters |\caprule| and |\capsep| specify the separation
- between captions and the adjacent text column. The vertical
- displacement is $capsep$, with a horizontal rule of thickness
- $caprule$ is drawn in the middle (set this to $0\pt$ to have no
- rule).
-
-\code
- |\newdimen\caprule \caprule=0.4pt
- |\newskip\capsep \capsep=5mm
-\endcode
-
- The corresponding parameters for column separators---this time
- it is a vertical rule.
-\code
- |\newdimen\colrule \colrule=0.4pt
- |\newdimen\colsep \colsep=5mm
-\endcode
-
- The number of text columns on a page.
-\code
- |\newcount\ncols \ncols=1
-\endcode
-
-\subsec{Boxes}
- To switch the number of columns in mid page, the first text is
- run through the output routine and the resultant partial page is
- stored in |\partialpage| to be placed at the top of the next
- output.
-
-\code
- |\newbox\partialpage
-\endcode
-
- The special boxes |\topbox| and |\botbox|, if non-void, are
- placed at the top and bottom of the page, going inside the
- headline and footline but outside the body text area (which is
- reduced correspondingly). These are often useful in
- multi-column text to put titles that span the page.
-\code
- |\newbox\topbox \newbox\botbox
-\endcode
-
- These boxes, if not void, go at the left and right of the body
- text. The amount of space for columns of text is reduced by the
- width of the boxes.
-\code
- |\newbox\leftbox \newbox\rightbox
-\endcode
-
- The output routine is passed the current page contents in
- box~255.
-\code
- |\chardef\pagebox=255
-\endcode
-
-\subsec{Hooks}
-
- These two list macros are used to override the output routine
- with customized layouts.
-
- One item is removed from |\pagelist| to generate each page body
- (the page body is everything except the headline, footline,
- topbox, botbox amd partial page). If the list is empty, then
- the default action is `|\makebody\pagebox|'. The commands
- should make a box with width |\bodywd|m and heght |\colht|.
-\code
- |\let\pagelist\empty
-\endcode
- An item is removed from |\collist| each time a column is to be
- created by |\makebody|. Each item should be \TeX\ commands that
- generate a box with width |\colwd| and height |\colht|.
-\code
- |\let\collist\empty
-\endcode
-
- Finally, token registers that may be used to customize pages and
- captions. For example, |\everypage| is used in |pdccmdoc.tex|
- to create an empty |\leftbox| on each page.
-\code
- |\newtoks\everypage
- |\newtoks\everycaption
-\endcode
-%}}} parameters
-%{{{ make a column (vbox)
-\section{How to make one column}
-
- This is the default way to generate a column of text---this will
- normally be invoked $k$ times if there are $k$ columns.
-
- A column is a vbox of height $colht$ and width $colwd$. It
- contains, in order from top to bottom, an illustration (vertical
- mode material, normally white space for artwork to be pasted
- into), caption separator, text (from the page), caption
- separator, and bottom illustration. The illustrations are
- usually omitted. When there is no illustration, the caption
- separators are omitted too.
- The macro takes the following parameters:
-$$\halign{\indent\tt\##\hfil&\quad#\hfil&\quad#\hfil\cr
- 1& vertical mode material& illustration at top of column\cr
- 2& \<8-bit number>& box to make middle out of\cr
- 3& vertical mode material& illustration for bottom of column\cr
-}$$
- To make baselines line up, $capsep=baselineskip$ and the height
- of a top illustration must be $N\times baselineskip + topskip$
- and of a bottom illustration must be $N\times baselineskip$
- (|\prevdepth| is set to $0\pt$ at the start of the bottom
- illustration, so if it starts with a box, baselineskip glue will
- be inserted to make the baseline of the box align correctly.)
-\code
- |\newdimen\toptotal \newdimen\bottotal
-\smallbreak
- |\def\xxxmakecolumn#1#2#3#4#5{\xmakecolumn
- | {\ifdim#1=0pt\else \kern#1 \fi
- | \def\tmp{#2}\ifx\tmp\empty\else #2 \fi}
- | {#3}
- | {\def\tmp{#2}\ifx\tmp\empty\else #2 \fi
- | \ifdim#1=0pt\else \kern#1 \fi}%
- |}
-\smallbreak
- |\def\xmakecolumn#1#2#3{%
- | \vbox to \colht{
-\endcode
- Calculate in |\dimena| how much of the text box will be needed
- once we have allowed for any illustrations, footnotes or
- topinserts:
-\code
- | \dimena\colht
- | \setbox0=\vbox{#1}\advance\dimena-\ht0
- | \ifdim\ht0>0pt
- | \advance\dimena-\capsep
- | \advance\dimena\topskip \advance\dimena-\baselineskip
- | \fi
- | \setbox4=\vbox{\prevdepth=0pt #3}%
- | \advance\dimena-\ht4
- | \ifdim\ht4>0pt \advance\dimena-\capsep \fi
- | \ifvoid\footins\else
- | \advance\dimena-\ht\footins
- | \advance\dimena-\skip\footins
- | \fi
- | \ifvoid\topins\else
- | \advance\dimena-\ht\topins
- | \advance\dimena-\skip\topins
- | \fi
-\endcode
- Split that much text off the top of the box:
-\code
- | \splittopskip\topskip \splitmaxdepth\maxdepth
- | \setbox2=\vsplit#2to\dimena
-\endcode
- Now to sandwich it all together.
-\code
- | \dimena=\ht0 \dimenb=\dp0 \unvbox0
- | \ifdim\dimena>0pt
- | \prevdepth=\dimenb
- | \capseparator
- | \dimena\baselineskip \advance\dimena-\topskip
- | \kern\dimena
- | \nointerlineskip
- | \fi
- | \ifvoid\topins\else \unvbox\topins \vskip\skip\topins \fi
- | \dimena\dp2
- | \ifvoid2 \vfil \else \unvbox2 \fi
- | \ifvoid\footins \else
- | \vskip\skip\footins \footnoterule
- | \dimena=\dp\footins \unvbox\footins
- | \fi
- | \ifdim\ht4>0pt
- | \prevdepth=\dimena
- | \capseparator \kern-\prevdepth \prevdepth0pt
- | \fi
- | \unvbox4
- | }%
- |}
-\endcode
- The caption separator is in an hbox so that
- baselineskip glue will be added appropriately.
-\code
- |\def\capseparator{%
- | \hbox to \colwd{%
- | \dimena=0.5ex \advance\dimena-0.5\caprule
- | \dimenb=\dimena \advance\dimenb\caprule
- | \vrule height \dimenb depth-\dimena width\colwd
- | }%
- |}
-\endcode
-
- Here's a macro for making an illustration (blank space) with
- caption, suitable for top of page. |#1| is the cation, |#2| is
- vertical mode material commands to make the illustration (often
- this will be something like `|\kern|$n$|\baselineskip|' to leave
- $n$ lines of blank space). The whitespace between illustration
- and caption is adjusted to make the whole shebang line up.
-\code
- |\def\topillustration#1#2{%
- | \setbox0=\vbox{#2}%
- | \dimena\ht0 \dimenb\dp0 \unvbox0
- | \counta\dimena \divide\counta\baselineskip
- | \advance\dimena-\counta\baselineskip \advance\dimena-\topskip
- | \kern-\dimena \prevdepth\dimenb
- | \hsize=\colwd \vskip-\parskip \noindent#1\par
- |}
-\endcode
-
- Similar for bottom of column.
-\code
- |\def\botillustration#1#2{%
- | \setbox0\vbox{\hsize=\colwd \vskip-\parskip \prevdepth=0pt #1}
- | \setbox2=\vbox{\prevdepth=\dp0 #2}%
- | \dimena=\ht0 \advance\dimena\dp0 \advance\dimena\ht2
- | \unvbox0
- | \counta\dimena \divide\counta\baselineskip
- | \advance\dimena-\counta\baselineskip
- | \advance\dimena-\baselineskip
- | \kern-\dimena
- | \unvbox2
- |}
-\endcode
-
-%}}} make a column
-%{{{ make body part of page (hbox)
-\section{Making the page body hbox}
-
- The page body is everything except the footline, headline,
- topbox and botbox. It should be a box of height |\bodywd|
- (which is normally fixed) and height |\colht| (which is
- |\bodyht| minus the top and bot boxes).
-
- The default macro for making the body is |\makebody| which takes
- as its parameter the box number (usually |\pagebox|). (This may
- be replaced by adding items to the list macro |\pagelist|.)
-\code
- |\def\makebody#1{%
- | \hbox to \bodywd{%
- | \ifvoid\leftbox\else
- | \box\leftbox
- | \colseparator
- | \fi
- | \makecolumnfromcollist{#1}%
- | \counta\ncols
- | \loop \ifnum\counta>1
- | \colseparator
- | \makecolumnfromcollist{#1}%
- | \advance\counta -1
- | \repeat
- | \ifvoid\rightbox\else
- | \colseparator
- | \box\rightbox
- | \fi
- | }%
- |}
-\smallbreak
- |\def\colseparator{%
- | \hfil \vrule width\colrule depth0pt \hfil
- |}
-\endcode
-
- The macro |\makecolumnfromcollist| is used to generate columns
- (which must be boxes of height |\colht| and width |\colwd|). It
- uses the next item on |\collist| if there is one, otherwise it
- just uses |\xmakecolumn|.
-\code
- |\def\makecolumnfromcollist#1{%
- | \ifx\collist\empty
- | \xmakecolumn{}{#1}{}%
- | \else
- | \qremove\temp\collist
- | \temp
- | \fi
- |}
- |
-\endcode
-%}}} make insides of page (hbox)
-%{{{ make a page (vbox)
-\section{Making a page vbox}
-
- The macro generates a new page---a vbox to be `shipped out'.
- The first page includes a |papersize| special; this is because
- if the macros used to change the paper size also generated the
- |\special| then there might be conflicting |\special|s which
- would confuse the printer driver. This way the paper size may
- be changed a few times before the first page.
-
- The |\colht| register is set to the height of text columns on
- this page (which is $bodyht$ minus the height of any partial
- page, top or bottom boxes).
-\code
- |\def\makepage{%
- | \vbox{
- | \papersizespecial
- | \colht\bodyht \advance\colht-\ht\partialpage
- | \advance\colht-\ht\topbox \advance\colht-\ht\botbox
- | \advance\colht-\dp\partialpage
- | \advance\colht-\dp\topbox
- | \the\everypage
- | \makeheadline \nointerlineskip
- | \box\partialpage \nointerlineskip
- | \box\topbox \nointerlineskip
- | \ifx\pagelist\empty
- | \makebody\pagebox
- | \else
- | \qremove\temp\pagelist
- | \temp
- | \fi
- | \unvbox\botbox
- | \makefootline
- | }%
- |}
-\endcode
-
- The |\makeheadline| macro generates the headline in the form of
- vertical mode material with zero height. It is expanded after
- |\everypage| has been expanded, at the very top of the page's
- vbox.
-\code
- |\def\makeheadline{
- | \vbox to 0pt {
- | \skip0=\topskip \advance\skip0-2\ht\strutbox
- | \advance\skip0-\headlineskip
- | \vskip\skip0
- | \hbox to \bodywd{\the\headline}
- | \vss
- | }
- |}
-\endcode
-
- The footline is, naturally, generated with |\makefootline|.
- This time there is no requirement for it to be zero height. It
- is the last thing in the box being shipped out.
-\code
- |\def\makefootline{{
- | \baselineskip=\footlineskip
- | \hbox to \bodywd{\the\footline}
- |}}
-\endcode
-
- The |papersize| special is specified in the manual for DVIPS.
- It specifies the physical size of the medium---and so must be
- multiplied by the current magnification.
-\code
- |\def\papersizespecial{{%
- | \dimena=0.001\paperwd \multiply\dimena\mag
- | \dimenb=0.001\paperht \multiply\dimenb\mag
- | \special{papersize=\the\dimena,\the\dimenb}%
- | \global\let\papersizespecial=\relax
- |}}
- |
-\endcode
-%}}} make a page (vbox)
-%{{{ output
-\section{The output routine}
-
- The output routine sets |\hoffset| appropiately (subtracting
- $1{\scriptstyle''}$ to allow for \TeX's peculiar origin point
- one inch from the top left of the page.
-\code
- |\def\pdcoutput{%
- | \ifodd\pageno \hoffset=\innermg \else \hoffset=\outermg \fi
- | \advance\hoffset-1 true in
- | \voffset=\topmg
- | \advance\voffset-1truein
- | \shipout\makepage \advancepageno
- | \ifnum\outputpenalty>-20000 \else \dosupereject \fi
- | \unvbox\pagebox
- |}
-\smallbreak
- |\output={\pdcoutput}
-\endcode
-%}}} output
-%{{{ automated column setting
-\section{Specifying a grid}
-
- These macros for setting the paper size ought to be invoked
- after the base font and baseline skip have been set but before
- the numebr of columns is chosen.
-
-\subsec{Specifiying the paper size}
-
- This is a macro that might be used in documents. It takes two
- parameters, \<dimen>s for the width and height of the paper.
-\code
- |\def\setpaper#1#2{%
- | \paperwd=#1\relax
- | \paperht=#2\relax
- | \OPUTcalcbodywdht
- | \OPUTcalctopskip
- |}
-\endcode
- Calculate the page body width |\bodywd| from the paper size and
- the size of the margins:
-\code
- |\def\OPUTcalcbodywdht{
- | \bodywd=\paperwd \advance\bodywd-\outermg \advance\bodywd-\innermg
- | \bodyht=\paperht \advance\bodyht-\topmg \advance\bodyht-\botmg
- | \OPUTcalctopskip
- |}
-\endcode
-
- To avoid having to write `Aiv' or `afour' for specifying
- international standard A4 paper, I~use an
- |\ifcase|.\footnote*{Note for Americans: A4 corresponds to
- American Letter size, and A3 to Ledger size.} This macro
- handles A0 to A5.
-\code
- |\def\setpaperA#1{
- | \ifcase#1
- | \setpaper{841mm}{1189mm}\or
- | \setpaper{594mm}{841mm}\or
- | \setpaper{420mm}{594mm}\or
- | \setpaper{297mm}{420mm}\or
- | \setpaper{210mm}{297mm}\or
- | \setpaper{148mm}{210mm}
- | \else
- | \errmessage{Dunno how big DIN A#1 paper is, sorry.}
- | \fi
- |}
-\endcode
-
-\subsec{Adjusting the body height and top skip}
-
- Plain \TeX\ sets |\topskip| to $10\pt$, which means there is a
- gap between the top of the letters of the top line of text and
- the top of the pages's vbox (i.e., $vsize$ is measured from the
- baseline of the last line to a line $topskip$ above the baseline
- of the first line). For magazine-style setting, it is more
- usual to have $topskip$ set to the cap-height of the font
- (assuming there are no strange tall characters in use).
-
- To have an exactly $N$ lines to a page,
- $$
- bodyht = (N-1)\times baselineskip + topskip \quad.
- $$
- This macro increases the bottom margin in order to set $bodyht$
- to such a value.
-\code
- |\def\OPUTcalctopskip{
- | \setbox0=\hbox{AXbl()!gyJQ,}
- | \topskip=\ht0 \maxdepth=\dp0
- | \advance\bodyht-\topskip \divide\bodyht\baselineskip
- | \multiply\bodyht\baselineskip \advance\bodyht\topskip
- |}
-\endcode
-
- Give this value for $bodyht$, we can set $hsize$ and $vsize$
- according to the number of columns to a page. For $N$ lines to
- a column, we need $N\times ncols$ lines to make a whole page, so
- $$
- \eqalign{vsize
- &= (ncols \times N - 1) \times baselineskip + topskip\cr
- &= (bodyht + \delta) \times ncols - \delta\cr
- }
- $$
- where $\delta=baselineskip-topskip$.
-\code
- |\def\OPUTcalchsizevsize{
- | \hsize=\colwd
- | \vsize=\bodyht
- | \advance\vsize-\topskip \advance\vsize\baselineskip
- | \multiply\vsize\ncols
- | \advance\vsize-\baselineskip \advance\vsize\topskip
- |}
-\endcode
-
-
-\subsec{Setting the number of columns}
-
- Now some macros used in documents for setting the number of
- coumns. In the general case we have a grid of $n$ cells with
- text columnns spanning $k$ cells. This macro takes two number
- parameters, $n$ and $k$. It sets |\ncols| to as many columns
- fit on the page.
- $$
- \eqalign{colwd &= k \times gridwd + (k - 1) \times colsep\cr
- ncols &= \lfloor n \mathbin/ k \rfloor\cr}
- $$
- Often $n$ is not a multiple of $k$, which leaves some grid cells
- `spare' for illustrations or extra margins and so on.
-\code
- |\def\setnkgrid#1#2{%
- | \gridwd=\bodywd
- | \advance\gridwd-#1\colsep \advance\gridwd\colsep \divide\gridwd#1
- | \colwd#2\gridwd \advance\colwd#2\colsep \advance\colwd-\colsep
- | \ncols#1 \divide\ncols#2
- | \gridht=\baselineskip
- | \capsep=\gridht
- | \OPUTcalchsizevsize
- |}
-\endcode
-
- For simpler layouts, we just set the number of columns and set
- the grid and column widths to be the same.
-\code
- |\def\setncolumns#1{%
- | \colwd=\bodywd
- | \advance\colwd-#1\colsep \advance\colwd\colsep \divide\colwd #1
- | \gridwd=\colwd
- | \ncols=#1
- | \OPUTcalchsizevsize
- |}
-\endcode
-
-\subsec{Setting default values}
-
- We give all the parameters default values by assuming A4 paper
- and a single-column layout in \TeX's default fonts.
-\code
- |\setpaperA4
- |\setncolumns1
-\endcode
-
-%}}} automated column setting
-%{{{ balancing columns
-\section{Routines for balanced columns}
-
-\subsec{Balanced columns from a rigid vbox}
-
- This is the routine discussed in {\it\TeX book}, Appendix~D,
- Section~7 (pp.\thinspace396--397). It takes a rigid, regular
- vbox (rigid meaning there is no stretchable glue between lines,
- and regular meaning that baselines are all the same distance
- apart). Its parameters are
- $$\centerline{\vbox{\halign{\tt\char`\##\hfil&&\quad#\hfil\cr
- 1&\<8-bit number>& box to chop\cr
- 2&\<number>& how many columns to make (${}>0$)\cr
- 3&\<dimen>& the value of \cs{topskip} for the box\cr
- 4&tokens& what to put between columns\cr
- }}}$$
- the last parameter will usually be |\hfil| or |\colseparator|.
- Usually this command will be used like
-$$\hbox{|\hbox to \bodywd{\rigidbalance...}|}$$
-
-
-\code
- |\newcount\RGDncols
-\smallbreak
- |\def\rigidbalance#1#2#3#4{%
- | \setbox0=\box#1\relax \RGDncols=#2\relax \toksa={#4}%
- | \begingroup\splittopskip#3\relax \vbadness=10000
- | \valign{##\vfil\cr \RGDdosplits}%
- | \endgroup
- |}
-\endcode
- The helper function that produces the insides of the valign is
- recursive.
-\code
- |\def\RGDdosplits{
- | \dimena\ht0 \divide\dimena\RGDncols
- | \advance\dimena\splittopskip
- | \setbox1=\vsplit0 to\dimena
- | \unvbox1
- | \global\advance\RGDncols-1
- | \cr
- | \ifnum\RGDncols>0
- | \noalign{\the\toksa}
- | \RGDdosplits
- | \fi
- |}
-\endcode
-
-\subsec{Balance partial page}
-
- Occasionally it is useful to switch between different grids or
- numbers of columns within one page. This macro does this,
- creating a shorter-than-usual page body (including topbox and
- botbox) and then putting the result in |\partialpage| Its
- parameters are |#1| the \TeX\ code used to generate the text
- columns and |#2| what to put between the partial page and the
- rest of the page.
-
-\code
- |\def\makepartialpage#1#2{
- | \maybepagebreak
- | \begingroup
- | \output{%
- | \message{[partial}
- | \setbox0=\vbox{\unvbox\pagebox}%
- | \global\setbox\partialpage\vbox{
- | \box\partialpage \nointerlineskip
- | \the\everypage
- | \box\topbox \nointerlineskip
- | \hbox to \bodywd{%
- | \ifvoid\leftbox\else
- | \box\leftbox \colseparator
- | \fi
- | #1%
- | \ifvoid\rightbox\else
- | \colseparator \box\rightbox
- | \fi
- | }% \nointerlineskip
- | \box\botbox
- | #2
- | \dimena\baselineskip \advance\dimena-\topskip
- | \kern\dimena
- | }%
- | \message{page]}
- | }
- | \eject
- | \endgroup
- |}
-\smallbreak
- |\def\rigidbalancepartialpage{
- | \makepartialpage{\rigidbalance0\ncols\topskip\colseparator}
- |}
-\endcode
- Occasionally \TeX\ might have just over a pageful of text when
- this command is used (since the page break calculations do not
- take into account the space subtracted by
- illustrations\footnote*{This is probably a bug.}). In this case
- we have to force out a complete page.
-\code
- |\def\maybepagebreak{%
- | \vskip0pt plus\baselineskip \penalty-100
- | \loop
- | \dimena\vsize \advance\dimena-\ncols\ht\partialpage
- | \advance\dimena-\ncols\ht\topbox
- | \advance\dimena-\ncols\ht\botbox
- | \ifdim\pagetotal>\dimena
- | \eject\null
- | \repeat
- |}
-\endcode
-%}}} balancing columns
-\endcodefile
-\enddocument
-\bye
-%}}} pdcoput5.tex
-
-%Local variables:
-%fold-folded-p: t
-%fill-prefix: " "
-%End: