%\iffalse % -*- mode: latex -*- 
% 
%
% $Id: cd-cover.dtx,v 1.6 2002/01/28 14:30:44 cholm Exp $
%
%<*driver>
{\makeatother 
  \gdef\CVSKeyword$#1 ${\expandafter\cCVSKeyword#1\endcCVSKeyword\relax}
\gdef\cCVSKeyword#1: #2\endcCVSKeyword{%
\expandafter\gdef\csname CVS#1\endcsname{#2}}
}
\CVSKeyword$Date: 2002/01/28 14:30:44 $
\CVSKeyword$Revision: 1.6 $
\CVSKeyword$Id: cd-cover.dtx,v 1.6 2002/01/28 14:30:44 cholm Exp $
\CVSKeyword$Author: cholm $
\def\docdate{\CVSDate}        % Format is YYYY/MM/DD
\def\fileversion{v1.4 Beta}   % Remember to update in class too
\def\filedate{\CVSDate}       % around ProvideClass
\documentclass{ltxdoc}
\usepackage{rotating}
\title{The \textsf{cd-cover} class\thanks{Previously a package}\\
  Version \fileversion\\[-1ex]
  {\small CVS Revision: \CVSRevision}}
\author{Christian Holm\thanks{E--mail: \texttt{cholm@nbi.dk}}}
\date{\docdate\\
  {\small CVS Date: \CVSDate}}
