% \iffalse
% This is the twoup package, twoup.dtx
% Copyright 2005 by Mogens Lemvig Hansen.
%
% Run this file through LaTeX and read the documentation in twoup.dvi
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% This Current Maintainer of this work is Mogens Lemvig Hansen.
%
% This work consists of the files twoup.dtx and twoup.ins
% and the derived file twoup.sty.
%
%<*docdriver>
\documentclass{ltxdoc}[1996/01/11]
\usepackage{url}
%\discretionaries |~!@$%^&*()_+`=#{"}[]:;'<>,.?\/|
%\CodelineIndex%\EnableCrossrefs
\makeatletter
\newcommand{\nextlinelabel}[2][1]{\@bsphack
   \@tempcnta\c@CodelineNo
   \advance\@tempcnta#1\relax
   \def\@currentlabel{\the\@tempcnta}\label{#2}%
   \@esphack}
\makeatother
\begin{document} \DocInput{twoup.dtx} \end{document}
%</docdriver>
% \fi
% \CheckSum{324}
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \def\fileversion{1.2} \def\filedate{2005/7/25} \def\docdate{\filedate}
% \title{The \textsf{twoup} Package\thanks{This file describes version
%   \fileversion, \filedate.}}
% \author{\copyright\ Mogens Lemvig Hansen\thanks{%
%    The \textsf{twoup} package is distributed under the \LaTeX\ Project
%    Public License; please see Section~\ref{sec:license}.}\\
% mlhansen@uniserve.com}
% \date{\docdate}
% \maketitle
% \begin{abstract}
%    The \textsf{twoup} assists in two-up or booklet printing
%    using the \textsf{2up} or \textsf{booklet} packages
%    or using the psnup program and friends.
% \end{abstract}
%
% \tableofcontents\bigskip
%
% I am familiar with three ways of producing two-up
% documents\footnote{That is, printing two logical pages side by
% side on one side of one sheet of paper.} and
% booklets:\footnote{That is, rearranging the logical pages before
% printing them two-up on both sides of the paper in such a manner
% that the resulting sheets of paper can be folded down the middle
% into a small book.} the \textsf{2up} package, the \textsf{booklet}
% package, and the postscript tool psnup.
% The \textsf{2up} and \textsf{booklet} packages are both available
% from CTAN, and psnup is included with many \TeX\ distributions
% including MiK\TeX. All three will by default
% accomplish this task by scaling the page down.  However, a one-up
% page layout does not necessarily work well when scaled.  The
% \textsf{twoup} package provides a page layout designed for two-up
% printing and sets the relevant \textsf{2up} or \textsf{booklet}
% parameters or gives advise on how to use the postscript tools.
%
% \section{Usage}
% Give the paper size you intend to print on as an option to
% \verb:\documentclass:.\footnote{If you intend to print on your
% default paper size, you do not have to give any paper size
% option.}  The \textsf{twoup} package re-calculates the paper size
% and margins for two-up printing.\footnote{If you print on
% \texttt{a4paper}, \textsf{twoup} calculates the same paper size as
% the \texttt{a5paper} option but with different (smaller) margins.
% You may consider this discrepancy either a bug or a feature.}
% Then choose the method:
%
% \subsection{Plain two-up with the \textsf{2up} package}
% Load the \textsf{2up} package \emph{before} the \textsf{twoup}
% package.
% \begin{quote}
% \verb:\documentclass[a4paper,12pt]{article}:\\
% \verb:\usepackage{2up}:\\
% \verb:\usepackage{twoup}:
% \end{quote}
%
% Unfortunately cross references may not work out under the
% \textsf{2up} package.  The solution is, as explained in the
% \textsf{2up} documentation, to comment out the
% \verb:\usepackage{2up}: line, run your .tex file through \LaTeX\
% until all references work out, then load \textsf{2up} again and run
% your document through \LaTeX\ once (an only once).
%
% \subsection{Booklets with the \textsf{booklet} package}
% Load the \textsf{booklet} package \emph{before} the \textsf{twoup}
% package.
% \begin{quote}
% \verb:\documentclass[letterpaper,12pt]{article}:\\
% \verb:\usepackage[print]{booklet}:\\
% \verb:\usepackage{twoup}:
% \end{quote}
% Without the \verb:print: option, the \textsf{booklet} package does
% nothing.
%
% The \textsf{booklet} package has miraculously solved the
% cross-reference problem of the \textsf{2up} package but does not
% provide a plain two-up option.
%
% \subsection{Plain two-up with the postscript tools}
% Simply load the \textsf{twoup} package.
% \begin{quote}
% \verb:\documentclass[letterpaper,12pt]{article}:\\
% \verb:\usepackage{twoup}:
% \end{quote}
% When you run your .tex file through \LaTeX, the \textsf{twoup}
% package will tell you which options to use with the psnup program;
% look for the psnup command line near the end of the
% transcript.\footnote{Both on screen and in the .log file.}  If you
% give a paper size option, the \textsf{twoup} package will also
% tell you which lines you will have to add to your postscript file
% by hand.
%
% Run the .dvi file through dvips\footnote{The current version of
% the \textsf{twoup} package requires that you use dvips.  If you
% want to use some other .dvi-to-postscript program, please see code
% line~\ref{line:dvips} and the commentary around it.} to make a
% postscript file.
% \begin{quote}
% \verb:dvips: \meta{file}
% \end{quote}
%
% Then run psnup with the options that the \textsf{twoup} package
% gave you above.  Even Win95 allows you to cut-and-paste the
% command line which could look something like this:
% \begin{quote}
% \verb:psnup: \verb:-pletter: \verb:-W396.0pt: \verb:-H612.0pt:
% \verb:-2: \meta{file}\verb:.ps: \meta{twoup}\verb:.ps:
% \end{quote}
%
% The postscript file, \meta{twoup}\verb:.ps:, has by now lost all
% consciousness of which paper size it is to be printed on.  If you
% are about to print on your printer's default paper size, that is
% no problem.  To print on any other paper size you most likely have
% to place a paper size command in \meta{twoup}\verb:.ps:.  With a
% plain text editor add the lines \textsf{twoup} gave you in the
% \LaTeX\ run to \meta{twoup}\verb:.ps:. The lines to add could look
% like this:
% \begin{quote}
% \verb;%%BeginPaperSize: letter;\\
% \verb;letter;\\
% \verb;%%EndPaperSize;
% \end{quote}
% Place the new lines just after the
% \verb:%%EndComments: line near the top of \meta{twoup}\verb:.ps:.
%
% \subsection{Booklets with the postscript tools}
% The \LaTeX\ side of making booklets is much like simple two-up.
% You may want to use the \texttt{twoside} option to
% \verb:\documentclass: to make the inner margins a bit larger etc.
% \begin{quote}
% \verb:\documentclass[a4paper,11pt,twoside]{article}:\\
% \verb:\usepackage{twoup}:
% \end{quote}
% As above, the \textsf{twoup} package will advise you on which
% options to use with the psnup program.  Run your .dvi file through
% dvips:
% \begin{quote}
% \verb:dvips: \meta{file}
% \end{quote}
%
% Now the fun begins:  Before using psnup you must use the psbook
% program to fold your postscript file into a signature:
% \begin{quote}
% \verb:psbook: \meta{file}\verb:.ps: \meta{book}\verb:.ps:
% \end{quote}
% The number of pages in a signature must be divisible by four, so
% psbook may add a few blank pages to the end of your booklet. Run
% the result through psnup with the options the \textsf{twoup}
% package calculated in the \LaTeX\ run. The command line could look
% something like this:\footnote{Under Unix, you can pipe the psbook
% and psnup commands together; Windows, however, does not like long
% command lines.}
% \begin{quote}
% \verb:psnup: \verb:-pa4: \verb:-Pa5:
% \verb:-2: \meta{book}\verb:.ps: \meta{twoup}\verb:.ps:
% \end{quote}
%
% Unless you are about to print on your printer's default paper
% size, add the paper size command to \meta{twoup}\verb:.ps: as
% above.
%
% You can print your postscript file, \meta{twoup}\verb:.ps:, now,
% but if you want to print double sided, you may have to split the
% file in two with the psselect program:
% \begin{quote}
% \verb:psselect: \verb:-o: \meta{twoup}\verb:.ps:
%    \meta{odd}\verb:.ps:\\
% \verb:psselect: \verb:-e:
%    \meta{twoup}\verb:.ps: \meta{even}\verb:.ps:
% \end{quote}
% Then print \meta{odd}\verb:.ps:, turn the paper over, and print
% \meta{even}\verb:.ps:.\footnote{Depending on your printer, you may
% want to use psselect's \texttt{-r} option to print the \meta{even}
% pages in reverse order.}
%
% \subsection{Options}
% By default the \textsf{twoup} package leaves room for running
% headers and footers.  Use the \texttt{noheadfoot},
% \texttt{nofoot}, or \texttt{nohead} option to reclaim that space.
% As a side efect, these options set the page style:
% \texttt{noheadfoot} implies the \texttt{empty} page style,
% \texttt{nofoot} implies the \texttt{headings} page style, and
% \texttt{nohead} implies the \texttt{plain} page style. Moreover,
% the \texttt{nofoot} and \texttt{noheadfoot} options disable the
% \texttt{plain} page style\footnote{By making \texttt{plain}
% synonymous with the \texttt{empty} style.} to prevent the
% \verb:\chapter: command from inserting a
% \verb:\thispagestyle{plain}: command.
%
% The \textsf{twoup} package knows the standard paper size options:
% \texttt{letterpaper}, \texttt{legalpaper},
% \texttt{executivepaper}, \texttt{a4paper}, \texttt{a5paper}, and
% \texttt{b5paper}.  You should use these options as global options
% to \verb:\documentclass:.  If you print two-up on
% \texttt{legalpaper}, the text width is larger than what is
% considered comfortable.  You should use the \texttt{twocolumn}
% option to \verb:\documentclass: or, better, the \textsf{multicol}
% package.
%
% If you use \textsf{twoup} without \textsf{2up} or
% \textsf{booklet}, then the \textsf{twoup} package will insert a
% paper-size \verb:\special: in your .dvi file.  Use the
% \verb:nospecial: option to suppress this.
%
% \subsection{Additional commands}%
% \DescribeMacro{\cleartolastpage}%
% If you are making a booklet, the number of pages must be divisible
% by four; indeed, the \textsf{booklet} package or the psbook
% program will add blank pages as necessary.  If, however, you want
% to print on the last page, the back of your booklet, you can use
% the \verb:\cleartolastpage: command in a \verb:twosided: context
% to (print all pending tables, figures, and footnotes and) insert
% as many blank pages as necessary to reach a page number divisible
% by four. In detail,
% \begin{quote}
% \verb:\cleartolastpage:\oarg{div}\oarg{rem}\\
% \verb:\cleartolastpage*:\oarg{div}\oarg{rem}
% \end{quote}
% both print all pending floats and insert blank pages until the
% page number leaves remainder \meta{rem} when divided by
% \meta{div}.  The default value of \meta{rem} is~$0$, and the
% default value of \meta{div} is~$4$ under the \verb:twosided: class
% option and $2$ otherwise.  The starred version suppresses the
% printing of page numbers on the inserted blank pages.
%
% Thus \verb:\cleartolastpage[1]: is equivalent to \LaTeX's
% \verb:\clearpage: command
% and \verb:\cleartolastpage[2][1]: is equivalent to
% \verb:\cleardoublepage:.
%
% The \verb:\cleartolastpage: command may fail to put you one the
% last page if page~$1$ is not the very first page (maybe because
% you have differently numbered front matter); use the optional
% \meta{rem} argument to overcome this.
%
%
% \section{Installation}
% As you must have figured, you generate the documentation for the
% \textsf{twoup} package by running the file \url:twoup.dtx: through
% \LaTeX---thrice to resolve cross references.
%
% To extract the package itself from the .dtx file, run
% \url:twoup.ins: through \LaTeX:
% \begin{quote}
% \verb:latex twoup.ins:
% \end{quote}
% You now have to decide what to do with several files.
% \begin{itemize}
% \item You may have to move the file \url:twoup.sty: to some
% directory where \LaTeX\ can find it;
% \url:(local)texmf/tex/latex/misc: would be the natural
% choice~\cite{tds}.
%
% \item Move the documentation, \url:twoup.dvi: or \url:twoup.pdf:,
% to \url:(local)texmf/doc/latex/misc:.
%
% \item You may discard the source files, \url:twoup.dtx: and
% \url:twoup.ins:, or store them in
% \url:(local)texmf/source/latex/misc:.
%
% \item Discard all remaining \url:twoup.*: files.
% \end{itemize}
%
%
% \section{Limitations}
% The \textsf{twoup} package is designed for and tested on
% \texttt{letterpaper}, \texttt{legalpaper}, and \texttt{a4paper}.
% Printing two-up on smaller paper is hardly feasible; printing on
% larger paper is beyond the normal desktop printer.
%
% The margins calculated by \textsf{twoup} are too small for
% \verb:\marginpar:s.\footnote{But just large enough for the line
% numbers inserted by the \textsf{lineno} package.}
%
% If you print two-up on \texttt{legalpaper}, \textsf{twoup} leaves
% a text width larger than what is considered comfortable.  You
% should use the \texttt{twocolumn} option to \verb:\documentclass:
% or, better, the \textsf{multicol} package.
%
% The \textsf{twoup} package is not compatible with the
% \textsf{geometry} package.  Both packages re-calculate the margins
% and the disagree on the interpretation of the paper size options.
%
% I know very little about postscript, yet I tell you to go add
% lines to .ps files.  The advise \textsf{twoup} gives has always
% worked for me; if it doesn't work for you, please teach me the
% correct way.
%
% The current implementation of \textsf{twoup} requires dvips
% (unless you use the \textsf{2up} or \textsf{booklet} packages).
% This limitation is easily overcome with your help: please see code
% line~\ref{line:dvips} and the commentary around it.
%
%
% \section{License}\label{sec:license}
% This work may be distributed and/or modified under the
% conditions of the \LaTeX\ Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   \url{http://www.latex-project.org/lppl.txt}
% and version 1.3 or later is part of all distributions of \LaTeX\
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status ``maintained.''
%
% This Current Maintainer of this work is Mogens Lemvig Hansen.
%
% This work consists of the files \url{twoup.dtx} and \url{twoup.ins}
% and the derived file \url{twoup.sty}.
%
%
% \StopEventually{
%    \nocite{ltclass}
%    \bibliographystyle{is-plain}
%    ^^A\bibliography{tex}
%      \begin{thebibliography}{1}
%
%      \bibitem{ltclass}
%      Leslie Lamport, Frank Mittelbach, and Johannes Braams.
%      \newblock {\em Standard Document Classes for \LaTeX\ version 2e}.
%      \newblock CTAN, 1999/09/10 edition, 1999.
%
%      \bibitem{tds}
%      {TUG Working Group on a {\TeX} Directory Structure (TWG-TDS)}.
%      \newblock {\em A Directory Structure for {\TeX} Files}.
%      \newblock CTAN, version 0.9995, January 26, 1998 edition, 1998.
%
%      \end{thebibliography}
% }
%
% \section{Implementation}
% The \textsf{twoup} package doesn't have to do much---just
% re-calculate the paper size and the margins and put together the
% advise on how to use the psnup program. The \textsf{twoup} package
% does its thing based on the plain \LaTeX\ parameters
% \verb:\paperwidth:, \verb:\paperheight:, \verb:\headheight:,
% \verb:\headsep:, \verb:\footskip:, \verb:\topskip:, and
% \verb:\baselineskip:.
%
% \subsection{Identification}
%    \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}%
\ProvidesPackage{twoup}[2005/07/25 version 1.2]
%    \end{macrocode}
%
% \subsection{Declaration of Options}
% The \texttt{noheadfoot} option sets the relevant lenghts to zero.
% Since there is no room for headers or footers, the only sensible
% page style is \texttt{empty}.  The \verb:\chapter: command issues
% a \verb:\thispagestyle{plain}: command, so re-define the
% \texttt{plain} style to be a synonym for the \texttt{empty}
% style.\footnote{I borrowed the idea of brutally making
% \texttt{plain} a synonym for \texttt{empty} from David Carlisle's
% \textsf{nopageno} package.}
%    \begin{macrocode}
\DeclareOption{noheadfoot}{%
   \setlength{\headheight}{0pt}%
   \setlength{\headsep}{0pt}%
   \setlength{\footskip}{0pt}%
   \let\ps@plain\ps@empty
   \pagestyle{empty}}
%    \end{macrocode}
% With room for a header but without a footer the most sensible page
% style would be \texttt{headings}.  Again the \texttt{plain} page
% style must be disabled.
%    \begin{macrocode}
\DeclareOption{nofoot}{%
   \setlength{\footskip}{0pt}%
   \let\ps@plain\ps@empty
   \pagestyle{headings}}
%    \end{macrocode}
% With room for a footer but no header the most sensible page style
% is \texttt{plain}---so don't change \texttt{plain}.
%    \begin{macrocode}
\DeclareOption{nohead}{%
   \setlength{\headheight}{0pt}%
   \setlength{\headsep}{0pt}%
   \pagestyle{plain}}
%    \end{macrocode}
%
% \begin{macro}{\TwoUp@info}
% \begin{macro}{\TwoUp@paper}
% The paper size options record part of the advise on how to use the
% psnup program in \verb:\TwoUp@info: and part of the advise on how
% to edit the final postscript file in \verb:\TwoUp@paper:.
%    \begin{macrocode}
\DeclareOption{letterpaper}{%
   \def\TwoUp@info{-pletter -W5.5in -H8.5in}%
   \def\TwoUp@paper{letter}}%
\DeclareOption{legalpaper}{%
   \def\TwoUp@info{-plegal -W7in -H8.5in}%
   \def\TwoUp@paper{legal}}%
\DeclareOption{executivepaper}{%
   \def\TwoUp@info{-pexecutive -W5.25in -H7.25in}%
   \def\TwoUp@paper{executive}}%
\DeclareOption{a4paper}{%
   \def\TwoUp@info{-pa4 -Pa5}%
   \def\TwoUp@paper{a4}}%
\DeclareOption{a5paper}{%
   \def\TwoUp@info{-pa5 -W105mm -H148mm}%
   \def\TwoUp@paper{a5}}%
\DeclareOption{b5paper}{%
   \def\TwoUp@info{-pb5 -W125mm -H176mm}%
   \def\TwoUp@paper{b5}}%
%    \end{macrocode}
% \end{macro}\end{macro}
%
% \begin{macro}{\TwoUp@special}
% The \textsf{twoup} package needs to record the (smaller) paper
% size in the postscript file.  That means placing a suitable
% \verb:\special: command in the .dvi file.  Unfortunately,
% ``suitable'' depends on which .dvi-to-postscript program you use,
% so we need an option for each such program.  I have implemented
% the option for dvips but was too lazy to figure out the
% appropriate command for other .dvi-to-postscript
% programs.\nextlinelabel[2]{line:dvips}
%    \begin{macrocode}
\DeclareOption{dvips}{%
   \def\TwoUp@special{%
      \special{papersize=\the\paperwidth,\the\paperheight}}}
%    \end{macrocode}
% If you need to use the \textsf{twoup} package with another
% postscript driver, please let me know so I can incorporate more
% options in future releases of \textsf{twoup}.  While you wait for
% that, use the \texttt{nospecial} option to suppress the
% \verb:\special:.
%    \begin{macrocode}
\DeclareOption{nospecial}{%
   \def\TwoUp@special{\relax}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Execution of Options}
% Default to dvips leaving space for headers and footer as the class
% sees fit.
%    \begin{macrocode}
\ExecuteOptions{dvips}
\ProcessOptions
%    \end{macrocode}
%
% \subsection{Main Code}
% \subsubsection{Paper Size and psnup Advise}
% \begin{macro}{\TwoUp@info}
% Before re-calculating the paper size, we must record part of the
% psnup advise.  If a paper size option did that already, all is
% fine.  Otherwise we must be printing on the default paper size
% which we must then determine.  We will try to recognize the most
% common default paper sizes: a4, letter, and legal.  Since this is
% the default paper size, we may assume that the printer knows how
% to handle it.  We therefore suppress the advise on editing the
% final postscript file by \emph{not} defining \verb:\TwoUp@paper:.
%    \begin{macrocode}
\ifx\TwoUp@info\undefined
   \setlength{\@tempdima}{8.5in}
   \ifdim\paperwidth=\@tempdima
      \setlength{\@tempdima}{11in}
      \ifdim\paperheight=\@tempdima
         \def\TwoUp@info{-pletter -W5.5in -H8.5in}
      \fi
      \setlength{\@tempdima}{14in}
      \ifdim\paperheight=\@tempdima
         \def\TwoUp@info{-plegal -W7in -H8.5in}
      \fi
   \fi
   \setlength{\@tempdima}{210mm}
   \ifdim\paperwidth=\@tempdima
      \setlength{\@tempdima}{297mm}
      \ifdim\paperheight=\@tempdima
         \def\TwoUp@info{-pa4 -Pa5}
      \fi
   \fi
\fi
%    \end{macrocode}
% If \verb:\TwoUp@info: is still undefined, we give up and use the
% \verb:-w: and \verb:-h: options to psnup.\footnote{We could of
% course have used the \texttt{-w} and \texttt{-h} options also for
% a4, letter, and legal sized paper, but the psnup command line
% looks a lot prettier with a \texttt{-pa4}, \texttt{-pletter}, or
% \texttt{-plegal} option.}
%    \begin{macrocode}
\ifx\TwoUp@info\undefined
   \PackageWarningNoLine{twoup}{Unknown paper size.
      You may want to use a \MessageBreak
      paper size option like letterpaper}
%    \end{macrocode}
% \TeX\ displays \verb:\the\paperwidth: as however many \emph{pt},
% by which \TeX\ means traditional points; one inch is $72.27$\,pt.
% However, psnup expects the paper width as so-and-so many
% \emph{pt}, by which psnup means postscript points, the unit \TeX\
% calls \emph{bp}, or big points; one inch is $72$\,bp.  To overcome
% this confusion, we must multiply by $\frac{72}{72.27}$ or
% $0.99627$.
%    \begin{macrocode}
   \setlength{\@tempdima}{0.99627\paperwidth}
%    \end{macrocode}
% The \verb:\@settopoint: command rounds (down) to an integer.
% Rounding causes the psnup command line to be slightly wrong but
% less ugly.
%    \begin{macrocode}
   \@settopoint\@tempdima
%    \end{macrocode}
% Then record the information in \verb:\TwoUp@info:.  The psnup
% syntax for the output paper size is \verb:-w:\meta{width}
% \verb:-h:\meta{height}.
%    \begin{macrocode}
   \edef\TwoUp@info{-w\the\@tempdima}
%    \end{macrocode}
% Record the paper height in the same manner.
%    \begin{macrocode}
   \setlength{\@tempdima}{0.99627\paperheight}
   \@settopoint\@tempdima
   \edef\TwoUp@info{\TwoUp@info\space -h\the\@tempdima}
%    \end{macrocode}
% Then add the input paper size to the list of psnup options. The
% syntax for the input paper size is \verb:-W:\meta{width}
% \verb:-H:\meta{height}. As before, we must correct for the
% confusion between traditional and postscript points.
%    \begin{macrocode}
   \setlength{\@tempdima}{0.5\paperheight}
   \setlength{\@tempdima}{0.99627\@tempdima}
   \@settopoint\@tempdima
   \edef\TwoUp@info{\TwoUp@info\space -W\the\@tempdima}
   \setlength{\@tempdima}{0.99627\paperwidth}
   \@settopoint\@tempdima
   \edef\TwoUp@info{\TwoUp@info\space -H\the\@tempdima}
\fi
%    \end{macrocode}
% \end{macro}
%
% The advise on psnup options is ready; now we must decide whether
% to use it.  But first change the paper size:  swap the width and
% the height; then divide the new width by two.
%    \begin{macrocode}
\setlength{\@tempdima}{\paperwidth}
\setlength{\paperwidth}{0.5\paperheight}
\setlength{\paperheight}{\@tempdima}
%    \end{macrocode}
% If either the \textsf{2up} or \textsf{booklet} package is loaded,
% ignore the psnup advise and issue suitable \verb:\source: and
% \verb:\target: commands---both \textsf{2up} and \textsf{booklet}
% define \verb:\source: and \verb:\target:.
%    \begin{macrocode}
\@ifpackageloaded{2up}{%
   \source{\magstep0}{\paperwidth}{\paperheight}%
   \target{\magstep0}{2\paperwidth}{\paperheight}%
}{%
\@ifpackageloaded{booklet}{%
   \source{\magstep0}{\paperwidth}{\paperheight}%
   \target{\magstep0}{2\paperwidth}{\paperheight}%
}{%
%    \end{macrocode}
% Otherwise we are going the postscript route.  Record the new
% smaller paper size in the postscript file by placing a suitable
% \verb:\special: command in the .dvi file.
%    \begin{macrocode}
   \TwoUp@special
%    \end{macrocode}
% Then have the psnup advise presented at the end of the \LaTeX\
% run. Using \verb:\PackageInfo: would have been natural, but I want
% the advise to appear on the screen (as well as in the .log file);
% also the psnup command line is rather long, so we need \emph{ad
% hoc} formatting.
%    \begin{macrocode}
   \AtEndDocument{\typeout{^^J%
      Package twoup Info: Use psnup with these options:^^J%
      psnup \TwoUp@info\space -2 \jobname.ps twoup.ps^^J}}
%    \end{macrocode}
% If we had an explicit paper size option (indicating that we are to
% print on a paper size other than the default), \verb:\TwoUp@paper:
% is defined and we can give advise on editing the postscript file.
%    \begin{macrocode}
   \ifx\TwoUp@paper\undefined\else
      \AtEndDocument{\typeout{^^J%
         Package twoup Info: You may have to add these
         three lines to your .ps file:^^J%
         \@percentchar\@percentchar BeginPaperSize: \TwoUp@paper^^J%
         \TwoUp@paper^^J%
         \@percentchar\@percentchar EndPaperSize^^J}}
   \fi%
}}%
%    \end{macrocode}
%
% \subsubsection{Text Width and Horizontal Margins}
% The standard \LaTeX\ classes~\cite{ltclass} ensure that the line
% length is not too large for comfortable reading.  For two-up
% printing on \texttt{letterpaper}, \texttt{a4paper}, or smaller,
% that is a non-issue. However, \texttt{legalpaper} does leave room
% for oversized lines.\footnote{Up to 25\% ``too large.''} If I
% leave the line length ``small,'' the layout of the two-up printed
% page looks odd.  I therefore allow the oversized lines.  The user
% should consider using \texttt{twocolumn} mode or---better---the
% \textsf{multicol} package.
%
% I think that a total horizontal margin of one inch looks
% fine.\footnote{Fine enough to just leave room (in \texttt{oneside}
% mode) for the numbers added by the \textsf{lineno} package.}  The
% \verb:\textwidth: is then what is left of the \verb:\paperwidth:.
%    \begin{macrocode}
\setlength{\@tempdima}{1in}
\setlength{\textwidth}{\paperwidth}
\addtolength{\textwidth}{-\@tempdima}
%    \end{macrocode}
% If we are printing in \texttt{twoside} mode, the inner margin
% should be larger than the outer margin.  A ratio of about $1:2$
% looks fine.  The outer margin is then what is left of the total
% horizontal margin.
%    \begin{macrocode}
\if@twoside
   \setlength{\evensidemargin}{0.33\@tempdima}
   \setlength{\oddsidemargin}{\@tempdima}
   \addtolength{\oddsidemargin}{-\evensidemargin}
\else
%    \end{macrocode}
% In \texttt{oneside} mode, simply split the margins even.
%    \begin{macrocode}
   \setlength{\oddsidemargin}{0.5\@tempdima}
   \setlength{\evensidemargin}{\oddsidemargin}
\fi
%    \end{macrocode}
%
% So far we have ignored that the ``real'' left margin is
% \verb:1 inch:${}+{}$\verb:\hoffset:${}+{}$\verb:\oddsidemargin:
% (or \verb:\evensidemargin:).  We must subtract that inch.
%    \begin{macrocode}
\addtolength{\oddsidemargin}{-1in}
\addtolength{\evensidemargin}{-1in}
%    \end{macrocode}
%
% \subsubsection{Text Height and Vertical Margins}
% A top margin of half an inch looks good to me.  As a first
% approximation for the text height, simply subtract all the header
% and footer stuff from the paper height.  (Subtract
% \verb:\topmargin: twice for the sake of the bottom margin.)
%    \begin{macrocode}
\setlength{\topmargin}{0.5in}
\setlength{\textheight}{\paperheight}
\addtolength{\textheight}{-2\topmargin}
\addtolength{\textheight}{-\headheight}
\addtolength{\textheight}{-\headsep}
\addtolength{\textheight}{-\footskip}
%    \end{macrocode}
%
% The text height must then be corrected to fit an integer number of
% lines. The first line has height \verb:\topskip: while all other
% lines have height \verb:\baselineskip:.  Thus subtract
% \verb:\topskip: and divide by \verb:\baselineskip:.
%    \begin{macrocode}
\addtolength{\textheight}{-\topskip}
\divide\textheight\baselineskip
%    \end{macrocode}
% The \verb:\divide: command performs integer division, so
% \verb:\textheight: is now \meta{number of lines}\,sp.  Store the
% result in a counter to get a \emph{bona fide} number.
%    \begin{macrocode}
\@tempcnta\textheight
%    \end{macrocode}
% Now we can calculate the text height: the correct number of
% \verb:\baselineskip:s plus a \verb:\topskip: for the first line.
%    \begin{macrocode}
\setlength{\textheight}{\@tempcnta\baselineskip}
\addtolength{\textheight}{\topskip}
%    \end{macrocode}
%
% Again, the ``real'' top margin is
% \verb:1 inch:${}+{}$\verb:\voffset:${}+{}$\verb:\topmargin:,
% so subtract one inch from \verb:\topmargin:.
%    \begin{macrocode}
\addtolength{\topmargin}{-1in}
%    \end{macrocode}
%
% \begin{macro}{\cleartolastpage}
% The \verb:\cleartolastpage: command clears the page, checks for a
% star, prepares to issue a suitable \verb:\thispagestyle: command,
% and passes control to \verb:\cleartolastp@ge:.
%    \begin{macrocode}
\newcommand{\cleartolastpage}{%
   \clearpage
   \@ifstar
      {\def\TwoUp@blankpagestyle{\thispagestyle{empty}}\cleartolastp@ge}
      {\let\TwoUp@blankpagestyle\relax\cleartolastp@ge}}
%    \end{macrocode}
% The \verb:\cleartolastp@ge: command stores the first optional
% argument, \meta{div}, in the temporary counter \verb:\@tempcnta:
% with a default that depends on the \verb:twoside: class option.
%    \begin{macrocode}
\if@twoside
   \newcommand{\cleartolastp@ge}[1][4]{%
      \@tempcnta#1\relax
      \cleartol@stp@ge}%
\else
   \newcommand{\cleartolastp@ge}[1][2]{%
      \@tempcnta#1\relax
      \cleartol@stp@ge}%
\fi
%    \end{macrocode}
% The \verb:\cleartol@stp@ge: command does the real work: store a
% copy of the page number, \verb:\c@page:, in a temporary counter,
% divide and multiply by \meta{div} to round down to a multiple of
% \meta{div}, and add \meta{rem}.
%    \begin{macrocode}
\newcommand{\cleartol@stp@ge}[1][0]{%
   \@tempcntb\c@page
   \divide\@tempcntb\@tempcnta
   \multiply\@tempcntb\@tempcnta
   \advance\@tempcntb#1\relax
%    \end{macrocode}
% Now \verb:\@tempcntb: leaves remainder \meta{rem} when divided by
% \meta{div}, but it may still be smaller than the page number.  If
% so, add \meta{div} to get the next number that leaves the same
% remainder.
%    \begin{macrocode}
   \ifnum\@tempcntb<\c@page
      \advance\@tempcntb\@tempcnta
   \fi
%    \end{macrocode}
% Now \verb:\@\tempcntb: is the page number we want to reach.
%    \begin{macrocode}
   \loop\ifnum\c@page<\@tempcntb
      \hbox{}\TwoUp@blankpagestyle\newpage
   \repeat
}
%</package>
%    \end{macrocode}
% \end{macro}
% \Finale
