% \iffalse -*- LaTeX -*-
%
%   This is file `cjw-ltr.dtx'.  You can run this file through LaTeX2e
%   to get a .dvi file of documentation.  The file `cjw-ltr.ins' should
%   have come with this file.  Run it through LaTeX2e to extract the
%   actual class file.
%
% \fi
\def\fileversion{0.9}
\def\filedate{1997/01/01}
%% \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{592}
%
% \iffalse
%
%<*driver>

\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{cjw-ltr.dtx}
    [\filedate\space v\fileversion\space
     Modified Letter Class for LaTeX2e---CJW]

\documentclass{ltxdoc}

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

\begin{document}
  \DocInput{cjw-ltr.dtx}
\end{document}
%</driver>
% \fi
%
% \DeclareRobustCommand{\cseq}[1]{\texttt{\bslash#1}}
% \DeclareRobustCommand{\pkg} [1]{\textsf{#1}}
% \DeclareRobustCommand{\env} [1]{\textsf{#1}}
%
% \providecommand{\ie}{\emph{i.e.},\ }
%
% \renewcommand{\thefootnote}{\fnsymbol{footnote}}
%
% \hyphenation{white-space}
%
% \title{The \pkg{cjw-ltr} Class\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 recently made the change to \LaTeXe{} after some years of
% dedication to \PlainTeX{} and that code which I had already
% written for it.  Among that code were macros for writing letters.
% Since I am studying in Germany this year, I had also written a set
% of macros for writing proper letters according to accepted German
% format.
%
% After switching to \LaTeX, I of course gave the \pkg{letter} class a
% try.  I didn't like some of the default behaviour that the class
% produces.  Furthermore, there was no support for writing German
% letters.  I am aware that a style file \pkg{dinbrief} exists for
% \LaTeX{} 2.09 or \LaTeXe{} in compatibility mode, but I would prefer
% to use something exclusively \LaTeXe.  Since I planned on doing some
% cosmetic alterations to the basic \pkg{letter} class anyway, I
% figured it wouldn't be too much extra to include the capability of
% formatting German letters as well.
%
% So, this is what I have come up with.  Feel free to e-mail me
% comments, suggestions, bugs, etc.
%
%
% \section{Creating Letters}
%
% \DescribeMacro{\letterskip}
% The first problem that I had with the \pkg{letter} class was
% spacing.  I do not like having the paragraphs of my letters
% unindented and separated by white space.  This poses a problem since
% the vertical space between the components of the letter are defined
% (nay, \emph{hard-wired}) as multiples of \cseq{parskip}.  Therefore,
% all vertical space has been defined in terms of \cseq{letterskip}, a
% length which is set initially to 0.7\,em, which happens to be the
% \pkg{letter} class's default value for \cseq{parskip}.
%
% \subsection{Standard Letters}
%
% \DescribeEnv{letter}
% \DescribeMacro{fax}
% American format letters are still delineated by the \env{letter}
% environment.  No changes have been made here; the single mandatory
% argument (which may be left empty) is still the address of the
% recipient.  I have, however, added a macro \cseq{fax}, analagous to
% \cseq{telephone}, for including a fax number in the return address.
% If the recipient's fax is also desired, it should probably just be
% included in the argument to the \env{letter} environment, perhaps
% using the \cseq{faxlabel} macro, as well (see below).
%
% Now, one of the things that I have always been taught about proper
% business letters is that the closing and the sender's address should
% line up, and be as far right as possible.  The standard \pkg{letter}
% class does not do this; instead, the address is set as far right as
% possible and the closing begins \cseq{indentedwidth} from the right
% margin.  By default, this is exactly in the middle of the page.  I
% can not express satisfactorily just how ugly and unbalanced this
% seems to me.
% \DescribeMacro{\addresswidth}
% So, first I have \cseq{let} the length \cseq{indentedwidth} to the slightly
% more intuitive \cseq{addresswidth}.  When the letter's \cseq{opening} is
% declared, \cseq{addresswidth} is fixed at the size of the return
% address.  Both the sending address and the closing will be set
% at in a box of width \cseq{addresswidth}; the box is flush right,
% the material within the box is flush left.
%
% \DescribeMacro{\opening}
% The \cseq{opening} macro still takes the text of the opening as its one
% argument, and still begins the letter by typesetting the addresses
% and date.  There are a few differences in the typesetting, though.
% First, if a \cseq{telephone} command has been entered, the number will
% be set as the last line of the address.  Then comes the skip between
% the address and the date.  This skip is rather smaller that that
% provided by the \pkg{letter} class.  I found this to be 
% preferable. Then come the recipient's address and the greeting.
% After these are typeset, the \cseq{parindent} is set to 20\,pt and the
% \cseq{parskip} to 0\,pt plus 1\,pt.  The values can be reset after the
% \cseq{opening} call and before the text of the body if such is desired.
%
% \DescribeMacro{\closing}
% The only change to the closing macro is the substitution of
% \cseq{letterskip} for the original \cseq{medskipamount}.  This means that
% all vertical space in a letter---between address and date and
% recipient's address, between address and greeting, etc.---are
% proportional.  I considered defining each of those quantities to be
% their own macro, such as \cseq{beforedateskip}, \cseq{beforerecipientskip},
% and so forth, but that seemed a little bit excessive.  If, however,
% such flexibility is desired, feel free to ask for it.
%
% \subsection{German Letters}
%
% \DescribeEnv{brief}
% \llap{\footnotemark}\footnotetext{Dies soll wirklich auf Deutsch
%   sein, oder?  Das hatte ich betrachtet, aber es schien mir ein
%   bi\ss chen durcheinander, die beiden Sprachen in dieser
%   Dokumentation zu mischen.  Wenn jemand die \"Ubersetzung will,
%   k\"onnte er mich fragen.  Anderseits ist jeder frei, die
%   \"Ubersetzung selbst zu erledigen.}^^A%
% The environment for a German letter is, appropriately enough, named
% \env{brief} (the German word for letter).  As for |begin{letter}|,
% the invocation takes the recipient's address as the one mandatory
% argument.  However, in standard format, the address line containing
% the \emph{Postleitzahl} (zip code, postal code---whatever) and the
% city is separated by a bit of whitespace from the rest of the
% address.  Thus, whereas other lines of the address are delineated
% by the |\\| macro, the sequence |!!| indicates the beginning of the
% PLZ.  Thus, my former address would most likely be entered as:
%   \begin{verbatim}
% \begin{brief}{%
%   Herrn                \\
%   Colin J. Wynne       \\
%   Klosterweg 28 / L110 !!
%   76131 Karlsruhe}
% \end{verbatim}
%
% \DescribeMacro{\totitle}
% \DescribeMacro{\toPLZ}
% I have not included any macros for creating mailing labels---other
% than the standard macros from the \pkg{letter} class.  However, if
% someone feels the need to write such, then the following is
% significant.  For a standard letter, the first line is taken as the
% recipient's `title'.  This can be a proper academic or professional
% title, or, more commonly, simply a polite \emph{Herrn}, as in the
% example above.  This is stored in the macro \cseq{totitle}.  The PLZ
% information (everything in the argument after |!!|) is stored in
% \cseq{toPLZ}.  These complement the standard \cseq{toname} and \cseq{toaddress}.
% I would add appropriate macros myself, but I have no facilities for
% printing mailing labels to check the result.  I imagine, though,
% that setting
%   \begin{verbatim}
% \edef\toname{\totitle \\ \toname}
% \edef\toaddress{\toaddress \\ \toPLZ}
%   \end{verbatim}
% would allow existing labelling functions to suffice.  (\cseq{edef} to
% avoid a recursive definition, of course.)
%
% \DescribeMacro{\ort}
% \DescribeMacro{\datum}
% \DescribeMacro{\heute}
% \DescribeMacro{\absender}
% \DescribeMacro{\telefon}
% \DescribeMacro{\unterschrift}
% German equivalents are allowed for the standard information
% providing macros.  \cseq{ort} is equivalent to \cseq{location}, and can be
% used to provide the place name on the dateline.  The date itself can
% be entered with the \cseq{datum} command, and the \cseq{heute} macro
% produces the current date in German format.  Thus, the input
% |\ort{Karlsruhe} \datum{\heute}| could produce the dateline
% `Karlsruhe, den 14. Mai 1995'
% at the top of the letter.  \cseq{absender} is used as \cseq{address} to
% indicate the sender's address, with \cseq{telefon} to provide a
% telephone number, and \cseq{fax} is of course the same as in
% English.  Finally, \cseq{unterschrift} provides the signature after
% the closing.
% \DescribeMacro{\betreff}
% \DescribeMacro{\bezug}
% Commands are also given for entering the optional \emph{Betreff} and
% \emph{Bezug} information.  A note to purists: one should include
% both or neither of these lines.  By default, the labels ``Betreff''
% and ``Bezug'' are printed at the beginning of their respective
% lines.  The actual label (including an empty label) can be entered
% as an optional argument to the \cseq{betreff} or \cseq{bezug} commands.
%
% \DescribeMacro{\anrede}
% \DescribeMacro{\gruss}
% The opening and closing of a letter are called by macros named for
% the German equivalents to \cseq{opening} and \cseq{closing}, namely
% \cseq{anrede} and \cseq{gruss}.
%
% \DescribeMacro{\anlage}
% Enclosures are indicated by the \cseq{anlage} command, which calls the
% standard \cseq{encl} macro.  \cseq{anlage} takes an optional argument,
% namely the \cseq{enclname} macro, which is used to label the enclosures.
% By default, ``Anlage'' is the label.  Since multiple enclosures are
% fairly standard, one can enter simply `n' (that is,
% |\anlage[n]|\meta{enclosures}) and produce the expected label
% ``Anlagen.''
%
%
% \StopEventually{\PrintChanges\PrintIndex}
%
% \iffalse
%<*class>

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{cjw-ltr}
    [\filedate\space v\fileversion\space
	 Modified Letter Class for LaTeX2e---CJW]

% \fi
%
% \section{The Code}
%
% The very first thing to do is to include the file |letter.cls|,
% since most of what's in there is very good, and I don't want to
% have to rewrite it and bloat this file.  We make sure as well that
% it inherits any options.
%    \begin{macrocode}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{letter}}
\ProcessOptions

\LoadClass{letter}
%    \end{macrocode}
% Now we can start to change things.  I think the default \cseq{headsep}
% is too large; so, we will make it a bit smaller.
%    \begin{macrocode}
\setlength\headsep   {25\p@}
%    \end{macrocode}
% Next, we provide the length that will be used for vertical space
% within a letter.  We initialise it to a reasonable value.
%    \begin{macrocode}
\newlength{\letterskip}
  \setlength{\letterskip}{0.7em}
%    \end{macrocode}
%
% \subsection{Standard Letters}
%
% \begin{macro}{\addresswidth}
% We first declare the length \cseq{addresswidth}, which is used to
% determine how far from the right margin the sender's adress and the
% closing should be set.  Since the \pkg{letter} class uses the
% \cseq{indentedwidth} length to help place the sender's address, we
% will simply recycle that length for our own purposes.
%    \begin{macrocode}
\let\addresswidth\indentedwidth
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\faxlabel}
% \begin{macro}{\tellabel}
% If a fax number is included, it should be labeled so as not to be
% confused with a telephone number.  The labels (appropriate to both
% German and English) will simply be `Tel:' and `Fax:'.  But, in the
% interest of \ae{}sthetics, we want the printed versions to have the
% same width, so that the actual numbers line up nicely.  Since `Fax:'
% is clearly the wider label, we use it to determine the width we
% want.
%    \begin{macrocode}
\newlength\lblwd
{\setbox0=\hbox{Fax:\enskip}\global\setlength{\lblwd}{\wd0}}
\newcommand*{\faxlabel}{\hbox to\lblwd{Fax:\enskip\hfil}}
\newcommand*{\tellabel}{\hbox to\lblwd{Tel:\enskip\hfil}}
%    \end{macrocode}
% \end{macro}
% \end{macro}

% \begin{macro}{\fax}
% \begin{macro}{\check@iffax}
% The \cseq{fax} command simply sets a global placeholder.
%    \begin{macrocode}
\newcommand*{\fax}[1]{\def\faxnum{#1}}
  \fax{}
%    \end{macrocode}
% The \cseq{check@iffax} macro inserts the labels if appropriate.
%    \begin{macrocode}
\def\check@iffax{%
  \ifx\@empty\faxnum\else
    \edef\faxnum{\protect\faxlabel\faxnum}
    \ifx\@empty\telephonenum\else
      \edef\telephonenum{\protect\tellabel\telephonenum}
  \fi\fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\opening}
% The \cseq{opening} macro will collect all information for the
% \env{letter} environment and begin the typesetting.  First, we
% calculate the actual width of the given address.  
%    \begin{macrocode}
\def\opening#1{%
%    \end{macrocode}
% The first step is to determine what actual address information we
% have.  We will figure this out and put it into a placeholder.  If a
% fax number is included, we will want to use labels for telephone and
% fax.
%    \begin{macrocode}
 \check@iffax
  \def\from@address{%
%    \end{macrocode}
% We see if a return address was supplied.  If not, we simply set
% the date.
%    \begin{macrocode}
    \ifx\@empty\fromaddress%
      \@date%
%    \end{macrocode}
% If so, we typeset the address including a telephone number if one is
% supplied.  Then comes a bit of whitespace and the date.
%    \begin{macrocode}
    \else% home address
      \fromaddress%
      \ifx\@empty\telephonenum\else%
        \\ \telephonenum%
      \fi%
      \ifx\@empty\faxnum\else%
        \\ \faxnum%
      \fi%
      \\*[\letterskip]\@date%
    \fi}
  \setbox0=\hbox{%
    \begin{tabular}{l}\from@address\end{tabular}}
%    \end{macrocode}
% With these values we set out global value for \cseq{addresswidth}.
%    \begin{macrocode}
  \global\setlength{\addresswidth}{\wd0}
%    \end{macrocode}
% With no address, we want the |firstpage| pagestyle.
%    \begin{macrocode}
  \ifx\@empty\fromaddress
    \thispagestyle{firstpage}%
%    \end{macrocode}
% With one, we want the |empty| pagestyle for the first page.
%    \begin{macrocode}
  \else
    \thispagestyle{empty}
  \fi
%    \end{macrocode}
% In either case, we fill horizontally and dump the box with the
% address information.
%    \begin{macrocode}
  \noindent\hfill\box0
  \par
%    \end{macrocode}
% After the date comes some more whitespace and the recipient---
%    \begin{macrocode}
  \vspace{2\letterskip}%
  {\raggedright\toname\\ \toaddress\par}%
%    \end{macrocode}
% ---then more whitespace and the text of the greeting.  Note that all
% of the whitespace is given in terms of \cseq{letterskip}.
%    \begin{macrocode}
  \vspace{2\letterskip}%
  \noindent#1%
%    \end{macrocode}
% Finally, we reset the values of \cseq{parindent} and \cseq{parskip} and
% inhibit a break before the body.  (What set of addresses would make
% \TeX{} \emph{want} to break after the greeting?)
%    \begin{macrocode}
  \setlength{\parindent}{20\p@}
  \setlength{\parskip}{0\p@ \@plus\@ne\p@\relax}
  \par\nobreak}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\closing}
% The \cseq{closing} macro is unchanged from the \pkg{letter} class,
% except for the change from \cseq{parindent} to \cseq{letterskip} and
% the use of \cseq{addresswidth} in determining the box size.
%    \begin{macrocode}
\long\def\closing#1{\par\nobreak\vspace{2\letterskip}%
  \stopbreaks
  \noindent\hfill
  \parbox{\addresswidth}{\raggedright%
       #1\\[6\letterskip]%
       \ifx\@empty\fromsig
           \fromname
       \else
	   \fromsig
       \fi\strut}
   \par}
%    \end{macrocode}
% \end{macro}
%
% \subsection{German Letters}
%
% First, we \cseq{let} several appropriate macros for German usage.
%    \begin{macrocode}
\let\unterschrift \signature
\let\absender     \address
\let\ort          \location
\let\telefon      \telephone
\let\datum        \date
%    \end{macrocode}
% \begin{macro}{\heute}
% Here are some simple definitions which I use in my own macro files.
%    \begin{macrocode}
\newcommand{\theday}{\number\day\relax}
\newcommand{\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}
\newcommand{\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}
\newcommand{\theyear}{\number\year\relax}
%    \end{macrocode}
% From these we can construct a German date macro, \cseq{heute}.
%    \begin{macrocode}
\newcommand{\heute}{den~\theday.\ \themonat\ \theyear}
%    \end{macrocode}
% These are also useful if one prefers a different (\ie date first)
% format for the \cseq{today} macro.
% \end{macro}
%
% \begin{macro}{\betreff}
% \begin{macro}{\bezug}
% Next come the macros for the additional information which may be
% included in the headers of a German letter.
% \changes{v0.5}{1995/06/10}{Fixed a bug (incorrect macro parameter)
%   in \cseq{betreff} and \cseq{bezug}.}
%    \begin{macrocode}
\newcommand{\betreff}[2][Betreff]{%
  \def\betreffname{#1}\long\def\@betreff{#2}}
\newcommand{\bezug}[2][Bezug]{%
  \def\bezugname{#1}\long\def\@bezug{#2}}
%    \end{macrocode}
% These are initialised to be empty.
%    \begin{macrocode}
\betreff[]{}
\bezug[]{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{environment}{brief}
% Now comes the \env{brief} environment itself.  German letters are
% suppose to use unindented and separated paragraphs, so we will set
% the proper values as soon as the environment is entered.
%    \begin{macrocode}
\long\def\brief#1{%
  \newpage
  \setlength{\parindent}{0pt}
  \setlength{\parskip}{0.7em}
%    \end{macrocode}
% Further initialisations are taken from the \cseq{letter} macro.
%    \begin{macrocode}
    \if@twoside \ifodd\c@page
                \else\thispagestyle{empty} \hbox{}\newpage\fi
    \fi
    \c@page\@ne
    \interlinepenalty=200 % Smaller than the TeXbook value
%    \end{macrocode}
% Since the supplied argument has more information in it than that
% given to a \env{letter} environment, we must have our own equivalent
% to the \pkg{letter} class's |\@processto|.
%    \begin{macrocode}
    \@prozessan{\leavevmode\ignorespaces #1}
%    \end{macrocode}
% Lastly, we make the default date a German one.
%    \begin{macrocode}
    \date{\heute}}
%    \end{macrocode}
% \begin{macro}{\@prozessan}
% \changes{v0.5}{1995/06/10}{The \cseq{@prozessan} macro and its
%   subprocesses completely rewritten, as the previous version (v0.1)
%   was very broken.}
% The address processing is based on the |\@processto| macro from
% \pkg{letter.cls}.  We call the first subprocess, |\@xproz|, to fetch
% the PLZ part of the address.
%    \begin{macrocode}
\long\def\@prozessan#1{%
  \@xproz #1!!@@@%
%    \end{macrocode}
% If there is a PLZ, the first test includes an extra occurrence of
% |!!| in the \cseq{toPLZ} macro.  So, we call |\@xproz| again without the
% extra characters (which were necesary to make sure that we didn't
% get a `usage doesn't match definition' error the first time around).
%    \begin{macrocode}
  \ifx\@empty\toPLZ\else\@xproz #1@@@\fi%
%    \end{macrocode}
% The |\@xproz| macro has now stored all the address parts before the
% PLZ in |\@tempa|.  Now there are up to three different parts that
% may be in |\@tempa| which we will try to separate out.  We use
% \cseq{expandafter} in order that the tokens within |\@tempa| get
% properly considered.
%    \begin{macrocode}
  \expandafter\@yproz \@tempa\\@@@%
%    \end{macrocode}
% The |\@yproz| splits the input into |\@tempb|, the part before the
% first linebreak, and |\@tempc|, the rest.  If the second part, that
% in |\@tempc|, is empty, then we want to set the third part,
% |\@tempd|, to be empty, too.
%    \begin{macrocode}
  \ifx\@empty\@tempc
    \let\@tempd\@empty
%    \end{macrocode}
% Otherwise, we call |\@zproz| to further subdivide the address input.
%    \begin{macrocode}
  \else
    \expandafter\@zproz \@tempa\\@@@%
%    \end{macrocode}
% If there is a third part, |\@tempd|, we have the same problem with
% extra characters as above in \cseq{toPLZ}.  We call |\@zproz| one more
% time in order to read |\@tempd| correctly.
%    \begin{macrocode}
    \ifx\@empty\@tempd
      \else
      \expandafter\@zproz \@tempa{}@@@%
    \fi
  \fi
%    \end{macrocode}
% Now we need to decide what to call whichever address pieces actually
% exist.  Obviously, if everything back to |\@tempb| was empty, all of
% the address parts should be likewise.
%    \begin{macrocode}
  \ifx\@empty\@tempb
    \let\totitle\@empty \let\toname\@empty \let\toaddress\@empty
  \else
%    \end{macrocode}
% Now we have at least one address part.  If that is the only one, it
% is most certainly not a title, so \cseq{totitle} must be set empty.
%    \begin{macrocode}
    \ifx\@empty\@tempc
      \let\totitle\@empty
%    \end{macrocode}
% One line with a PLZ is almost assuredly an address proper.  Without
% a PLZ it is probably a name.
%    \begin{macrocode}
      \ifx\@empty\toPLZ
        \let\toname\@tempb \let\toaddress\@empty
      \else
        \let\toname\@empty \let\toaddress\@tempb
      \fi
%    \end{macrocode}
% If |\@tempb| and |\@tempc| contain something, but |\@tempd| is
% empty, the two lines should be name and address.
%    \begin{macrocode}
    \else
      \ifx\@empty\@tempd
        \let\totitle\@empty \let\toname\@tempb \let\toaddress\@tempc
%    \end{macrocode}
% The last option is that title, name and address are all present.
%    \begin{macrocode}
      \else
        \let\totitle\@tempb \let\toname\@tempc \let\toaddress\@tempd
      \fi
    \fi
    \fi}
%    \end{macrocode}
% This is my second implementation of the |\@prozessan| macro.  The
% first was truly ugly and had the added disadvantage of, well, not
% working.  In fact, it failed miserably for a few relatively simple
% cases.  That the current version (as far I can tell) works does not,
% however, excuse the fact that it is still somewhat ugly and seems to
% me to be very efficient.  I am still open to any suggested
% improvements. 
%
% The subproceses to |\@prozessan| are simply designed to be able to
% make assignments based on the structure of the passed argument.
%    \begin{macrocode}
\long\def\@xproz #1!!#2@@@{\def\@tempa{#1}\def\toPLZ{#2}}
\long\def\@yproz #1\\#2@@@{\def\@tempb{#1}\def\@tempc{#2}\def\@tempd{}}
\long\def\@zproz #1\\#2\\#3@@@{\def\@tempc{#2}\def\@tempd{#3}}
%    \end{macrocode}
% \end{macro}
%
% The end of the \env{brief} environment is identical to that of the
% \env{letter} environment.
%    \begin{macrocode}
\let\endbrief\endletter
%    \end{macrocode}
% \end{environment}
%
% \begin{macro}{\anrede}
% As for the \cseq{opening} macro in the \env{letter} environment, the
% \cseq{anrede} macro signals the beginning of the letter.  We begin by
% setting the dateline.
% \changes{v0.5}{1995/06/10}{Use \cseq{@dateline} instead of
%   \cseq{@tempa}, because \cseq{raggedright}, or \emph{something},
%   seemed to mess with \cseq{@tempa}.  Also move the conditional
%   outside of the definition of \cseq{@dateline}.}
%    \begin{macrocode}
\def\anrede#1{%
  \check@iffax
  \ifx\@empty\fromlocation
    \def\@dateline{\@date}
  \else
    \def\@dateline{\fromlocation,\space\@date}
  \fi
%    \end{macrocode}
% Set with a typewriter, a German letter should leave two blank lines
% before the return address.  Since we are using something a little
% more capable than a typewriter, we will leave a small amount of
% whitespace, in the form of a multiple of \cseq{letterskip}.
%    \begin{macrocode}
  \null\vspace{1.2\letterskip}
  \noindent\ignorespaces
%    \end{macrocode}
% If there is no return address (a situation which I don't actually
% see happening with this format), just set the dateline at the right
% margin.
%    \begin{macrocode}
  \ifx\@empty\fromaddress%
    \pagestyle{firstpage}%
    {\raggedleft \@dateline}%
%    \end{macrocode}
% Otherwise, the address is set at the left margin and the dateline
% right justified at the level of the first line of the sender
% information.  A telephone number and fax, if provided, follow the address.
% \changes{v0.5}{1995/06/10}{Added code to include a telephone number
%   in the return address information.}
%    \begin{macrocode}
  \else % Home address
    \pagestyle{empty}%
    {\raggedright%
       \fromname \hfill \@dateline\\
       \fromaddress}
        \ifx\@empty\telephonenum
        \else
          \\ \telephonenum
        \fi
        \ifx\@empty\faxnum
        \else
          \\ \faxnum
        \fi
  \fi
  \par
%    \end{macrocode}
% Next comes whitespace approximately twice as large as the topskip.
%    \begin{macrocode}
  \vspace{2.2\letterskip}
%    \end{macrocode}
% We then set the recipient's address.  Using the information provided
% from the |\@prozessan| macro above, we include those pieces which
% were supplied.
%    \begin{macrocode}
  {\raggedright
     \ifx\@empty\totitle
     \else
       \totitle \\
     \fi
     \toname
     \ifx\@empty\toaddress
     \else
       \\ \toaddress
     \fi
     \ifx\@empty\toPLZ
     \else
       \\*[0.6\letterskip]\toPLZ
     \fi
   \par}
%    \end{macrocode}
% After the address come, if supplied, the \emph{Betreff} and
% \emph{Bezug} lines.  First, though, we check to see if only one is
% supplied---if so, we issue a warning.
%    \begin{macrocode}
  \@checkbetreffbezug
%    \end{macrocode}
% Now we can typeset those lines.  A small amount of whitespace
% separates them from one another and from the address.
%    \begin{macrocode}
    \ifx\@empty\@betreff
    \else
      \vspace{\letterskip}
      \ifx\@empty\betreffname
      \else
        \betreffname:\quad
      \fi
      \@betreff\par
    \fi
    \ifx\@empty\@bezug
    \else
      \vspace{1\letterskip}
      \ifx\@empty\bezugname
      \else
        \bezugname:\quad
      \fi
      \@bezug\par
    \fi
%    \end{macrocode}
% A slightly larger amount of whitespace precedes the actual
% \emph{Anrede}.
%    \begin{macrocode}
  \vspace{1.4\letterskip}%
  #1\par\nobreak}
%    \end{macrocode}
% \end{macro}
% The |\@checkbetreffbezug| macro emits a warning if only one of those
% two lines is supplied.
%    \begin{macrocode}
\def\@checkbetreffbezug{%
  \ifx\@empty\@betreff
    \ifx\@empty\@bezug
    \else
      \ClassWarningNoLine{cjw-ltr}{%
        Die \protect\betreff und \protect\bezug Befehlen sollen nur
                                                    \MessageBreak 
        zusammen verwendet werden.  Ihnen fehlt die  \MessageBreak
        Betreff-Zeile.}
    \fi
  \else
    \ifx\@empty\@bezug
      \ClassWarningNoLine{cjw-ltr}{%
        Die \protect\betreff und \protect\bezug Befehlen sollen nur
                                                    \MessageBreak 
        zusammen verwendet werden.  Ihnen fehlt die  \MessageBreak
        Bezug-Zeile.}
    \fi
  \fi}
%    \end{macrocode}
%
% \begin{macro}{\gruss}
% The command \cseq{gruss} ends a letter by first adding some whitespace
% and disabling further pagebreaks.
%    \begin{macrocode}
\long\def\gruss#1{\par\nobreak\vspace{2\letterskip}%
  \stopbreaks
  \noindent%
%    \end{macrocode}
% The closing itself is set, leaving enough whitespace for the actual
% signature.
%    \begin{macrocode}
  {\raggedright #1 \\[5\letterskip]
     \ifx\@empty\fromsig
       \fromname
     \else
       \fromsig
     \fi}
  \par
%    \end{macrocode}
% Finally, a bit of white space separates the bottom of the closing
% from any postscripts.
%    \begin{macrocode}
  \vspace{\letterskip}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\anlage}
% Enclosures, \emph{Anlagen}, are specified by the \cseq{anlage} command.
% As with \cseq{betreff} and \cseq{bezug}, the label is given by an optional
% argument.
%    \begin{macrocode}
\newcommand{\anlage}[1][Anlage]{%
%    \end{macrocode}
% If the optional argument is simply `n', we pluralize the label.
%    \begin{macrocode}
  \def\@tempa{n} \def\@tempb{#1}
  \ifx\@tempa\@tempb
    \renewcommand{\enclname}{Anlagen}
%    \end{macrocode}
% Otherwise, the optional argument (or the default, if none is given)
% becomes the label.
%    \begin{macrocode}
  \else
    \renewcommand{\enclname}{\@tempb}
  \fi\encl}
%    \end{macrocode}
% \end{macro}
% And with that, we are done.
%
% \iffalse
%</class>
% \fi
%
% \Finale
%