From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/cd/cd.dtx | 1136 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 1136 insertions(+)
 create mode 100644 macros/latex/contrib/cd/cd.dtx

(limited to 'macros/latex/contrib/cd/cd.dtx')

diff --git a/macros/latex/contrib/cd/cd.dtx b/macros/latex/contrib/cd/cd.dtx
new file mode 100644
index 0000000000..03557bfd27
--- /dev/null
+++ b/macros/latex/contrib/cd/cd.dtx
@@ -0,0 +1,1136 @@
+% \iffalse meta-comment
+%
+% File: cd.dtx Copyright (C) 1998-2007 Sebastiano Vigna
+%              Copyright (C) 2014 Werner Lemberg
+%
+%   This file 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 Free Software
+%   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+%
+% \fi
+%
+% \CheckSum{1121}
+%% \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         \~}
+%%
+% \iffalse
+%
+%<class>\NeedsTeXFormat{LaTeX2e}
+%<class>\ProvidesClass{cd}[2014/06/13 v1.4 CD Cover Class]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\RecordChanges
+\GetFileInfo{cd.cls}
+
+\title{A CD Cover Class}
+\date{Printed \today}
+\author{Sebastiano Vigna}
+
+\begin{document}
+ \maketitle
+ \tableofcontents
+ \DocInput{cd.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \changes{v0.0}{1998/06/04}
+%   {Created file.}
+%
+% \changes{v0.1}{1998/06/15}
+%   {New macros for data file handling.}
+%
+% \changes{v1.0}{2002/01/10}
+%   {Bump revision number.}
+%
+% \changes{v1.1}{2005/09/08}
+%   {Add support for slim cases.}
+% \changes{v1.1}{2005/09/08}
+%   {Better positioning, too.}
+%
+% \changes{v1.3}{2007/10/12}
+%   {Implement covergraphics, etc.}
+% \changes{v1.3}{2007/10/12}
+%   {Implement .dat/.lst filename from job name.}
+%
+% \changes{v1.4}{2014/06/13}
+%   {Make track list height configurable.}
+% \changes{v1.4}{2014/06/13}
+%   {Add \cs{trackrange} command.}
+% \changes{v1.4}{2014/06/13}
+%   {Fix typo in \cs{track} command.}
+% \changes{v1.4}{2014/06/13}
+%   {Make slim and normal back covers use the same height.}
+%
+%
+% \section{Introduction}
+%
+% The purpose of this class is to print CD covers.  The main design line is
+% allowing the creation of labels with minimum effort, without restraining
+% the freedom to customise.  There is also some support for multiple cover
+% printing.  Since version 1.1, slim CD boxes are supported.
+%
+% Each CD cover is created by a number of commands that set the content of
+% the front cover, back cover, track lists etc.  After everything is ready,
+% additional commands actually generate the covers.  This is a very simple
+% example:
+%
+% \begin{verbatim}
+% \documentclass{cd}
+% \begin{document}
+%
+% \covertext{
+% The Artist\\
+% \bfseries The Title
+% }
+%
+% \leftspine{THE ARTIST}
+% \centerspine{THE TITLE}
+%
+% \lefttracklist{
+% \track Song 1
+% \track Song 2
+% \track Song 3
+% }
+%
+% \leftinfo{Words and Music by The Artist}
+%
+% \makecover\par
+% \makeback\par
+% \end{document}
+% \end{verbatim}
+%
+% By compiling the file above, you will obtain your first CD cover.  Using
+% |\makeslimcover| instead of |\makecover| and |\makeback|, you will obtain
+% a single cover for a slim CD box.
+%
+% Equivalently, you can create a file |CD.dat| containing the lines between
+% |\begin{document}| and |\makecover| and compile with \LaTeX{} the file
+% |CD.tex| (or |slimCD.tex|).  This is a better mechanism---each CD should
+% have its own data (|.dat|) file that is run through the driver file
+% |CD.tex| or the more powerful list mechanism described below.  This also
+% allows to set some parameters one for all (for instance, the font family)
+% in the driver file.  My driver file, for instance, is as follows (see
+% below for the non-standard commands):
+%
+% \begin{verbatim}
+% \documentclass[a4paper]{cd}
+% \usepackage[latin1]{inputenc}
+% \usepackage{avant}
+% \renewcommand\rmdefault{\sfdefault}
+% \onecorrection{.2}
+% \begin{document}
+% \makeCD
+% \end{document}
+% \end{verbatim}
+%
+% The |CD| class loads the |article| class, so commands like |\Large| or
+% |\smallskip| are available.  However, the |CD| class provides its own
+% precise size-switching commands, and for greater accuracy it is advisable
+% to use \LaTeX's |\\|\oarg{vspace} mechanism in order to generate vertical
+% spacing.
+%
+% Note that the class uses heavily the |rotating| package, so you must
+% convert the resulting dvi file into PostScript\textregistered, or use
+% directly |pdflatex|.
+%
+%
+% \section{The Text Commands}
+%
+% The content of a CD cover are set using the following self-explaining
+% commands.
+%
+% \begin{quote}
+%   |\covertext|, |\backtext|, |\insidetext|,\\
+%   |\leftspine|, |\centerspine|, |\rightspine|,\\
+%   |\lefttracklist|, |\righttracklist|,\\
+%   |\leftinfo|, |\rightinfo|
+% \end{quote}
+%
+% \noindent The commands |\insidetext|, |\leftspine|, |\centerspine| and
+% |\rightspine| are ignored for slim covers.  Note that by default the
+% material contained in |\covertext|, |\backtext| and |\insidetext| is
+% bottom-aligned, and the arguments of the spine commands must not contain
+% line breaks.  The left and right track lists should use the |\track|
+% command, which inserts a |\par| and an automatically numbered box with the
+% track number.  There is also a |\trackrange| command that takes a
+% parameter and adds a range indication (two numbered boxes separated by a
+% dash).  Should you need to set manually the track number, use
+% |\setindex|\marg{n}.  The text contained in |\leftinfo| and |\rightinfo|
+% is bottom-aligned just under the respective track lists.  Note that if the
+% right information or track list box is empty, the left one will span
+% across the whole cover.  By default everything is typeset with no
+% justification, and no paragraph indentation.  One tenth of the current
+% baseline skip is inserted between paragraphs.
+%
+% In extreme cases you may want to create different spines (e.g., for
+% R.E.M.'s \emph{Fables Of The Reconstruction}); the |\leftspinebis|,
+% |\centerspinebis| and |\rightspinebis| commands allows you to insert
+% different content into the ``back'' spine.
+%
+% The height of the track list (in millimeters) can be set with
+% |\tracklistheight|, which expects a dimensionless, positive integer value.
+% If not specified, the height is set to 70.  The sum of the track list
+% height and the height of the area used to typeset |\covertext| on the back
+% cover equals 100.
+%
+%
+% \section{The Graphic Commands}
+%
+% In the case you want to fill the cover or the inside of your CD with a
+% picture, the commands |\covergraphics| and |\insidegraphics| work like
+% |\covertext| and |\insidetext|, but they create no border (as opposed to
+% the standard 1\,cm border for text).
+%
+%
+% \section{The Font Commands}
+%
+% The |CD| class provides some simple commands for switching the font
+% dimension and line spacing.  The command |\fh|\marg{height} sets the font
+% height to the given number of points (line spacing is not affected), while
+% |\fhb|\marg{height}\marg{baselineskip} sets both the font height and the
+% baseline skip (usually 6/5th of the font height will work).  Note that you
+% can just write |\fh7| in order to switch to a 7~point font, and that the
+% |\fhb| command always sets |\parskip| to 1/10th of the current baseline
+% skip, so |\par| will always space a little more than |\\|.
+%
+% When you issue a |\newcd| command, all fonts are reset to their default
+% values.  But there are a number of self-explaining commands, i.e.,
+% |\coverfont|, |\backfont|, |\insidefont|, |\spinefont|, |\tracklistfont|,
+% |\infofont| and |\indexfont|, that allow to change the font assigned to a
+% part of the cover.  In fact, they are just one-argument macros whose
+% arguments are expanded just before the corresponding text commands, and
+% can contain other formatting parameters.
+%
+%
+% \section{The Cover Creation Commands}
+%
+% Before setting the content of the cover, the |\newcd| command takes care
+% of resetting everything to default values.  In particular, |\backtext| is
+% the same as |\covertext| (unless you change it explicitly), so usually you
+% do not need to set the former (note that, of course, this does \emph{not}
+% happen with |\covergraphics|).  Analogously, |\backfont| is the same as
+% |\coverfont|.
+%
+% Once everything is set up, the |\makecover| and |\makeback| commands will
+% create a cover and a back cover using the data set so far, whereas the
+% |\makeslimcover| will create a slim cover.  Both commands have an optional
+% argument that can contain any of the letters |lrtb| (left, right, top,
+% bottom), which create the respective crop marks (note that the argument
+% must be enclosed in brackets).  The default value is |lrtb|.  The
+% possibility of partially eliminating crop marks is particularly useful
+% when stacking several covers in the same sheet.
+%
+% It is possible to create a single \LaTeX{} document containing a CD cover,
+% but it is usually more useful to create a data file containing all
+% |CD|-specific command, and include it from a ``driver'' file, containing
+% the |\makeCD| or the |\makeslimCD| command.  With no argument, it checks
+% for the existence of a \textit{jobname}|.dat| file (where \textit{jobname}
+% is the root of the \LaTeX{} file under compilation---e.g., |CD.dat| when
+% compiling |CD.tex|).  If such a file exists, it is input and then the
+% (slim) CD cover is generated.  Otherwise, the user is asked for a data
+% file name (the |CD| class will try automatically to append the |.dat|
+% extension to the name), which is read and processed.  Of course, the
+% optional argument (which, note again, must be enclosed in brackets) can be
+% used to specify a data file name.
+%
+% Having a database of data files is particularly useful when using the
+% |\makelist| or the |\makeslimlist| commands, which process an entire list
+% of CDs, printing one cover (or two back covers) per page; the crop marks
+% are suitably aligned so to minimise the cutting effort.  The CD list must
+% be contained in a list file, one data file name per line.  With no
+% argument, |\makelist| and |\makeslimlist| check for the existence of a
+% |CD.lst| file.  If it exists, it is input; otherwise, the user is asked
+% for a list file name (the |CD| class will try automatically to append the
+% |.lst| extension to the name), which is read and processed.  Again, the
+% optional argument can be used to specify a list file name.
+%
+%
+% \section{The Options}
+%
+% You can pass to the |CD| class all the options of the |article| class
+% (e.g., paper size).  Moreover, there are options |aligncovertop|,
+% |aligninsidetop|, |alignbacktop| and |aligntop| (the last one resumes the
+% first three ones), and analogously |aligncovercenter|, etc., that allow to
+% change the default alignment behaviour.  The |covergraphics| option lets
+% you use the entire cover area (instead of a centered 10\,cm$\times$10\,cm
+% square).  Finally, the |alignspine| option forces vertical centring of the
+% spine text on the ``real'' height of the box involved, rather than on the
+% height of a generic upper case character.  This is not usually what you
+% want, since, e.g., accents can lead to ugly results.  Experiment.
+%
+%
+% \section{Getting Obsessed}
+%
+% PostScript fonts usually are set up in such a way that the metric of all
+% digits is the same, regardless of the actual appearance.  This (in
+% particular with sans-serif fonts) can lead to a very ugly alignment of
+% two-digit track numbers in which either the first or the last digit is
+% a~1.  The solution is to put in the preamble a
+% |\onecorrection|\marg{fraction} command: the positioning of two-digit
+% numbers either starting or ending with 1 will be corrected by the given
+% fraction of the width of a~1.  For instance, |\onecorrection{.2}| works
+% great for AvantGarde.  The values for other fonts must be set by
+% trial-and-error.
+%
+%
+% \StopEventually{}
+%
+%
+% \section{The Code}
+%
+% First of all we manage all options.  This is done with a |\newif| for
+% |alignspine|, and by defining suitably some macros representing the
+% alignment option for the cover, inside and back text.  Default is~|b|.
+% All options we do not process are passed to the |article| class.
+%
+%    \begin{macrocode}
+%<*class>
+\newif\if@lignspine
+\@lignspinefalse
+
+\DeclareOption{alignspine}{\@lignspinetrue}
+
+\def\@ligncover{b}
+\def\@ligninside{b}
+\def\@lignback{b}
+
+\DeclareOption{aligncovertop}{\def\@ligncover{t}}
+\DeclareOption{aligninsidetop}{\def\@ligninside{t}}
+\DeclareOption{alignbacktop}{\def\@lignback{t}}
+
+\DeclareOption{covergraphics}{\def\@lignback{t}}
+
+\DeclareOption{aligntop}%
+  {\ExecuteOptions{aligncovertop,
+                   aligninsidetop,
+                   alignbacktop}}
+
+\DeclareOption{aligncovercenter}{\def\@ligncover{c}}
+\DeclareOption{aligninsidecenter}{\def\@ligninside{c}}
+\DeclareOption{alignbackcenter}{\def\@lignback{c}}
+
+\DeclareOption{aligncenter}%
+  {\ExecuteOptions{aligncovercenter,
+                   aligninsidecenter,
+                   alignbackcenter}}
+
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+
+\ProcessOptions\relax
+%    \end{macrocode}
+%
+% Now we load the |article| class and the |rotating| package, which is
+% fundamental in typesetting the spine text.
+%
+%    \begin{macrocode}
+\LoadClass{article}
+\RequirePackage{rotating}
+%    \end{macrocode}
+%
+% The |\onecorrection| command defines a the fraction used for
+% correcting the alignment of 1's.  The default is~0.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*\onecorrection[1]{\def\onec@rrfrac{#1}}
+\onecorrection{0}
+%    \end{macrocode}
+%
+% Now we have all the font and text declaration commands.  They just define
+% a certain macro to be their argument.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\coverfont}[1]{\def\coverf@nt{#1}}
+\DeclareRobustCommand*{\backfont}[1]{\def\backf@nt{#1}}
+\DeclareRobustCommand*{\insidefont}[1]{\def\insidef@nt{#1}}
+\DeclareRobustCommand*{\spinefont}[1]{\def\spinef@nt{#1}}
+\DeclareRobustCommand*{\tracklistfont}[1]{\def\tracklistf@nt{#1}}
+\DeclareRobustCommand*{\infofont}[1]{\def\infof@nt{#1}}
+\DeclareRobustCommand*{\indexfont}[1]{\def\indexf@nt{#1}}
+
+\DeclareRobustCommand{\lefttracklist}[1]{\def\lefttr@cklist{#1}}
+\DeclareRobustCommand{\righttracklist}[1]{\def\righttr@cklist{#1}}
+\DeclareRobustCommand{\leftinfo}[1]{\def\leftinf@{#1}}
+\DeclareRobustCommand{\rightinfo}[1]{\def\rightinf@{#1}}
+\DeclareRobustCommand{\covertext}[1]{\def\c@vertext{#1}}
+\DeclareRobustCommand{\backtext}[1]{\def\b@cktext{#1}}
+\DeclareRobustCommand{\insidetext}[1]{\def\insid@text{#1}}
+
+\DeclareRobustCommand{\covergraphics}[1]{%
+  \def\c@vertext{#1}\def\c@vergraphics{}}
+\DeclareRobustCommand{\insidegraphics}[1]{%
+  \def\insid@text{#1}\def\insid@graphics{}}
+
+\DeclareRobustCommand*{\leftspine}[1]{\def\leftspin@{#1}}
+\DeclareRobustCommand*{\centerspine}[1]{\def\centerspin@{#1}}
+\DeclareRobustCommand*{\rightspine}[1]{\def\rightspin@{#1}}
+\DeclareRobustCommand*{\leftspinebis}[1]{\def\leftspin@bis{#1}}
+\DeclareRobustCommand*{\centerspinebis}[1]{\def\centerspin@bis{#1}}
+\DeclareRobustCommand*{\rightspinebis}[1]{\def\rightspin@bis{#1}}
+
+\DeclareRobustCommand*{\tracklistheight}[1]{%
+  \begingroup
+    \xdef\tr@cklistheight{#1}%
+    \@tempcnta=100
+    \advance\@tempcnta by -\tr@cklistheight
+    \xdef\c@vertextheight{\the\@tempcnta}%
+    \@tempcnta=12
+    \advance\@tempcnta by \tr@cklistheight
+    \xdef\c@verpos{\the\@tempcnta}%
+  \endgroup
+}
+%    \end{macrocode}
+%
+% We do not want any |lineskip|, as stacked covers should not be separated
+% by any space.  Analogously, we want no margins, no indentation and no
+% hyphenation.  Offsets will be set command by each command.
+%
+%    \begin{macrocode}
+\evensidemargin=0cm
+\oddsidemargin=0cm
+\topmargin=0cm
+\headheight=0cm
+\headsep=0cm
+\footskip=0cm
+\textwidth=\paperwidth
+%\advance\textwidth by -3cm
+\textheight=\paperheight
+%\advance\textheight by -3cm
+
+\lineskip=0pt
+\lineskiplimit=0pt
+\parskip=0pt
+\parindent=0pt
+\hyphenpenalty=10000
+%    \end{macrocode}
+%
+% We set the unit for the |picture| environment to 1\,mm and prepare a
+% number of lengths that will be useful in aligning track numbers and spine
+% text.  |\squ@re| holds the side length of the square framing the track
+% numbers.  |\h@nging| is its hanging amount.  |\h@ngingg| is the hanging
+% amount of a track range.  |\@hstrip| and |\@wstrip| are used when aligning
+% the spine.  |\winf@| and |\wtr@cklist| are the width of the information
+% and tracklist minipages.
+%
+%    \begin{macrocode}
+\setlength{\unitlength}{1mm}
+\newlength{\squ@re}
+\newlength{\@temp}
+\newlength{\@tempp}
+\newlength{\d@shwidth}
+\newlength{\h@nging}
+\newlength{\h@ngingg}
+\newlength{\@hstrip}
+\newlength{\@wstrip}
+\newlength{\winf@}
+\newlength{\wtr@cklist}
+\newlength{\onec@rrection}
+%    \end{macrocode}
+%
+% The |\tr@ck| command typesets a hanging framed box with a small number
+% inside.  The number is given by a counter that is reset to~1 at each
+% |\makeback|, and can be changed manually with the |\setindex| command.
+% Two parameters makes it possible to set the hanging amount and the amount
+% of space that follows the box.  The alignment inside the small box will be
+% corrected for numbers either starting or ending with a~1 by the fraction
+% of the width of~1 specified with the |\onecorrection| command.  The
+% associated user commands are |\track| and |\trackrange|; the latter makes
+% it possible to typeset a range given its length.
+%
+%    \begin{macrocode}
+\newcounter{tr@ckindex}
+\DeclareRobustCommand*{\setindex}[1]{\setcounter{tr@ckindex}{#1}}
+
+\DeclareRobustCommand*{\tr@ck}[2]{%
+  \let\@firstdigit=\@empty
+  \setlength{\onec@rrection}{0pt}%
+  \settowidth{\@temp}{\indexf@nt1}%
+  \expandafter\@tfor \expandafter\@digit
+   \expandafter:\expandafter=\number\value{tr@ckindex}\do {%
+    \ifx\@firstdigit\@empty
+      \let\@firstdigit=\@digit
+    \else
+      \if 1\@firstdigit
+        \if 1\@digit\else
+          \setlength{\onec@rrection}{-\onec@rrfrac\@temp}%
+        \fi
+      \else
+        \if 1\@digit
+          \setlength{\onec@rrection}{\onec@rrfrac\@temp}%
+        \fi
+      \fi
+    \fi
+  }%
+  \setlength{\@temp}{\squ@re}%
+  \settoheight{\@tempp}{\tracklistf@nt M}%
+  \addtolength{\@temp}{-\@tempp}%
+  \raisebox{-.5\@temp}{%
+    \setlength{\unitlength}{\squ@re}%
+    \hspace*{-#1}%
+    \begin{picture}(1,1)
+      \put(0,0){%
+        \framebox(1,1){%
+          \hspace*{\onec@rrection}\indexf@nt\thetr@ckindex}%
+        }
+    \end{picture}%
+  }%
+  \hspace*{#2}%
+  \addtocounter{tr@ckindex}{1}%
+}
+
+\DeclareRobustCommand*{\track}{%
+  \par\tr@ck{\h@nging}{6pt}%
+}
+
+\DeclareRobustCommand*{\trackrange}[1]{%
+  \par
+  \tr@ck{\h@ngingg}{1pt}%
+  \addtocounter{tr@ckindex}{#1}%
+  \addtocounter{tr@ckindex}{-2}%
+  \settoheight{\@temp}{\indexf@nt M}%
+  \settoheight{\@tempp}{\tracklistf@nt M}%
+  \addtolength{\@temp}{-\@tempp}%
+  \raisebox{-.5\@temp}{\indexf@nt-}%
+  \hspace*{1pt}%
+  \tr@ck{0pt}{6pt}%
+}
+%    \end{macrocode}
+%
+% We declare some utility commands that allow for easy font dimension
+% switch.  The |\newcd| command resets font and text values to its default
+% values.
+%
+%    \begin{macrocode}
+\AtBeginDocument{%
+  \pagestyle{empty}%
+  \thispagestyle{empty}%
+  \newcd
+}
+
+\DeclareRobustCommand*{\fhb}[2]{%
+  \fontsize{#1pt}{#2pt}\selectfont
+  \parskip=.1\baselineskip
+}
+
+\DeclareRobustCommand*{\fh}[1]{%
+  \fontsize{#1pt}{\baselineskip}\selectfont
+}
+
+\DeclareRobustCommand*{\newcd}{%
+  \lefttracklist{}%
+  \righttracklist{}%
+  \covertext{}%
+  \insidetext{}%
+  \leftspine{}%
+  \centerspine{}%
+  \rightspine{}%
+  \leftspinebis{\leftspin@}%
+  \centerspinebis{\centerspin@}%
+  \rightspinebis{\rightspin@}%
+  \leftinfo{}%
+  \rightinfo{}%
+  \coverfont{\fhb{16}{19}}%
+  \backfont{\coverf@nt}%
+  \insidefont{\fhb{10}{12}}%
+  \spinefont{\fhb{9}{11}\bfseries}%
+  \tracklistfont{\fhb{9}{10.5}}%
+  \infofont{\fhb{7}{8.3}}%
+  \indexfont{\fhb{5}{0}}%
+  \tracklistheight{70}%
+}
+%    \end{macrocode}
+%
+% The following two commands are useful in alignment.  The first command
+% decides the height and width of a given strip of text, to be inserted in
+% the spine.  The point is that unless the |alignspine| option has been
+% requested, we do not set |\@hstrip|, which has been set previously to the
+% maximum height of a capital letter.  The |\alignt@baseline| command is
+% used at the end of boxes that could be bottom aligned: it eliminates the
+% additional height inserted when a box's last line has a descender.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\@sethwstrips}[1]{%
+  \settowidth{\@wstrip}{\spinef@nt #1}%
+  \if@lignspine
+    \settoheight{\@hstrip}{\spinef@nt #1}%
+  \fi
+}
+
+\DeclareRobustCommand*{\alignt@baseline}{%
+  \settodepth{\@temp}{gjpqy}%
+  \vphantom{gjpqy}\par
+  \vspace*{-\@temp}\par
+}
+%    \end{macrocode}
+%
+% It is now easy to write down the |\makecover| command.  It is just a
+% matter of laying out the material and printing the requested crop marks.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\makecover}[1][lrtb]{%
+  \voffset=0in
+  \begin{picture}(120,240)
+  \end{picture}%
+  \begin{rotate}{90}%
+    \begin{picture}(240,120)
+      \@tfor\cr@pmark := #1 \do {
+        \if l\cr@pmark
+          \put(-1,0){\line(-1,0){5}}
+          \put(-1,120){\line(-1,0){5}}
+        \else\if r\cr@pmark
+          \put(241,0){\line(1,0){5}}
+          \put(241,120){\line(1,0){5}}
+        \else\if b\cr@pmark
+          \put(0,-1){\line(0,-1){5}}
+          \put(240,-1){\line(0,-1){5}}
+          \put(120,-1){\line(0,-1){1}}
+          \put(120,-3){\line(0,-1){1}}
+          \put(120,-5){\line(0,-1){1}}
+        \else\if t\cr@pmark
+          \put(0,121){\line(0,1){5}}
+          \put(240,121){\line(0,1){5}}
+          \put(120,121){\line(0,1){1}}
+          \put(120,123){\line(0,1){1}}
+          \put(120,125){\line(0,1){1}}
+        \else\if c\cr@pmark
+          \put(0,0){\line(1,0){240}}
+          \put(0,0){\line(0,1){120}}
+          \put(120,0){\line(0,1){120}}
+          \put(0,120){\line(1,0){240}}
+          \put(240,0){\line(0,1){120}}
+        \fi\fi\fi\fi\fi
+      }
+
+      \ifx\insid@graphics\@empty
+        \put(0,0){%
+          \makebox(120,120)[\@ligninside]{%
+            \parbox{12cm}{%
+               \raggedright
+               \insidef@nt
+               \insid@text
+               \alignt@baseline}}}
+      \else
+        \put(10,10){%
+          \makebox(100,100)[\@ligninside]{%
+            \parbox{10cm}{%
+              \raggedright
+              \insidef@nt
+              \insid@text
+              \alignt@baseline}}}
+      \fi
+      \ifx\c@vergraphics\@empty
+        \put(120,0){%
+          \makebox(120,120)[\@ligncover]{%
+            \parbox{12cm}{%
+              \raggedright
+              \coverf@nt
+              \c@vertext
+              \alignt@baseline}}}
+      \else
+        \put(130,10){%
+          \makebox(100,100)[\@ligncover]{%
+            \parbox{10cm}{%
+              \raggedright
+              \coverf@nt
+              \c@vertext
+              \alignt@baseline}}}
+      \fi
+    \end{picture}%
+  \end{rotate}%
+}
+%    \end{macrocode}
+%
+% The |\makeback| command is slightly more complicated, as it must set up
+% come values for the |\track| command to work.  Moreover, it has to check
+% for empty right information or tracklist minipages, as in this case the
+% left ones must be enlarged, and it must try to use the text from the cover
+% page if no back text has been specified.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\makeback}[1][lrtb]{%
+  \voffset=-.5in
+  \setindex{1}%
+  \settowidth{\d@shwidth}{\indexf@nt-}%
+  \settowidth{\squ@re}{\indexf@nt00}%
+  \settoheight{\@temp}{\indexf@nt0}%
+  \addtolength{\squ@re}{.4\@temp}%
+  \setlength{\h@nging}{\squ@re}%
+  \setlength{\h@ngingg}{\squ@re}%
+  \addtolength{\h@ngingg}{\squ@re}%
+  \addtolength{\h@ngingg}{\d@shwidth}%
+  \addtolength{\h@nging}{6pt}%
+  \addtolength{\h@ngingg}{8pt}%
+  \settoheight{\@hstrip}{\spinef@nt ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
+%
+  \ifx\righttr@cklist\@empty
+    \setlength{\wtr@cklist}{12cm}%
+  \else
+    \setlength{\wtr@cklist}{5.5cm}%
+  \fi
+%
+  \ifx\rightinf@\@empty
+    \setlength{\winf@}{12cm}%
+  \else
+    \setlength{\winf@}{5.5cm}%
+  \fi
+%
+  \begin{picture}(151,118)
+    \@tfor\cr@pmark := #1 \do {
+      \if l\cr@pmark
+        \put(-1,0){\line(-1,0){5}}
+        \put(-1,118){\line(-1,0){5}}
+      \else\if r\cr@pmark
+        \put(152,0){\line(1,0){5}}
+        \put(152,118){\line(1,0){5}}
+      \else\if b\cr@pmark
+        \put(0,-1){\line(0,-1){5}}
+        \put(151,-1){\line(0,-1){5}}
+        \put(6.5,-1){\line(0,-1){1}}
+        \put(6.5,-3){\line(0,-1){1}}
+        \put(6.5,-5){\line(0,-1){1}}
+        \put(144.5,-1){\line(0,-1){1}}
+        \put(144.5,-3){\line(0,-1){1}}
+        \put(144.5,-5){\line(0,-1){1}}
+      \else\if t\cr@pmark
+        \put(0,119){\line(0,1){5}}
+        \put(151,119){\line(0,1){5}}
+        \put(6.5,119){\line(0,1){1}}
+        \put(6.5,121){\line(0,1){1}}
+        \put(6.5,123){\line(0,1){1}}
+        \put(144.5,119){\line(0,1){1}}
+        \put(144.5,121){\line(0,1){1}}
+        \put(144.5,123){\line(0,1){1}}
+      \else\if c\cr@pmark
+        \put(0,0){\line(1,0){151}}
+        \put(0,0){\line(0,1){118}}
+        \put(151,0){\line(0,1){118}}
+        \put(0,118){\line(1,0){151}}
+        \put(6.5,0){\line(0,1){118}}
+        \put(144.5,0){\line(0,1){118}}
+      \fi\fi\fi\fi\fi
+    }
+
+    \@sethwstrips{\leftspin@}
+
+    \put(0,4){%
+      \makebox(6.5,110)[b]{%
+        \makebox[\@hstrip][r]{%
+          \begin{rotate}{90}%
+            \spinef@nt
+            \leftspin@
+          \end{rotate}}}}
+
+    \@sethwstrips{\centerspin@}
+
+    \put(0,4){%
+      \makebox(6.5,110){%
+        \raisebox{0pt}[\@wstrip]{%
+          \makebox[\@hstrip][r]{%
+            \begin{rotate}{90}%
+              \spinef@nt
+              \centerspin@
+            \end{rotate}}}}}
+
+    \@sethwstrips{\rightspin@}
+
+    \put(0,4){%
+      \makebox(6.5,110)[t]{%
+        \raisebox{0pt}[\@wstrip]{%
+          \makebox[\@hstrip][r]{%
+            \begin{rotate}{90}%
+              \spinef@nt
+              \rightspin@
+            \end{rotate}}}}}
+
+    \@sethwstrips{\leftspin@bis}
+
+    \put(144.5,4){%
+      \makebox(6.5,110)[t]{%
+        \makebox[\@hstrip][l]{%
+          \begin{rotate}{-90}%
+            \spinef@nt
+            \leftspin@bis
+          \end{rotate}}}}
+
+    \@sethwstrips{\centerspin@bis}
+
+    \put(144.5,4){%
+      \makebox(6.5,110){%
+        \raisebox{\@wstrip}[\@wstrip]{%
+          \makebox[\@hstrip][l]{%
+            \begin{rotate}{-90}%
+              \spinef@nt
+              \centerspin@bis
+            \end{rotate}}}}}
+
+    \@sethwstrips{\rightspin@bis}
+
+    \put(144.5,4){%
+      \makebox(6.5,110)[b]{%
+        \raisebox{\@wstrip}[\@wstrip]{%
+          \makebox[\@hstrip][l]{%
+            \begin{rotate}{-90}%
+              \spinef@nt
+              \rightspin@bis
+            \end{rotate}}}}}
+
+    \put(17,0){%
+      \begin{picture}(121,118)
+        \put(0,\c@verpos){%
+          \makebox(120,\c@vertextheight)[\@lignback]{%
+            \parbox{12.1cm}{%
+              \raggedright
+              \backf@nt
+              \ifx\b@cktext\undefined
+                \ifx\c@vergraphics\@empty\else\c@vertext\fi
+              \else
+                \b@cktext
+              \fi
+              \alignt@baseline}}}
+
+        \put(0,5){%
+          \makebox(55,\tr@cklistheight)[tl]{%
+            \begin{minipage}{\wtr@cklist}%
+              \lineskip=.5pt
+              \lineskiplimit=1pt
+              \raggedright
+              \tracklistf@nt
+              \lefttr@cklist
+            \end{minipage}}}
+
+        \put(65,5){%
+          \makebox(55,\tr@cklistheight)[tl]{%
+            \begin{minipage}{\wtr@cklist}%
+              \lineskip=.5pt
+              \lineskiplimit=1pt
+              \raggedright
+              \tracklistf@nt
+              \righttr@cklist
+            \end{minipage}}}
+
+        \put(0,5){%
+          \makebox(0,0)[bl]{%
+            \parbox{\winf@}{%
+              \raggedright
+              \infof@nt
+              \leftinf@
+              \alignt@baseline}}}
+
+        \put(65,5){%
+          \makebox(0,0)[bl]{%
+            \parbox{\winf@}{%
+              \raggedright
+              \infof@nt
+              \rightinf@
+              \alignt@baseline}}}
+      \end{picture}%
+    }
+  \end{picture}%
+}
+%    \end{macrocode}
+%
+% The |\makeslimcover| command is essentially a mix of the previous two, as
+% a single slim cover must contain the front matter and the track lists.
+% Note that we have much less space.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\makeslimcover}[1][lrtb]{%
+  \voffset=0in
+  \setindex{1}%
+  \settowidth{\d@shwidth}{\indexf@nt-}%
+  \settowidth{\squ@re}{\indexf@nt00}%
+  \settoheight{\@temp}{\indexf@nt0}%
+  \addtolength{\squ@re}{.4\@temp}%
+  \setlength{\h@nging}{\squ@re}%
+  \setlength{\h@ngingg}{\squ@re}%
+  \addtolength{\h@ngingg}{\squ@re}%
+  \addtolength{\h@ngingg}{\d@shwidth}%
+  \addtolength{\h@nging}{6pt}%
+  \addtolength{\h@ngingg}{8pt}%
+  \settoheight{\@hstrip}{\spinef@nt ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
+%
+  \ifx\righttr@cklist\@empty
+    \setlength{\wtr@cklist}{10cm}%
+  \else
+    \setlength{\wtr@cklist}{4.7cm}%
+  \fi
+%
+  \ifx\rightinf@\@empty
+    \setlength{\winf@}{10cm}%
+  \else
+    \setlength{\winf@}{4.7cm}%
+  \fi
+%
+  \begin{picture}(120,240)
+  \end{picture}%
+  \begin{rotate}{90}%
+    \begin{picture}(240,120)
+      \@tfor\cr@pmark := #1 \do {
+        \if l\cr@pmark
+          \put(-1,0){\line(-1,0){5}}
+          \put(-1,120){\line(-1,0){5}}
+        \else\if r\cr@pmark
+          \put(241,0){\line(1,0){5}}
+          \put(241,120){\line(1,0){5}}
+        \else\if b\cr@pmark
+          \put(0,-1){\line(0,-1){5}}
+          \put(240,-1){\line(0,-1){5}}
+          \put(120,-1){\line(0,-1){1}}
+          \put(120,-3){\line(0,-1){1}}
+          \put(120,-5){\line(0,-1){1}}
+        \else\if t\cr@pmark
+          \put(0,121){\line(0,1){5}}
+          \put(240,121){\line(0,1){5}}
+          \put(120,121){\line(0,1){1}}
+          \put(120,123){\line(0,1){1}}
+          \put(120,125){\line(0,1){1}}
+        \else\if c\cr@pmark
+          \put(0,0){\line(1,0){240}}
+          \put(0,0){\line(0,1){120}}
+          \put(120,0){\line(0,1){120}}
+          \put(0,120){\line(1,0){240}}
+          \put(240,0){\line(0,1){120}}
+        \fi\fi\fi\fi\fi
+      }
+
+      \put(11,0){%
+        \begin{picture}(100,120)
+          \put(0,\c@verpos){%
+            \makebox(100,\c@vertextheight)[\@lignback]{%
+              \parbox{10.1cm}{%
+                \raggedright
+                \backf@nt
+                \ifx\b@cktext\undefined
+                  \ifx\c@vergraphics\@empty\else\c@vertext\fi
+                \else
+                  \b@cktext
+                \fi
+                \alignt@baseline}}}
+
+          \put(0,5){%
+            \makebox(47,\tr@cklistheight)[tl]{%
+              \begin{minipage}{\wtr@cklist}%
+                \lineskip=.5pt
+                \lineskiplimit=1pt
+                \raggedright
+                \tracklistf@nt
+                \lefttr@cklist
+              \end{minipage}}}
+
+          \put(55,5){%
+            \makebox(47,\tr@cklistheight)[tl]{%
+              \begin{minipage}{\wtr@cklist}%
+                \lineskip=.5pt
+                \lineskiplimit=1pt
+                \raggedright
+                \tracklistf@nt
+                \righttr@cklist
+              \end{minipage}}}
+
+          \put(0,5){%
+            \makebox(0,0)[bl]{%
+              \parbox{\winf@}{%
+                \raggedright
+                \infof@nt
+                \leftinf@
+                \alignt@baseline}}}
+
+          \put(55,5){%
+            \makebox(0,0)[bl]{%
+              \parbox{\winf@}{%
+                \raggedright
+                \infof@nt
+                \rightinf@
+                \alignt@baseline}}}
+        \end{picture}%
+      }
+      \ifx\c@vergraphics\@empty
+        \put(120,0){%
+          \makebox(120,120)[\@ligncover]{%
+            \parbox{12cm}{%
+              \raggedright
+              \coverf@nt
+              \c@vertext
+              \alignt@baseline}}}
+      \else
+        \put(130,10){%
+          \makebox(100,100)[\@ligncover]{%
+            \parbox{10cm}{%
+              \raggedright
+              \coverf@nt
+              \c@vertext
+              \alignt@baseline}}}
+      \fi
+    \end{picture}%
+  \end{rotate}%
+}
+%    \end{macrocode}
+%
+% Finally, we have the high-level commands that allow to produce one or
+% several CD from data files, |\makeCD|, |\makelist|, |\makeslimCD| and
+% |\makeslimlist|.  All have an additional argument for the file name,
+% defaulting to |\jobname.dat| or |\jobname.lst|.
+%
+% Two separate commands factor out the checks and the user interaction in
+% case the file is not specified or does not exist.
+%
+% A data file must contain only text declaration commands from the |CD|
+% class.  All \LaTeX{} stuff (preamble, etc.) and cover generation commands
+% are handled automatically.  A list file must contain a number of lines,
+% each containing a data file name.
+%
+%    \begin{macrocode}
+\DeclareRobustCommand*{\@skCDfile}[1]{%
+  \def\CDname{#1}%
+  \ifx\CDname\@empty
+    \IfFileExists{\jobname.dat}{%
+      \def\CDname{\jobname.dat}%
+    }{%
+      \typein[\CDname]{Please insert CD data file name:}%
+    }%
+  \fi
+  \InputIfFileExists{\CDname.dat}{%
+  }{%
+    \InputIfFileExists{\CDname}{%
+    }{%
+      \ClassError{cd}
+                 {CD data file (\CDname.dat or \CDname) not found}
+                 {}%
+    }%
+  }%
+}
+
+\DeclareRobustCommand*{\makeCD}[1][]{%
+  \@skCDfile{#1}%
+  \makecover\par
+  \makeback\par
+}
+
+\DeclareRobustCommand*{\makeslimCD}[1][]{%
+  \@skCDfile{#1}%
+  \makeslimcover\par
+}
+
+\newread\CDlist
+
+\newcounter{@cd}
+\setcounter{@cd}{0}
+
+\newif\ifne@f
+
+\DeclareRobustCommand*{\@sklistfile}[1]{%
+  \def\CDlistname{#1}%
+  \ifx\CDlistname\@empty
+    \IfFileExists{\jobname.lst}{%
+      \def\CDlistname{\jobname.lst}%
+    }{%
+      \typein[\CDlistname]{Please insert CD list file name:}
+    }%
+  \fi
+  \IfFileExists{\CDlistname.lst}{%
+    \immediate\openin\CDlist=\CDlistname.lst
+  }{%
+    \IfFileExists{\CDlistname}{%
+      \immediate\openin\CDlist=\CDlistname
+    }{%
+      \ClassError{cd}
+                 {CD list (\CDlistname.lst or \CDlistname) not found}
+                 {}%
+    }%
+  }%
+  \ne@ftrue
+}
+
+\DeclareRobustCommand*{\makelist}[1][]{%
+  \@sklistfile{#1}%
+  \advance\endlinechar\@M
+  \immediate\read\CDlist to \CDname
+  \advance\endlinechar-\@M
+  \ifeof\CDlist\ne@ffalse\fi
+%
+  \@whilesw \ifne@f \fi {%
+    \newcd
+    \InputIfFileExists{\CDname.dat}{%
+    }{%
+      \InputIfFileExists{\CDname}{%
+      }{%
+        \ClassError{cd}
+                   {CD data file (\CDname.dat or \CDname) not found}
+                   {}%
+      }%
+    }%
+    \advance\endlinechar\@M
+    \immediate\read\CDlist to \CDname
+    \advance\endlinechar-\@M
+    \ifeof\CDlist\ne@ffalse\fi
+    \ifodd\value{@cd}%
+      \makeback[lrb]\par
+      \makecover\par
+    \else
+      \makecover\par
+      \ifne@f\makeback[lrt]\else\makeback\fi\par
+    \fi
+    \addtocounter{@cd}{1}%
+  }%
+}
+
+\DeclareRobustCommand*{\makeslimlist}[1][]{%
+  \@sklistfile{#1}%
+  \advance\endlinechar\@M
+  \immediate\read\CDlist to \CDname
+  \advance\endlinechar-\@M
+  \ifeof\CDlist\ne@ffalse\fi
+%
+  \@whilesw \ifne@f \fi {%
+    \newcd
+    \InputIfFileExists{\CDname.dat}{%
+    }{%
+      \InputIfFileExists{\CDname}{%
+      }{%
+        \ClassError{cd}
+                   {CD data file (\CDname.dat or \CDname) not found}
+                   {}%
+      }%
+    }%
+    \advance\endlinechar\@M
+    \immediate\read\CDlist to \CDname
+    \advance\endlinechar-\@M
+    \ifeof\CDlist\ne@ffalse\fi
+    \makeslimcover\par
+  }%
+}
+%</class>
+%    \end{macrocode}
+% \Finale
+%
+% \PrintChanges
+% \addcontentsline{toc}{section}{Change History}
+
+\endinput
-- 
cgit v1.2.3