\AlsoImplementation
\CodelineIndex
\EnableCrossrefs
\RecordChanges
\parindent=0pt
\parskip=1ex
\begin{document}
\maketitle
\tableofcontents
\DocInput{cd-cover.dtx}
\PrintIndex
\end{document}
%</driver>
%\fi
% \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         \~}
%
% \section{Introduction}
%
% This is an $\beta$ release of the \textsf{cd-cover} class. This was
% previously a package, but since a class is actually more appropiate
% for the commands and macros herein, this new version switches to a
% class implementation.
%
% A number of improvements has been made in this release. The whole
% scheme of things has taken a drastic turn, providing many new
% advantages (see also section~\ref{sec:psscheme}).
%
% Bug reports, suggestions, praises, but not flames should be sent to
% \texttt{cholm@nbi.dk}.   Please submit changes in form of patches to
% the most recent \texttt{cd-cover.dtx} file\footnote{Avaliable from
% CTAN in \texttt{macros/latex/contrib/other/cd-cover}.}.  Patches are 
% easily generated with 
% \begin{quote}
%   {\ttfamily
%     diff -c \meta{original-file} \meta{new-file} >
%     \meta{patch-file}}
% \end{quote}
% on any reasonable system.  This makes merging changes into the class
% much eaiser, and the changes will more like be included in the
% normal distribution.
%
% \section{Usage}
%
% In this release four environments are provided:
% \begin{itemize}
% \item \textsf{bookletsheets} is for typesetting booklet pages for
%   normal CD covers (plastic cover).
% \item \textsf{backssheet} is for typesetting the back side for
%   normal CD covers.  
% \item \textsf{backssheet*} Special version of the above, that
%   rotates the back title the other way.  Useful for typesetting
%   double jewelcase covers, and for some nationalities (e.g., German)
%   that like the title to run opposite to that of English.
% \item \textsf{sleevesheet} is for typesetting paper sleeves for CDs,
%   for example if you lost the plastic one, or don't like the space 
%   they take up, or whatever.
% \item \textsf{singlesheet} is for typeseting covers for plastic
%   single CD covers.
% \end{itemize}
%
% \subsection{Syntax}
%
% The syntax of these environments is:
% \begin{quote}
%   |\begin{bookletsheets}|\meta{your text}|\end{bookletsheets}|\\
%   |\begin{backsheet}|\marg{title}\meta{your text}|\end{backsheet}|\\
%   |\begin{backsheet*}|\marg{title}\meta{your text}|\end{backsheet*}|\\
%   |\begin{sleevesheet}|\meta{your text}|\end{sleevesheet}|\\
%   |\begin{singlesheet}|\marg{title}\marg{slip text}\meta{your text}
%   |\end{singlesheet}|
% \end{quote}
% 
% Here \marg{title} is the title on the back of the covers, \marg{slip
% text} is the text that should go on the back slip of the single type
% cover.
%
% In figure~\ref{fig:exa:booklet} to~\ref{fig:exa:single} there
% are some examples of these environments. 
% 
% \begin{figure}[htbp]
%   \setlength{\unitlength}{.5mm}%
%   \begin{picture}(240,120)(0,-120)%
%     \put(0,0){\line(1,0){240}}%    
%     \put(0,0){\line(0,-1){120}}%   
%     \put(0,-120){\line(1,0){240}}% 
%     \put(240,0){\line(0,-1){120}}% 
%     \put(120,0){\line(0,1){5}}%    
%     \put(120,-120){\line(0,-1){5}}%
%     \multiput(120,-1)(0,-5){24}{\line(0, -1){3}} %
%     \put(110,2){\vector(1,0){10}}%  
%     \put(75,1){Fold here}%          
%     \put(125,-10){Hello World}
%     \put(5,-10){Hello World Again}
%   \end{picture}
%   \caption{Example of \textsf{bookletsheets} output}
%   \label{fig:exa:booklet}
% \end{figure}
%
% \begin{figure}[htbp]
%   \setlength{\unitlength}{.5mm}%
%   \begin{picture}(151,118)(0,-118)%
%     \put(0,0){\line(1,0){151}}%
%     \put(0,-118){\line(1,0){151}}%
%     \put(0,0){\line(0,-1){118}}%  
%     \put(151,0){\line(0,-1){118}}%
%     \put(7,0){\line(0,1){5}}%     
%     \put(7,-118){\line(0,-1){5}}% 
%     \multiput(7,-1)(0,-5){24}{\line(0, -1){3}}
%     \put(144,0){\line(0,1){5}}
%     \put(144,-118){\line(0,-1){5}}
%     \multiput(144,-1)(0,-5){24}{\line(0, -1){3}}
%     \put(17,2){\vector(-1,0){10}}%  
%     \put(17,1){Fold here}%          
%     \put(134,2){\vector(1,0){10}}%  
%     \put(99,1){Fold here}%         
%     \put(6,-118){\begin{rotate}{90}Hello World\end{rotate}}%
%     \put(145,0){\begin{rotate}{-90}Hello World\end{rotate}}%
%     \put(13,-10){Hello World Again}%
%   \end{picture}
%   \caption{Example of \textsf{backsheet} output}
%   \label{fig:exa:back}
% \end{figure}
%
% \begin{figure}[htbp]
%   \setlength{\unitlength}{.5mm}%
%   \begin{picture}(266,123)(0,-123)%
%     \put(0,0){\line(3,4){6}}%
%     \put(6,8){\line(1,0){121}}%
%     \put(133,0){\line(-3,4){6}}%
%     \multiput(130,-1)(0,-5){24}{\line(0, -1){3}} %
%     \put(50,1){Fold and clue}%
%     \put(0,-123){\line(3,-4){6}}%
%     \put(6,-131){\line(1,0){121}}%
%     \put(133,-123){\line(-3,-4){6}}%
%     \put(50,-127){Fold and clue}%
%     \put(0,0){\line(1,0){266}}%
%     \put(0,0){\line(0,-1){123}}%
%     \put(0,-123){\line(1,0){266}}%
%     \put(266,0){\line(0,-1){123}}%
%   \end{picture}
%   \caption{Example of \textsf{sleevesheet} output}
%   \label{fig:exa:sleeve}
% \end{figure}
%
% \begin{figure}[htbp]
%   \setlength{\unitlength}{.5mm}%
%   \begin{picture}(137,120)(0,-120)%
%     \put(0,0){\line(0,-1){116}}%
%     \put(0,0){\line(1,0){36}}%
%     \put(36,0){\line(0,1){2}}%
%     \put(15,0){\line(0,1){5}}%
%     \multiput(15,-1)(0,-5){24}{\line(0, -1){3}} %
%     \put(18,0){\line(0,1){5}}%
%     \multiput(18,-1)(0,-5){24}{\line(0, -1){3}} %
%     \put(36,2){\line(1,0){119}}%
%     \put(155,2){\line(0,-1){120}}%
%     \put(0,-116){\line(1,0){36}}%
%     \put(36,-116){\line(0,-1){2}}%
%     \put(15,-116){\line(0,-1){5}}%
%     \put(18,-116){\line(0,-1){5}}%
%     \put(36,-118){\line(1,0){119}}%
%     \put(5,4){\vector(1,0){10}}%
%     \put(28,4){\vector(-1,0){10}}%
%     \put(28,3){Fold here}%
%     \put(0,0){\begin{rotate}{-90}Hello World\end{rotate}}%
%     \put(15,0){\begin{rotate}{-90}Hello World Again\end{rotate}}%
%   \end{picture}
%   \caption{Example of \textsf{singlesheet} output}
%   \label{fig:exa:single}
% \end{figure}
% \subsection{User setup}
%
% For each of the four environments, two user configurable lengths are
% defined. One is |\CD|\meta{type}|TopMargin|, which determins the
% vertical space from the cover border to \meta{your text}. The other
% is |\CD|\meta{type}|Margin| which determins the horizontal space
% between the border and \\meta{your text}. The default values for
% these lengths are 5mm.
%
% Here is the complete list of the lengths
%
% \DeleteShortVerb{\|}
% \begin{tabular}{|ll|}
%   \hline
%   \MakeShortVerb{\|}%
%   |\CDbookletTopMargin|& |\CDbackTopMargin|  \\  
%   |\CDbookletMargin|   & |\CDbackMargin|     \\
%   |\CDsleeveTopMargin| & |\CDsingleTopMargin|\\
%   |\CDsleeveMargin|    & |\CDsingleMargin|   \\
%   \hline
% \end{tabular}
%
% For example, if you want to put a picture that fills out a
% complete page of the booklets, you can set |\CDbookletTopMargin| and
% |\CDbookletMargin| to |0pt|. For example 
% \begin{verbatim}
%   \documentclass{cd-cover} 
%   \usepackage{epsfig}
%   \begin{document}
%   \parindent=0pt
%   \parskip=0pt
%   \CDbookletTopMargin=0pt
%   \CDbookletMargin=0pt
%   \begin{bookletsheets}
%     \vspace{5mm}  % These are specific for the file rh61img.ps 
%     \hspace{5mm}
%     \begin{center}
%       {\LARGE Debian GNU/Linux 2.2r5 --- potato}
%     \end{center}
%     \epsfig{file=rh61img.ps,width=11.99cm}
%     \end{bookletsheets}
%   \end{document}                            
% \end{verbatim}
%
% Note that the graphics should not be 12cm exactly, but rahter
% slightly less, say 11.99cm like above. This is to make sure that it
% only takes up one page, so that \LaTeX{} will not start a new page. 
%
% \section{Credits} 
%
% Many people have come up with suggestions, bugs, improvements to the
% first package version of \textsf{cd-cover}, and I'd like to thank
% them, especially for thier patience in me, for not getting this out
% sooner. So thanks to 
% James A.\ Bednar,
% Steven Buehler,
% Patrik Carlsson,
% Jim Clark,
% Lionel Cons,
% Joerg Desch,
% Stefan A.\ Deutscher,
% Holger Dewes,
% Stephen Gildea,
% Anders Bruun Olsen,
% Rolf Niepraschk,
% Mark Peade,
% Dominik Roettsches,
% Carsten Sch\"afer,
% C.\ J.\ Walker, 
% and 
% Rainer Wiener. 
% I may have forgotten some, for which I apologize. 
%
% And of course thanks to Donald E.\ Knuth for \TeX, Leslie Lamport
% for \LaTeX, Robin Fairbairns for CTAN and being very patient with
% me. 
%
% \section{Copyright}
%
% \LaTeXe{} class \textsf{cd-cover} for typesetting a variaty of cd
% covers Copyright \copyright 1999 Christian Holm |<cholm@nbi.dk>|
%
% This class 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. 
%
% 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.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the
% \begin{quote}
%   Free Software Foundation, Inc.\\
%   675 Mass Ave\\
%   Cambridge\\
%   MA 02139\\
%   USA
% \end{quote}
%
% \section{Implementation}
%
%\iffalse
%<*class>
%\fi
%
% \subsection{Initializing}
%
% \subsubsection*{Identification}
% 
% First we must, as any good package or class should, identify
% ourselves, and tell what format we need. In this case it is ofcourse
% \LaTeXe{}.
% 
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\def\fileversion{v1.4}
\def\filedate{2002/01/28}  % Format is YYYY/MM/DD
\ProvidesClass{cd-cover}[\filedate\space\fileversion
\space cd-cover class.]
%    \end{macrocode}
%    
% \subsubsection*{Lengths or dimensions}
% 
% The next thing is to setup some lengths (dimensions) we need for
% various purposes. There is two temporary lengths |\temp@length| and
% |\temp@@length|, for use in variuos calculations; along width margin
% lengths, two for each type of environment, one for the odd pages
% |\booklet@odd@margins|, |\back@odd@margins|, |\sleeve@odd@margins|,
% and |\single@odd@margins|, and ofcourse the corrosponding for the
% even pages |\booklet@even@margins|, |\back@even@margins|,
% |\sleeve@even@margins|, and |\single@even@margins|. These margin
% lengths is used so that we may do two--sided printing where the
% various covers align. 
%    \begin{macrocode}
\newlength{\temp@length}
\newlength{\temp@@length}
\newlength{\booklet@even@margins}
\newlength{\booklet@odd@margins}
\newlength{\back@even@margins}
\newlength{\back@odd@margins}
\newlength{\sleeve@even@margins}
\newlength{\sleeve@odd@margins}
\newlength{\single@even@margins}
\newlength{\single@odd@margins}
%    \end{macrocode}
%    
% \subsubsection*{Options}
% 
% \begin{macro}{\cd@cover@setup@margins}
% This command sets up a number of dimensions, so that when doing
% two--side printing, the covers will be align on each side of the
% paper, and can neatly be cut out to provide a double--sided booklet,
% sleeve or cover. This is not implemeted fully yet.  What is here is
% good for the booklet, but doesn't work for single other types of
% covers.  It's mainly the horizontal alignment that's the problem.
%    \begin{macrocode} 
\def\cd@cover@setup@margins{
  % This is some old stuff, that I'm not sure is needed, but I leave it
  % \global\paperheight=\temp@length
  % \global\paperwidth=\temp@@length
  \advance\temp@length-\booklet@height
  \divide\temp@length2
  \advance\temp@length-1in
  \advance\temp@length-\headheight
  \global\topmargin=\temp@length
  \advance\temp@@length-\booklet@width
  \divide\temp@@length2
  \advance\temp@@length-1in  
  \oddsidemargin=\temp@@length}
