% \iffalse -*- LaTeX -*-
%
%   This is file `cjw-latex.dtx'.  You can run this file through
%   LaTeX2e to produce a DVI file of documentation.  The file
%   `cjw-latex.ins' should have come with this file.  Run it through
%   (La)TeX to extract the bundled macro files.
%
% \fi
\def\RCSinfo{$Id: cjw-latex.dtx,v 0.13 1998/09/01 15:54:20 cwynne Exp $}

\def\RCSsplit $#1: #2,v #3 #4 #5 #6 #7${
  \gdef\filename   {#2}
  \gdef\fileversion{#3}
  \gdef\filedate   {#4}
  \gdef\filetime   {#5}
  \gdef\fileauthor {#6}
  \gdef\filelocker {#7}}

\expandafter\RCSsplit\RCSinfo
%%
%% \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{0}
%
% \iffalse
%<*driver>

\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{cjw-latex.dtx}
    [\filedate\space v\fileversion\space
     Personal macros for LaTeX2e---CJW]

\documentclass{ltxdoc}
  \usepackage{cjwmacro}
    % We need math---call it with all options to make sure they work.
  \usepackage[derivs,integrals,physics]{cjwmath}

\GetFileInfo{cjw-ltr.dtx}
\EnableCrossrefs         
% \DisableCrossrefs     % Say \DisableCrossrefs if index is ready
% \OnlyDescription      % Comment out for implementation details
\RecordChanges

\begin{document}
  \DocInput{cjw-latex.dtx}
\end{document}
%</driver>
% \fi
%
% \DeclareRobustCommand{\cseq}[1]{\texttt{\bslash#1}}
% \DeclareRobustCommand{\pkg} [1]{\textsf{#1}}
% \DeclareRobustCommand{\env} [1]{\textsf{#1}}
%
% \renewcommand{\thefootnote}{\fnsymbol{footnote}}
%
% \title{The \pkg{cjw-latex} Macro Collection\thanks{%
%   This file has version \fileversion{} as of \filedate.}}
% \author{Colin J.~Wynne\thanks{E-Mail at:
%   \texttt{cwynne@mts.jhu.edu}, \texttt{cwynne@jhu.edu}\,.}}
% \date{\filedate}
%
% \maketitle
%
% \setcounter{StandardModuleDepth}{1}
%
% {\parskip 0pt         ^^A % This is the hack used by |doc.dtx|.
%                       ^^A % (bug in \LaTeX?)
%  \tableofcontents
% }
%
% \section*{Introduction}
%
% I have been a \TeX{} user for quite a long time now.  It was in my
% junior year in college, in 1992, that one of my friends and one of
% my math professors decided to warp my perception of reality and
% introduce me to Dr.~Knuth's wonderful creation.  In those days,
% Plain-\TeX{} was the tool of choice, we coded everything ourselves
% from primitives on up, logical markup was unknown, and \LaTeX{} was
% known as Lame-\TeX.  During my senior year I wrote an honors thesis
% in mathematics which required quite a lot of things not present in
% standard Plain-\TeX.  My macro files grew, and grew, and\dots
%
% In the year following my graduation, I converted myself to \LaTeX{},
% mostly because of the convergence my own personal modified
% ePlain/NFSS1/Plain format was having towards \LaTeX{} in terms of
% logical markup.  Most of macros were easily converted into
% \LaTeX{}-ese.  They got more complicated from there.
%
% So now I regularly write up papers, letters, mathematical problem
% sets, and just about anything else that uses the English language,
% in \LaTeX.  The macros have evolved quite a bit.  More has been
% added.  I took to using the |dtx| format for most of my input files,
% and finally decided to wrap my big three up into a single documented
% source file.
%
% I hope that these macros will prove useful to somebody out there,
% and if they do, feel free to buy me a beer next time you see me.  I
% have other |dtx| files available, including a modified \pkg{letter}
% class which also does German formal letters, and a package for doing
% outlines.  Any package of mine should be identifiable on your
% friendly neighborhood CTAN site with a name like
% \verb+cjw*.(dtx|ins)+.
%
% \section{General macros}
%
% \iffalse
%
\NeedsTeXFormat{LaTeX2e}
%<general>\ProvidesPackage{cjwmacro}
%<math>\ProvidesPackage{cjwmath}
%<deriv>\ProvidesFile{cjwderiv.tex}
%<integ>\ProvidesFile{cjwinteg.tex}
%<phys>\ProvidesFile{cjwphys.tex}
%<units>\ProvidesFile{cjwunits}
    [\filedate\space v\fileversion\space
%<general>     Personal macros for LaTeX2e---CJW]
%<math>     Math macros for LaTeX2e---CJW]
%<deriv>     Derivative macros for cjwmath.sty---CJW]
%<integ>     Integration macros for cjwmath.sty---CJW]
%<phys>     Physics macros for cjwmath.sty---CJW]
%<units>     Typesetting units in LaTeX2e---CJW]
%
%<*general>
%
%\fi
%
% I tend to organize my package files as follows---first come flow
% control structures for the package itself, usually in the form of
% new conditionals; then come the options; then comes the meat of the
% package in some sort of vaguely thought out order.  This package is
% no exception.  
%
% \subsection{Package initialization}
%
% Conditionals are usually used in conjunction with package options to
% provide conditional inclusion of certain code, either \emph{via} an
% \cseq{if}\dots{}\cseq{endif} block or using class options.  For this
% package, the subsystem in question is the inclusion of verbatim
% typeset files.
%    \begin{macrocode}
\newif\if@verbext       \@verbextfalse
%    \end{macrocode}
% Not surprisingly, this conditional is used directly by an option.
%    \begin{macrocode}
\DeclareOption{verbext}{\@verbexttrue}
%    \end{macrocode}
% I used to use options for the loading of additional packages.  In
% particular, when I used \pkg{psfig.new} which could not be handled
% as a \LaTeXe{} package, I did this.  Now that I use the \pkg{epsfig}
% package that comes with \LaTeXe, I simply issue a warning to
% include the package separately.
%    \begin{macrocode}
\DeclareOption{psfig}{%
  \PackageWarning{cjwmacro}%
    {Obsolete option \CurrentOption.  Use package `epsfig' instead.}}
%    \end{macrocode}
% Since, however, using \pkg{pstricks} requires several files, I still
% use a package option to take care of all of that.  This option
% checks for the existence of \emph{both} files before including
% either, hence the nested calls to \cseq{InputIfFileExists}.  A
% similar option is used for \pkg{pst-plot.tex}, since is not
% implemented as a package file.
%    \begin{macrocode}
\DeclareOption{pstricks}{%
  \InputIfFileExists{pstricks.sty}{%
  \InputIfFileExists{pst-node.tex}{}{%
    \PackageError{cjwmacro}{File `pst-node.sty' not found.}{}}}%
   {\PackageError{cjwmacro}{File `pstricks.sty' not found.}{}}}

\DeclareOption{psplot}{\InputIfFileExists{pst-plot.tex}{}{%
  \PackageError{cjwmacro}{File `pst-plot.tex' not found.}{}}}
%    \end{macrocode}
%
% The next two options are used to change behavior of some macros on
% draft as opposed to final copies.  Currently, only \cseq{ssbreak}
% has such a dependency, and in final form it uses the PS-Tricks
% package to typeset a nice section delimiter.  Note the use of
% \cseq{ExecuteOption} by the \pkg{final} option to make sure that
% PS-Tricks is, indeed, available.
%    \begin{macrocode}
% What to do for draft vs. final copy.
\DeclareOption{draft}{%  
  \def\ssbreakbar{\hbox to 2in{\hrulefill}}}
\DeclareOption{final}{%
  \ExecuteOptions{pstricks}  
  \def\ssbreakbar{%
    \psset{linewidth=0.4pt,unit=1in}%
    \pspicture(-2.5,-0.15)(2.5,0.15)%
      \qdisk(0,0){0.04}%
      \qdisk(0.33,0){0.02}%
      \qdisk(-0.33,0){0.02}%
      \pspolygon*(0.33,-0.02)(0.33,0.02)(1.75,0)%
      \pspolygon*(-0.33,-0.02)(-0.33,0.02)(-1.75,0)%
    \endpspicture}}
%    \end{macrocode}
%
% To finish off option handling, we declare a default (warn about
% unknown options), execute defaults, and process the passed option
% list. 
%    \begin{macrocode}
\DeclareOption*{%
  \PackageWarning{cjwmacro}{Unknown option `\CurrentOption'}}
\ExecuteOptions{draft}
\ProcessOptions
%    \end{macrocode}
%
% \subsection{General definitions}
%
% These general definitions set up some `meta-macros', to be used by
% other commands.
%
% One of the things I liked a lot about \TeX{} was the use of
% \cseq{let} to make aliases for existing commands without
% sacrificing much of the control sequence space.  In the spirit of
% \LaTeXe, however, I have implemented this thrice with name
% checking.  Analogously to the \cseq{newcommand}-like macros, we
% offer the following three:
%    \begin{macrocode}
\newcommand{\alias}       [2]{\@ifdefinable #1{\let #1 #2}}
\alias\realias\let
\newcommand{\providealias}[2]{\@ifundefined #1{\let #1 #2}}
%    \end{macrocode}
% Usage is, for example,
%   \begin{display}{l}
% \cseq{alias}\cseq{foo}\cseq{bar}
%   \end{display}
% which makes \cseq{foo} an alias for \cseq{bar}.  As expected,
% \cseq{alias} only works if the new name is currently undefined and
% \cseq{providealias} does nothing if its first argument is already
% defined.  Somewhat more lax than its counterpart
% \cseq{renewcommand}, \cseq{realias} does not care if its first
% argument is defined or not.  In essence, that command is used to
% unconditionally alias a command.  This is why, oddly enough,
% \cseq{realias} is itself just an alias of \cseq{let}.  Is this
% getting confusing yet?
%
% Next we input wholesale a few useful packages.  These are still in
% the spirit of meta-macros which define this section.  The first
% package, \pkg{amstext}, provides the \cseq{text} command, which
% basically puts its argument in text mode inside a box, but in the
% current style (textstyle, scriptstyle, etc.).  This is used later
% on.  The \pkg{xspace} package is used for control sequences which
% would encounter `the space problem' when expanded as is.
%    \begin{macrocode}
\RequirePackage{amstext}
\RequirePackage{xspace}
%    \end{macrocode}
% The command \cseq{intertext} from the \pkg{amsmath} package is quite
% useful, but I do not want to include that entire package unless it
% is necessary.  Therefore, I make sure that command is defined one
% way or another.  I also give it the alias \cseq{rem} since I am
% somewhat nostalgic about ancient forms of \textsf{\small BASIC}\dots{}
%    \begin{macrocode}
\providecommand{\intertext}[1]{\noalign{%
  \penalty\postdisplaypenalty\addvspace{ 0.5\belowdisplayskip}
  \vbox{\normalbaselines\noindent#1}%
  \penalty\predisplaypenalty\addvspace{0.5\abovedisplayskip}}}
\alias\rem\intertext
%    \end{macrocode}
%
% Next we define some font style names which will be used in some
% contexts later.  This is done to avoid hard-coding of certain styles
% and to allow as much customization as possible.
%    \begin{macrocode}
\providecommand{\pagenofont}    {\normalfont}
\providecommand{\declarefont}   {\normalfont\bfseries\mathversion{bold}}
\providecommand{\altdeclarefont}{\normalfont\itshape}
\providecommand{\captionfont}   {\normalfont\itshape}
\providecommand{\examplefont}   {\normalfont}
\providecommand{\altexamplefont}{\normalfont\itshape}
\providecommand{\labelfont}     {\normalfont\bfseries\mathversion{bold}}
\providecommand{\timelinefont}  {\normalfont}
\providecommand{\titlefont}     {\normalfont\bfseries\Large\mathversion{bold}}
\providecommand{\verbatimfont}  {\normalfont\ttfamily}
%    \end{macrocode}
%
% The next few commands are for programming convenience.  First we
% want to be able to swap the definitions of two control sequences.
%    \begin{macrocode}
\newcommand{\swapdef}[2]{{%
         \let \@tempa #1\relax
  \global\let #1      #2\relax
  \global\let #2      \@tempa}}
%    \end{macrocode}
% We also want to be able to do the same for lengths (or glue or
% whathaveyou).
%    \begin{macrocode}
\newcommand{\swapdim}[2]{{%
         \@tempdima #1\relax
  \global #1        #2\relax
  \global #2        \@tempdima}}
%    \end{macrocode}
% Next is a macro constructed from an exercise in \emph{The
% \TeX{}book}, which takes three control sequences and expands them in
% reverse order.
%    \begin{macrocode}
\newcommand{\expandthree}[2]{%
  \expandafter\expandafter\expandafter #1\expandafter #2}
%    \end{macrocode}
%
% This next macro is modified from code I received in the
% |comp.text.tex| newsgroup.  According to the e-mail in which I
% received it, the original source is a set of macros for
% \emph{TUGboat}.  It turns a number into an ordinal, finding the
% correct ordinal label which is set as a superscript.
%    \begin{macrocode}
\newcommand{\nth}[1]{{%
  \@tempcnta = #1\relax
  \ifnum \@tempcnta < 0\relax           % Make sure our number is
    \@tempcnta = -\@tempcnta            %   non-negative.
  \fi
  \ifnum \@tempcnta < 14\relax          % Deal first with the 
    \ifnum \@tempcnta > 10\relax        %   exceptions for 
      \def\@tempa{th}                   %   11, 12, and 13.
    \fi
  \else
    \loop \ifnum\@tempcnta > 9\relax    % Loop until the recursive
      \@tempcntb = \@tempcnta           %   remainder (mod 10) is
      \divide  \@tempcntb by  10\relax  %   a single digit in order
      \multiply\@tempcntb by  10\relax  %   to successfully satisfy
      \advance \@tempcnta by -\@tempcntb%   the ordinality test.
    \repeat
    \def\@tempa{\ifcase\@tempcnta       % Figure the proper label:
              th%                       %   0th
        \or   st%                       %   1st
        \or   nd%                       %   2nd
        \or   rd%                       %   3rd
        \else th%                       %   nth
      \fi}
  \fi
  #1\ensuremath{^{\text{\@tempa}}}}}    % Superscript the label in
                                        %   math mode.
%    \end{macrocode}
%
% Continuing in the vein of superscripts, we define two macros which
% put their arguments as sub- and superscripts in script-script
% style.  This was motivated by such things as derivative indices
% which look just plain ugly in script style.
%    \begin{macrocode}
\alias\sst\scriptscriptstyle
\newcommand{\ssp}[1]{^{\sst#1}}
\newcommand{\ssb}[1]{_{\sst#1}}
%    \end{macrocode}
%
% We now come to some very important and necessary macros, namely the
% creation of typeset sideways \textsf{\small ASCII} smiley
% faces. \smiley  Since I like to be as general as possible, I have
% also written  an \cseq{emote} macro for indicating
% emotions. \emote{smirk} 
%    \begin{macrocode}
\newcommand{\smiley}[1][\@smiley]{%
  \edef\@sf{\spacefactor=\the\spacefactor}%
  \unskip\spacefactor=1000\relax\space #1\@sf\xspace}
\newcommand{\@smiley}{%
  {\ttfamily\raise 0.078em\hbox{:}\kern-0.1em{-}\kern-0.1em{)}}}
\newcommand{\emote}[1]{%
  \smiley[\ensuremath{\langle}\emph{#1}\ensuremath{\rangle}]}
%    \end{macrocode}
%
% Since I learned the good habit of doing so at Washington and Lee, I
% often append pledges to my assignments.  The generic pledge is
% implemented as an environment.  It formerly took an argument, the
% date, but I decided that was superfluous, seeing as how the
% assignment headers set the date once.  Why risk inconsistency?  Much
% to my surprise, I found out that \LaTeXe's \cseq{maketitle} command
% unsets not only the date holder, but also the command which is used
% to set the date in the first place.  Anyhow, this means that the
% date \emph{does} need to be set, but I have left that to be done by
% the headers.  The \env{pledge} environment issues a warning if the
% date is not set.
%    \begin{macrocode}
\newenvironment{pledge}%
  {\ifx\@empty\@date
      \PackageWarning{cjwmacro}{Date is not set.}
   \fi
   \parskip=2pt \parindent=0pt\relax
   \null\vfill\begin{flushright}
     \itshape\small}
  {\\[5ex]\normalfont\footnotesize
     \makebox[2in]{\hrulefill}\quad\@date\\
     \makebox[2in]{Colin J.~Wynne}\quad{\hphantom{\@date}}\\
   \end{flushright}}
%    \end{macrocode}
% The old Washington and Lee pledge lives on in my macros\dots{}  It
% requires one argument, namely the type of assignment being pledged.
% The argument is optional, though, and a paper is assumed by default.
%    \begin{macrocode}
\newcommand{\wnlpledge}[1][paper]{%
  \ifx\@empty\@date
    \PackageWarning{cjwmacro}{Date is not set.}
  \fi
  \parskip=2pt \parindent=0pt\relax
  \null\vfill\begin{flushright}
    \itshape\small
    On my honour, I have neither given nor received\\
    any unacknowledged aid on this #1.\\[5ex]
    \normalfont\footnotesize
    \makebox[2in]{\hrulefill}\quad\@date\\
    \makebox[2in]{Colin J.~Wynne,~'94}\quad{\hphantom{\@date}}\\
  \end{flushright}}
%    \end{macrocode}
%
% As mentioned in the option section, there is a macro used to put
% fancy section delimiters into, say, a story.  The \cseq{ssbreak}
% command expects the type of delimiter, the \cseq{ssbreakbar}, to be
% defined.  Since either \pkg{draft} or \pkg{final} must be chosen as
% an option, this should be fine, but I have put a hopefully redundant
% command in just in case.
%    \begin{macrocode}
\newcommand{\ssbreak}{\bigskip
  \centerline{\ssbreakbar}\bigbreak}
\providecommand{\ssbreakbar}{}
%    \end{macrocode}
%
% \subsection{Box formatting}
%
% I have written some of my own commands for handling boxes.  The
% first thing I wanted was an analog of \cseq{mbox} or \cseq{hbox} for
% math mode.  The simple version---\cseq{mathbox} puts its argument into an
% \cseq{hbox}, in math mode, in the current style.  The second version
% is \cseq{Mathbox}, which takes two arguments, the first of which is
% put in the box and evaluated \emph{before} math mode is entered.
% This was done for a specific application where I needed to get the
% contents of the \cseq{mathbox} itself into boldface.  Of course,
% \cseq{boldmath} cannot be evaluated within math mode.  Note that the
% style is chosen by the \cseq{mathpalette} macro, and that the
% command \cseq{@mathbox} is essentially just a dummy to allow the
% proper expansion of \cseq{mathpalette}.
%    \begin{macrocode}
% \mathbox puts its argument into an \hbox, in math mode, with the
% current \...style.
\def\mathbox #1{\hbox{$\mathpalette\@mathbox{#1}$}}
\def\Mathbox #1#2{\hbox{#1$\mathpalette\@mathbox{#2}$}}
\def\@mathbox#1#2{#1#2}
%    \end{macrocode}
% Now, there is a reason why these are defined with \cseq{def} and not
% \cseq{newcommand}.  You see, what I really wanted to do was
% something like
%   \begin{verbatim}
% \newcommand{\mathbox}[2][]{%
%   \hbox{#1$\mathpalette\@mathbox{#1}$}}
% \newcommand{\@mathbox}[2]{#1#2}
%   \end{verbatim}
% in order to get optional arguments to my \cseq{mathbox}es.  The
% problem, though, is that I want to use this command in the context
% of |\box|$N$|=\mathbox{|\dots{}|}|, and for that to work, the first
% token in the expansion of \cseq{mathbox} \emph{must} be a
% |\|$?$|box| command.  The overhead imposed by \cseq{newcommand}
% precludes this.  So, I use the cheap hack until I figure out a more
% workable way of implementing what I really want.
%
% A more generically applicable box command is one which does unto
% width what \cseq{smash} does to height.  Hence \cseq{smush}:
%    \begin{macrocode}
\newcommand{\smush}{\relax
  \ifmmode
    \def\next{\mathpalette\math@smush}
  \else
    \let\next\make@smush
  \fi \next}
\newcommand{\make@smush}[1]{\setbox0=\hbox{#1}\fin@smush}
\newcommand{\math@smush}[2]{\setbox0=\hbox{$\m@th#1{#2}$}\fin@smush}
\newcommand{\fin@smush}{\wd0=0pt \box0 }
%    \end{macrocode}
%
% And finally, vaguely in the realm of boxes, we have struts.  Here I
% have defined some math struts of various sizes (corresponding to the
% various delimiter sizes on which they are based).
%    \begin{macrocode}
\newcommand{\bigmathstrut} {\vphantom{\big()}}
\newcommand{\biggmathstrut}{\vphantom{\bigg()}}
\newcommand{\Bigmathstrut} {\vphantom{\Big()}}
\newcommand{\Biggmathstrut}{\vphantom{\Bigg()}}
%    \end{macrocode}
%
% \subsection{Abbreviations, etc.}
%
% I have found myself using particular types of abbreviations quite
% often---often enough that I wanted control sequences for them,
% whence these first few specimens.
%    \begin{macrocode}
\newcommand{\ie}    {\emph{i.e.}\xspace}
\newcommand{\eg}    {\emph{e.g.}\xspace}
\newcommand{\heisst}{d.h\null.\xspace}          % \dh is taken.
%    \end{macrocode}
% Note the use of \cseq{xspace} so that explicit space need not be
% given afterward.  I did this mostly because I have never decided
% whether or not I want to use a comma after either of this.
%
% The second type of abbreviation is the initial, or should I say
% initials.  I finally settled on a style I like---two initials should
% be separated by a thinspace, and will of course need to have the
% spacefactor adjusted if at the end of a sentence (followed by a
% period, in particular).  Here is the implementation:
%    \begin{macrocode}
\newcommand{\initials}[2]{%
  \break@init #2
  \@ifdefinable #1{%
    \global\edef#1{%
      \noexpand\hbox{\@tempa.\noexpand\,\@tempb}%
      \noexpand\@ifnextchar.{\noexpand\@}{.\noexpand\xspace}}}}
\def\break@init #1.#2.{%
  \def\@tempa{#1}\def\@tempb{#2}}
%    \end{macrocode}
% What happens is this.  The \cseq{initials} command is given a
% control sequence name and the initials to be used.  The initials are
% broken on the periods and returned in the specified tokens.  Then,
% if the control sequence is available for definition, it is defined
% in such a way to make all the spacing and punctuation work out.
% Since the tokens need to be expanded back to the separate initials,
% an \cseq{edef} is required---at the same time, use of
% \cseq{noexpand} is made to keep things from going kablooie at
% definition time.  Here are some standard initials by way of usage
% example.
%    \begin{macrocode}
\initials{\UN}{U.N.}
\initials{\US}{U.S.}
\initials{\AI}{A.I.}
%    \end{macrocode}
%
% \subsection{Dates}
%
% I have had call to do a fair amount of \TeX{} in both English and
% German.  Therefore, in implementing the examples of date macros from
% \emph{The \TeX{}book}, I have provided for both languages.
%
%    \begin{macrocode}
% LaTeX style commands for date-parts, both English and German.
\providecommand{\theday}{\number\day\relax}
\providecommand{\themonth}{%
  \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}
\providecommand{\themonat}{%
  \ifcase\month\or Januar\or Februar\or%
  M\"arz\or April\or Mai\or Juni\or Juli\or August\or%
  September\or Oktober\or November\or Dezember\fi}
\providecommand{\theyear}{\number\year\relax}
%    \end{macrocode}
% Note that \cseq{today} is unconditionally defined by the following
% underhandedness. 
%    \begin{macrocode}
\providecommand{\today}{}
\renewcommand{\today}{\theday~\themonth, \theyear\xspace}
\providecommand{\heute}{}
\renewcommand{\heute}{den~\theday.\ \themonat\ \theyear\xspace}
  \alias\gdate\heute
%    \end{macrocode}
%
% \subsection{Page styles and titles}
%
% We are finally into the realm of more traditional package macros,
% namely creating some general page appearances.  Here I have
% redefined the \pkg{plain} pagestyle to take advantage of the
% \cseq{pagenofont} defined above.
%    \begin{macrocode}
\renewcommand{\ps@plain}{%
  \let\@mkboth  \@gobbletwo
  \let\@oddhead \@empty
  \let\@evenhead\@empty
  \def\@oddfoot{\pagenofont\hfil\thepage\hfil}
  \let\@evenfoot\@oddfoot}
%    \end{macrocode}
% The \pkg{topright} pagestyle has page numbers (strangely enough) at the top
% right of the page.
%    \begin{macrocode}
\newcommand{\ps@topright}{%
  \let\@mkboth  \@gobbletwo
  \def\@oddhead{\pagenofont\hfil\thepage}
  \let\@evenhead\@oddhead
  \let\@oddfoot \@empty
  \let\@evenfoot\@empty}
%    \end{macrocode}
%
% \subsection{Text formatting}
%
% \subsubsection{Timelines}
%
% A timeline is a long, running, two-column format used, for example,
% to do r\'esum\'es or vit\ae (or, if you are in Germany, a
% \emph{Lebenslauf}).  The idea is that a date (or some identifying
% information) appears at the left, and the content is given in the
% righthand column.  The usage is
%   \begin{display}{l}
% |\timeline[|\meta{pos}|]{|\meta{date}|}|
%   \end{display}
% where \meta{pos} is exactly the argument to \cseq{makebox}, the
% justification of the \meta{date} entry within the lefthand column.
% That column has length \cseq{timelineskip}, which can off course be
% set as desired.
%    \begin{macrocode}
\newlength{\timelineskip}
\setlength{\timelineskip}{1.75in}
%    \end{macrocode}
% The actual entries are not considered to be two separate columns.
% Rather, the first line is padded out to \cseq{timelineskip} with
% makebox, and following lines use a hanging indentation.  The control
% sequence \cseq{endtimeline} is defined trivially so that a timeline
% entry may be used as a \env{timeline} environment.
%    \begin{macrocode}
\newcommand{\timeline}[2][l]{%
  \noindent\hangindent=\timelineskip
  \makebox[\timelineskip][#1]{\timelinefont{#2}}\ignorespaces}
\let\endtimeline\relax
%    \end{macrocode}
%
%  \subsubsection{Mathematical declarations}
%
% In writing up mathematics, one often wishes to declare definitions,
% theorems, and so forth.  I have written generic declaration macros
% which can be customized for these uses.  Since I prefer to have all
% such things numbered seuqentially, they use a common counter, called
% \cseq{declare}, strangely enough.  They are numbered within sections
% if sections are being numbered.
%    \begin{macrocode}
\@ifundefined{c@section}
  {\newcounter{declare}}
  {\newcounter{declare}[section]
   \renewcommand{\thedeclare}{\thesection.\arabic{declare}}}
%    \end{macrocode}
% When declarations are numbered, it is sometime nice to have the
% declaration type and number appear uniformly wide throughout.  This
% is done by forcing the declaration to appear in a box of width
% \cseq{declareindent}.
%    \begin{macrocode}
\newlength{\declareindent}
  \setlength{\declareindent}{0pt}
%    \end{macrocode}
% We use some internal commands to specify exactly how the declaration
% is typeset.  In fact, we will be defining not only declaration, but
% an alternate declaration form so that two different methods may be
% used simultaneously in a document---\eg, when theorems and major
% results are to be italicized, but definitions and so forth are not.
%    \begin{macrocode}
\newcommand{\@declare}   [1]{{\declarefont#1:}\quad}
\newcommand{\@altdeclare}[1]{{\altdeclarefont#1:}\quad}
%    \end{macrocode}
% The generic declarations are environments, and are provided in both
% numbered (normal) and unnumbered (starred) forms.  The latter are
% more simple.
%    \begin{macrocode}
\newenvironment{declaration*}[1]%
  {\medbreak\noindent\ignorespaces
     \@declare{#1}\ignorespaces}%
  {\kern0pt\nobreak\smallskip}
\newenvironment{altdeclaration*}[1]%
  {\medbreak\noindent\ignorespaces
     \@altdeclare{#1}\ignorespaces}%
  {\kern0pt\nobreak\smallskip}
%    \end{macrocode}
% The numbered versions introduce nothing surprising, but are a tad
% more involved.
%    \begin{macrocode}
\newenvironment{declaration}[1]%
  {\medbreak\refstepcounter{declare}
     \noindent\ignorespaces
     \ifnum\declareindent = 0\relax%
       \@declare{\thedeclare\quad #1}
     \else
       \makebox[\declareindent]{\@declare{\thedeclare\hss #1}}
     \fi\ignorespaces}
  {\kern0pt\nobreak\smallskip}
\newenvironment{altdeclaration}[1]%
  {\medbreak\noindent\ignorespaces
     \refstepcounter{declare}
     \ifnum\declareindent = 0\relax
       \@altdeclare{\thedeclare\quad #1}
     \else
       \makebox[\declareindent]{\@altdeclare{\thedeclare\hss #1}}
     \fi\ignorespaces}
  {\kern0pt\nobreak\smallskip}
%    \end{macrocode}
% Now, because I am essentially lazy and do not want the extra typing
% needed for an environment, I have shortcuts, \cseq{declare} and
% \cseq{altdeclare}, as well as numbered versions \cseq{ndeclare} and
% \cseq{altndeclare}.  The first argument is passed to the
% corresponding environment, and the following paragraph is the body
% of the environment.
%    \begin{macrocode}
\def\declare    #1#2\par{%
  \begin{declaration*}{#1}#2\end{declaration*}\par}
\def\altdeclare #1#2\par{%
  \begin{altdeclaration*}{#1}#2\end{altdeclaration*}\par}
\def\ndeclare   #1#2\par{%
  \begin{declaration}{#1}#2\end{declaration}\par}
\def\altndeclare#1#2\par{%
  \begin{altdeclaration}{#1}#2\end{altdeclaration}\par}
%    \end{macrocode}
% Genreality is all well and good, but there are some stock
% declarations, given here in both numbered and unnumbered versions.
%    \begin{macrocode}
\providecommand{\corollary}   {\declare{Corollary}}
\providecommand{\definition}  {\declare{Definition}}
\providecommand{\lemma}       {\declare{Lemma}}
\providecommand{\proposition} {\declare{Proposition}}
\providecommand{\theorem}     {\declare{Theorem}}
\providecommand{\note}        {\altdeclare{Note}}

\providecommand{\ncorollary}  {\ndeclare{Corollary}}
\providecommand{\ndefinition} {\ndeclare{Definition}}
\providecommand{\nlemma}      {\ndeclare{Lemma}}
\providecommand{\nproposition}{\ndeclare{Proposition}}
\providecommand{\ntheorem}    {\ndeclare{Theorem}}
\providecommand{\nnote}       {\altndeclare{Note}}
%    \end{macrocode}
% In addition, the following German declaration (meaning a claim) is
% also defined.
%    \begin{macrocode}
\providecommand{\behaupt}	  {\declare{Behauptung}}
\providecommand{\nbehaupt}	  {\ndeclare{Behauptung}}
%    \end{macrocode}
% Finally, since one is not likely to mix numbered and unnumbered,
% here is a control sequence that will make sure everything is
% numbered. 
%    \begin{macrocode}
\newcommand{\allndeclares}{%
  \let\declare     \ndeclare
  \let\altdeclare  \altndeclare}
%    \end{macrocode}
%
% Now that we have propositions, claims, and theorems (oh my!), we
% want to be able to prove them.  The first step is to define a proof
% environment.  The environment simply sets up a label and some
% spacing.  The label is in |\altdeclarefont|.  The label is an
% optional argument which defaults to `Proof', oddly enough.
%    \begin{macrocode}
\newenvironment{proof}[1][Proof]%
  {\smallbreak\noindent{\altdeclarefont#1:}%
     \quad\ignorespaces}%
  {\qed}
%    \end{macrocode}
% Just in case you are prooving in German, we also have the following:
%    \begin{macrocode}
\newenvironment{beweis}[1][Beweis]%
  {\smallbreak\noindent{\altdeclarefont#1:}%
     \quad\ignorespaces}%
  {\qed}
%    \end{macrocode}
% Note that the end of a proof has the command |\qed|, which we will
% unconditionally define here.  This is adapted from \emph{The
% \TeX{}book}.  The idea is to right justify |\qedsymbol| on the line
% where |\qed| is invoked, unless there is not a comfortable amount of
% room.  That amount is given as 2\,em.  When this happens, the line
% is broken and the |\qedsymbol| appears flush right on the following
% line. 
%    \begin{macrocode}
\providecommand{\qed}{}
  \renewcommand{\qed}{%
    {\unskip\nobreak\hfil\penalty 50%
     \hskip 2em\hbox{}\nobreak\hfil\qedsymbol%
     \parfillskip=0pt \finalhyphendemerits=0 \par}}
%    \end{macrocode}
% The standard end-of-proof symbol is a box, but I prefer somewhat
% less ink.  I use \TeX's hollow diamond suit symbol (again
% unconditionally defined).
%    \begin{macrocode}
\providecommand{\qedsymbol}{}
  \renewcommand{\qedsymbol}{\lower 0.35ex\hbox{$\diamondsuit$}}
%    \end{macrocode}
% In case it is desired, the box symbol is defined as |\qedbox|, and
% then with a simple alias this can be used to end all proofs.
%    \begin{macrocode}
  \newcommand{\qedbox}{\vrule height4pt width3pt depth2pt}
%    \end{macrocode}
% Now we wish to define control sequences for some constructions
% commonly found in proofs.  I often find myself writing out proofs
% which require cases.  There are two types of cases.  Often I will
% want to have two cases, one for each definition of an equivalence
% for example.  In this case, the case delimiters will be something
% like |\then| and |\when| commands, and should be set in parentheses
% to mark them clearly.  The other type is the more general `Case
% $n$:' (where $n$, one hopes, will not be \emph{too} large).  To
% cover both of these, we use a fairly typical \LaTeX{} conceit:
%   \begin{display}{l}
% |\Case*{|\meta{case}|}|
%   \end{display}
% where the unstarred argument sets \meta{case} inside parentheses and
% the star supresses the parentheses.  A German alias is given.
%    \begin{macrocode}
\newcommand{\Case}{\@ifstar{\@starCase}{\@Case}}
\newcommand{\@starCase}[1]{\@@Case{#1}}
\newcommand{\@Case}[1]{\@@Case{(#1)}}
\newcommand{\@@Case}[1]{%
  \noindent{\declarefont#1}\quad\ignorespaces}
\alias\Fall\Case
%    \end{macrocode}
% And finally, just in case the proof is by contradiction, we have the
% following.
%    \begin{macrocode}
\newcommand{\contra}{\ensuremath{\Rightarrow\Leftarrow}}
%    \end{macrocode}
%
%
% \subsubsection{Problems and examples}
%
% In addition to declarations, and for subjects other than
% mathematics, one might want to provide examples and worked
% problems.  I implement examples as a separate environment (well,
% \emph{four} separate environments) so that they may have fonts
% distinct from declarations.
%    \begin{macrocode}
\newenvironment{example*}%
  {\@nameuse{declaration*}{Example}\examplefont}
  {\medbreak}
\newenvironment{altexample*}%
  {\@nameuse{declaration*}{Example}\examplefont}
  {\medbreak}
\newenvironment{example}%
  {\declaration{Example}\examplefont}
  {\medbreak}
\newenvironment{altexample}%
  {\declaration{Example}\examplefont}
  {\medbreak}
%    \end{macrocode}
%
% Problems are handled differently.  In my experience, problems do not
% appear in longwinded documents using sectioning, and so the counter
% need not be embedded.
%    \begin{macrocode}
\newcounter{problem}
  \setcounter{problem}{0}
\renewcommand{\theproblem}{\arabic{problem}}
\renewcommand{\p@problem}{}
%    \end{macrocode}
% Often when working a problem, one wishes to include a reference to
% the source.  This is accomplished via the \cseq{Page} macro.  Usage
% is 
%   \begin{display}{l}
% |\Page*[|\meta{author}|]{|\meta{pp}|}{|\meta{problem}|}|
%   \end{display}
% In the \LaTeX{} tradition, the standard command tries to outguess
% you by prepending a hash `\#' to the problem number, whereas the
% starred version omits this.  Thus, the standard version produces
%   \begin{display}{l}
% ([\meta{author},~]p.\,\meta{pp}, \#\meta{problem})
%   \end{display}
% and \cseq{Page*} leaves off the hash.  Notice that the space between
% author and page number is inserted by the macro.  The macro is
% defined robustly so that it can be used in moving arguments.
%    \begin{macrocode}
\DeclareRobustCommand{\Page}{%
  \@ifstar{\@Page{}}{\@Page{\#}}}
\def\@Page#1{%
  \@ifnextchar [{\@@Page{#1}}{\@@Page{#1}[]}}
\def\@@Page#1[#2]#3#4{%
  \def\@tempa{#2}%
  \ifx\@empty\@tempa%
    \let\@tempb\@tempa%
  \else%
    \edef\@tempb{\@tempa,~}%
  \fi%
  (\@tempb p.\,#3, #1{#4})}
%    \end{macrocode}
% 
% The statement of a problem is given in an environment, again so that
% font customization can be easily done.  The \env{statement}
% environment takes a single optional argument, which is typeset at
% the beginning of the statement in \cseq{altdeclarefont}.  The rest
% of the statement is in \cseq{declarefont}.  I use the optional
% argument to pass a \cseq{Page} reference most often---note, though,
% that if the optional argument to \cseq{Page} is used, the whole
% \cseq{Page} command should be put in braces sp that the square
% brackets of optional arguments do not get confused.
%    \begin{macrocode}
\newenvironment{statement}[1][\null]%
  {\def\@tempa{#1}\def\@tempb{\null}%
    \ifx\@tempa\@tempb%
      \def\@tempc{\null}%
    \else%
      \def\@tempc{\altdeclarefont\@tempa\quad}%
    \fi%
    \declarefont{\@tempc}\ignorespaces}
  {\removelastskip\nopagebreak\smallskip}
%    \end{macrocode}
% A problem, now, is basically just a wrapper for the statement.  It
% generates and sets the problem number, does some spacing, and the
% body of the \env{problem} environment becomes the body of the
% \env{statement}.  In essence, a \env{problem} is a numbered
% \env{statement}.   There is a starred version which does not do
% numbers and references---this just does the correct spacing and
% calls \env{statement}. Note that the problem number is set using a
% macro from the \pkg{cjw-outl} package.
%    \begin{macrocode}
\newenvironment{problem}%
  {\setcounter{equation}{0}%
    \gdef\theequation{\theproblem.\arabic{equation}}%
    \removelastskip\medbreak%
    \refstepcounter{problem}%
    \noindent\theoutlabel{\theproblem.}%
    \statement}
  {\endstatement}
\newenvironment{problem*}%
  {\removelastskip\medbreak%
   \noindent\statement}
  {\endstatement}
%    \end{macrocode}
% Since I have been known to write assignments in German, we provide
% the aliases to make an \env{aufgabe} environment.
%    \begin{macrocode}
\alias  \aufgabe   \problem
\realias\endaufgabe\endproblem
%    \end{macrocode}
% For parts and subparts of problems, the aliases are English and the
% main definitions are German because I wrote these while I was in
% Germany.  So, parts (\emph{Teile}) are numbered within problems and
% subparts (\emph{Subteile}) within parts.  The defaults for
% cross-referencing (the \cseq{p@} forms) are set, too.
%    \begin{macrocode}
\newcounter{teil} [problem]
\newcounter{steil}[teil]
\renewcommand{\theteil}  {(\alph{teil})}
  \renewcommand{\p@teil} {\theproblem}
\renewcommand{\thesteil} {(\roman{steil})}
  \renewcommand{\p@steil}{\p@teil\theteil}
%    \end{macrocode}
% The environment \env{part}/\env{teil} used to be implemented
% entirely in terms of the \pkg{cjw-outl} package, but that was a
% little bit of overkill, and made the numbering more difficult to
% implement.  I ought to one day implement problems/parts/subparts
% entirely in terms of the outline macros.  We'll see.
%
% Anyway, the current implementations still rely on some of the
% definitions from the \pkg{cjw-outl} package.  The
% \env{part}/\env{teil} environments take a single optional argument,
% namely the outline depth.  Level one starts the text flush left at
% the margin, which is usually where the \env{problem} is, hence a
% \env{part} should be at level two, and this is the default.  A more
% detailed explanation of the goings-on here can be found in
% \pkg{cjw-outl.dtx}. 
%    \begin{macrocode}
\newenvironment{teil}[1][2]%
  {\@tempcnta=#1\advance\@tempcnta by -1\relax
   \ifnum\@tempcnta < 1\relax
     \leftskip=0pt\relax
   \else
     \leftskip=\@tempcnta\outlindent
   \fi
   \refstepcounter{teil}
   \addvspace{\medskipamount}%
   \noindent\theoutlabel{\theteil}%
   \ignorespaces}
  {\par\smallbreak}
%    \end{macrocode}
% The default level for \env{ppart} or \env{steil}, the subpart
% environments, is three.
%    \begin{macrocode}
\newenvironment{steil}[1][3]%
  {\@tempcnta=#1\advance\@tempcnta by -1\relax
   \ifnum\@tempcnta < 1\relax
     \leftskip=0pt\relax
   \else
     \leftskip=\@tempcnta\outlindent
   \fi
   \refstepcounter{steil}
   \addvspace{\medskipamount}%
   \noindent\theoutlabel{\thesteil}%
   \ignorespaces}
  {\par\smallbreak}
%    \end{macrocode}
% English aliases are, of course, given.
%    \begin{macrocode}
\realias\part    \teil
\realias\endpart \endteil
\alias  \ppart   \steil
\realias\endppart\endsteil
%    \end{macrocode}
%
% \subsubsection{Footnotes}
%
% This is a simple modification to a standard \LaTeXe{} internal
% macro, because I prefer hanging indentation on my footnote text.
%    \begin{macrocode}
\long\def\@makefntext#1{%
  \parindent 1em\noindent\hangindent=\parindent%
  \hb@xt@    1em{\hss \llap{\@makefnmark} }#1}
%    \end{macrocode}
%
% \subsubsection{Text displays}
%
% I have turned the \cseq{begindisplay} and \cseq{enddisplay} macro
% pair from \emph{The \TeX{}book} (page~421) into a \LaTeX{}
% environment.  As with Knuth's macros, local definitions for use
% within the display can be given, in this case via the
% \env{display}'s optional argument.  Since the environment is
% implemented through the standard \env{tabular} environment, there is
% a mandatory argument specifying column layout.  Overall, usage is
%   \begin{display}{l}
% \cseq{begin}|{display}[|\meta{local}|]{|\meta{cols}|}|
%   \end{display}
% with local definitions \meta{local} and column descriptol
% \meta{col}.  (By the way, the previous display was created with the
% \env{display} environment\dots)
%
% The display's offset from the left margin is specified by
% \cseq{textdisplay indent}.  Default value is equal to
% \cseq{parindent}, and is therefore set below, after
% \cseq{parindent}. 
%    \begin{macrocode}
\newlength{\textdisplayindent}
%    \end{macrocode}
% The actual \env{display} environment uses the spacing and penalties
% of mathematical displays.
%    \begin{macrocode}
\newenvironment{display}[2][]
  {\vadjust{\penalty\predisplaypenalty}
   \@newline[\abovedisplayskip]%
   \begingroup%
     #1%
     \begin{tabular}{@{\null\hspace{\textdisplayindent}\null}#2}}
  {\end{tabular}\endgroup
   \vadjust{\penalty\postdisplaypenalty}
   \@newline[\belowdisplayskip]\ignorespaces}
%    \end{macrocode}
%
% \subsection{Verbatim inclusions}
%
% Since I only occassionally need to include verbatim files, the
% following macros need to be specifically included by a package
% option, as was mentioned above.
%    \begin{macrocode}
\if@verbext
%    \end{macrocode}
% For numbered inclusions, we need a line number counter.
%    \begin{macrocode}
\newcounter{vfline}
\renewcommand{\thevfline}{\arabic{vfline}}
%    \end{macrocode}
% We need the following command from \emph{The \TeX{}book}.
%    \begin{macrocode}
\providecommand{\uncatcodespecials}{%
  \def\do##1{\catcode`##1=12 }\dospecials}
%    \end{macrocode}
% The basic command is \cseq{verbfile} which takes an optional
% argument specifying the starting line number (default is one), and a
% mandatory argument which is, of course, the name of the file to
% include.  There is also \cseq{verbfilenolines} which does not number
% lines, and needs only the one mandatory argument.
%    \begin{macrocode}
\providecommand{\verbfile}[2][1]{%
  \par\begingroup\@vf@lines{#1}\input{#2}\relax\endgroup}
\providecommand{\verbfilenolines}[1]{%
  \par\begingroup\@vf@nolines\input{#1}\relax\endgroup}
%    \end{macrocode}
% In the manner of command which need to do \cseq{catcode} trickery,
% the above are primarily wrappers for the real commands.  The one
% problem with these as currently implemented is that they do not
% handle leading space in the included file.  Oh, well.
%    \begin{macrocode}
\newcommand{\@vf@lines}[1]{%
  \verbatimfont
  \setcounter{vfline}{#1}
    \addtocounter{vfline}{-1}
  \setlength{\parindent}{0pt}
  \setlength{\parskip}{0pt}
  \def\par{\leavevmode\endgraf}
  \obeylines \uncatcodespecials \obeyspaces
  \everypar{\null\stepcounter{vfline}%
    \llap{\scriptsize\thevfline\quad}\null}}
\newcommand{\@vf@nolines}{%
  \verbatimfont
  \setlength{\parindent}{0pt}
  \setlength{\parskip}{0pt}
  \def\par{\leavevmode\endgraf}
  \obeylines \uncatcodespecials \obeyspaces
  \everypar{\null}}
%    \end{macrocode}
% Now we end the inclusion conditional.
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
% \subsection{Initialization}
%
% We use the \cseq{AtBeginDocument} command to set up some default
% values when the document is actually started.
%    \begin{macrocode}
\AtBeginDocument{%
  \setlength{\parindent}        {20pt}
  \setlength{\parskip}          { 2pt plus 1pt}
  \setlength{\textdisplayindent}{\parindent}}
%    \end{macrocode}
%
% \iffalse
%
%</general>
%
% \fi
%
%
% \section{Math macros}
%
% \iffalse
%
%<*math>
%
% \fi
%
% While some macros useful for typesetting mathematics have already
% been covered, none of them had to do with mathematical equations or
% symbols---they were macros for logical flow and delineation.  In
% this package, \pkg{cjwmath}, I have written macros which are
% specifically for typesetting the actual math---the vast majority of
% these macros, if not actually all of them, are meant to be used in
% math mode.
%
% \subsection{Package initialization}
%
% Since different papers require different types of math, I have again
% used the introduction of conditionals and package options to control
% what code is actually loaded.  The important one concerns use of the
% AMS math packages in AMS-\LaTeX.  This is included as an option to
% my package because some of my definitions depend upon whether the
% AMS macros are being used.  There are conditionals for including
% code for calculus (both derivatives and integrals) and some code for
% physics.
%    \begin{macrocode}
\newif \if@amsmath
\newif \if@derivatives
\newif \if@integrals
\newif \if@physics
%    \end{macrocode}
% There are options corresponding to each conditional.
%    \begin{macrocode}
\DeclareOption{amsmath}  {\@amsmathtrue}
\DeclareOption{derivs}   {\@derivativestrue}
\DeclareOption{integrals}{\@integralstrue}
\DeclareOption{physics}  {\@physicstrue}
%    \end{macrocode}
% There used to be another option for typesetting units.  While I
% originally included that code in this package directly, I found
% several occasions where I wanted units but not the rest of the math
% code.  Therefore, units are in a separate package, and the option
% now just reminds the user to input that package by itself.
%    \begin{macrocode}
\DeclareOption{units}{%
  \PackageWarning{cjwmath}%
    {Obsolete option \CurrentOption.  Use package `cjwunits' instead.}}
%    \end{macrocode}
% Finally, there is a default option, to warn about unknown options,
% and the passed option list is processed.
%    \begin{macrocode}
\DeclareOption*{%
  \PackageWarning{cjwmath}{Unknown option `\CurrentOption'}}
\ProcessOptions
%    \end{macrocode}
%
% This package depends upon the previous one.
%    \begin{macrocode}
\RequirePackage{cjwmacro}
%    \end{macrocode}
% It also uses the AMS fonts, for which we require \pkg{amssymb},
% which itself requires \pkg{amsfonts}.
%    \begin{macrocode}
\RequirePackage{amssymb}
%    \end{macrocode}
% Just in case things get screwy in \pkg{cjwmacro}---which they
% shouldn't, we explicitly require \pkg{amstext} here, too, for the
% \cseq{text} command.
%    \begin{macrocode}
\RequirePackage{amstext}
%    \end{macrocode}
% I much prefer the following package to AMS's own blackboard bold
% font. 
%    \begin{macrocode}
\RequirePackage{bbm}
%    \end{macrocode}
% If the \pkg{amsmath} option is specified, we load the package (which
% itself brings in a lot of other stuff).
%    \begin{macrocode}
\if@amsmath
  \RequirePackage{amsmath}
\fi
%    \end{macrocode}
%
% \subsection{Miscellaneous macros}
%
% Here is a package command which I have written to cover the
% shortcomings of AMS-\LaTeX's |\DeclareNewMathOperator| command.  In
% particular, I would like to be able to set different fonts for some
% operators.   The syntax is
%   \begin{display}{l}
% |\NewMathOp*[|\meta{font}|]{\cs}{|\meta{text}|}|
%   \end{display}
% The optional star makes an operator with limits.  The \meta{font}
% is, by default, |\operator@font|.  |\cs| is the name of the new
% mathop.  \meta{text} should be the printed version of the operator,
% but may also include, for example, extra kerning information, as in
%   \begin{display}{l}
% |\NewMathOp[\mathfrak]{\so}{o\kern 0pt}|
%   \end{display}
% The command should produce something robust.
%    \begin{macrocode}
\DeclareRobustCommand{\NewMathOp}{%
  \@ifstar{\@makenewop{\displaylimits}}
          {\@makenewop{\nolimits}}}
%    \end{macrocode}
% The first iteration applies a font if the optional argument is not
% given.
%    \begin{macrocode}
\def\@makenewop#1{%
  \@ifnextchar [{\@@makenewop{#1}}
    {\@@makenewop{#1}[\operator@font]}}
%    \end{macrocode}
% Finally, the net operator itself is declared robustly.  The
% arguments are, in order, either |\displaylimits| or |\nolimits|, the
% font, the control sequence, and the operator text.
%    \begin{macrocode}
\def\@@makenewop#1[#2]#3#4{%
  \DeclareRobustCommand{#3}{%
    \mathop{\kern\z@{#2{#4}}}#1}}
%    \end{macrocode}
%
% The next few macros have to do with things not specific to any
% particular flavor of mathematics.  For example, I like some of the
% alternate Greek characters more than the originals---notice how we
% cleverly required the \pkg{cjwmacro} package which gives us the
% \cseq{swapdef} command.
%    \begin{macrocode}
\swapdef{\epsilon}{\varepsilon}
% \swapdef{\theta}{\vartheta}
\swapdef{\rho}{\varrho}
%    \end{macrocode}
% I also like the empty set symbol from AMS, to which I also assign a
% German alias.
%    \begin{macrocode}
\swapdef{\nothing}{\varnothing}
\alias\leer\nothing
%    \end{macrocode}
%  The standard symbols `$\exists$' and `$\forall$' do not have
% satisfactory spacing, in my opinion, so I redefine them as
% relations.  Notice the aliasing so that the symbols' redefinition
% can be carried out regardless of current math fonts.
%    \begin{macrocode}
\alias\@@exists\exists
  \renewcommand{\exists}{\mathrel{\@@exists}}
\alias\@@forall\forall
  \renewcommand{\forall}{\mathrel{\@@forall}}
%    \end{macrocode}
% What \LaTeX{} cleverly calls \cseq{ni} (a backwards `$\in$') really
% ought to mean `such that,' hence I rename it:
%    \begin{macrocode}
\newcommand{\st}{\mathrel{\ni}}
%    \end{macrocode}
% Being essentially lazy, I also prefer to make a nice control
% sequence for some standard abbreviations.  One happens to be
% German (since in German it is more acceptable to use abbreviations
% of long phrases even in a more formal setting).
%    \begin{macrocode}
\newcommand{\WLOG}{Without loss of generality\xspace}
\newcommand{\Wlog}{without loss of generality\xspace}
\newcommand{\obda}{o.B.d.A.\xspace}
\newcommand{\fp}{floating-point\xspace}
%    \end{macrocode}
% The following two commands are simply for phantoms I often find
% myself using, for example to make alignments in arrays and matrices
% come out right.  The mnemonic is `phantom negative' or `phantom equals'.
%    \begin{macrocode}
\newcommand{\pneg}{\phantom{-}}
\newcommand{\peq}{\phantom{=}}
%    \end{macrocode}
% Going probably too far into the realm of generalization, here are
% some macros to set their arguments inside matching scaled delimiters
% of various sorts.
%    \begin{macrocode}
\newcommand{\anglebrackets}[1]{%
  \left\langle #1 \right\rangle}
\newcommand{\curlybrackets}[1]{%
  \left\{ #1 \right\}}
\newcommand{\squarebrackets}[1]{%
  \left[ #1 \right]}
\newcommand{\vertbrackets}[1]{%
  \left| #1 \right|}
\newcommand{\Vertbrackets}[1]{%
  \left\| #1 \right\|}
%    \end{macrocode}
% And now for something completely different---sometimes an operand
% should be left generic, but not in terms of a variable.  The usual
% way of accomplishing this is to place a small dot where the argument
% would otherwise go.  As I consider this to imply `no argument', the
% command is |\noarg|.
%    \begin{macrocode}
\newcommand{\noarg}{\,\cdot\,}
%    \end{macrocode}
% We end with a few things that should be fairly obvious.
%    \begin{macrocode}
\newcommand{\ee}[1]{\times10^{#1}}
\newcommand{\half}{\sfrac12}
\newcommand{\ninfty}{-\infty}
%    \end{macrocode}
% This is shorthand for function definitions, including an extra
% control sequence for some backwards compatibility and an alias to
% German.
%    \begin{macrocode}
\newcommand{\fcn}[2]{\colon{#1}\rightarrow{#2}}
  \newcommand{\mapping}[3]{{#1}\fkt{#2}{#3}}
\alias\fkt\fcn
%    \end{macrocode}
% Restrictions of functions:
%    \begin{macrocode}
\newcommand{\restr}[2][\big]{\kern -.1em #1|_{#2}}
%    \end{macrocode}
%
%
% \subsection{Combinatorics}
%
% The binomial coefficient $\choose{n}{k}$ is defined, depending on
% whether or not AMS-\LaTeX{} is being used.
%    \begin{macrocode}
\if@amsmath
  \realias\choose\binom
\else
  \renewcommand{\choose}[2]{{{#1}\atopwithdelims(){#2}}}
\fi
%    \end{macrocode}
% And lastly, we have the combinatorial doohickie which is read as
% `$n$ multichoose $k$', using doubled parentheses as delimiters.  I
% think this comes out looking right.
%    \begin{macrocode}
\newcommand{\mchoose}[2]{%
  \mathchoice%
   {\left(\kern-0.48em\choose{#1}{#2}\kern-0.48em\right)}
   {\left(\kern-0.30em
        \choose{\smash{#1}}{\smash{#2}}\kern-0.30em\right)}
   {\left(\kern-0.30em
        \choose{\smash{#1}}{\smash{#2}}\kern-0.30em\right)}
   {\left(\kern-0.30em
        \choose{\smash{#1}}{\smash{#2}}\kern-0.30em\right)}
  }
%    \end{macrocode}
% There is also the old-fashioned $\Comb{n}{k}$-type notation, as used
% both in English and in German.
%    \begin{macrocode}
\newcommand{\Comb}[2]{%                         %   C
  {}_{#1}{\operator@font C}_{#2}}               % #1 #2
\newcommand{\Komb}[2]{%                         %          #2
  {\operator@font Ko}_{#1}^{#2}}                %        Ko
\newcommand{\Kombun}[2]{\Komb{#1,\neq}{#2}}     %          #1
\newcommand{\Perm}[2]{%                         %                #2
  {\operator@font Pe}_{#1}^{#2}}                %              Pe
\newcommand{\Permun}[2]{\Perm{#1,\neq}{#2}}     %                #1
%    \end{macrocode}
%
% \subsection{Sets}
%
% The most important macro in this section is named, of course,
% |\set|.  The idea is to make sets which look like
%   \begin{displaymath}
% \set{x \in \R^2}{\norm{x}_p = 1 \forall p = 1,2,3,\ldots}.
%   \end{displaymath}
% That is, there should be scaled braces around two halves separated
% by a scaled logical delimiter, the vertical bar.  The problem with
% this is getting everything the same height, since the $\mid$
% specifier does not scale and there is no middle-counterpart to
% |\left|\dots|\right|.
%
% So, the command has the form:
%   \begin{display}{l}
% |\set[|\meta{mid}|]{|\meta{left}|}{|\meta{right}|}|
%   \end{display}
% The optional \meta{mid} specifies an alternate delimiter to use
% between the two definition halves of the set.  If it is left
% \emph{empty}, the null delimiter `.' will be assumed.  If anything
% at all appears in the optional argument, though, the first token
% \emph{must} be a delimiter, as it will immediately be preceded by a
% sizing macro.  For example, if you wish to use a colon to separate
% the definitions, use `|[.:]|' as the optional argument.  The
% mandatory \meta{left} and \meta{right} are simply the halves of the
% set definition.
%    \begin{macrocode}
\newcommand{\set}[3][|]{{%
  \newdimen\@tempdimd%
%    \end{macrocode}
% Each half is set in its own box, then the larger of the respective
% heights and depths are determined.
%    \begin{macrocode}
  \setbox0=\mathbox{#2}\@tempdima=\ht0 \@tempdimb=\dp0%
  \setbox0=\mathbox{#3}\@tempdimc=\ht0 \@tempdimd=\dp0%
  \ifdim\@tempdimc > \@tempdima
    \@tempdima=\@tempdimc
  \fi
  \ifdim\@tempdimd > \@tempdimb
    \@tempdimb=\@tempdimb
  \fi
%    \end{macrocode}
% We create an invisible rule with that height and depth, and make
% sure we have a valid delimiter if the optional argument is empty.
%    \begin{macrocode}
  \def\@tempa{\vrule width0pt height\@tempdima depth\@tempdimb}
  \def\@tempb{#1}
  \ifx\@empty\@tempb
    \def\@tempb{.}
  \fi
%    \end{macrocode}
% Finally, we use a null left delimiter to balance the middle
% delimiter, and then a left brace to balance the right brace.  The
% rule is set inside both pairs so that they scale identically.  Note
% the use of |\expandafter| so that when the first |\right| is
% expanded, it can grab the delimiter in |\@tempb|.
%    \begin{macrocode}
  \left.\left\{ \@tempa{#2} \,\expandafter\right\@tempb\,{#3} \right\} }}
%    \end{macrocode}
% For backwards compatibility, I make two aliases for |\set|; the old
% commands required the user to specify the larger side of the set
% definition in order to get sizing correct.
%    \begin{macrocode}
\alias\setl\set
\alias\setr\set
%    \end{macrocode}
%
% Here are some macros for typesetting sets symbolically.  First off,
% we might want to know how to typeset a level set.
%    \begin{macrocode}
\newcommand{\lvl}[2][\alpha]{\Gamma\ssb{#2}\ssp{(#1)}}
%    \end{macrocode}
% There are also fuzzy sets, and their corresponding level sets.
%    \begin{macrocode}
\if@amsmath
  \newcommand{\fset}[1]{\Tilde{#1}}
\else
    \newcommand{\fset}[1]{\tilde{#1}}
\fi
\newcommand{\flvl}[2][\alpha]{\lvl[#1]{\fset{#2}}}
%    \end{macrocode}
% For want of a better font, I will typeset set collections
% in |\mathcal|.
%    \begin{macrocode}
\alias\coll\mathcal
%    \end{macrocode}
%
% Finally, we deal with some set operators.
% \emph{The \TeX{}book} points out the difference between |\setminus|
% and |\backslash|.  I prefer to think of them as `set
% complementation' and `coset', respectively.
%    \begin{macrocode}
\alias\scomp\setminus
\alias\coset\backslash
%    \end{macrocode}
% The next macro attempts to create a symmetric difference operator.
% I don't like it, but I probably won't do better until I learn to
% make my own \textsf{M{\small ETAFONT}} characters\ldots
%    \begin{macrocode}
\newcommand{\symmdiff}{%
  \mathbin{\text{\footnotesize$\bigtriangleup$}}}
%    \end{macrocode}  
%
%
% \subsection{Sequences and series}
%
% Just a few macros are required for various sequences and series,
% mostly for indexing.  The best explanation is simply an example.
% The code
%   \begin{display}{l}
% |$y \in \seq{x_{ij}}$, where $i\inset{n}$, $j\inrange[0]{m}$|
%   \end{display}
% produces
%   \begin{display}{l}
% $y \in \seq{x_{ij}}$, where $i\inset{n}$, $j\inrange[0]{m}$.
%   \end{display}
% 
%    \begin{macrocode}
\newcommand{\seq}    [1]   {\curlybrackets{#1}}
\newcommand{\inset}  [2][1]{\in\{ #1,\ldots,#2 \}}
\newcommand{\inrange}[2][1]{ = #1,\ldots,#2}
%    \end{macrocode}
% 
%
% \subsection{Calculus}
%
% The calculus macros are relegated to auxiliary files, as I rarely
% need them.  
% 
% \subsubsection{Derivatives}
%
% We load the derivatives in if they are requested.
%    \begin{macrocode}
\if@derivatives
  \InputIfFileExists{cjwderiv.tex}{}{%
    \PackageWarning{cjwmath}{Option `cjwderiv.tex' not found.}
    \@@derivativesfalse}
\fi
%    \end{macrocode}
% This loads both simple and partial derivative macros.
%\iffalse
%</math>
%<*deriv>
%\fi
%
% The derivatives are all variations on the basic |\dd| macro, which
% should be fairly self explanatory.
%    \begin{macrocode}
\newcommand{\dd} [2]{\frac{d#1}{d#2}}
\newcommand{\ddt}[1]{\dd{#1}{t}}
\newcommand{\ddu}[1]{\dd{#1}{u}}
\newcommand{\ddv}[1]{\dd{#1}{v}}
\newcommand{\ddx}[1]{\dd{#1}{x}}
\newcommand{\ddy}[1]{\dd{#1}{y}}

\newcommand{\sdd} [2]{\frac{d^2#1}{d#2^2}}
\newcommand{\sddx}[1]{\sdd{#1}{x}}
\newcommand{\sddy}[1]{\sdd{#1}{y}}
\newcommand{\sddt}[1]{\sdd{#1}{t}}
\newcommand{\sddu}[1]{\sdd{#1}{u}}
\newcommand{\sddv}[1]{\sdd{#1}{v}}
%    \end{macrocode}
%
% \subsubsection{Partial derivatives}
%
% The partial derivatives are all variations on the theme of |\pard|,
% which is as |\dd|, replacing the $d$ with $\partial$.
%    \begin{macrocode}
\newcommand{\pard} [2]{\frac{\partial#1}{\partial#2}}
\newcommand{\pardx}[1]{\pard{#1}{x}}
\newcommand{\pardy}[1]{\pard{#1}{y}}
\newcommand{\pardz}[1]{\pard{#1}{z}}
\newcommand{\pardu}[1]{\pard{#1}{u}}
\newcommand{\pardv}[1]{\pard{#1}{v}}
\newcommand{\pardt}[1]{\pard{#1}{t}}

\newcommand{\spard} [2]{\frac{\partial^2#1}{\partial#2^2}}
\newcommand{\spardx}[1]{\spard{#1}{x}}
\newcommand{\spardy}[1]{\spard{#1}{y}}
\newcommand{\spardz}[1]{\spard{#1}{z}}
\newcommand{\spardu}[1]{\spard{#1}{u}}
\newcommand{\spardv}[1]{\spard{#1}{v}}
\newcommand{\spardt}[1]{\spard{#1}{t}}

\newcommand{\spardxy}[1]{\frac{\partial^2#1}{\partial x\partial y}}
\newcommand{\spardyx}[1]{\frac{\partial^2#1}{\partial y\partial x}}
\newcommand{\spardxz}[1]{\frac{\partial^2#1}{\partial x\partial z}}
\newcommand{\spardzx}[1]{\frac{\partial^2#1}{\partial z\partial x}}
\newcommand{\spardyz}[1]{\frac{\partial^2#1}{\partial y\partial z}}
\newcommand{\spardzy}[1]{\frac{\partial^2#1}{\partial z\partial y}}
%    \end{macrocode}
%\iffalse
%</deriv>
%<*math>
%\fi
%
% \subsubsection{Integrals}
%
% We load the integrals in if they are requested.
%    \begin{macrocode}
\if@integrals
  \InputIfFileExists{cjwinteg.tex}{}{%
    \PackageWarning{cjwmath}{Option `cjwinteg.tex' not found.}
    \@@integralsfalse}
\fi
%    \end{macrocode}
%\iffalse
%</math>
%<*integ>
%\fi
%
% The first macro is simply a variation of |\int| using the |\limits|
% macro. 
%    \begin{macrocode}
\def\integ{\mathop{\int}\limits}
%    \end{macrocode}
% Next we have a small shortcut for the differential at the end of an
% integral.  We work around \LaTeX's font encoding macro.
%    \begin{macrocode}
\alias\latex@d\d
  \renewcommand{\d}{\,d}
%    \end{macrocode}
% We have macros for double and triple integrals, with and without
% |\limits|.
%    \begin{macrocode}
\newcommand{\dint}{\int\!\!\!\int}
\newcommand{\dinteg}{\mathop{\int\!\!\!\int}\limits}
\newcommand{\tint}{\int\!\!\!\int\!\!\!\int}
\newcommand{\tinteg}{\mathop{\int\!\!\!\int\!\!\!\int}\limits}
%    \end{macrocode}
% To be honest, I have no idea why I wrote this one.  It is probably
% buried in a homework file of mine somewhere, but I'll be a fiddler
% crab if I can remember where\dots
%    \begin{macrocode}
\newcommand{\flushintlim}[1]{{\phantom{#1} #1}}
%    \end{macrocode}
%\iffalse
%</integ>
%<*math>
%\fi
%
% \subsection{Algebra}
%
% We define how to typeset an algebra.
%    \begin{macrocode}
\alias\alg\mathbbm
%    \end{macrocode}
%
% \subsubsection{Fields}
%
% A field will also be done in blackboard bold.
%    \begin{macrocode}
\alias\field\mathbbm
%    \end{macrocode}
% The following fields are defined.
%    \begin{macrocode}
\newcommand{\C}{\field{C}}      % Complex
\newcommand{\E}{\field{E}}      % Euclidean (also Evens)
%    \end{macrocode}
% Note that $\H$ is a \LaTeX{} accent, so we save it away before
% redefining it as a field.
%    \begin{macrocode}
\alias\latex@H\H                % Quaternions
  \renewcommand{\H}{\field{H}}	%   (Hamiltonian field)
\newcommand{\N}{\field{N}}	% Natural numbers
\newcommand{\Q}{\field{Q}}	% Rationals
\newcommand{\R}{\field{R}}	% Reals
% \newcommand{\Rn}[1][n]{\R^{#1}}
\newcommand{\Z}{\field{Z}}	% Integers
\newcommand{\pr}{\field{P}}	% Primes
%    \end{macrocode}
%
% \subsubsection{Groups}
%
% Remember |\NewMathOp|?  One use for it is in defining mathematical
% groups.  Here are a bunch.
%    \begin{macrocode}
% Groups are typeset as operators.
\NewMathOp           {\Aut}{Aut}	% Automorphisms
\NewMathOp           {\End}{End}	% Endomorphisms
\NewMathOp           {\GL}{GL}		% General Linear
\NewMathOp           {\Inn}{Inn}	% Inner products
\NewMathOp           {\Pin}{Pin}	% Pin
\NewMathOp           {\SL}{SL}		% Special Linear
\NewMathOp           {\SO}{SO}		% Special Orthogonal
\NewMathOp           {\SU}{SU}		% Special Unitary
\NewMathOp[\mathfrak]{\Sn}{S}		% Symmetric
\NewMathOp           {\Spin}{Spin}	% Spin
\NewMathOp           {\Sp}{Sp}		% Symplectic
\NewMathOp           {\Unit}{U\kern 0pt}% Unitary
\NewMathOp           {\Orth}{O\kern 0pt}% Orthogonal
\NewMathOp[\mathfrak]{\slin}{sl}        % Tangent group to SL
\NewMathOp[\mathfrak]{\so}{o\kern 0pt}  % skew orthogonal
\NewMathOp[\mathfrak]{\sp}{sp}          % skew symplectic
\NewMathOp[\mathfrak]{\su}{u\kern 0pt}  % skew hermitian
%    \end{macrocode}
%
% \subsubsection{Linear algebra}
%
% If matrices are to be typeset specially, we will use the |\mathcal| font.
%    \begin{macrocode}
\alias\mtx\mathcal
%    \end{macrocode}
% I have often seen the letter $\Theta$ used for the matrix of zeros.
% I like it that way.
%    \begin{macrocode}
\newcommand{\nullmtx}{\mtx\Theta}
%    \end{macrocode}
% Taken from Horn and Johnson, a matrix norm can be represented with a
% triple-bar delimiter.
%    \begin{macrocode}
\newcommand{\mnorm}[1]{%
  \left\vert\kern-0.9pt\left\vert\kern-0.9pt\left\vert #1
    \right\vert\kern-0.9pt\right\vert\kern-0.9pt\right\vert}
%    \end{macrocode}
% We define the Lie product of two matrices.
%    \begin{macrocode}
\newcommand{\lie}[1]{\squarebrackets{#1}}
%    \end{macrocode}
% There is an for the trace (Spur, auf Deutsch) of a matrix\dots
%    \begin{macrocode}
\NewMathOp{\Spur}{Spur}
\NewMathOp{\Tr}{Tr}
%    \end{macrocode}
% \dots as well as for diagonal matrices.
%    \begin{macrocode}
\NewMathOp{\Diag}{Diag}
%    \end{macrocode}
%
% This is a shortcut for putting delimiters around matrices.  With
% AMS-\LaTeX, we use an environment, taking as its two mandatory
% arguments the left and right delimiters, respectively.
%    \begin{macrocode}
\if@amsmath
  \newenvironment{arbmatrix}[2]%
    {\def\@tempa{#2}\left#1 \matrix}{\endmatrix \right\@tempa}
%    \end{macrocode}
% Without AMS, we use a command as does standard \LaTeX, and define
% some basic types.
%    \begin{macrocode}
\else
  \newcommand{\arbmatrix}[3]{\left#1 \matrix{#2} \right#3}
  \providecommand{\bmatrix}[1]{\arbmatrix[{#1}]}
  \providecommand{\vmatrix}[1]{\arbmatrix|{#1}|}
\fi
%    \end{macrocode}
%
% The next bit of code is used to enter sparse matrices which are
% often represented in the literature with an oversized zero marking
% the region of zeros.  This takes more than a bit of trickery in
% \LaTeX.  The oversized digit will be put in a box, which in most
% cases needs horizontal and/or vertical adjustment from the position
% where it is placed in the matrix by default.  The default vertical
% offset will be called |\numoffset|, and is set by default to the
% height of a |\Bigmathstrut|.
%    \begin{macrocode}
\newlength{\numoffset}
{\setbox0=\hbox{$\Bigmathstrut$}
 \@tempdima=0.8\ht0\relax
 \global\numoffset\@tempdima}
%    \end{macrocode}
% Occasionally, one might wish to use something other than a zero as
% the oversized digit.  We define a generic |\Number| macro to be
% used.  The usage is
%   \begin{display}{l}
% |\Number|\oarg{raise}\marg{num}
%   \end{display}
% where \meta{raise} is the amount by which the number is raised and
% \meta{num} is the number to be used.
%    \begin{macrocode}
\newcommand{\Number}[2][-\numoffset]{%
  \@tempdima=#1\relax
  \smash{\hbox{\raise\@tempdima\@bignumber{#2}}}}
%    \end{macrocode}
% The macros |\@bignumber| is called to do the dirty work of
% typesetting the number.
%    \begin{macrocode}
\newcommand{\@bignumber}[1]{\hbox{\LARGE$#1$}}
%    \end{macrocode}
% Now, the horizontal adjustment mentioned earlier usually refers to
% the need to have the large digit straddle two columns in a matrix.
% This is easily accomplished with |\multicolumn|.  Here things start
% to get ugly, though; |\multicolumn| must be the first thing after
% the |&| in the array.  But the reasonable way to include an optional
% argument to be passed through to |\Number| is to use the
% |\newcommand| feature, which ends up putting junk in the way---this
% is exactly the same problem which arose in writing |\mathbox|
% earlier.  Therefore, there are currently two separate commands, one
% which takes the optional argument, and one which doesn't.  I would
% really like to remedy this if I ever figure out how.
%    \begin{macrocode}
\def\bignumber    #1{\multicolumn{2}{c}{\Number{#1}}}
\def\Bignumber[#1]#2{\multicolumn{2}{c}{\Number[#1]{#2}}}
%    \end{macrocode}
% Here are some specific cases for using zero, as is most commonly the
% case.
%    \begin{macrocode}
\newcommand{\Zero}[1][-\numoffset]{\Number[#1]{0}}
\def\bigzero    {\bignumber{0}}
\def\Bigzero[#1]{\Bignumber[#1]{0}}
%    \end{macrocode}
% 
% From this we wish to construct various types of matrices.  Each
% variation will have two versions, depending on whether or not
% AMS-\LaTeX{} has been invoked.  Each version, though, has an
% optional argument which is what will be passed through as
% \meta{raise} to |\Bigzero|.  The names of each matrix are an attempt
% to indicate the layout.  For example, the command |\iidiagi| takes
% three mandatory arguments which will be the diagonal entries, the
% first two in the upper left, and the third in the lower right with
% |\ddots| separating them.  Likewise, we have |\idiagii| and
% |\idiagi|. 
%    \begin{macrocode}
\if@amsmath
  \newcommand{\iidiagi}[4][-\numoffset]{%       % 2     0       
    \begin{bmatrix}                             %   3           
       #2 &        &    \Bigzero[#1] \\         %     .         
          &     #3 &        &        \\         %       .       
      \Bigzero[#1] & \ddots &        \\         %   0     4     
          &        &        &    #4                             
    \end{bmatrix}}
  \newcommand{\idiagii}[4][-\numoffset]{%       % 2     0       
    \begin{bmatrix}                             %   .           
       #2 &        & \Bigzero[#1] \\            %     .         
          & \ddots &     &        \\            %       3       
      \Bigzero[#1] &  #3 &        \\            %   0     4     
          &        &     &    #4                                
    \end{bmatrix}}
  \newcommand{\idiagi}[3][-1.2pt]{%             % 2     0
    \begin{bmatrix}                             %   .
       #2 &         \Bigzero[#1] \\             %     .
          & \ddots  &            \\             %       .
      \Bigzero[#1]  &    #3                     %   0     3
    \end{bmatrix}}
\else
  \newcommand{\iidiagi}[4][-\numoffset]{%       % 2     0
    \matrix{%                                   %   3           
       #2 &        &    \Bigzero[#1] \\         %     .         
          &     #3 &        &        \\         %       .        
     \Bigzero[#1] & \ddots &        \\          %   0     4     
          &        &        &    #4}}                           
  \newcommand{\idiagii}[4][-\numoffset]{%                        
    \pmatrix{%                                  % 2     0       
       #2 &        & \Bigzero[#1] \\            %   .           
          & \ddots &     &        \\            %     .         
      \Bigzero[#1] &  #3 &        \\            %       3       
          &        &     &    #4}}              %   0     4
                                  %
  \newcommand{\idiagi}[3][-1.2pt]{%             % 2     0
    \pmatrix{%                                  %   .
       #2 &         \Bigzero[#1] \\             %     .
          & \ddots  &            \\             %       .
      \Bigzero[#1]  &    #3}}                   %   0     3
\fi                                             
%    \end{macrocode}
%
% We now wish to typeset the transpose of a matrix.  The most general
% form is
%   \begin{display}{l}
% |\@trans|\oarg{pre}\marg{post}
%   \end{display}
% which expands to `|^{|\meta{pre}|t|\meta{post}|}|'.  Next is
% |\trans| which takes a single optional argument for \meta{post} (no
% \meta{pre}).
%    \begin{macrocode}
\newcommand{\@trans}[2][]{^{#1\text{\normalfont\textsf{t}}#2}}
\newcommand{\trans} [1][]{\@trans[]{#1}}
%    \end{macrocode}
% Why?  I don't know---I needed |\trinv|, below, and decided to
% generalize.
%    \begin{macrocode}
\newcommand{\trinv}      {\@trans[-]{}}
%    \end{macrocode}
% For backwards compatibility, I have |\ct|\marg{mtx} to represent
% matrix \meta{mtx} as conjugated and transposed.
%    \begin{macrocode}
\newcommand{\ct}[1]{\conj{#1}\trans}
%    \end{macrocode}
%
% The next topic is vectors.  I prefer |\vec| to be logical markup as
% opposed to a specific accent.  Thus, I create an alias |\sarvec|
% (short arrow vector) for the original |\vec|, and another alias
% |\arvec| for a long arrow, which is just |\overrightarrow|.
%    \begin{macrocode}
\alias\sarvec\vec
\alias\arvec \overrightarrow
%    \end{macrocode}
% The actual typesetting I prefer for vectors (when I use anything at
% all) is boldface.  This requires the |\Mathbox| command defined
% earlier so that the argument can be set in a bold math version.
%    \begin{macrocode}
\renewcommand{\vec}[1]{\Mathbox{\boldmath}{#1}}
%    \end{macrocode}
% To typeset vectors in long form simply uses the |\matrix|
% command---but this depends, again, on whether AMS-\LaTeX{} is being
% used.  In either case, a single argument---the contents of the
% vector---is required.  Simply delimit with |\\| for column vectors
% and |&| for rows.
%    \begin{macrocode}
\if@amsmath
  \newcommand{\bvec}[1]{%
    \begin{bmatrix}#1\end{bmatrix}}
  \newcommand{\pvec}[1]{%
    \begin{pmatrix}#1\end{pmatrix}}
%    \end{macrocode}
% There are also two aliases for row vectors for backwards
% compatibility. 
%    \begin{macrocode}
  \alias\brvec\bvec
  \alias\prvec\pvec
\else  
  \newcommand{\bvec}[1]{\bmatrix{#1}}
  \newcommand{\pvec}[1]{\pmatrix{#1}}
% \newcommand{\bvec}[2][r]{%
%   \left[ \begin{array}{#1}#2\end{array} \right]}
% \newcommand{\pvec}[2][r]{%
%   \left( \begin{array}{#1}#2\end{array} \right)}
\fi
%    \end{macrocode}
% The null vector, like the null matrix, is given with $\theta$.
%    \begin{macrocode}
\newcommand{\nullvec}{\vec{0}}
%    \end{macrocode}
% Once we have vectors, we need dot products.  The simple version just
% puts its argument inside angled brackets.
%    \begin{macrocode}
\newcommand{\dotp}[1]{\anglebrackets{#1}}
%    \end{macrocode}
% If special vector notation is required, the two arguments should be
% separated by a comma (which should be the case anyway), and then
% each half is passed to |\vec|.
%    \begin{macrocode}
\newcommand{\vdotp}[1]{\@vdotp#1@@@}
\def\@vdotp #1,#2@@@{\dotp{\vec #1,\vec #2}}
%    \end{macrocode}
% 
% We define some other vector operators to go with the dot product.
% These are the curl, the divergence, and the Laplacian.  These are
% usually read as `del dot', `del cross', and `del squared', so the
% first thing to do is rename the |\nabla|(?).
%    \begin{macrocode}
\newcommand{\del}  {\vec\nabla}
%    \end{macrocode}
% \LaTeX{} defines |\div|, so we rename that and renew the command.
%    \begin{macrocode}
\alias\@@div\div
\renewcommand{\div}{\del\dot}
%    \end{macrocode}
% Finally, we have the other two.
%    \begin{macrocode}
\newcommand{\curl} {\del\cross}
\newcommand{\lapl} {\del^2}
%    \end{macrocode}
%
% In German texts, the linear hull is usually represented as a list of
% vectors in square brackets.
%    \begin{macrocode}
\alias\huelle\squarebrackets
%    \end{macrocode}
% 
% \subsection{Operators}
%
% This section is simply a gathering point for all sorts of
% mathematical operators---not in the |\NewMathOp| sense, like various
% groups defined above, but in the sense of mathematical doohickies
% which take one or two operands and give you something new.
%
% \subsubsection{Binary operators}
%
% What we have first is a whole bunch of names for the large, `x'-like
% times symbol.  In the case of specifying dimension (as in, a 4-by-3
% matrix), we declare it a |\mathord| so as not to invoke binary
% spacing.  Then |\mal| is simply German for `times', and |\cross| is
% the vector space (or group) product using the same symbol.
%    \begin{macrocode}
\newcommand{\by}{\mathord{\times}}
\alias\mal	\times
\alias\cross	\times
%    \end{macrocode}
% To indicate isomorphism, I have most often used an equals sign with
% a tilde above it.
%    \begin{macrocode}
\alias\iso	\simeq
%    \end{macrocode}
% This next one stretches the usefulness of aliasing by defining an
% operator for normal subgroups.
%    \begin{macrocode}
\alias\nsubgrp	\trianglelefteq
%    \end{macrocode}
% Next we specify a congruence symbol.
%    \begin{macrocode}
\realias\cong  	\equiv
%    \end{macrocode}
% In graph theory, we want a symbol for adjacency of nodes.
%    \begin{macrocode}
\alias\adj\leftrightarrow
%    \end{macrocode}
% We unconditionally define |\Box| to be a square operator symbol.
%    \begin{macrocode}
\providecommand{\Box}{}
\renewcommand{\Box}{\mathbin{\square}}
%    \end{macrocode}
% We give a number theoretic division relation, in English and
% German.
%    \begin{macrocode}
\newcommand{\teilt}{\mathbin{|}}
  \alias\divides\teilt
%    \end{macrocode}
% Once upon a time I wanted a `big dot' operator.
%    \begin{macrocode}
% \newcommand{\bdot}{\mathop{\lower0.33ex\hbox{\LARGE$\cdot$}}}
%    \end{macrocode}
% We can use \LaTeX's built-in |\stackrel| to create a definition
% relation. 
%    \begin{macrocode}
\newcommand{\defeq}{\stackrel{\text{def}}{=}}
%    \end{macrocode}
% The symbol I first saw used to indicate disjoint union was a union
% `cup' with a bar through the middle.  Using a naming convention
% similar to AMS-\LaTeX's |\Uplus| we get text and display versions.
%    \begin{macrocode}
\newcommand{\uminus}{%
  \,\,{\mathbin{\cup\kern-.6em{\raise.05em%
  \hbox{-\negthinspace-\kern-.25em-}}}}\,\,}
\newcommand{\Uminus}{%
  \mathop{\bigcup\kern-0.9em{\raise.05em%
  \hbox{-\negthinspace-\kern-.25em-}}}}
%    \end{macrocode}
% We define some handy names for various arrows.
%    \begin{macrocode}
\providecommand{\implies}{\;\Longrightarrow\;}
  \alias\then\implies
\if@amsmath
  \newcommand{\when}{\DOTSB \;\Longleftarrow \;}
\else
  \newcommand{\when}{\;\Longleftarrow \;}
\fi
%    \end{macrocode}
% The following can be used when tracing a series of implications
% through a multiline equation environment, for example.
%    \begin{macrocode}
\newcommand{\limplies}{\llap{$\implies$}\quad}
%    \end{macrocode}
% Based on \emph{The \TeX{}book}, I have written a `skewed' fraction,
% which uses a diagonal separator.
%    \begin{macrocode}
\newcommand{\sfrac}[2]{%
  \hbox{\kern 0.1em%
  \raise 0.5ex\hbox {\scriptsize$#1$}%
  \kern -0.1em $/$%
  \kern -0.15em%
  \lower 0.25ex\hbox {\scriptsize$#2$}}%
  \kern  0.2em}
%    \end{macrocode}
% If we are not using AMS-\LaTeX, the following well not yet be
% defined.
%    \begin{macrocode}
\providecommand{\tfrac}{\sfrac}
\providecommand{\dfrac}[2]{{{#1}\over{#2}}}
%    \end{macrocode}
%
%
% \subsubsection{Unary operators}
%
% I most often use the longer versions of various math accents, so I
% redefine them by default to be long.  The short ones are saved in a
% macro with identical name save for a prepended `s' (as we have
% already seen for |\arvec| and |\sarvec|).  The simple ones are bars,
% tildes, and hats.
%    \begin{macrocode}
\alias\sbar\bar
  \renewcommand{\bar}[1]{\overline{#1}}
\alias\stilde\tilde
  \alias\retilde\widetilde
\alias\shat\hat
  \realias\hat\widehat
%    \end{macrocode}
% We need something better than the default real- and imaginary-part
% macros. 
%    \begin{macrocode}
\renewcommand{\Im}{%
  \mathop{\mathfrak{Im}}}
\renewcommand{\Re}{%
  \mathop{\mathfrak{Re}}}
%    \end{macrocode}
% Complex conjugation is usually denoted by a bar.
%    \begin{macrocode}
\alias\conj  \bar
%    \end{macrocode}
% Inversion of various types is used often enough to warrant a control
% sequence.
%    \begin{macrocode}
\newcommand{\inv}{^{-1}}
%    \end{macrocode}
% To denote power sets, I have used to different alternatives.  The
% default is the standard |\wp| symbol---I don't know what it is
% supposed to be used for, but it can be modified for the task.  On
% the other hand, if we have a real math script font (as one might
% have if using my \pkg{callig} style\dots) we will certainly use
% that. 
%    \begin{macrocode}
\@ifundefined{mathscript}
  {\newcommand{\Pow}{\raise 0.4ex\Mathbox{\Large}{\wp}}}
  {\NewMathOp[\mathscript]{\Pow}{P}}
%    \end{macrocode}
% And what macro would be complete without a German alias?  (Auf
% Deutsch, die Potenzmenge.)
%    \begin{macrocode}
\alias\Pot\Pow
%    \end{macrocode}
% We can leave the letter `\/I\/' to computer scientists who don't
% know how to write an indicator function.  For our purposes, we want
% the neat-o-keen blackboard bold font.
%    \begin{macrocode}
\newcommand{\1}{\mathbbm{1}}
%    \end{macrocode}
%
% Next we have some trigonometric shortcuts.
%    \begin{macrocode}
\alias\acos\arccos
\alias\asin\arcsin
\alias\atan\arctan
%    \end{macrocode}
% Using our generic bracketing macros from earlier, we have absolute
% value, cardinality (order of a set), cyclic generators, and norms.
%    \begin{macrocode}
\alias\abs \vertbrackets
\alias\ord \abs
\alias\cyc \anglebrackets
\alias\norm\Vertbrackets
%    \end{macrocode}
% 
% Multiple sums are recurrent enough (no pun intended \smiley) to get
% macros.  We have double sums, triple sums, and $n$-fold sums.
%    \begin{macrocode}
\newcommand{\dsum}{\mathop{\sum\sum}\limits}
\newcommand{\tsum}{\mathop{\sum\sum\sum}\limits}
\newcommand{\nsum}{\mathop{\sum\sum\cdots\sum}\limits}
%    \end{macrocode}
%
% The next two macros indicate monotone limits, respectively ascending
% (mnemonic `limit up') and descending (you guessed it---`limit
% down').
%    \begin{macrocode}
\NewMathOp*{\ulim}{lim\raise0.4ex\mathbox{\mathord{\smash{\uparrow}}}}
\NewMathOp*{\dlim}{lim\raise0.4ex\mathbox{\mathord{\smash{\downarrow}}}}
%    \end{macrocode}
%
% 
% Finally we have the miscellany, where we can really go to town with
% |\NewMathOp|!  These should be pretty clear, unless you don't do
% math in German, in which case some will be pretty odd.
%    \begin{macrocode}
\NewMathOp*{\argmax}{arg\,max}          % arg min
\NewMathOp*{\argmin}{arg\,min}          % arg min
\NewMathOp {\Aff}   {Aff}               % Affine hull
\NewMathOp {\Bild}  {Bild}              % Bild
\NewMathOp {\Cone}  {Cone}              % Cone
\NewMathOp {\Conv}  {Conv}              % Convex hull
\NewMathOp {\Core}  {Core}              % Fuzzy set core
\NewMathOp {\diam}  {diam}              % diameter
\NewMathOp {\dom}   {dom}               % Domain
\NewMathOp {\Epi}   {Epi}               % Epigraph
\NewMathOp*{\esssup}{ess\,sup}          % Essential supremum
\NewMathOp {\fl}    {fl}                % float-point
\NewMathOp {\ggT}   {ggT}               % ggT
\NewMathOp {\Grad}  {Grad}              % Grad
\NewMathOp {\Hypo}  {Hypo}              % Hypograph
\NewMathOp {\Int}   {Int}               % Interior
\NewMathOp {\Kern}  {Kern}              % Kernel
\NewMathOp {\kgV}   {kgV}               % kgV
\NewMathOp {\Lin}   {Lin}               % Linear hull
\NewMathOp {\lcm}   {lcm}               % LCM
\NewMathOp {\Ord}   {Ord}               % order
\NewMathOp {\proj}  {proj}              % Projection
\NewMathOp {\Rang}  {Rang}              % Rang
\NewMathOp {\range} {range}             % Range
\NewMathOp {\Rank}  {Rank}              % Rank
\NewMathOp {\rot}   {rot}               % Rotation
\NewMathOp {\Span}  {Span}              % Span
\NewMathOp {\val}   {val}               % value
%    \end{macrocode}
% 
% 
% \subsection{Physics}
%
% Now, since physics is a subset of mathematics, physics macros are
% invoked from within the math macro file.
%    \begin{macrocode}
\if@physics
  \InputIfFileExists{cjwphys.tex}{}{%
    \PackageWarning{cjwmath}{Option `cjwphys.tex' not found.}
    \@@physicsfalse}
\fi
%    \end{macrocode}
%\iffalse
%</math>
%<*phys>
%\fi
%
% The only thing really specific to physics that I ever used---meaning
% not applicable in any more general mathematical setting---was the
% bra/ket notation.  Here we have bras (br\ae?), kets, and brakets,
% the latter of which bear uncoincidental resemblance to the |\set|
% macro.
%    \begin{macrocode}
\newcommand{\bra}[1]{\left\langle #1 \right|\,}
\newcommand{\ket}[1]{\,\left| #1 \right\rangle}

\newcommand{\braket}[2]{%
  \newdimen\@tempdimd%
  \setbox0=\mathbox{#1}\@tempdima=\ht0 \@tempdimb=\dp0%
  \setbox0=\mathbox{#2}\@tempdimc=\ht0 \@tempdimd=\dp0%
  \ifdim\@tempdimc > \@tempdima
    \@tempdima=\@tempdimc
  \fi
  \ifdim\@tempdimd > \@tempdimb
    \@tempdimb=\@tempdimb
  \fi
  \def\@tempa{\vrule width0pt height\@tempdima depth\@tempdimb}
  \left.\left\langle \@tempa{#1} \,\right|\,{#2} \right\rangle }
%    \end{macrocode}
%\iffalse
%</phys>
%<*math>
%\fi
%
%
% \subsection{Probability}
%
% Here comes that |\NewMathOp| thingie again.  First thing is to
% define some standard probabilistic operators, which really need to
% be typeset in an operator font in order not to look horrible.
%    \begin{macrocode}
\NewMathOp{\Prob} {P}                   % Probability operator
\NewMathOp{\Corr} {Corr}                % Correlation
\NewMathOp{\Cov}  {Cov}                 % Covariance
\NewMathOp{\Expct}{E}                   % Expectation
\NewMathOp{\SD}   {SD}                  % Standard Deviation.
\NewMathOp{\Var}  {Var}                 % Variance
%    \end{macrocode}
% Here is a macro to put inside of some of those operators where
% conditional events are being considered.
%    \begin{macrocode}
\newcommand{\given}{\,|\,}
%    \end{macrocode}
% Usually a single tilde, which as an operator bears the name of
% |\sim| in \LaTeX, indicates a distribution.  Hence, we make an
% alias.
%    \begin{macrocode}
\alias\distrib\sim
%    \end{macrocode}
% And coming back to |\NewMathOp|, we define some standard
% distributions\dots
%    \begin{macrocode}
\NewMathOp{\Bin} {Bin}                  % Binary dist.
  \newcommand{\Nbin}{-\!\Bin}           % Negative Binom.
\NewMathOp{\Exp} {Exp}                  % Exponential dist.
\NewMathOp{\Geom}{Geom}                 % Geometric dist.
\NewMathOp{\Norm}{Norm}                 % Normal dist.
\NewMathOp{\Poi} {Poi}                  % Poisson dist.
\NewMathOp{\Unif}{Unif}                 % Uniform dist.
%    \end{macrocode}
% \dots and the normal density and distribution functions (which might
% also be represented as $\Phi$ and $\phi$).
%    \begin{macrocode}
\NewMathOp[\mathfrak]{\Ndens}{N}
\NewMathOp[\mathfrak]{\Ndist}{n}
%    \end{macrocode}
% The last thing to do is create some macros for probabilistic modes
% of convergence.  We go, again, from the general to the specific.
%    \begin{macrocode}
\NewMathOp*{\@mapsto}{\mapstochar\rightarrow}
\newcommand{\@probconv}[1]{\mathrel{\@mapsto\limits^{1}}}
  \newcommand{\asconv}{\@probconv{a.s.}}        % Almost sure conv.
  \newcommand{\inprob}{\@probconv{P}}           % Conv. in probability
  \newcommand{\inlaw} {\@probconv{L}}           % Conv. in law
  \newcommand{\vague} {\@probconv{v}}           % Vague conv.
%    \end{macrocode}
%
% \iffalse
%
%</math>
%
% \fi
%
%
% \section{Units}
%
% \iffalse
%
%<*units>
%
% \fi
%
% The package \pkg{cjwunits} simply standardizes how to typeset units
% (or dimensions---things such as seconds, meters, and so forth).
% Most of the work is done by defining a pretty simple macro,
% |\unit|.  The rest is just a collection of standard units which may
% be invoked (meaning ones I have used, and therefore stuck into the
% file).
%
% \subsection{Package initialization}
%
% The initialization does most everything.  We first specify a font
% for the unit types.
%    \begin{macrocode}
\newcommand{\unitfont}{\operator@font}
%    \end{macrocode}
% Now the workhorse of the package is defined.  It is pretty
% foolproof, in that it can be invoked in or out of math, may or may
% not be followed by explicit space, and the font as defined above is
% pretty customizable.
%    \begin{macrocode}
\newcommand{\unit}[1]{\ensuremath{\,{\unitfont{#1}\kern\z@}}\xspace}
%    \end{macrocode}
%
% Now come the examples.
%
% \subsection{Distance}
%    \begin{macrocode}
\newcommand{\ang} {\unit{\AA}}                  % angstroms
  \alias\Ao\ang
\newcommand{\cm}  {\unit{cm}}                   % centimetres
\newcommand{\inch}{\unit{in}}                   % inches
\newcommand{\km}  {\unit{km}}                   % kilometres
\newcommand{\mi}  {\unit{mi}}                   % miles
\newcommand{\m}   {\unit{m}}                    % metres
%    \end{macrocode}
%
% \subsection{Electricity and magnetism}
%
%    \begin{macrocode}
\newcommand{\Hz}  {\unit{Hz}}                   % herz
\newcommand{\J}   {\unit{J}}                    % joules
\newcommand{\V}   {\unit{V}}                    % volts
\newcommand{\eV}  {\unit{eV}}                   % electron volts
\newcommand{\erg} {\unit{erg}}                  % ergs
%    \end{macrocode}
%
% \subsection{Mass}
%
%    \begin{macrocode}
\newcommand{\amu} {\unit{amu}}                  % atomic mass units
\newcommand{\gram}{\unit{g}}                    % grams
\newcommand{\kg}  {\unit{kg}}                   % kilograms
\newcommand{\Ton} {\unit{T}}                    % tons
\newcommand{\kT}  {\unit{kT}}                   % kilotons
\newcommand{\MT}  {\unit{MT}}                   % megatons
%    \end{macrocode}
%
% \subsection{Thermodynamics}
%
%    \begin{macrocode}
\newcommand{\kelv}{\unit{K}}                    % kelvins
%    \end{macrocode}
%
% \subsection{Time}
%
% It seems that |\sec| already means secant, so we need a preservation
% and renewal here.
%    \begin{macrocode}
\alias\secant\sec
\renewcommand{\sec} {\unit{s}}                  % seconds
%    \end{macrocode}
%
% \subsection{Velocity}
%
%    \begin{macrocode}
\newcommand{\cee} {\unit{c}}                    % speed o' light
%    \end{macrocode}
%
% \iffalse
%
%</units>
%
% \fi