summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/cjw/cjw-ltr.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/cjw/cjw-ltr.dtx')
-rw-r--r--macros/latex/contrib/cjw/cjw-ltr.dtx821
1 files changed, 821 insertions, 0 deletions
diff --git a/macros/latex/contrib/cjw/cjw-ltr.dtx b/macros/latex/contrib/cjw/cjw-ltr.dtx
new file mode 100644
index 0000000000..42e80bc36e
--- /dev/null
+++ b/macros/latex/contrib/cjw/cjw-ltr.dtx
@@ -0,0 +1,821 @@
+% \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
+%