\AtBeginDocument{\cd@cover@setup@margins}
%    \end{macrocode}
% \end{macro}
% We also provide a number of options, to specify the papersize.
% Notice, that since the \textsf{article} class will set the paper
% size, we use temporary local variables to  hold the information, and
% then in |\cd@cover@setup@margins| we set the right dimensions. 
%    \begin{macrocode}
\DeclareOption{a4paper}{
  \global\temp@length=210mm
  \global\temp@@length=297mm}
\DeclareOption{letterpaper}{
  \global\temp@length=8.5in
  \global\temp@@length=11in}
\DeclareOption{legalpapar}{
  \setlength\temp@length{8.5in}
  \setlength\temp@@length{14in}}
\DeclareOption{executivepaper}{
  \setlength\temp@length{7.25in}
  \setlength\temp@@length{10.5in}}
%    \end{macrocode}
% Notice, that some standard papersizes produces an error message, as
% they will be too small to hold the covers.
%    \begin{macrocode} 
\DeclareOption{a5paper}{\cd@cover@paper@error{a5paper}}
\DeclareOption{b5paper}{\cd@cover@paper@error{b5paper}}
%    \end{macrocode}
% Also, all papersizes are already in `landscape'
% version\footnote{compared to the normal defintions in
% \texttt{article.cls}.} so the \textsf{landscape} option is redundent
% with this class.
%    \begin{macrocode} 
\DeclareOption{landscape}{
  \ClassWarning{cd-cover}{Option `landscape' redundant to this % 
    class.}}
