[comp.text.tex] Borders in TeX

brister@decwrl.dec.com (James Brister) (01/29/91)

I wanted to add a black border to pages, but I wanted to avoid printer
specific "specials." Here's what I came up with. It only works in plain TeX
(or should I say it only works where the output routine isn't required to
to fancy stuff like LaTeX).

Let me know if it breaks. Criticism on the code is welcome. Ideas on how to
make it work properly with LaTeX are welcome too.

James
--
James Brister                                           brister@decwrl.dec.com
DEC Western Software Lab., Palo Alto, CA    {uunet,sun,pyramid}!decwrl!brister
------------------------------------------------------------------------------
% border.tex
% Author: James A. Brister
% Mon Jan 28 19:43:19 1991
%
% Macros to put black borders around a page in PLAIN TeX. The border is
% laid over the top of the page as it would normally be. Changes to
% \hoffset and \voffset do not affect where the border goes.
%
% To turn borders on use the command \borderson, to turn them off use
% \bordersoff.
%
% Interesting dimensions are:
%
%	\borderindent	the distance from the outside edge of the border to
%			the paper edge. Default is 10 pts
%	\borderwidth	the width of the border. Default is 5pt
%	\borderspace	the (minimum) space between the inside edge of the 
%			border and the outside edge of the box containing 
%			all the page material. Default is 10pt. Not really 
%			useful in this context though, because it implies the 
%			internal box will be shifted, but the size
%			of the internal box is adjusted to allow for this 
%			dimension. The macro that uses it (boxit) is
%			useful, and borderspace can really be set to
%			anything inside a group .e.g.
%			{\borderwidth=5pt 
%                        \borderspace=5pt 
%                        \boxit{\hbox{fubar}}}
%			won't (ok, shouldn't) affect the output routine.
%	\paperheight	the height of the paper, default is 11 inches
%	\paperwidth	the width of the paper, default is 8.5 inches
%
% NOTE: If you change these dimensions you can get
% overfull box errors. To avoid this adjust \vsize, \hsize, \hoffset, and
% \voffset accordingly.
%
%

\newdimen\borderspace \borderspace=10pt
\newdimen\borderwidth \borderwidth=5pt
\newdimen\borderindent \borderindent=10pt
\newdimen\paperheight \paperheight=11in
\newdimen\paperwidth \paperwidth=8.5in


\newdimen\bigboxheight % height of final box inside border
\newdimen\bigboxwidth % width of same box
\newdimen\leftsidekern % distance between inside of border and left of page box
\newdimen\topsidekern % distance between inside of border and top of pagebox
\newdimen\boxadjust % distance from paper edge to inside edge of border space.

%
% put a border around a box. Taken from the TeX book. Border width is
% defined by \borderwidth. Distance out from box is \borderspace.
%
% This macro can be called in a page like so:
% {\borderwidth=5pt \borderspace=5pt \boxit{\hbox{fubar}}}
%

\def\boxit#1{\vbox{\hrule height \borderwidth depth 0pt
  \hbox{\vrule width \borderwidth\kern\borderspace
\vbox{\kern\borderspace#1\kern\borderspace}\kern\borderspace \vrule width
\borderwidth}\hrule height \borderwidth depth 0pt}}

%
% Wrap up the page in a border and ship it out.
%

\def\borderoutput{
  \setbox255=\vbox{\makeheadline
  \pagebody
  \makefootline}%
  \setbox255=\vbox{\makebigbox{\box255}}
  \begingroup
    \hoffset= -1in \advance\hoffset by \borderindent
    \voffset= -1in \advance\voffset by \borderindent
    \shipout\boxit{\box255}
  \endgroup
  \advancepageno
  \ifnum\outputpenalty>-20000\else\dosupereject\fi}

%
% make a big box to hold the page, that's big enough to wrap the border
% around.
%

\def\makebigbox#1{%
  \boxadjust=\borderindent
  \advance\boxadjust by \borderwidth
  \advance\boxadjust by \borderspace

  \bigboxheight=\paperheight
  \bigboxwidth=\paperwidth

  \advance\bigboxheight by -\boxadjust
  \advance\bigboxheight by -\boxadjust
  \advance\bigboxwidth by -\boxadjust
  \advance\bigboxwidth by -\boxadjust

  \leftsidekern=\hoffset \advance\leftsidekern by 1in
  \advance\leftsidekern by -\boxadjust
  \topsidekern=\voffset \advance\topsidekern by 1in
  \advance\topsidekern by -\boxadjust

  \hbox to \bigboxwidth{\kern\leftsidekern
    \vbox to \bigboxheight{\kern\topsidekern#1\vfil}
    \hfil}}

\def\borderson{\output={\borderoutput}}
\def\bordersoff{\output={\plainoutput}} % reset to TeX's standard output