%^^A* legal notices
% \iffalse
%
%   This program is part of the Frankenstein bundle for LaTeX.  
%
%   Copyright 1995-2001 Matt Swift <swift@alum.mit.edu>.
%
%   This file contains both the code and documentation for the
%   bits LaTeX package.  It will work ONLY if it is placed in a
%   proper directory.  Files called README, INSTALL, bits.tex
%   and bits.ins should have also been distributed to you
%   with this file.  See them for more information on how to typeset
%   the documentation with LaTeX and how to generate a version of this
%   file that will work faster than this one.
%
%   This program is free software; you may redistribute it and/or
%   modify it under the conditions of the LaTeX Project Public
%   License, either version 1.2 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.2 or later is
%   part of all distributions of LaTeX version 1999/12/01 or later.
%
%   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
%   LaTeX Project Public License for more details.
%
% \fi  
%
%^^A* checks
%
%^^A NOTE:  The character table, with two %'s, will get written to all files.
%% \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         \~}
%
% \CheckSum{602} 
%
% \newcommand\scheme [2] {\ensuremath{\frac{#1}{#2}}}
%
%^^A** abstract
% \begin{abstract}
%   Bits provides a programmer's interface for a new idea called a
%   \term{bit}, which is like an environment but has a title, author, and
%   other attributes usually only associated with the \env{document}
%   environment.  
%
%   This package is useful but may have problems and is unsupported.
% \end{abstract}
% \tableofcontents
%
% \part{Discussion}
%
% This documentation is spotty, but should be accurate.  Please feel free to
% write me if you can't figure something out.
%
% \section{Basic concepts and terminology}
%   \subsection{Users' interface}
%
% A \term{bit} is the smallest part of a document treated as an independent
% unit.  Each \term{bit} has an explicit type called a \term{bitstyle}.
% (Examples: generic, story, poem, recipe, letter.)  A bit's bitstyle
% determines the markup that is legal within the bit.  (Additional declarations
% can be made on a per-bit basis, also; see below.)  A bit's formatting is
% determined by both its bitstyle and the copystyle (see below) of the
% document.  New bitstyles can be added.
%
% A \term{copystyle} is one of an explicit list of ways to present a collection
% of bits together in a single document.  It might well be called a
% ``documentstyle'' and be implemented as a \LaTeX{} documentclass, but if they
% are kept separate, copystyles and documentclasses can coexist with each
% other, and this leads to a greater flexibility when dealing with existing
% documents.  The relationship between copystyles and documentclasses is
% discussed further below. New copystyles can be added.
%
% \subsection{Programmers' interface}
%
% The formatting of a bit is considered to involve a fixed number of
% \term{tasks}.  Examples of tasks performed near the beginning of formatting a
% bit are inserting some space after the preceding bit, and formatting the
% title of the current bit.  Each task must be assigned a \term{procedure} that
% accomplishes that task.  (Notice that the null procedure might be a suitable
% procedure for some tasks in some situations.)  We call a mapping of some
% tasks to suitable procedures a \term{profile}.  We call a profile that maps
% the \emph{complete} set of tasks a \term{scheme}.  You need a scheme to
% format a bit, and the scheme to use for a given bit is determined by its
% bitstyle and copystyle.
%
% Now we are in a position to try to visualize the variable space established
% by the \term{bits} package.  It's not simple, and if you think of a better
% way, please let me know.
%
% As just explained, to format a bit, you need a scheme, which is a series of
% procedures suitable for a series of certain tasks.  To be concrete, let's
% assume there are 4 tasks.  Identify each task with a general color.  In our
% example, let's use red, blue, green, and yellow.  Think of a scheme as a
% stack of colored blocks, each representing a procedure.  The top block,
% corresponding to the first task, is red, the second block is blue, the third
% green, and the bottom block, corresponding to the final task, is yellow.
%
% Suppose I create a new scheme, the same as the original except for a slight
% change in the first task.  This would be represented by changing the color of
% the red, or top, block to a different shade of red.  The precise color of a
% block represents the specific procedure.  A general color is associated with
% a task because it is expected that no procedure suitable for one task is
% going to be suitable for another task.  The redness of a block represents its
% suitability for the the first task.
%
% (If we wanted to be exact, we would observe that some procedures, such as the
% null procedure, might be suitable for more than one task.  OK, let such
% procedures be a shade of grey, with the null task, let us say, being white.
% Then the colored block at each task's position will have either the
% associated color of the task or a shade of grey.)
%
% I have drawn in your mind the picture of two stacks of 4 colored blocks,
% differing only in the shade of the top (red) block.  Let's give them the
% names Jack and Jill.  Let Jack and Jill represent two bitstyles.  You can
% imagine as many bitstyles as you like---Jack, Jill, Hank, Wendy, and
% Beauregard; all are stacks of four colored blocks arranged next to each other
% in a line, a red block on top, a blue block, a green block, and a yellow
% block.  Some of the stacks might even have identical blocks.  This would mean
% that two bitstyles have the same scheme.  You refer to bitstyles by their
% name, so in the future, you could change one bitstyle and make it different
% from the other.  In fact, when you create a new bitstyle, it is initially
% simply a copy of an existing bitstyle.  Then you can modify the new one if
% you want to.
%
% bitclass? bittype?  bitstyle best describes a scheme.  bitscheme?
%
% You've almost got the whole picture now.  We need to consider copystyles.
% Suppose Jack, Jill, Hank, Wendy, and little Beauregard are all siblings.
% They have the same last name, Grimm.  Grimm is the name of a copystyle.
% Across town, or in a parallel universe, there is another set of siblings
% Jack, Jill, etc.\ with a different last name, Beedle.  They, too, are
% represented by a line of stacks of colored blocks.  Line up the Beedle
% siblings behind the Grimm siblings, and you now have a pile of colored blocks
% 4 high (4 tasks), 5 wide (the 5 bitstyles Jack, Jill, etc.), and 2 deep (the
% 2 copystyles Grimm and Beedle).
%
% That's it.  Given a bitstyle (e.g., Hank) and a copystyle (e.g., Beedle), you
% have a particular scheme for formatting a bit.
%
% As you may notice, there is so far no justification for the metaphor of
% family.  Nothing I've said yet about tasks and procedures corresponds to the
% metaphor's suggestion that Hank Beedle is probably more similar to Wendy
% Beedle than he is to Hank Grimm; or that when putting together the Beedles in
% a family photograph, there is a certain pleasing aesthetic unity that would
% be lacking if any of those odd-looking Grimms were to stray into the picture.
% In fact, technically, each scheme can be completely different from every
% other scheme, Hank Beedle being as different from Wendy Beedle as he is from
% Hank Grimm.
%
% These metaphors are justified when you consider the way in which new
% copystyles and bistyles are added, and the expected purposes for bitstyles
% and copystyles.
%
% OR: family of Poems, family of recipes.  First name is the copystyle.  Then a
% document would consist of Hank Poem, Hank Recipe, etc. = Standard Poem,
% Standard Recipe; Fancy Poem, Fancy Recipe.
%
% Or, each family has one Poem, one Recipe, etc. So a document puts together
% members of a family, Poem, Recipe, etc.
%
% \section{Usage}
%
% Bits look like \LaTeX{} environments that take two arguments.  (Surprise
% surprise that's exactly what they are.)  Here's an example of a bit with
% hypothetical bitstyle ``poem'': 
%
% \begin{codeexample}
% \begin{poem}{Butterflies}{\subtitle{An Address to My Stomach}}
%   O jittery one, quavering tub, \\
%   Rumble not your complaints so violently! \\
%   Remember your jollitude just last Sunday, \\
%   The pound of bovine ambrosia \\
%   I filled you to the gills with \\
%   To silence you, on this, my wedding day.
% \end{poem}
% \end{codeexample}
%
% \section{Extension and customization}
%   \subsection{Customizing an instance of a bit}
%
% Fat little Hank Beedle might come with a note tied around his neck on a piece
% of yarn, with special instructions on his care and feeding from his mother.
% ``Peanuts will give him hives,'' it might say.  And ``A quart of sour cream
% is always welcome.''
%
%   \subsection{Adding bitstyles, copystyles, and tasks}
%
% When you add a new bitstyle $B'$, you create a new scheme for each of the
% existing copystyles.  You name an existing bitstyle $B$ and zero or more
% profiles.  For each existing copystyle $C$, the profiles will be composed
% with the \scheme{B}{C} scheme to obtain the new scheme \scheme{B'}{C}.
% (Notice that if any of the profiles you name are schemes, the choice of $B$
% is irrelevant, and that if you name no profiles, $B' = B$.)
%
% The procedure is identical when you add a new copystyle.  Just swap
% references to copystyles and bibstyles in the last paragraph.
%
% You can add to list of tasks.  When you do this, you must assign a default
% procedure for it (part of the \cat{Z} scheme, the universal default).  All
% existing bitstyles and copystyles will inherit the same procedure for this
% task.  This makes sense because they've presumably all done the task the same
% way before, if they've done it at all.  You can promulgate changes with
% \cs\Promulgate etc.
%
% \section{Notes}
%
% FIX; bit type determines its markup; bitstyle is a mapping of tasks to
% procedures.
%
% \StopEventually{}
%
% \part{Implementation}
%
% \section{Version control}
%
%  \begin{macro}{\fileinfo}
%  \begin{macro}{\DoXUsepackagE}
%  \begin{macro}{\HaveECitationS}
%  \begin{macro}{\fileversion}
%  \begin{macro}{\filedate}
%  \begin{macro}{\docdate}
%  \begin{macro}{\PPOptArg}
% These definitions must be the first ones in the file.
%    \begin{macrocode}
\def\fileinfo{basic bits (Frankenstein's guts)}
\def\DoXPackageS {}
\def\fileversion{v1.2}
\def\filedate{2001/08/31}
\def\docdate{2001/08/31}
\edef\PPOptArg {%
  \filedate\space \fileversion\space \fileinfo
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% If we're loading this file from a \cs\ProcessDTXFile command (see the
% \package{compsci} package), then \cs\JusTLoaDInformatioN will be defined;
% othewise we assume it is not (that's why the FunkY NamE).
% 
% If we're loading from \cs\ProcessDTXFile, we want to load the packages listed
% in \cs\DoXPackageS (needed to typeset the documentation for this file) and
% then bail out.  Otherwise, we're using this file in a normal way as a
% package, so do nothing.  \cs\DoXPackageS, if there are any, are declared in
% the \ext{dtx} file, and, if you're reading the typeset documentation of this
% package, would appear just above.  (It's OK to call \cs\usepackage with an
% empty argument or \cs\relax, by the way.)
%    \begin{macrocode}
\makeatletter% A special comment to help create bst files.  Don't change!
\@ifundefined{JusTLoaDInformatioN} {%
  }{% ELSE (we know the compsci package is already loaded, too)
  \UndefineCS\JusTLoaDInformatioN
  \SaveDoXVarS
  \eExpand\csname DoXPackageS\endcsname\In {%use \csname in case it's undefined
    \usepackage{#1}%
  }%
  \RestoreDoXVarS
  \makeatother
  \endinput
}% A special comment to help create bst files.  Don't change!
%    \end{macrocode}
%
% Now we check for \LaTeX2e and declare the LaTeX package.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{bits}[\PPOptArg]
%    \end{macrocode}^^A special comment to help create bst files.  Don't change!
%
% ^^A NOTE: We have to compensate for the above backslashes, which are not
% ^^A       actually in the .dtx file the author works on, by adding to the
% ^^A       CheckSum.
%%
% \AddToCheckSum{17}^^A `dtx-update-checksum' automatically handles this.
% \AddToCheckSum{7}^^A The half a macrocode env. at the top is missed, however...
% \AddToCheckSum{10}^^A ... and so are the 5 \defs from the .dtx file 
%                   ^^A     that precede it.
% \IfCitations {%
%   \AddToCheckSum{2}^^A When \initelyHavECitationS is defined in
% }                  ^^A the .dtx file, we need 2 more in the CheckSum.
%
%
% \section{Preliminaries}
%
%   \subsection{Requirements}
%
%    \begin{macrocode}
\RequirePackage{blkcntrl,letterhead,moredefs,relsize}
%    \end{macrocode}
%
%   \subsection{Option processing}
%
%    \begin{macrocode}
\DeclareOption{poetica} {%
  \RequirePackage{poetica}
  \newcommand\FullTitlePoetica {%
    \begin{Poetica}
      \fontshape{t}\selectfont
      \BitTitle\\%
      \ifx\BitSubtitle\ShortEmpty \else
        \BitSubtitle\\%
      \fi
    \end{Poetica}
  }
  \AtBeginDocument {%
    \let\FullTitle\FullTitlePoetica
  }
}
%    \end{macrocode}
% FIX: hmm, I think I always want user options so that I can have two different
% packages require a package, and they don't have to match up on their options.
% What about options that can only be used in preamble, that would be the right
% thing for many cases I think.  Aak, \cname{ends} can't be defined without
% special handling?  Hmm, seems like it can.
%    \begin{macrocode}
\DeclareBooleanUserOptions{ends}{noends}
\DeclareBooleanUserOptions{signed}{anonymous}

\DeclareBooleanOptions{titlepage}{notitlepage}

\ExecuteOptions{ends,notitlepage,signed}
\ProcessOptions
%    \end{macrocode}
%
% \section{Making new copy and bit styles}
%
%   \subsection{General stuff}
%
% \begin{macro}{\bt@a}
% \begin{macro}{\bt@b}
% \begin{macro}{\bt@c}
% \begin{macro}{\bt@d}
% \begin{macro}{\bt@e}
%   \mbox{}
%    \begin{macrocode}
\ReserveCS\bt@a
\ReserveCS\bt@b
\ReserveCS\bt@c
\ReserveCS\bt@d
\ReserveCS\bt@e
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \begin{macro}{\bt@tasks}
% \begin{macro}{\bt@bitstyle@list}
% \begin{macro}{\bt@copystyle@list}
%   Comma-separated lists of valid bitstyles, copystyles, and tasks.  We start
%   them off non-null to bootstrap the system of adding new ones, which adds
%   them preceded by a comma.
%    \begin{macrocode}
\newcommand\bt@tasks {%
  environment,end@bit,begin@bit,interbits,firstbit%
  ,settitle,setfirsttitle%
}
\newcommand\bt@bitstyle@list {%
  generic%
}
\newcommand\bt@copystyle@list {%
  standard%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\if@bt@trymoreschemes@}
% \begin{macro}{\@bt@trymoreschemes@true}
% \begin{macro}{\@bt@trymoreschemes@false}
% \begin{macro}{\bt@list@car}
% \begin{macro}{\bt@list@cdr}
%   \cname{bt@list@car} and \cname{bt@list@cdr} expand to the car and cdr of a
%   comma-separated list, respectively.
%    \begin{macrocode}
\provideboolean{@bt@trymoreschemes@}

\NewName{bt@list@car}{#1,#2\@nil} {%
  #1%
}
\NewName{bt@list@cdr}{#1,#2\@nil} {%
  #2%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\NewCopystyle}
% \begin{macro}{\NewBitstyle}
% \begin{macro}{\bt@assign@task}
%   To define a new style, you specify a base style and a list of profiles.
%   Each of these can be empty.  If no base style is specified, the root style
%   is used (i.e., standard copystyle or generic bitstyle).  See discussion
%   above.
%    \begin{macrocode}
\newcommand\NewCopystyle [2][Z] {% args: [profile-list] new-copystyle
  \addto@macro\bt@copystyle@list{,#2}%
  \@for\bt@a:=\bt@bitstyle@list \do {%
    \@for\bt@b:=\bt@tasks \do {%
      \eExpand\bt@b\In {%
          \expandafter\bt@assign@task
            \expandafter{\bt@a}{#2}{##1}{#1}%
      }%
    }%
  }%
}
\newcommand\NewBitstyle [2][Z] {% args: [scheme-list] new-bitstyle
  \addto@macro\bt@bitstyle@list{,#2}%
  \@for\bt@a:=\bt@copystyle@list \do {%
    \@for\bt@b:=\bt@tasks \do {%
      \eExpand\bt@a\In {%
        \eExpand\bt@b\In {%
%        \eExpandNest\bt@b\In {%  FIX?
          \bt@assign@task{#2}{##1}{####1}{#1}%
        }%
      }%
    }%
  }%
}
\newcommand\bt@assign@task [4] {% args: bitstyle copystyle 
                                %       task scheme-list
  \@bt@trymoreschemes@true
  \edef\bt@d{#4}% scheme-list that diminishes; edef not necessary
  \@whilesw\if@bt@trymoreschemes@\fi {%
%    \end{macrocode}
% There's at least one element to start; and the last scheme (\cat{Z}) is always
% defined.
%    \begin{macrocode}
    \edef\bt@c{%
      \bt@list@car\bt@d,\@nil
    }
    \@ifundefined{bt@make@#3@\bt@c} {%
        \edef\bt@d{\bt@list@cdr\bt@d,\@nil}%
        }{% ELSE
      \@nameuse{bt@make@#3@\bt@c}{#1}{#2}%
      \@bt@trymoreschemes@false
      }%
  }%
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \begin{macro}{\PromulgateTaskAcrossCopystyles}
% \begin{macro}{\PromulgateTaskAcrossBitstyles}
%   \mbox{}
%    \begin{macrocode}
\newcommand\PromulgateTaskAcrossCopystyles [3] {% args: task scheme bitstyle
  \@for\bt@a:=\bt@copystyle@list \do {%
    \@nameuse{bt@make@#1@#2}{#3}{\bt@a}%
  }%
}
\newcommand\PromulgateTaskAcrossBitstyles [3] {% args: task scheme copystyle
  \@for\bt@a:=\bt@bitstyle@list \do {%
    \@nameuse{bt@make@#1@#2}{\bt@a}{#3}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\bt@begin@bit@common}
% \begin{macro}{\BitStyle}
% \begin{macro}{\PreBitAll}
%   \cname{bt@begin@bit@common} should be called early in the sequence of
%   beginning a bit.
%    \begin{macrocode}
\providesavebox\sc@box@a
\newcommand\bt@begin@bit@common [2] {%
  \title{#1}%
%    \end{macrocode}
% We want to clear all optional attributes here, such as subtitle. FIX: should
% be a list of attributes and perhaps even abstract clearing functions on them, etc.
%    \begin{macrocode}
  \subtitle{}%
%    \end{macrocode}
% Execute stuff: FIXME: nice hooks can be set here to execute things later
% We introduce the \par so that extra spaces in the argument are not going to
% mean anything.  It would be complicated but possible by means perhaps of
% \cs\nullfont to avoid starting a paragraph here.  Arg, the kernel is so
% opaque on how it handles ignoring spaces and what it's doing with everypar.
%    \begin{macrocode}
  \par #2%
  \refstepcounter{bit}%
  \ifnum\value{bit} = \@ne
    \@nameuse{bt@firstbit@\CopyStyle}%
  \else
    \@nameuse{bt@interbits@\CopyStyle}%
  \fi
}
\ReserveCS\BitStyle
\ReserveCS\PreBitAll
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%   \subsection{Schemes}
%
%     \subsubsection{The \cat{Z} scheme}
%
% \begin{macro}{\FullTitle}
%   The \cat{Z} scheme is always the last resort deafult, and it corresponds to
%   the standard copystyle and the generic bitstyle.
%
% FIXME: whenever we have a dummy we have to use DefName or else we error
% FIXME: Aak, when Promulgating we need defnames for everyting!
%    \begin{macrocode}
\newcommand\bt@make@environment@Z [2] {% args: bitstyle dummy
  \DefName{end#1}{}{}%
  \DefName{#1}{##1##2} {%
    \DefName{end#1}{} {%
      \@nameuse{bt@end@bit@#1@\CopyStyle}{##1}%
    }%
    \@nameuse{bt@begin@bit@#1@\CopyStyle}{##1}{##2}%
  }%
}
\newcommand\bt@make@interbits@Z [2] {% args: dummy copystyle
  \DefName{bt@interbits@#2}{} {%
    \relax
    \par\pagebreak[2]\bigskip\bigskip
    \@nameuse{bt@settitle@\BitStyle @#2}%
  }%
}
\newcommand\bt@make@firstbit@Z [2] {% args: dummy copystyle
  \DefName{bt@firstbit@#2}{} {%
    \relax
    \par\pagebreak[2]%
    \thispagestyle{empty}%
    \@nameuse{bt@setfirsttitle@\BitStyle @#2}%
  }%
}
\newcommand\bt@make@begin@bit@Z [2] {% args: bitstyle copystyle
  \DefName{PreBit#1}{}{}%
  \DefName{bt@begin@bit@#1@#2}{##1##2} {%
    \def\BitStyle{#1}%
    \bt@begin@bit@common{##1}{##2}%
    \PreBitAll
    \@nameuse{PreBit#1}%
  }%
}
\newcommand\bt@make@end@bit@Z [2] {% args: bitstyle copystyle
  \DefName{bt@end@bit@#1@#2}{##1} {%
    \TheEnd
  }%
}
\newcommand\bt@make@settitle@Z [2] {% args: bitstyle copystyle
  \DefName{bt@settitle@#1@#2}{} {%
    \relax
    \begin{center}\FullTitle\end{center}
  }%
}
\newcommand\bt@make@setfirsttitle@Z [2] {% args: bitstyle copystyle
  \DefName{bt@setfirsttitle@#1@#2}{} {%
    \relax
    \begin{center}\FullTitle\end{center}
    \DTypeout{FIXME setfirsttitle in Z scheme}%
  }%
}
%    \end{macrocode}
% When there is no subtitle, it sometimes seems better for the title to be set
% one size larger than the copy; but when you have a subtitle, you need the
% title two sizes larger so that the subtitle can be an intermediate size.
% With CM fonts, because their boldface is extended, a bold subtitle at the
% same size as the copy looks good, and larger is too larger.  So this is a
% tricky issue.  A basic kludge that would work for me, given the font families
% I have an use, would be to check for CM fonts here, or on the other hand
% specifically for an extended boldface, or for Dante/Bulmer, or set a flag in
% my dante.sty or bulmer.sty.
%    \begin{macrocode}
\newcommand\FullTitle {%
  \relsize{2}\bfseries
%  \relsize{1}\bfseries
  \BitTitle\\%
  \ifx\BitSubtitle\ShortEmpty
  \else
    \csname sbseries\endcsname  % this way it's harmless if undefined
    \relsize{-1}\BitSubtitle\\%
  \fi
}
%    \end{macrocode}
% \end{macro}
%
%     \subsubsection{The \cat{P} scheme}
%
% \begin{macro}{\bt@make@setfirsttitle@P}
% \begin{macro}{\bt@make@settitle@P}
% \begin{macro}{\bt@make@end@bit@P}
% \begin{macro}{\bt@make@begin@bit@P}
% The \cat{P} scheme was created for the poem bitstyle.
%    \begin{macrocode}
\newcommand\bt@make@begin@bit@P [2] {% args: bitstyle copystyle
  \DefName{bt@begin@bit@#1@#2}{##1##2} {%
    \def\BitStyle{#1}%
    \bt@begin@bit@common{##1}{##2}%
    \PreBitAll
    \verse        % FIX: why does the PreBitAll hook come before \verse and the
		  % BitHook come after?  Why doesn't the PreBitAll come in
		  % @common@ -- well, so that a bit can put stuff before the hooks.
    \@nameuse{PreBit#1}%
  }%
}
\newcommand\bt@make@end@bit@P [2]  {% args: bitstyle copystyle
  \DefName{bt@end@bit@#1@#2}{##1} {%
    \relax
    \endverse
    \TheEnd
  }%
}
\newcommand\bt@make@settitle@P [2]  {% args: bitstyle copystyle
  \DefName{bt@settitle@#1@#2}{} {%
    \relax
    \begin{verse}\FullTitle\end{verse}
  }%
}
\newcommand\bt@make@setfirsttitle@P [2]  {% args: bitstyle copystyle
  \DefName{bt@setfirsttitle@#1@#2}{} {%
    \relax
    \begin{verse}\FullTitle\end{verse}
    \DTypeout{this is setfirsttitle in P scheme}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%     \subsubsection{The \cat{R} scheme}
%  For the prose bitstyle.
%    \begin{macrocode}
\newcommand\bt@make@settitle@R [2] {%
  \DefName{bt@settitle@#1@#2}{} {%
    \relax
    \ifx\BitTitle\ShortEmpty\else
      \noindent
      \begingroup
        \relsize{1}%
        \bfseries
        \BitTitle
      \endgroup
      \par\smallskip
    \fi
  }%
}
%    \end{macrocode}
%
%     \subsubsection{The \cat{T} scheme} FIX: for what?
%
% \section{The standard copystyle and generic bitstyle}
%
%    \begin{macrocode}
\@for\bt@e:=\bt@tasks \do {%
  \PromulgateTaskAcrossBitstyles{\bt@e}{Z}{standard}
}
%    \end{macrocode}
%
% \section{Bit Styles}
%
%   \subsection{Story}
% This is the same as generic.
%    \begin{macrocode}
\NewBitstyle{generic}
\NewBitstyle{story}
%    \end{macrocode}
%
%   \subsection{Poem}
%
%    \begin{macrocode}
\NewBitstyle{poem}
\PromulgateTaskAcrossCopystyles{begin@bit}{P}{poem}
\PromulgateTaskAcrossCopystyles{end@bit}{P}{poem}
\PromulgateTaskAcrossCopystyles{settitle}{P}{poem}
\PromulgateTaskAcrossCopystyles{setfirsttitle}{P}{poem}
%    \end{macrocode}
%
%   \subsection{Prose}
%
%    \begin{macrocode}
\NewBitstyle{prose}
\PromulgateTaskAcrossCopystyles{settitle}{R}{prose}
%    \end{macrocode}
%
% \section{Copy Styles}
%
%    \begin{macrocode}
\NewCopystyle{titlepage}

\newcommand\bt@make@setfirsttitle@T [2] {% args: bitstyle copystyle
  \DefName{bt@setfirsttitle@#1@#2}{} {%
    \thispagestyle{empty}%
    \vspace*{\fill}%
    \begin{center}
      {\relsize{5}\BitTitle \\}%
      \ifx\BitSubtitle\ShortEmpty\else
        {\relsize{3}\BitSubtitle \\}%
      \fi
    \end{center}
    \vfill
%      \CoverNotes
%      \vfill
    \par
    \begingroup
      \sffamily
      \hfill
      \begin{tabular}{r@{\hspace{\@ne em}}r}
        Copy of:&\todayabbrev   \\%
        Version of:&\Lastchange \\%
        Date:&\Date             \\%     
      \end{tabular}
      \par\bigskip\bigskip
      \begin{raggedleft}
        \def\and{\\}%
        \larger\scshape\Author
%    \end{macrocode}
% A final |\par| is needed to close the paragraph in raggedleft mode.
%    \begin{macrocode}
        \par
      \end{raggedleft}
    \endgroup
    \newpage
    \setcounter{page}{\@ne}%
  }%
}
\PromulgateTaskAcrossBitstyles{setfirsttitle}{T}{titlepage}
%    \end{macrocode}
%
% \section{Bit counters and interbit skips}
%
% \begin{macro}{\c@bit}
% \begin{macro}{\c@bitbit}
% \begin{macro}{\c@bitbitbit}
%   \mbox{}
%    \begin{macrocode}
\providecounter{bit}
\providecounter{bitbit}[bit]
\providecounter{bitbitbit}[bitbit]
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\bt@bitskip}
%  \begin{macro}{\InterBitBreak}
%  \begin{macro}{\InterBitBitBreak}
%  \begin{macro}{\InterBitBitBitBreak}
% \cs\medbreak is penalty -100; \cs\smallbreak is 50.  FIXME: what's going on
% here?
%    \begin{macrocode}
\newcommand\bt@bitskip[1] {%
  \par
  \ifdim \lastskip < \bigskipamount
    \removelastskip
    \penalty -500%
    #1%
  \fi
}  
\newcommand\InterBitBreak {%
  \bt@bitskip
  \bigskip
}
\newcommand\InterBitBitBreak {%
  \bt@bitskip
  \medskip
}
\newcommand\InterBitBitBitBreak {%
  \bt@bitskip
  \smallskip
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \begin{macro}{\bitbit}
% \begin{macro}{\bitbitbit}
% \begin{macro}{\bt@bitbit}
% \begin{macro}{\bt@bitbitbit}
%   FIXME: These should be made attributes of the Generic Bit Style.
%    \begin{macrocode}
\newcommand\bitbit {%
  \@ifstar {%
      \bt@bitbit{}%
    }{% ELSE
    \refstepcounter{bitbit}%
    \bt@bitbit{\thebitbit\ }%
  }%
}
\newcommand{\bt@bitbit} [2] {%
  \ifnum\value{bitbit}=\@ne \else
     \InterBitBitBreak
  \fi
  \noindent #1{\relsize{-1}\bfseries #2}%
  \par\nobreak
  \smallskip
}
\newcommand\bitbitbit {%
  \@ifstar {%
      \bt@bitbitbit{}%
    }{% ELSE
    \refstepcounter{bitbitbit}%
    \bt@bitbitbit{\thebitbitbit\ }%
  }%
}
\newcommand\bt@bitbitbit [2] {%
  \ifnum\value{bitbitbit}=\@ne \else
    \InterBitBitBitBreak
  \fi
  \noindent #1{\relsize{-1}\bfseries #2}%
  \par\nobreak
  \smallskip
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% \section{Userinfos}
%
% \begin{macro}{\Author}
% \begin{macro}{\author}
% \begin{macro}{\Lastchange}
% \begin{macro}{\lastchange}
% \begin{macro}{\Date}
% \begin{macro}{\date}
% \begin{macro}{\title}
% \begin{macro}{\BitTitle}
% \begin{macro}{\BitSubtitle}
% \begin{macro}{\Subtitle}
% \begin{macro}{\subtitle}
% When we redefine \cs\author, \cs\date, and \cs\title, we add a new action to
% the original meaning.  This means that standard commands like \cs\maketitle
% will still perform as expected, if someone prefers to use that instead of the
% \Frankenstein commands.
%    \begin{macrocode}
\SaveCS\date

\newcommand*\Date {%
  \todayabbrev
}
\defcommand\date [1] {%
  \MDSaveddate{#1}%
  \def\Date{#1}%
}
\SaveCS\title
\ReserveCS\BitTitle

\defcommand\title [1] {%
  \MDSavedtitle{#1}%
  \def\BitTitle{#1}%
}
%    \end{macrocode}
% Why did I originally want \cs\Subtitle to be a user command instead of \cs\subtitle?
%    \begin{macrocode}
\NewUserInfo*[\subtitle]\BitSubtitle
%\NewUserInfo*[\Subtitle]\BitSubtitle
%\newlet\subtitle\Subtitle
\NewUserInfo*\Lastchange
\lastchange{\todayabbrev}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\Copystyle}
% \begin{macro}{\copystyle}
%   \mbox{}
%    \begin{macrocode}
\NewUserInfo*\CopyStyle
\copystyle{standard}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \section{Dates}
%
% \begin{macro}{\today}
% \begin{macro}{\todayabbrev}
%   \mbox{}
%    \begin{macrocode}
\def\today {%
  \number\day\space\ifcase\month\or 
        January\or February\or
        March\or April\or May\or June\or July\or August\or September\or
        October\or November\or December\fi\space\number\year
}
\newcommand\todayabbrev {%
  \number\day\space\ifcase\month\or 
        Jan\or Feb\or
        Mar\or Apr\or May\or Jun\or Jul\or Aug\or Sep\or
        Oct\or Nov\or Dec\fi\space\number\year
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \begin{macro}{\copywrite}
%   This adds a copyright message to the beginning of \cs\Notes.  Its single
%   argument should be a year.
%    \begin{macrocode}
\newcommand\copywrite [1] {%
  \edef\Notes {%
    \copyright#1 All rights reserved. \Notes
  }%
}
%    \end{macrocode}
%  \end{macro}
%
% \section{Ends}
%
% \begin{macro}{\EndSign}
%   It's very hard to attach this thing without allowing a page break before it. FIX.
%    \begin{macrocode}
\newcommand\EndSign {%
  \par\nobreak
  \vspace{2\bigskipamount}%  multiplication turns glue into dimen.
  \hfill
%    \end{macrocode}
% We do this so that |\Author| can have |\\|s in it.
%    \begin{macrocode}
  \begingroup
    \scshape
    \let\and\@tabularcr
    \begin{tabular}{c}
      \Author \\% 
      \relsize{-1}\itshape\Date
    \end{tabular}%
  \endgroup
}
%    \end{macrocode}
%  \end{macro}
%
% \begin{macro}{\theend}
%   User command which (almost) always makes an \cs\EndSign:
%    \begin{macrocode}
\newcommand\theend {%
  \if@signed@
    \EndSign
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\TheEnd}
%   The end of a bit calls \cs\TheEnd.  The default definition is either
%   nothing or \cs\EndSign, depending on some condition.
%    \begin{macrocode}
\newcommand\TheEnd {%
  \def\sc@t@c {%
    prizes%
  }%
  \let\sc@t@a\EndSign
  \ifx\CopyStyle\sc@t@c
    \InitCS*\sc@t@a
  \else
    \if@signed@
      \if@ends@
% FIX: when you get the footer going...
%        \ifnum\value{page} < 2%
%          \InitCS*\sc@t@a
%        \fi
      \else
        \InitCS*\sc@t@a
      \fi
    \else
      \InitCS*\sc@t@a
    \fi
  \fi
  \sc@t@a
}
%    \end{macrocode}
% \end{macro}
%
% \section{Version control}
%
% We use macros instead of boxes, because at this point some of the macros in
% the boxes may change their meaning.  
%
% Algorithm: We will maintain two \cs\hbox es |to \textwidth| each time
% \cs\MakeCover is called.  Set the footboxes to |\v@idbox| here.  Whenever
% |\MakeCover| is called, it should stack another |\vbox| with the right
% information in it into both boxes.  The information is expanded, and thus the
% macro contents can change between calls to |\MakeCover|, but the box being
% built inserts two different |\vboxes| with their value at the moment.
%
% \begin{macro}{\bt@vcbox}
% \begin{macro}{\VersionControlString}
% \begin{macro}{\VersionControlAuthorString}
%   \mbox{}
%    \begin{macrocode}
\newcommand\BTVersionWord {Version}
\newcommand\BTCopyWord {Copy}
\newcommand\bt@vcbox {%
  \footnotesize
  \ifx\Lastchange\ShortEmpty\else
    {\bfseries \BTVersionWord:} {\slshape \Lastchange}%
  \fi
  \hspace{\@ne em}%
  {\bfseries \BTCopyWord:} {\slshape \todayabbrev}%
}
\newcommand\VersionControlString {%
  \hfill \bt@vcbox \hfill
}
%    \end{macrocode}
% I should assign some names to the various meanings of and, like protect.
%    \begin{macrocode}
\newcommand\VersionControlAuthorString {%
  \bt@vcbox \hfill {\scshape\def\and{\unskip, \ignorespaces}\Author}%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%     
% \begin{macro}{\whitespace}
%   \mbox{}
%    \begin{macrocode}
\requirecommand\whitespace {%
  \bigbreak
}
%    \end{macrocode}
%  \end{macro}
%
% \part{Configuration}
%
% We leave the rest to a configuration file.
%    \begin{macrocode}
\InputIfFileExists{bits.cfg}{}{}
%    \end{macrocode}
%
%  The contents of the distributed configuration file are below.
%
% \InputIfFileExists{bits.cfg}{}{}
%
% \Finale