%    \end{macrocode}
% Add an option to avoid foldlines 
%    \begin{macrocode} 
\newif\ifcd@cover@foldlines\cd@cover@foldlinestrue
\DeclareOption{nofoldlines}{\cd@cover@foldlinesfalse}
\DeclareOption{foldlines}{\cd@cover@foldlinestrue}
%    \end{macrocode}
% All other options are passed on to the standard \textsf{article}
% class, as expected. `letterpaper' is then the default paper size,
% and we finally execute the options.
%    \begin{macrocode} 
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ExecuteOptions{letterpaper}
\ProcessOptions\relax
%    \end{macrocode}
% \begin{macro}{\cd@cover@paper@error}
% This is just an error message, so that the user doesn't try to use a
% paper size that is too small to hold some of the covers.
%    \begin{macrocode} 
\def\cd@cover@paper@error#1{
  \ClassError{cd-cover}{^^J%
    Paper format `#1' is too small for the covers}{^^J%
    You have given the option `#1' to this class.^^J%
    However, that paper size is too small to hold^^J%
    the covers.^^J%
    Please change the paper size option to another^^J%
    format that CAN hold the covers (e.g., `a4paper',^^J%
    `letterpaper', etc.)}}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection*{Class and package loading}
%
% First we load the standard \LaTeXe{} class \textsf{article} with
% what ever options was passed from above. This provides the user with
% the standard envrionments and sectioning commands, and is therefore
% desired. The \textsf{article} class is chosen, since the sectioning
% commands of this class is appropiate for cd--covers. The package
% \textsf{rotating} is then loaded. This package facilitates rotation
% of text, using |\special| commands. This means, that this class may
% be sensible to the users \textsf{PostScript} driver. Also, as I
% myself suspected, and as others have confirmed, this package is
% flawed, meaning, that this class isn't as stable as it should
% be. However, the \textsf{rotating} package is the best avaliable for
% the job, and hence used here\footnote{I'm sorry I don't have the
% time, or expertice, to write a new package, but that's life for
% you.}.  
%
% After loading the class, we set the paper height and width.
%    \begin{macrocode} 
\LoadClass{article}
\paperheight=\temp@length
\paperwidth=\temp@@length
\RequirePackage{rotating}
%    \end{macrocode}
%
% \subsubsection*{Setting up fixed lengths}
% 
% Next on the agenda is to define and setup some fixed lengths. These
% are the dimensions of the various cover styles. The really isn't
% much to say about these. I obtained these numbers by simple
% meassuring some of my own (pre--printed) covers, with, as you can
% see, a metric meter stick.
%    \begin{macrocode}
\newlength{\booklet@width}     \setlength{\booklet@width}{240mm}
\newlength{\booklet@height}    \setlength{\booklet@height}{120mm}
\newlength{\back@width}        \setlength{\back@width}{137mm}
\newlength{\back@height}       \setlength{\back@height}{118mm}
\newlength{\back@slip@width}   \setlength{\back@slip@width}{7mm}
\newlength{\sleeve@height}     \setlength{\sleeve@height}{128mm}
\newlength{\sleeve@width}      \setlength{\sleeve@width}{266mm}
\newlength{\single@height}     \setlength{\single@height}{120mm}
\newlength{\single@width}      \setlength{\single@width}{137mm}
\newlength{\single@slip@width} \setlength{\single@slip@width}{15mm}
\newlength{\single@back@width} \setlength{\single@back@width}{3mm}
%    \end{macrocode}
%
% \subsubsection*{Setting up user lengths}
% 
% The user also has some control of the page dimensions of the various
% cover types. These are provided via the below lengths. What the do
% should be obvious from the names\footnote{Otherwise, refer to the
% documentation part of this document.}. We also set the default
% values of these lengths here.
%    \begin{macrocode}
\newlength{\CDbookletTopMargin} \setlength{\CDbookletTopMargin}{5mm}
\newlength{\CDbookletMargin}    \setlength{\CDbookletMargin}{5mm}
\newlength{\CDbackTopMargin}    \setlength{\CDbackTopMargin}{5mm}
\newlength{\CDbackMargin}       \setlength{\CDbackMargin}{5mm}
\newlength{\CDsleeveTopMargin}  \setlength{\CDsleeveTopMargin}{5mm}
\newlength{\CDsleeveMargin}     \setlength{\CDsleeveMargin}{5mm}
\newlength{\CDsingleTopMargin}  \setlength{\CDsingleTopMargin}{5mm}
\newlength{\CDsingleMargin}     \setlength{\CDsingleMargin}{5mm}
%    \end{macrocode}
%
% Finally we set the default page style to \textsf{empty}.
%    \begin{macrocode}
\pagestyle{empty}
%    \end{macrocode}
%
% \subsection{The various cover types}\label{sec:psscheme}
%
% The changing form one type of cover to the other is implemented
% using `page styles'. So each type of cover has it's own page
% style. This has several advantages.
%
% To those of you familiar with the first two (or was it three --- I
% can't remember) versions, this is where you really will note the
% difference. In version v1.0 from 1998/10/04, the interface was
% driven via commands. This limited a number of things, most noticably
% the text length. You had to manually break each page up, which
% ofcourse is very non--\TeX{}--like. Secondly it limited the use of
% `floats' such as \textsf{tables} and \textsf{figures}.
%
% Well, in the \emph{new} scheme, this is all changed. Since the
% pagestyle doesn't effect the way pages are broken by \TeX, one no
% longer has to break up the pages manually! You can put as much text
% as you like into the pages, \LaTeX{} will just produce more pages as
% the text growes in length. Though page styles has \emph{some} effect
% on the \LaTeXe{} output routine and hence on floats, it is very
% minimal, and floats can be use extensively under this scheme.
%
% Another advantage of the new scheme, is the use of user
% \emph{configurable dimensions}. If all the boundary dimensions are
% set to zero, you can effectually fill out the whole cover with
% text. Though this doesn't seem usefull, consider the the case where
% you want to fill out your cover with some marvelous picture you have
% created in \textsf{Gimp}, \textsf{PhotoShop}, or just downloaded
% form the internet!
%
% \subsubsection{The booklet type}
%
% Let me just say a few words on page styles. Every page style defines
% the commands |\@oddhead|, |\@evenhead|, |\@oddfoot|, and
% |\@evenfoot| to be some command containg some text\footnote{In
% \TeX{} terms this means \emph{horizontal mode stuff}.}. There
% \emph{must} be some text present, or othetwise \TeX{} will respond
% with a \texttt{Underfull \string\hbox ... while output is active},
% wich is quite enyoing. For this reason all the \emph{border} macros 
% contains a |\hfill| as the very last thing. Also, \LaTeX{} assumes,
% that the four macros above are no wider then |\textwidth| and no
% taller then |\headheight| or |\footskip|, whatever appropiate.
%
% For the page styles at hand, I decided to |\let| the above two
% |\@...head| commands to the  \emph{border} commands below, and the
% two |\@...foot| to |\@empty|. Now these \emph{border} commands are
% apparently \emph{much} taller then |\headheight|, but if one takes a
% closer look, they actually aren't.
%
% The first part of every one of them is one ore more
% |\kern|s. |\kern|s in \TeX{} mind\footnote{Or mouth or stomach, I
% don't remember wich one it is, as Donald E.\ Knuth calls it in the
% \TeX{}book.} doesn't take up space in anyway, so these commands are
% \emph{invisble} in that sense. The next thing is a \textsf{picture}
% environment, and this is defined in \LaTeXe{} so that it does't take
% up any space in the previous sense. Finishing of the macros is a
% |\hfill|, wich is there for reasons explained above. So the only
% command that is `space visible' in the \emph{border} commands, is
% the |\hfill|! Now if that isn't neat, I don't know what is. That
% said, I won't comment anymore on the page style definitons and move
% straight on to the rest of the macros and commands.
% \begin{macro}{\ps@bookletsheet}
%    \begin{macrocode}
\def\ps@bookletsheets{  
  \let\@oddhead\booklet@border\let\@evenhead\@oddhead
  \let\@oddfoot\@empty\let\@evenfoot\@oddfoot}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\init@booklet}
