diff options
Diffstat (limited to 'macros/latex/contrib/cjw/cjw-ltr.dtx')
-rw-r--r-- | macros/latex/contrib/cjw/cjw-ltr.dtx | 821 |
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 +% |