% We need to do some manipulation of the dimensions |\textheight|,
% |\textwidth|, |\headsep| and since the booklet pages are set in
% double column mode, also on |\columnsep| and |\@colht|.
%    \begin{macrocode}
\def\init@booklet{
%    \end{macrocode}
% What we do is to set the text height limit to the proper value for
% the booklet --- as defined in |\booklet@height| --- then correct for
% the space wanted above and below the text --- as defined in
% |\CDbookletTopMargin|. This ofcourse only sets the \emph{lower}
% margin, and has absolutly nothing to do with the upper margin. To do
% that we fix the value of |\headsep| to |\CDbookletTopMargin|.
%    \begin{macrocode}
  \temp@length=\booklet@height
  \advance\temp@length-2\CDbookletTopMargin
  \global\textheight=\temp@length
  \global\headsep=\CDbookletTopMargin
%    \end{macrocode}
% The next thing is to set the text width. This limit is again set to
% it's appropiate value for this type of cover --- defined in
% |\booklet@width| --- and then corrected for for the wanted margin
% width --- taken from |\CDbookletMargin|.
%    \begin{macrocode}
  \temp@length=\booklet@width
  \advance\temp@length-2\CDbookletMargin
  \global\textwidth=\temp@length
%    \end{macrocode}
% A little extra care is needed since we type set in two column
% mode. We In the case, that the first page  contains this sort of
% cover, we \emph{have to} set |\@colht| equal to |\textheight|
% manually. 
%
% The reason is a bit complicated, and I will not go into
% much detail about it. The point is, that \LaTeX{} uses |\@colht| as
% the limit for the height of the columns. Now, when constructing the
% first column, |\@colht| still has the old value of |\textheight|, as
% set in the begining of the document, and this is properly not what
% we want. \emph{After} making the first column, it sets |\@colht| to
% the present value of |\textheight|, which is what we want, but then
% it is too late. The \emph{only} way to get around this
% problem\footnote{Or is ts a bug in \LaTeXe.}, is to manually set
% |\@colht|. One should not be conserned on that this dimension is
% hand--set on subsequent pages.
%
% The second thing to do, is to set |\columnsep| to whatever value the
% margins should have --- as defined in |\CDbookletMargin|.
%    \begin{macrocode}
  \global\@colht=\textheight
  \global\columnsep=2\CDbookletMargin}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{bookletsheets}
% Now for the environment it self. We start off with initializing the
% dimensions as outlined above, and then we start the two column
% mode and set the page style to \textsf{bookletsheets}. To finish of
% the the environment, we make sure that the last page has a border by
% calling |\clearpage|, and revert to the default page style. 
%    \begin{macrocode}
\newenvironment{bookletsheets}{
  \init@booklet\twocolumn\pagestyle{bookletsheets}}{
  \clearpage\pagestyle{empty}}
%    \end{macrocode}
% \end{environment}
% 
% \begin{macro}{\booklet@border}
% First we want to back up the margin width (|\CDbookletMargin|), so
% that the border will be properly spaced from the text. Secondly we
% want to draw the border.
%
% This border isn't very complex. It's just a retangular with to small
% lines indicating a folding line. For the users convinience, we put
% an arrow an some text next to the folding line.
%
% As explained above this command is `space invisible', execpt for the
% final |\hfill|, which is exactly what we want. 
%     \begin{macrocode}
\def\booklet@border{%
  \kern-\CDbookletMargin%
  \setlength{\unitlength}{1mm}%
  \begin{picture}(100,1)%
    \put(0,0){\line(1,0){240}}%     Top most horizontal line
    \put(0,0){\line(0,-1){120}}%    Left most vertical line
    \put(0,-120){\line(1,0){240}}%  Bottom most horizontal line
    \put(240,0){\line(0,-1){120}}%  Right most vertical line
    \put(120,0){\line(0,1){5}}%     Top folding mark
    \put(120,-120){\line(0,-1){5}}% Bottom folding mark
    \ifcd@cover@foldlines
      \multiput(120,-1)(0,-5){24}{\line(0, -1){3}} % Fold line
    \fi
    \put(110,2){\vector(1,0){10}}%  Arrow 
    \put(95,1){Fold here}%          Helping text
  \end{picture}\hfill}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The back type}
% 
% One could argue, that the page style scheme outlined on page
% \pageref{sec:psscheme} really isn't that advantages in this case,
% and that a \textsf{minipage}--like solution would be better, since
% the text in this environment shouldn't be more then \emph{one} page,
% since there is only room for one back sheet on a normal
% cd-cover. While this is true, I decided, that it should be up to the
% user to restain him/her--self from putting tom much text into these
% kinds of pages.
% 
% \begin{macro}{\ps@backsheet}
% Page style for the backpage.
%    \begin{macrocode}
\def\ps@backsheet{
  \let\@oddhead\back@border\let\@evenhead\@oddhead
  \let\@oddfoot\@empty\let\@evenfoot\@empty}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\init@back}
% This macro is similar to |\init@booklet| comment above, so I will
% suffice to say the instead of |\CDbooklet...| above read
% |\CDback...|, and the two--column notes are irrelevant.
%    \begin{macrocode}
\def\init@back{
  \temp@length=\back@height
  \advance\temp@length-2\CDbackTopMargin
  \global\textheight=\temp@length
  \temp@length=\back@width
  \advance\temp@length-2\CDbackMargin
  \global\textwidth=\temp@length
  \global\headsep=\CDbackTopMargin}
%    \end{macrocode}
% \end{macro}
%    
% \begin{macro}{\back@title}
% This is a save box for the title on the back of the cover. See more
% below. 
%    \begin{macrocode}
\newsavebox{\back@title}
%    \end{macrocode}
% \end{macro}
% 
% \begin{environment}{backsheet}
% \begin{environment}{backsheet*}
% This environment should take one argument, the title on the back of
% the cover. This will be type set two times; one on each end of the
% cover, rotated as to give the proper reading when your CD is put on
% the shelf. The argument is put into a |\parbox|, so that we may
% control the size of the text, and then put into a save box for later
% use (in |\back@border|).
%
% The star'ed version \textsf{backsheet*} turns the back title
% opposite to the non--star'ed version.  This is useful if one want's
% to typeset covers for double jewel cases.  Also, in some countries,
% like Germany, they like having the text run the opposite direction,
% so for those users, that environment may be more appropiate. 
%
% \begin{macro}{\ifback@anglereverse}
% To help distingish between the two ways of rotation the back title,
% we have the macro |\ifback@anglereverse|, which is set to |\relax| if
% we're using the regular non--star'ed version. 
%    \begin{macrocode}
\newif\ifback@anglereverse\back@anglereversefalse
%    \end{macrocode}
% \end{macro}
%
% As in \textsf{bookletsheets} environment, we call the initializing
% macro, make sure we are in one--cloumn mode, and set the page
% style. When finishing of the environment, we clear the page, to
% insure the last page style, and revert to the default page style.
%    \begin{macrocode}
\newenvironment{backsheet}[1]{
  \back@anglereversefalse%
  \init@back%
  \savebox{\back@title}[\textheight]{%
    \parbox[t][6mm]{\textheight}{#1}}
  \onecolumn\pagestyle{backsheet}
  \clearpage}{\clearpage\pagestyle{empty}}
\newenvironment{backsheet*}[1]{
  \back@anglereversetrue%
  \init@back%
  \savebox{\back@title}[\textheight]{%
    \parbox[t][6mm]{\textheight}{#1}}
  \onecolumn\pagestyle{backsheet}
  \clearpage}{\clearpage\pagestyle{empty}}
%    \end{macrocode}
% \end{environment}
% \end{environment}
%
% \begin{macro}{\back@border}
% First we back up, just as in |\booklet@border|, but we also have to
% back up the length (height) of the slips, unlike above. Then the
% border is drawn with folding marks, and some help text and arrows.
%    \begin{macrocode}
\def\back@border{%
  \kern-\CDbackMargin%
  \kern-\back@slip@width%
  \setlength{\unitlength}{1mm}%
  \begin{picture}(0,0)%
    \put(0,0){\line(1,0){151}}%     Top most horizontal line
    \put(0,-118){\line(1,0){151}}%  Bottom most horizontal line
    \put(0,0){\line(0,-1){118}}%    Left most vertical line
    \put(151,0){\line(0,-1){118}}%  Right most vertical line
    \put(7,0){\line(0,1){5}}%       Left top folding mark
    \put(7,-118){\line(0,-1){5}}%   Left bottom folding mark
    \ifcd@cover@foldlines
      \multiput(7,-1)(0,-5){24}{\line(0, -1){3}} % Fold line
    \fi
    \put(144,0){\line(0,1){5}}%     Right top folding mark
    \put(144,-118){\line(0,-1){5}}% Right bottom folding mark
    \ifcd@cover@foldlines
      \multiput(144,-1)(0,-5){24}{\line(0, -1){3}} % Fold line
    \fi
    \put(17,2){\vector(-1,0){10}}%  Left help arrow
    \put(17,1){Fold here}%          Left help text
    \put(134,2){\vector(1,0){10}}%  Right help arrow
    \put(119,1){Fold here}%         Right help text
%    \end{macrocode}
% We finshes off with drawing the rotated titles. Please notice, that
% the left one, is the one closest to the opening of the CD
% cover. This should explain the somewhat strange rotating values.
%
% Also, notice that we can rotate one or the other way, as explained
% above, conditionally on |\ifback@anglereverse{1}|. 
%    \begin{macrocode}
    \ifback@anglereverse%
      \put(1,0){\begin{rotate}{-90}\usebox{\back@title}\end{rotate}}%
      \put(150,-118){\begin{rotate}{90}\usebox{\back@title}\end{rotate}}%
    \else%
      \put(6,-118){\begin{rotate}{90}\usebox{\back@title}\end{rotate}}%
      \put(145,0){\begin{rotate}{-90}\usebox{\back@title}\end{rotate}}%
    \fi%
    %\put(3,-118){\begin{rotate}{90}\usebox{\back@title}\end{rotate}}%
    %\put(148,0){\begin{rotate}{-90}\usebox{\back@title}\end{rotate}}%
  \end{picture}\hfill}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The sleeve type}
%
% This type showes how you can juggle around with \LaTeX{} and get it
% to do almost everything you want\footnote{I don't want to sound
% pretentious, but I was surprised how easily it all turned out to
% be.}. By altering a bit in the way |\LaTeXe| output two--column
% pages, I could get it to swap the columns, so that the last entered
% would come out first, and vice versa. This is exactly what we want
% for this page style, which is obvious when you see the finished
% output. 
% 
% \begin{macro}{\ps@sleevesheet}
%    \begin{macrocode}
\def\ps@sleevesheet{%
  \let\@oddhead\sleeve@border\let\@evenhead\@oddhead
  \let\@oddfoot\@empty\let\@evenfoot\@oddfoot}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\init@sleeve}
% What I said about |\init@booklet| goes here with the exchange of
% |\CDsleeve...| for |\CDbooklet...|.
%    \begin{macrocode}
\def\init@sleeve{
  \temp@length=\sleeve@height
  \advance\temp@length-2\CDsleeveTopMargin
  \global\textheight=\temp@length
  \global\@colht=\textheight
  \temp@length=\sleeve@width
  \advance\temp@length-2\CDsleeveMargin
  \global\textwidth=\temp@length
  \global\headsep=\CDsleeveTopMargin
  \global\columnsep=2\CDsleeveMargin}
%    \end{macrocode}
% \end{macro}
%
% \begin{environment}{sleevesheet}
% Again we initialize, make sure we are in two column mode, and set
% the page style. The only thing to notice here, is we |\let|
% |\@outputdblcol| to |\sleeve@outputdblcol|, and when the environment
% ends, change back to the usual definition saved in
% |\ltx@outputdblcol|. It is important that the last change comes
% \emph{after} the |\clearpage|, since otherwise, the last page will
% be output with the wrong output routine. Notice, that it doesn't
% make sense to make two--side prinint for this kind of cover, so the
% scheme works on \emph{any} page. Ofcourse, you should make the
% following page blank, by putting |\vfill\clearpage| after the
% environment. 
%    \begin{macrocode}
\newenvironment{sleevesheet}{%
  \init@sleeve
  \twocolumn\pagestyle{sleevesheet}
  \global\let\@outputdblcol\sleeve@outputdblcol}{
  \clearpage\pagestyle{empty}
  \global\let\@outputdblcol\ltx@outputdblcol}
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\sleeve@border}
% Two flaps is outlined for clueing.
%    \begin{macrocode}
\def\sleeve@border{%
  \kern-\CDsleeveMargin%
  \setlength{\unitlength}{1mm}%
  \begin{picture}(100,1)%
    \put(0,0){\line(3,4){6}}%        Top flap
    \put(6,8){\line(1,0){121}}%
    \put(133,0){\line(-3,4){6}}%
    \ifcd@cover@foldlines
      \multiput(133,-1)(0,-5){25}{\line(0, -1){3}} % Fold line
    \fi 
    \put(50,1){Fold and clue}%       Help text in top flap
    \put(0,-123){\line(3,-4){6}}%    Bottom flap
    \put(6,-131){\line(1,0){121}}%
    \put(133,-123){\line(-3,-4){6}}%
    \put(50,-131){Fold and clue}%    Help text in bottom flap
    \put(0,0){\line(1,0){266}}%      Top most horizontal line
    \put(0,0){\line(0,-1){123}}%     Left most vertical line
    \put(0,-123){\line(1,0){266}}%   Bottom most horizontal line
    \put(266,0){\line(0,-1){123}}%   Right most vertical line
  \end{picture}\hfill}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The single type}
% 
% \begin{macro}{\ps@singlesheet}
% To facilitate two side printing, we have to have two kinds of
% borders, since the border outline is asymmetric along a vertical
% line, hence |\@oddhead| and |\@evenhead| has different values.
%    \begin{macrocode}
\def\ps@singlesheet{
  \let\@oddhead\odd@single@border
  \let\@evenhead\even@single@border
  \let\@oddfoot\@empty\let\@evenfoot\@oddfoot}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\single@title}
% \begin{macro}{\single@slip}
% These two save boxes are used below.
%    \begin{macrocode}
\newsavebox{\single@title}
\newsavebox{\single@slip}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\init@single}
% Again exchnage |\CDsingle...| with |\CDback...| in the description
% of |\init@back|, and there you have it.
%    \begin{macrocode}
\def\init@single{
  \temp@length=\single@height
  \advance\temp@length-2\CDsingleTopMargin
  \advance\temp@length-4mm
  \global\textheight=\temp@length
  \temp@length=\single@width
  \advance\temp@length-2\CDsingleMargin
  \global\textwidth=\temp@length
  \global\headsep=\CDsingleTopMargin}
%    \end{macrocode}
% \end{macro}
%    
% \begin{environment}{singlesheet}
% As in the \textsf{backsheet} environment, we save the arguments in
% |\parbox|'es to control the size, and put all that into save boxes,
% wich are used in |\odd@single@border|. Everything else is as above.
%    \begin{macrocode}
\newenvironment{singlesheet}[2]{
  \init@single
  \savebox{\single@title}[\textwidth]{%
    \parbox[t][3mm]{\textwidth}{#1}}
  \savebox{\single@slip}[\textwidth]{%
    \parbox[t][\single@slip@width]{\textwidth}{#2}}
  \onecolumn\pagestyle{singlesheet}
  \clearpage}{\clearpage\pagestyle{empty}}
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\odd@single@border}
% We define two border for the reasons stated above. The differ in
% that they are mirror reflections of each other, and the back title
% and slip text isn't put on even sides.
%    \begin{macrocode}
\def\odd@single@border{
  \kern-\CDsingleMargin%
  \kern-\single@slip@width%
  \kern-\single@back@width%
  \setlength{\unitlength}{1mm}%
  \begin{picture}(0,0)%
    \put(0,0){\line(0,-1){116}}%                  Left most vertical line 
    \put(0,0){\line(1,0){36}}%                    First top horizontal line 
    \put(36,0){\line(0,1){2}}%                    Jump
    \put(15,0){\line(0,1){5}}%                    Fold mark
    \ifcd@cover@foldlines
      \multiput(15,-1)(0,-5){24}{\line(0, -1){3}} % Fold line
    \fi 
    \put(18,0){\line(0,1){5}}%                    Fold mark
    \ifcd@cover@foldlines
      \multiput(18,-1)(0,-5){24}{\line(0, -1){3}} % Fold line
    \fi 
    \put(36,2){\line(1,0){119}}%                  Second top line 
    \put(155,2){\line(0,-1){120}}%                Right most vertical line 
    \put(0,-116){\line(1,0){36}}%                 First bottom line 
    \put(36,-116){\line(0,-1){2}}%                Jump
    \put(15,-116){\line(0,-1){5}}%                Fold Mark
    \put(18,-116){\line(0,-1){5}}%                Fold Mark
    \put(36,-118){\line(1,0){119}}%               Second bottom line 
    \put(5,4){\vector(1,0){10}}%                  Arrows
    \put(28,4){\vector(-1,0){10}}%                Arrows 
    \put(28,3){Fold here}%                        Help text 
    \put(0,0){\begin{rotate}{-90}\usebox{\single@title}\end{rotate}}%
    \put(15,0){\begin{rotate}{-90}\usebox{\single@slip}\end{rotate}}%
  \end{picture}\hfill}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\even@single@border}
%    \begin{macrocode}
\def\even@single@border{
  \kern-\CDsingleMargin%
  \setlength{\unitlength}{1mm}%
  \begin{picture}(0,0)%
    \put(0,2){\line(0,-1){120}}%    1st left vert line
    \put(119,0){\line(1,0){36}}%    2nd top horiz line  
    \put(119,0){\line(0,1){2}}%     2nd top right vert line
    \put(137,0){\line(0,1){5}}%     1st top fold mark 
    \put(140,0){\line(0,1){5}}%     2nd top fold mark
    \put(0,2){\line(1,0){119}}%     1st top horiz line
    \put(155,0){\line(0,-1){116}}%  1st right vert line
    \put(119,-116){\line(1,0){36}}% 2nd bototm horiz line
    \put(119,-116){\line(0,-1){2}}% 2nd bottom right vert line 
    \put(137,-116){\line(0,-1){5}}% 1st bottom fold mark
    \put(140,-116){\line(0,-1){5}}% 2nd bottom fold mark
    \put(0,-118){\line(1,0){119}}%  1st bottom horiz line
    \put(127,4){\vector(1,0){10}}%  1st help arrow
    \put(150,4){\vector(-1,0){10}}% 2nd help arrow
    \put(112,3){Fold here}%         Help text 
  \end{picture}\hfill}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Modified output routines}\label{sec:modout}
%    
% Here are some modifications to the \LaTeXe{} output routine to
% \emph{invert} the page orders in some of the environments, such as 
% \textsf{sleeve}. First we save the old definition in
% |\ltx@outputdblcol|. 
%    \begin{macrocode}
\let\ltx@outputdblcol\@outputdblcol
%    \end{macrocode}
%
% \begin{macro}{\sleeve@outputdblcol}   
% Then we go on to define |\sleeve@outputdblcol|, changing the order
% of column output.
%    
% The first part os the same as in \texttt{ltoutput.dtx}, so no need
% to comment on that here.
%    \begin{macrocode}
\def\sleeve@outputdblcol{%
  \if@firstcolumn
    \global\@firstcolumnfalse
    \global\setbox\@leftcolumn\box\@outputbox
  \else
    \global\@firstcolumntrue
%    \end{macrocode}
% Now for the building of the actual output box, we \emph{interchange}
% the order of |\@leftcolumn| and |\@outputbox| in the body definition
% of |\@outputbox|, tricky isn't it!
%    \begin{macrocode}
    \setbox\@outputbox\vbox{%
      \hb@xt@\textwidth{%
        \hb@xt@\columnwidth{%
          \box\@outputbox\hss}%  \@leftcolumn changed to \@outputbox
        \hfil\vrule\@width\columnseprule\hfil
        \hb@xt@\columnwidth{%
          \box\@leftcolumn\hss}}}% \@outputbox changed to \@leftcolumn
    \@combinedblfloats
    \@outputpage
    \begingroup
      \@dblfloatplacement
      \@startdblcolumn
      \@whilesw\if@fcolmade\fi
        {\@outputpage
          \@startdblcolumn}%
    \endgroup
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{The final stuff}
% 
% If we can figure out the graphics driver automatically, then we emit
% a |\special| or equivilant command to the output file.  If we can
% not find the driver, we warn the user that the printing should be
% done in landscape mode. 
%    \begin{macrocode}
\def\cdcover@endmessage{cd-cover class: Remember that this document is
    type set in landscape^^J mode, and therefore dvips should be
    passed the `-t landscape' option.}
\@ifundefined{Gin@driver}{%
  \AtEndDocument{\typeout{\cdcover@endmessage}}}{%
  \filename@parse{\Gin@driver}%
  \def\reserved@a{dvips}%
  \ifx\filename@base\reserved@a\relax%
    \message{DVIPS driver found}
    \AtBeginDvi{\special{papersize=\the\paperwidth,\the\paperheight}}%
    \AtBeginDvi{\special{papersize=\the\paperheight,\the\paperwidth}}%
  \else
    \def\reserved@a{pdftex}\relax%
    \ifx\filename@base\reserved@a
      \message{PDF driver found}
      \pdfpagewidth=\the\paperwidth\pdfpageheight=\the\paperheight%
    \else
      \def\reserved@a{vtex}\relax%
      \ifx\filename@base\reserved@a
        \message{VTeX driver found}
        \mediawidth=\the\paperwidth\mediaheight=\the\paperheight%
      \else
        \AtEndDocument{\typeout{\cdcover@endmessage}}
      \fi
    \fi
  \fi} 
%    \end{macrocode}
%    
%\iffalse
%</class>
%\fi
