diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/chletter/chletter.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/chletter/chletter.dtx | 1975 |
1 files changed, 1464 insertions, 511 deletions
diff --git a/Master/texmf-dist/source/latex/chletter/chletter.dtx b/Master/texmf-dist/source/latex/chletter/chletter.dtx index aabf5cd9b8d..7a50fa21ed8 100644 --- a/Master/texmf-dist/source/latex/chletter/chletter.dtx +++ b/Master/texmf-dist/source/latex/chletter/chletter.dtx @@ -1,148 +1,711 @@ % \iffalse meta-comment % -% Copyright 2008 Boris Oriet -% The licence is LPPL. +% Copyright 2008, 2009, 2010 by Boris Oriet <http://boris.oriet.net> +% ------------------------------------------------------- % +% This file may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008/05/04 or later. +% +% This file has the LPPL maintenance status "author-maintained". +% % \fi +% % \iffalse -%<chletter>\NeedsTeXFormat{LaTeX2e}[1996/06/01] -%<chletter>\ProvidesClass{chletter}[2008/07/29 v1.0 Swiss Letter document class] %<*driver> \ProvidesFile{chletter.dtx} \documentclass[a4paper]{ltxdoc} -\usepackage[colorlinks]{hyperref} -\CodelineNumbered +\usepackage{hypdoc} +\pdfstringdefDisableCommands{\def\url{}} +\makeatletter +\let\PrintMacroName\HDorg@PrintMacroName +\let\PrintDescribeMacro\HDorg@PrintDescribeMacro +\makeatother +\setlength\parindent{0pt} +\setlength\unitlength{.59pt} \CodelineIndex -\EnableCrossrefs -\RecordChanges -\frenchspacing \begin{document} -\DocInput{chletter.dtx} + \DocInput{chletter.dtx} \end{document} %</driver> % \fi +% +% \CheckSum{1057} +% +% \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 \~} +% % \changes{v1.0}{2008/07/29}{Initial version} -% \GetFileInfo{chletter.dtx} -% \DoNotIndex{\newcommand,\newenvironment} -% \author{Boris \textsc{Oriet}} -% \title{Swiss Letter Document Class for \LaTeXe{}} +% \changes{v1.1}{2009/11/05}{Internal interim version, minor changes} +% \changes{v2.0}{2010/10/10}{Code overhaul, new features, code frozen} +% +% \title{The \textsf{chletter} Document Class +% \thanks{This document corresponds to \textsf{chletter} v2.0, dated 2010/10/10.}} +% \author{Boris \textsc{Oriet}\\\url{http://boris.oriet.net}} % \maketitle +% \bigskip\bigskip +% \tableofcontents +% \pagebreak % % \section{Introduction} -% The \textsf{chletter} class is intended for typesetting letters with addresses fields -% corresponding to C5 \& C6/5 envelopes (according to the swiss norm SN~010130)\footnote -% {This version of the class only generates -% envelopes with righthanded recipient addresses, perhaps a future version -% will add an option to support lefthanded windows.}. % -% This class is mostly compatible with the standard \LaTeXe{} classes, -% especially the \textsf{letter} class. Unlike the \textsf{lettre} class\footnote -% {From the Observatoire de Gen\`eve, see at \texttt{http://www.ctan.org}}, -% this one doesn't provide much additional commands and declarations. +% The \textsf{chletter} class is suited for typesetting letters with letterhead +% corresponding to the swiss norm SN~010130.\bigskip +% +% The default letterhead is set according to Swiss rules. It fits into both right +% and left windowed ISO 269 C5 and C6/5 envelopes.\bigskip +% +% This class is mostly compatible with the standard \LaTeXe{} classes. +% It is not limited to letters and may be used as a generic document class.\bigskip +% +% Its basic usage is very simple and user friendly. +% It is appropriate to quickly typeset casual documents and letters.\bigskip +% +% It is however highly configurable and may be used within complex setups +% to provide automated letters composition. % -% \section{Examples sources} -% The following examples describe the normal usage of the \textsf{chletter} class. +% \section{Usage} +% +% The following examples describe the regular usage of the \textsf{chletter} class. +% Basically, this class behaves in a similar way to a standard class and accepts the +% regular \textsf{letter} commands, including the dedicated |letter| environment. +% Much like with standard classes, the only mandatory commands are |\documentclass| +% and the |document| environment (|\begin{document}| and |\end{document}|). +% +% \subsection{A basic letter} +% +% This example shows the plain usage of the \textsf{chletter} class.\medskip +% +% |\author|, |\address| and |\date| are markup commands which store +% global values used to build the letterhead. The |letter| environment actually creates the +% letter with its letterhead and all the needed layout. |\opening|, |\closing|, |\encl| and +% |\cc| are mainly formatting commands. To have multiple lines in a field, one may use +% |\newline| (shortcut |\\| as in this example) or |\par| (shortcut is an empty line).\medskip +% +% Please note that this example would also compile straightforward with the +% standard \textsf{letter} class (giving a somewhat different output). % -% \subsection{Standard Letter: \texttt{standardletter.ltx}} % \begin{verbatim} % \documentclass{chletter} -% \author{fromname} -% \address{fromaddress} +% +% \author{My name} +% \address{My address\\My city} +% \date{Location, \today} +% % \begin{document} -% \begin{letter}{toname\\toaddress} -% \opening{salutation} -% text -% \closing{valediction} -% \end{letter} +% \begin{letter}{Name\\Address\\City} +% \opening{Salutation,} +% Hello World! +% \closing{Valediction.} +% \encl{enclosures} +% \cc{other recipients} +% \end{letter} % \end{document} % \end{verbatim} % -% \subsection{Minimal Letter: \texttt{minimalletter.ltx}} +% \begin{figure} +% \begin{picture}(596,842)(0,0) +% \fontsize{7}{7}\selectfont +% \thicklines +% \put(0,0){\framebox(596,842){}} +% \thinlines +% \put(72,758){My name} +% \put(72,746){My address} +% \put(72,734){My city} +% \put(334,758){Location, October 10, 2010} +% \put(334,686){Name} +% \put(334,674){Address} +% \put(334,662){City} +% \put(108,542){Salutation,} +% \put(108,518){Hello World!} +% \put(108,494){Valediction.} +% \put(334,446){My name} +% \end{picture} +% \caption{Standard letter output by \textsf{chletter}.} +% \end{figure} +% +% \subsection{A customized letter} +% +% This example provides a good overview of the different class options and macros.\medskip +% +% The |leftwin| option is to be used with a left windowed envelope, inverting the sender's +% and recipient's addresses. The |leftsig| option places the signature against the left body +% margin. The |foldmark| option will include a thin line to help folding of C6/5 letters. +% The |footfill| option will throw the letter foot against the document footer, for refined +% vertical balancing.\medskip +% +% |\makelabels| creates an addtional envelope page with only the recipient's address and +% the sender's return address. |\addresswidth| adjusts the letterhead layout (here it is +% computed to right align the date field, mimicking the standard \textsf{letter} class +% behaviour). |\location|, |\name|, |\return| and |\telephone| are supplementary markup +% commands. |\object| and |\ps| are extra layout commands. |\longindentation| (which is +% also provided by the standard \textsf{letter} class) enables alignement of the text with +% the addresses.\medskip +% +% Please note that lines with a comment (|%|) should be removed to allow compilation with the +% standard \textsf{letter} class. +% % \begin{verbatim} -% \documentclass{chletter} +% \documentclass[leftwin,leftsig,foldmark,footfill]{chletter} +% +% \settowidth\addresswidth{\today} % +% +% \makelabels +% +% \location{Our Company} +% \name{My name} +% \return{\fromlocation, My address, My city} % +% \address{My address\\My city} +% \telephone{My phone\\My email} +% \signature{My signature\\\footnotesize My position} +% \title{\textbf{About the \textsf{chletter} document class}} +% % \begin{document} +% \begin{letter}{Name\\Address\\City} +% \object % +% \opening{Dear \toname,} +% Body text. +% \closing{Yours truly,} +% \encl{Enclosures} +% \cc{Other recipients} +% \ps{P. S.}{Don't forget\par\hspace{\longindentation}long indentation!} +% \end{letter} % \end{document} % \end{verbatim} % -% \subsection{Commented example: \texttt{sampleletter.ltx}} +% \begin{figure} +% \begin{picture}(596,842)(0,0) +% \fontsize{7}{7}\selectfont +% \thicklines +% \put(0,0){\framebox(596,842){}} +% \thinlines +% \put(424,758){Our Company} +% \put(424,746){My name} +% \put(424,734){My address} +% \put(424,722){My city} +% \put(424,710){\tiny My phone} +% \put(424,698){\tiny My email} +% \put(72,686){\textsuperscript{\underline{Our Company, My address, My city}}} +% \put(72,674){Name} +% \put(72,662){Address} +% \put(72,650){City} +% \put(424,614){October 10, 2010} +% \put(0,554){\line(1,0){18}} +% \put(108,542){\textbf{About the \textsf{chletter} document class}} +% \put(108,512){Dear Name,} +% \put(108,482){Body text.} +% \put(108,452){Yours truly,} +% \put(108,400){My signature} +% \put(108,388){\tiny My position} +% \put(72,168){\makebox(36,0)[r]{\strut encl~}} +% \put(108,168){\makebox(0,0)[l]{\strut Enclosures}} +% \put(72,144){\makebox(36,0)[r]{\strut cc~}} +% \put(108,144){\makebox(0,0)[l]{\strut Other recipients}} +% \put(72,120){\makebox(36,0)[r]{\strut P. S.~}} +% \put(108,120){\makebox(0,0)[l]{\strut Don't forget}} +% \put(424,108){\makebox(0,0)[l]{\strut |long indentation|!}} +% \end{picture} +% \caption{Customized letter output by \textsf{chletter}.} +% \end{figure} +% +% \begin{figure} +% \begin{picture}(596,842)(0,0) +% \fontsize{7}{7}\selectfont +% \thicklines +% \put(0,0){\framebox(596,842){}} +% \thinlines +% \put(72,686){\textsuperscript{\underline{Our Company, My address, My city}}} +% \put(72,674){Name} +% \put(72,662){Address} +% \put(72,650){City} +% \end{picture} +% \caption{Cover page output by \textsf{chletter}.} +% \end{figure}\pagebreak +% +% \section{Compatibility} +% +% The \textsf{chletter} class is based upon the standard classes of the \LaTeXe{} distribution. +% Many documents founded on these classes will also compile with \textsf{chletter}. +% +% \subsection{With the \LaTeXe{} \textsf{letter} class} +% +% The \textsf{chletter} class is `source compatible' (ascending) with the standard +% \textsf{letter} class. For the most part a file which compiles with \textsf{letter} will +% recompile straightforward with \textsf{chletter}. There are however some functional +% differencies, which are described in the following sections. +% +% \subsection{With other \LaTeXe{} classes} +% +% The \textsf{chletter} class is largely `source compatible' (ascending) with other standard +% \LaTeXe{} classes. It doesn't implement the sectioning mecanism, but accepts the related +% commands (|\section| for example). Some commands behave differently (|\maketitle| for +% example). Obvsiously, any command specific to the \textsf{chletter} class will prevent +% compilation with other classes. +% +% \subsection{With older versions of \textsf{chletter}} +% +% The \textsf{chletter} class has been completely overhauled between versions |1.0| and |2.0|. +% The new code is far more compact and efficient, so is its usage (the commands no more have +% a plethora of optional arguments). The versions of the class are mostly `source compatible,' +% given the deprecated commands are not used: |\conc| (replaced by |\object|), |\letterindent|, +% |\letterskip|, |\fromheight| (replaced by |\titletopheight|, |\toheight| (replaced by +% |\titlemidheight|) and |\stockheight| (replaced by |\titlebotheight|). To add a +% `compilability layer', the following code can be inserted in the preamble: % \begin{verbatim} -% \documentclass{chletter} % defaults: 11pt,a4paper,oneside -% \title{sampleletter} % -% \author{author} % if no signature specified -% \name{fromname} % to appear in the footer -% \signature{fromsig} % to appear after valediction -% \location{office} % to appear in the sender address zone -% \address{fromaddress} % to appear at the upper left -% \return{returnaddress} % to appear in the window -% \telephone{telephone} % to appear under the address -% \date{place, \today} % to alter the date string -% \makelabels % will generate an envelope page -% \begin{document} % -% \begin{letter}{toname % gets the recipient name and address -% \\toaddress} % and creates the addresses zones -% \conc[l]{subject} % the letter's subject, left aligned -% \opening[i]{salutation} % the salutation, text will be indented -% text % the letter's main text -% \closing{valediction} % adds the signature -% \ps{\emph{ps}}post % creates a post scriptum -% \cc{copies} % creates a copies field -% \encl{enclosures} % creates an enclosures field -% \end{letter} % -% \end{document} % +% \newcommand\conc[2]{\object{#2}} +% \let\letterindent\parindent +% \let\letterskip\parskip +% \let\fromheight\titletopheight +% \let\toheight\titlemidheight +% \let\stockheight\titlebotheight % \end{verbatim} % -% \section{Compatibility} -% The \textsf{chletter} class is based upon the standard classes of the \LaTeXe{} -% distribution. It is mostly compatible with any type of document founded on these classes. -% -%\subsection{Compatibility with the \LaTeXe{} \textsf{letter} class} -% -%\subsubsection{Ascending Compatiblity} -% \textsf{chletter} is ``source compatible'' with the standard \textsf{letter} class. -% Usually a file which compiles with \textsf{letter} will recompile straight forward -% with this one. There are however some functional differencies: -%\begin{itemize} -%\item the addresses zones, at the top of the first page, is inserted at the opening -% of the |letter| envrionment rather than at the |\opening| command; -% \item there are important differences in the page layout; the addresses zones are -% redefined and the vertical centering mecanisme is absent; -% \item some macros, for example |\makelabels|, behave somewhat differently; the labels -% generation mechanism via the \textsf{.aux} file is inactive. -%\end{itemize} -% -%\subsubsection{Descending Compatibility} -% A document using the new options and macros of the \textsf{chletter} class won't -% compile directly with the \textsf{letter} class\footnote{These differences are marked -% with an asterisk in the following sections}. -% -%\subsection{Compatibility With Other \LaTeXe{} Standard Classes} -% The \textsf{chletter} class is largely ``source compatible'' with the standard \LaTeXe{} -% classes. It doesn't implement the sectioning mecanism, but accepts the related commands -% (|\section| for example). The |\maketitle| command is defined but behaves in a special way. -% -%\subsection{Compatibility with \LaTeX\,2.09} -% No compatibility mecanism with \LaTeX\,2.09 has been implemented. The sources should -% be adapted to the standards defined by \LaTeXe, particularly those concerning the font -% selection scheme\footnote{\texttt{\textbackslash textbf} or \texttt{\textbackslash mathbf} in -% place of \texttt{\textbackslash bf}.}. -%\subsection{Compatibility With Other Packages} -% -% There is no reported incompatibility with usual packages. -% \StopEventually{\PrintChanges\PrintIndex} +% \subsection{With upcoming versions of \textsf{chletter}} +% +% The \textsf{chletter} class is now considered mature and won't evolve further +% (the code is frozen). The class has been thoroughly tested, and there are no known deficiencies. +% +% \subsection{With other packages} +% +% The \textsf{chletter} class is generic in the sense that it doesn't rely on anything but +% the \LaTeXe\ kernel. There is no known command clash with any package.\medskip +% +% Please note that a \textsf{chextras} companion package is available (but not mandatory). +% It simplifies the preparation of documents and letters by loading and setting up font, +% linguistic and other common packages. It also implements a `glue code' for full source +% compatibility with older \textsf{chletter v1.0} documents. +% +% \section{Configuration} +% +% The default values used by the \textsf{chletter} class are balanced for casual writing of +% simple articles (the class can eventually replace the standard \textsf{article} class) and +% letters (of course). Nevertheless this class is highly configurable and customizable. +% +% \subsection{Class options} +% +% The \textsf{chletter} class accepts the options provided by the \LaTeXe\ default classes. +% These options are: |a4paper|, |a5paper|, |b5paper|, |letterpaper|, |legalpaper|, +% |executivepaper|, |landscape|, |10pt|, |11pt|, |12pt|, |oneside|, |twoside|, |draft|, |final|, +% |leqno|, |fleqn|, |onecolumn|, |twocolumn|. The defaults are: |a4paper|, |10pt|, |oneside|, +% |final|, |onecolumn|. Additionally, the \textsf{chletter} class provides four extra options +% (described just below) to adjust the general layout of the letters.\bigskip +% +% \DescribeMacro{leftwin} +% \DescribeMacro{leftsig} +% \DescribeMacro{foldmark} +% \DescribeMacro{footfill} +% |leftwin| places the recipient's address to the left of the letterhead rather than to the +% right. |leftsig| aligns the signature with the left body margin rather than with the right +% address. |foldmark| puts a thin line to help folding of C6/5 letters. |footfill| adds an +% infinite glue between the signature and the letter foot. +% +% \subsection{Page layout} +% +% The default page layout provided by the \textsf{chletter} class, while generic enough, +% leaves more place for the text than the standard classes do.\bigskip +% +% \DescribeMacro{\textwidth} +% \DescribeMacro{\textheight} +% \DescribeMacro{\oddsidemargin} +% \DescribeMacro{\evensidemargin} +% In a single sided document, the space between the top left corner of the page and the main +% text is (|1in + 36pt|, |1in + 36pt|); |36pt| are left for the header and the footer, along +% with |72pt| for the right and bottom margins. For A4 paper, the defaults are the following +% (values in inches and centimeters are rounded): +% \begin{verbatim} +% \textwidth 416pt [5.75in or 14.5cm] +% \textheight 630pt [8.75in or 22cm] +% \oddsidemargin 36pt [.5in or 1.25cm] +% \evensidemargin 0pt +% \end{verbatim} +% +% \DescribeMacro{\titlehead} +% \DescribeMacro{\titletopheight} +% \DescribeMacro{\titlemidheight} +% \DescribeMacro{\titlebotheight} +% \DescribeMacro{\titlemargin} +% \DescribeMacro{\titlewidth} +% \DescribeMacro{\addressmargin} +% \DescribeMacro{\addresswidth} +% These values are used for the letterhead layout. They are related to the \TeX\ origin, which +% is (|1in|, |1in|) from the top left corner of the page. Please remember that |1in = 72.27pt|. +% |\titlehead| controls the vertical placement of the first baseline of the letterhead. +% |\titlemargin| and |\titlewidth| control the horizontal position and width of the letterhead. +% |\addressmargin| is where the title is split in two. |\addresswith| is the width of the right +% address fields. The title is built by opening a |letter| environment or by calling directly +% |\maketitle|. For A4 paper, the defaults are the following (values in inches and centimeters +% are rounded): +% \begin{verbatim} +% \titlehead 12pt [.16in or .4cm] +% \titletopheight 72pt [1in or 2.5cm] +% \titlemidheight 72pt [1in or 2.5cm] +% \titlebotheight 72pt [1in or 2.5cm] +% \titlemargin 0pt +% \titlewidth 452pt [6.25in or 16 cm] +% \addressmargin 262pt [3.625in or 9.25cm] +% \addresswidth 190pt [2.625in or 6.75cm] +% \end{verbatim} +% +% \begin{figure} +% \begin{picture}(595,842)(0,0) +% \fontsize{5}{5}\selectfont +% \thicklines +% \put(0,0){\framebox(596,842){}} +% \thinlines +% \put(74,758){|fromname|} +% \put(74,746){|fromaddress|} +% \put(336,758){|date|} +% \put(336,686){|toname|} +% \put(336,674){|toaddress|} +% \multiput(72,770)(0,-72){4}{\line(1,0){452}} +% \multiput(72,770)(262,0){2}{\line(0,-1){216}} +% \put(524,770){\line(0,-1){662}} +% \put(108,554){\line(0,-1){446}} +% \put(108,108){\line(1,0){416}} +% \put(110,542){|salutation|} +% \put(110,518){|text|} +% \put(110,494){|valediction|} +% \put(336,446){|signature|} +% \put(25,788){\vector(-1,0){25}}\put(47,788){\vector(1,0){25}} +% \put(0,788){\makebox(72,0){|1in|}} +% \put(170,788){\vector(-1,0){98}}\put(236,788){\vector(1,0){98}} +% \put(72,788){\makebox(262,0){|addressmargin|}} +% \put(398,788){\vector(-1,0){64}}\put(460,788){\vector(1,0){64}} +% \put(334,788){\makebox(190,0){|addresswidth|}} +% \put(272,806){\vector(-1,0){200}}\put(324,806){\vector(1,0){200}} +% \put(72,806){\makebox(452,0){|titlewidth|}} +% \put(560,800){\vector(0,-1){30}}\put(560,812){\vector(0,1){30}} +% \put(524,800){\makebox(72,12){|1in|}} +% \put(560,728){\vector(0,-1){30}}\put(560,740){\vector(0,1){30}} +% \put(524,728){\makebox(72,12){|titletopheight|}} +% \put(560,656){\vector(0,-1){30}}\put(560,668){\vector(0,1){30}} +% \put(524,656){\makebox(72,12){|titlemidheight|}} +% \put(560,584){\vector(0,-1){30}}\put(560,596){\vector(0,1){30}} +% \put(524,584){\makebox(72,12){|titlebotheight|}} +% \put(182,320){\vector(-1,0){74}}\put(260,320){\vector(1,0){74}} +% \put(108,320){\makebox(226,0){|longindentation|}} +% \put(396,320){\vector(-1,0){62}}\put(462,320){\vector(1,0){62}} +% \put(334,320){\makebox(190,0){|indentedwidth|}} +% \put(292,90){\vector(-1,0){184}}\put(340,90){\vector(1,0){184}} +% \put(108,90){\makebox(416,0){|textwidth|}} +% \end{picture} +% \caption{The default \textsf{chletter} layout.} +% \end{figure} +% +% \subsection{The \texttt{letter} environment} +% +% The |letter| environment performs some special actions in the scope of writing letters. At +% its beginning, it generates the letterhead according to its arguments and some previously +% defined values (see below). The |letter| environment takes in account some global options, +% for example |twocolumn|... so yes, it is possible to write two column letters! At its +% closing, the |letter| environment generates a cover page if needed (see below).\bigskip +% +% \DescribeEnv{letter} +% The |letter| environment takes one `mandatory' argument : the recipient's address. The +% address should be formatted with newline markers (|\\|) as in the standard |letter| class. +% The argument is `tokenized' into |\toname| and |\toaddress|, which can be used in the +% letter body. The `token separator' is the first encountered |\\|\,. Please note that an +% invocation of the |letter| environment without argument will retrieve previously defined +% |\toname| and |\toaddress| values (empty by default).\medskip +% +% There is an optional argument to specify if the letter is to be indented |[i]| or not |[n]| +% where |[n]| is the default. Please note that this option will alter the formatting of general +% \LaTeX\ lists and \textsf{chletter} |\ps|, |\cc| and |\encl| commands (see below).\bigskip +% +% It is possible to open multiple |letter| environments within a single document. Global +% values may be shared between each letter (see next page). Please remember that environments +% involve some locality; for example a length value altered within a |letter| environment +% will recover its initial value outside of the environment.\medskip +% +% An ordinary usage would be: +% \begin{verbatim} +% \begin{letter}[i]{Toname\\ToAddressFirstLine\\...\\ToAddressLastLine} +% ... +% \end{letter} +% \end{verbatim} +% +% \subsubsection{Cover page} +% +% \DescribeMacro{\makelabels} +% Unlike the standard \textsf{letter} class, this macro doesn't involve a complex mecanism +% using the |.aux| file to build a labels page (the main reason why the standard class is +% fragile). Anyway, the \textsf{chletter} class provides a way to generate dedicated cover +% pages. The |\makelabels| command will set a flag which is checked at the closing of the +% |letter| environment. The default behaviour is to put the recipient's address and, as +% requested by the Swiss post, the return address above it, separated by a line. |\makelabels| +% doesn't take any argument. +% +% \subsubsection{Page breaking} +% +% These commands are intended to (try to) control the place where a page break occur. +% They may be used anywhere in a document.\medskip +% +% \DescribeMacro{\stopbreaks} +% |\stopbreaks| will try to prevent all page breaks after its invocation.\bigskip +% +% \DescribeMacro{\startbreaks} +% |\startbreaks| cancels the behaviour of |\stopbreaks|. +% +% \subsubsection{Letter counter} +% +% \DescribeMacro{\theletter} +% At each new |letter| environment opened, this counter is incremented. Please note that +% |thepage| and |thefootnote| counters are reset at the same time. +% +% \subsubsection{Letter markup} +% +% The commands described here are usually put in the preamble, but they may be called from +% anywhere in the document. They store their argument in associated values which will be +% retrieved by the |letter| environment, for example to build the letterhead. They are common +% to a bunch of letter classes.\medskip +% +% \DescribeMacro{\name} +% \DescribeMacro{\address} +% \DescribeMacro{\location} +% \DescribeMacro{\telephone} +% \DescribeMacro{\return} +% The values stored by these commands are respectively: |\fromname|, |\fromaddress|, +% |\fromlocation|, |\telephonenum| and |\returnaddress|. |\telephone| and |\return| will +% format their output (respectively small text and underlined superscript text). Please note +% that |\return| is not defined in the standard \textsf{letter} class. These values are used +% to build the expeditor's address fields: +% \begin{verbatim} +% \name{My Name} +% \address{My Street\\My City} +% \return{My Return Address} +% \end{verbatim} +% +% \DescribeMacro{\date} +% The date field (stored by kernel |\@date| value) can be customized by, for example: +% \begin{verbatim} +% \date{Here, \today} +% \end{verbatim} +% +% \DescribeMacro{\signature} +% The value stored by this macro is |\fromsig|, which is used by the |\closing| command to +% output the signature field (see below).\bigskip +% +% Please note that |\fromname| and |\fromsig| values default to |\@author| (initialized by +% \LaTeX, modified by the standard |\author| command). The |\@date| field defaults to +% |\today|, which will be localized by a linguistic package (\textsf{babel} or +% \textsf{polyglossia}).\medskip +% +% To prevent any value from appearing, it has to be emptied by the corresponding command, +% for example: |\date{}|.\medskip +% +% These macros can contain anything that fits in a |\parbox|, including some special stuff +% (using dedicated packages): |\location{\includegraphics{mylogo.pdf}}|\medskip +% +% Any of the values stored by these commands can be retrieved anywhere in the letter (given +% the corresponding value is accessible, |\@author| and |\@date| requiring a |\makeatletter|): +% |I, \fromname, declare...| +% +% \subsubsection{Letter body} +% +% These commands are mostly used within a letter environment, but they may be called at +% document level for special purpose. Their foremost intend is formatting, although they are +% able to retrieve or store their value at will.\medskip +% +% \DescribeMacro{\object} +% This command will simply output the text given in its argument, followed by a |\bigskip|. +% The |\object| command stores its argument in |\@title| and actually outputs it. If the +% argument is either empty or null, then the |\object| command will output the value of +% |\@title| previously set by a |\title| command. Remember that the default |\@title| value +% is an error (set by the \LaTeX\ kernel): +% \begin{verbatim} +% \title{Answer to your previous letter} +% ... +% \begin{document} +% \begin{letter}{...} +% \object +% \end{verbatim} +% +% Please note that the following code is functionally equivalent (the |\@title| value set by +% both methods is global (available outside of the current letter environment): +% \begin{verbatim} +% \begin{document} +% \begin{letter}{...} +% \object{Answer to your previous letter} +% \end{verbatim} +% +% \DescribeMacro{\opening} +% This command outputs the text given in its argument (adding a |\medskip| vertical space +% after it): +% \begin{verbatim} +% \opening{Dear Sir,} +% \end{verbatim} +% +% It stores its argument in |\salutation| for further use. |\salutation| can also be defined +% previously and be recalled by an |\opening| with an empty or null argument: +% \begin{verbatim} +% \renewcommand{\salutation}{Dear Sir,} +% ... +% \begin{document} +% \begin{letter}{...} +% \opening +% \end{verbatim} +% +% \DescribeMacro{\closing} +% This command issues a |\medskip|, outputs the text given in its argument and generates +% the signature field, which should provide its own vertical spacing (by default it is +% |4\bigskip| above the signature and |2\bigskip| below): +% \begin{verbatim} +% \closing{Yours sincerely,} +% \end{verbatim} +% +% The signature field placement can be altered by invocation of |leftsig| as a +% class option. The signature field will contain the value defined by: +% \begin{itemize} +% \item[---] |\fromsig| (set by |\signature{...}|) in the first place; +% \item[---] |\fromname| (set by |\name{...}|) if no |\signature| given; +% \item[---] |\@author| (set by |\author{...}|) if no |\name| given (eventually empty). +% \end{itemize} +% +% The |\closing| macro stores its argument in |\valediction| for later use. As usual, the +% |\valediction| value can also be defined before and be output by an invocation of +% |\closing| with an empty or null argument: +% \begin{verbatim} +% \renewcommand{\valediction}{Yours sincerely,} +% \begin{document} +% \begin{letter}{...} +% ... +% \closing{} +% \end{verbatim} +% +% Depending on the class option |footfill|, an extra vertical glue will be added after the +% signature, in order to balance the appearance of the letter foot. |footfill| pushes the +% letter foot text against the document footer (usually the the letter foot is filled by the +% |\ps|, |\encl| and |\cc| commands). Please note that for a weaker balance a |\vfil| could +% be manually added after the |\closing| command.\bigskip +% +% Be aware of the locality of macros. |\salutation| and |\valediction| values are local to +% the current |letter| environment if defined within the environment (usually by |\opening| +% and |\closing| commands), global otherwise. Please look at the \LaTeX\ documentation for +% further explanations. +% +% \subsubsection{Letter foot} +% +% Some formatting commands are intended to be used at the end of the letter (although they +% can be used anywhere in the document, even outside of a letter environment---just as any +% formatting command provided by the \textsf{chletter} class).\bigskip +% +% \DescribeMacro{\ps} +% This command is generic in the sense that it is nothing but a shortcut for a \LaTeX\ list. +% It takes two mandatory arguments. The text contained in the arguments is output as an +% indented paragraph. The indentation margin is set by the standard \LaTeX\ |\leftmargin| +% value (which defaults to |18pt| at document level, |0pt| after the |\closing| of a default +% letter and |36pt| after the |\closing| of an indented |[i]| letter). Here is an example use: +% \begin{verbatim} +% \ps{P.S.}{This is a post scriptum} +% \end{verbatim} +% +% \DescribeMacro{\encl} +% This command is a shortcut for |\ps{\enclname}{...}| and takes one mandatory argument. +% Regular use is: +% \begin{verbatim} +% \encl{1. Your previous letter\\2. My Curriculum Vit\ae} +% \end{verbatim} +% +% \DescribeMacro{\cc} +% This command is a shortcut for |\ps{\ccname}{...}| and takes one mandatory argument. +% Regular use is: +% \begin{verbatim} +% \cc{1. First other recipient\\2. Second other recipient} +% \end{verbatim} +% +% |\enclname| and |\ccname| are set to |{encl}|, respectively |{cc}| by default. +% They will be adjusted by a linguistic package (\textsf{babel} or \textsf{polyglossia}). +% +% \subsection{Sectioning} +% +% \DescribeMacro{section} +% \DescribeMacro{subsection} +% \DescribeMacro{subsubsection} +% \DescribeMacro{paragraph} +% \DescribeMacro{subparagraph} +% The class is intended to output short documents (mainly letters!), so the sectioning mecanism +% is minimalist (no index nor table of contents generation). The stock sectioning commands are +% here: |section|, |subsection|, |subsubsection|, |paragraph|, |subparagraph|, but are merely +% formating commands which select some text style and vertical space. As usual, these commands +% take one mandatory argument. +% +% \subsection{Environments} +% +% \DescribeMacro{description} +% \DescribeMacro{verse} +% \DescribeMacro{quotation} +% \DescribeMacro{quote} +% These environments are available and behave as ordinary in the \textsf{chletter} class. +% The default list values (at document level) are:|\labelsep6pt|, |\labelwidth12pt|, +% |\leftmargin18pt|. Please note that |\labelwidth| and |\labelsep| are redefined by a +% |\closing| command to |\leftmargin2\parindent|, |\labelwidth3\labelwidth|. +% +% \subsection{Paragraphing} +% +% \DescribeMacro{\parindent} +% \DescribeMacro{\parskip} +%|\parindent| and |\parskip| respectively default to |18pt| and |9pt| at document level. If +% a |letter| environment is called with the |[i]| option, |\parindent| is kept at its previous +% value. With the default |[n]| option, |\parindent| is locally set to |0| (zero).\bigskip +% +% Please note that the actual value of |\parindent| while a |\closing| command is issued +% will alter the layout of \LaTeX\ lists (in fact |\ps|, |\encl| and |\cc| are lists): the +% |leftmargin| value (which defaults to |18pt|) is then defined as three times the value of +% |\parindent| (thus |0pt| for a default letter and |36pt| for an indented letter). +% +% \StopEventually % % \section{Implementation} % -% \subsection{Options} -% The initial code is taken from the \LaTeXe{} standard document -% classes. See classes.dtx and letter.dtx for more information. -% This class is largely compatible with the standard letter class. -% We have mainly the same options with the same behaviour. +% The \textsf{chletter} code is fairly compact (less than 300 lines) and highly optimized +% (it relies on \TeX\ primitives wherever practical), dropping the obsolete legacy (namely +% \LaTeX\ 2.09) for the sake of efficiency.\bigskip +% +% Appart from the options described until now, it is possible (and allowed!) to `hook' into +% certain pieces of the class code. This enables a degree of customization and extensibility. +% It would be quite straightforward to add, for example, mail merging features through a +% dedicated package. +% +% \subsection{Initial code} +% % \begin{macrocode} -%<*chletter> -\newcommand\@ptsize{} +%<*chletter.cls> +% \end{macrocode} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{chletter}[2010/10/10 v2.0 Swiss letter document class] % \end{macrocode} % -% \subsubsection{Declaring Options} +% \subsubsection{Declaring options} +% +% \begin{macro}{leftwin} +% \begin{macro}{leftsig} +% \begin{macro}{foldmark} +% \begin{macro}{footfill} +% There are four specific options: |leftwin|, |leftsig|, |foldmark| and |footfill|, +% corresponding to the format of the letter (left envelope window, left signature, folding +% mark for C6/5 covers, letter foot balancing). The default is to not set any of these options. +% All other options are borrowed from the standard classes. +% % \begin{macrocode} \DeclareOption{a4paper}{\paperheight297mm\paperwidth210mm} \DeclareOption{a5paper}{\paperheight210mm\paperwidth148mm} @@ -151,184 +714,280 @@ \DeclareOption{legalpaper}{\paperheight14in\paperwidth8.5in} \DeclareOption{executivepaper}{\paperheight10.5in\paperwidth7.25in} \DeclareOption{landscape} - {\@tempdima\paperheight - \paperheight\paperwidth - \paperwidth\@tempdima} -\DeclareOption{10pt}{\renewcommand\@ptsize{0}} -\DeclareOption{11pt}{\renewcommand\@ptsize{1}} -\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +{\@tempdima\paperheight\paperheight\paperwidth\paperwidth\@tempdima} +\DeclareOption{10pt}{\def\@ptsize{0}} +\DeclareOption{11pt}{\def\@ptsize{1}} +\DeclareOption{12pt}{\def\@ptsize{2}} \DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse} \DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue} -\DeclareOption{draft}{\setlength\overfullrule{5\p@}} -\DeclareOption{final}{\setlength\overfullrule{0\p@}} +\DeclareOption{draft}{\overfullrule5\p@} +\DeclareOption{final}{\overfullrule\z@} \DeclareOption{leqno}{\input{leqno.clo}} \DeclareOption{fleqn}{\input{fleqn.clo}} +\DeclareOption{onecolumn}{\@twocolumnfalse\@leftsigfalse} +\DeclareOption{twocolumn}{\@twocolumntrue\@leftsigtrue} +\DeclareOption{leftwin}{\@leftwintrue} +\DeclareOption{leftsig}{\@leftsigtrue} +\DeclareOption{foldmark}{\@foldmarktrue} +\DeclareOption{footfill}{\@footfilltrue} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% These booleans will be evaluated at the end of the class code. They are |false| until the +% associated option is selected. +% +% \begin{macrocode} +\newif\if@leftwin +\newif\if@leftsig +\newif\if@foldmark +\newif\if@footfill +% \end{macrocode} +% +% \subsubsection{Executing options} +% +% Swiss letters are written on A4 paper. Default font size is |10pt|, like in other standard +% classes. Other switches are set at kernel level. +% +% \begin{macrocode} +\ExecuteOptions{a4paper,10pt} +\ProcessOptions\relax % \end{macrocode} % -% \subsubsection{Executing Options} -% The default options are set according to swiss paper format (A4). -% We also set a standard type size of 11pt. +% Loading this |.clo| file leads to a lot of redundancy. But we want compatibility. +% % \begin{macrocode} -\ExecuteOptions{a4paper,11pt,oneside,onecolumn,final} -\ProcessOptions \input{size1\@ptsize.clo} % \end{macrocode} % -% \subsubsection{Loading Packages} -% This class dos not load additional packages. +% \subsubsection{Loading packages} +% +% The \textsf{chletter} class does not load additional packages. +% +% \subsection{Document layout} +% +% This class tries to provide quite a universal layout, not only suitable for letters, but +% also for other types of short documents. There are anyway some values specific to letters, +% principally the letterhead values. +% +% \subsubsection{Letter counter} +% +% \begin{macro}{theletter} +% Each time a letter is created by a |letter| environment, this counter is incremented. +% +% \begin{macrocode} +\newcounter{letter} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Letter dimensions} +% +% These dimensions concern the letterhead, where |\titlehead| is the absolute position of +% its first baseline. The title matter is vertically stacked in three strips, each one with +% its own height. |\titlemargin| is the absolute position of the letterhead margin, to which +% the letterhead matter is relative. |\longindentation| and |\indentedwidth| are to be used +% within a |letter| environment and will be computed on the fly by |\maketitle|, along with +% |\addressmargin| or |\addresswidth|. % -% \subsection{Document Layout} -% This class tries to provide a quite universal layout, not only suitable -% for letters, but also for other types of short documents. +% \begin{macrocode} +\newdimen\titlehead +\newdimen\titletopheight +\newdimen\titlemidheight +\newdimen\titlebotheight +% \end{macrocode} +% \begin{macrocode} +\newdimen\titlemargin +\newdimen\titlewidth +\newdimen\addressmargin +\newdimen\addresswidth +% \end{macrocode} +% \begin{macrocode} +\newdimen\longindentation +\newdimen\indentedwidth +% \end{macrocode} % % \subsubsection{Paragraphing} -% We prefer some paragraph spacing and some indentation at the document level. -% This may be altered in the letter environment. +% +% We prefer inter paragraph skips in a letter. Swiss letters are rarely indented but the +% |letter| environement offers an option to do so. Indentation is still enabled at +% document level. Setting |\normallineskip| to zero prevents layout inconsistencies. +% % \begin{macrocode} -\parskip9\p@\parindent18\p@ +\parskip9\p@ +\parindent18\p@ % \end{macrocode} -% \begin{macro}{letterskip} -% \begin{macro}{letterindent} -% These values are used to store the current paragraph skip and indentation parameters. They are -% computed at the beginning of the \textsf{letter} environment from |\parskip| and |\parindent| values. % \begin{macrocode} -\newdimen\letterskip\newdimen\letterindent +\normallineskip\z@ +% \end{macrocode} +% +% \subsubsection{Page layout} +% +% All dimensions are measured from a point |1in| from the top left corner of the page. +% Remember that |1in = 72.27pt = 2.54cm| = |72bp| and |1pt| = |65536sp|.\medskip +% +% Regarding the header, |12pt| (more or less one line) are reserved, plus |24pt| spacing +% before the main text. The footer space is |36pt|, including body to footer gap. +% +% \begin{macrocode} +\headheight12\p@ +\headsep24\p@ % \end{macrocode} -% \end{macro} -% \end{macro} -% We don't allow the breaking of a page in an hyphenated line. % \begin{macrocode} -\brokenpenalty10000 +\footskip36\p@ % \end{macrocode} % -% \subsubsection{Standard Page Layout} -% All margin dimensions are measured from a point one inch from the -% top and lefthand side of the page (the \LaTeXe{} origin). We add 0.5 inch for the header. -% This gives a 1.5 inch total margin from the top of the page -% to the begining of the text. Note that the standard classes do not -% set the |\topskip| value, which is set to 10 pt by the \LaTeX{} kernel. +% Regarding the text dimensions, we remove approximately |1in| at each side, plus |36pt| +% horizontally (corresponding to the margin, see below) and |72pt| vertically +% (corresponding to the header and footer, see above). The trick in the definition +% of |\textwidth| and |\textheight| is to have integer values for A4 paper. +% % \begin{macrocode} -\topmargin\z@\topskip12\p@\headheight12\p@\headsep24\p@ +\textwidth\paperwidth +\advance\textwidth-9536004sp +\titlewidth\textwidth +\advance\textwidth-36\p@ % \end{macrocode} -% Same as above, we add 0.5 inch for the footer. We also set the footnotes vertical spaces here. % \begin{macrocode} -\footskip36\p@\footnotesep12\p@\skip\footins18\p@ +\textheight\paperheight +\advance\textheight-14093310sp % \end{macrocode} -% We substract 2.5 inches to the width of the paper. +% +% The left margin of the odd pages is set to |1in + 36pt| (more or less |4cm|). Sizes of the +% marginal notes are adapted to quite small margins. Top margin is set to zero. +% % \begin{macrocode} -\textwidth\paperwidth\addtolength\textwidth{-180\p@} +\oddsidemargin36\p@ +\evensidemargin\z@ % \end{macrocode} -% We substract 3 inches from the height of the paper. % \begin{macrocode} -\textheight\paperheight\addtolength\textheight{-216\p@} +\marginparwidth48\p@ +\marginparsep6\p@ +\marginparpush6\p@ % \end{macrocode} -% We set standard values here. We will have a 1.5 inch -% lefthand margin and a 1~inch righthand margin (given -% the text width is 2.5~inches shorter than the paper width. % \begin{macrocode} -\oddsidemargin36\p@\evensidemargin0\p@ -\marginparwidth48\p@\marginparsep12\p@\marginparpush6\p@ +\topmargin\z@ % \end{macrocode} % -% \subsubsection{New Horizontal Dimensions} -% \begin{macro}{\addressmargin} -% This is the space between the origin (1 inch from the left border of the page) -% and the recipient address field. +% The footnotes values are somewhat larger than the default. +% % \begin{macrocode} -\newdimen\addressmargin\addressmargin246\p@ +\footnotesep12\p@ +\skip\footins12\p@ +% \end{macrocode} +% +% \subsubsection{Title layout} +% +% What we call `title' here is the letterhead, with the addresses fields and all this kind of +% stuff. Title is always placed on an odd page at an absolute position. +% +% \begin{macro}{\titlehead} +% The vertical position of the title is controled by the |\titlehead| value (by analogy with +% |\headheight| which sets the first baseline of the running head). Please note that +% letterhead position is not altered by anything but |\titlehead| (for example it is +% independant from the |\topmargin| value). +% +% \begin{macrocode} +\titlehead12\p@ % \end{macrocode} % \end{macro} -% \begin{macro}{\longindentation} -% \begin{macro}{\indentedwidth} -% |\longindentation| + |\indentedwidth| = |\textwidth|. -% These values will be computed at the begining of the \textsf{letter} environment. -% They are useful to align text width the recipient address field, which may be -% modified by author between two letters. +% +% \begin{macro}{\titletopheight} +% \begin{macro}{\titlemidheight} +% \begin{macro}{\titlebotheight} +% The title (letterhead or cover) field is divided into three strips, each one containing +% some material. For example, the first field could contain the sender's address, the second +% one the recipient's address and the third one the letter's date. Obviously the total +% letterhead height is the sum of these three values (|216pt| by default). +% % \begin{macrocode} -\newdimen\longindentation\newdimen\indentedwidth +\titletopheight72\p@ +\titlemidheight72\p@ +\titlebotheight72\p@ % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % -% \subsubsection{New Vertical Dimensions} -% \begin{macro}{\fromtop} -% We need to position precisely the addresses fields, substracting some values until -% we reach the origin at 1 inch from the top of the paper. -% \begin{macrocode} -\newdimen\fromtop\fromtop\z@\addtolength\fromtop{-\headheight} -\addtolength\fromtop{-\headsep}\addtolength\fromtop{-\baselineskip} -% \end{macrocode} +% \begin{macro}{\titlemargin} +% \begin{macro}{\titlewidth} +% The horizontal position of the title is controlled by |\titlemargin| which is set to |0pt| +% by default. |\titlewidth| has already been set as |\textwidth + 36pt|. +% \end{macro} % \end{macro} -% \begin{macro}{\fromheight} -% \begin{macro}{\toheight} -% |\fromheight| is the height of the field containing the sender address. -% |\toheight| is the height of the field containing the recipient address. -% Theses values are set accordingly to swiss standard windowed envelopes. +% +% \begin{macro}{\addressmargin} +% \begin{macro}{\addresswidth} +% These values are to be computed on the fly by |\maketitle| depending on user input and +% actual |\titlewidth| value. If |\addressmargin| is defined by the user, then the formula +% |\titlewidth = \addressmargin + \addresswidth| will be applied to |\addresswidth|, otherwise +% it will be applied to |\addressmargin|. +% % \begin{macrocode} -\newdimen\fromheight\fromheight60\p@\newdimen\toheight\toheight96\p@ +\addresswidth190\p@ % \end{macrocode} % \end{macro} % \end{macro} -% \begin{macro}{\sigspace} -% is the total space in which the signature is centered. +% +% \subsubsection{Page styles} +% +% The default page styles are here, but their layout differ from the standard classes. +% % \begin{macrocode} -\newdimen\sigspace\sigspace6\bigskipamount +\def\ps@plain% +{\let\@oddhead\@empty + \let\@evenhead\@empty + \def\@oddfoot{\footnotesize\hfil\pagename~\thepage} + \def\@evenfoot{\footnotesize\pagename~\thepage\hfil}} % \end{macrocode} -% \end{macro} -% -% \subsubsection{Page Styles} -% The pagestyles \textsl{empty} and \textsl{plain} are defined in -% the \LaTeX{} kernel ({ltpage.dtx}). In this class we change -% a bit the \textsl{plain} style. Note that we don't set different -% headings for one-sided and two-sided documents. -% \begin{macrocode} -\def\ps@plain - {\let\@oddhead\@empty - \def\@oddfoot - {\footnotesize{\hfil\pagename~\thepage}} - \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot} -\def\ps@headings - {\def\@oddhead - {\footnotesize{\hspace*{-\oddsidemargin}\headtoname~\toname\hfil\pagename~\thepage}} - \def\@oddfoot - {\footnotesize{\hspace*{-\oddsidemargin}\leftmark\hfil\rightmark}} - \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot} -\def\ps@myheadings - {\def\@oddhead - {\footnotesize{\hspace*{-\oddsidemargin}\leftmark\hfil\rightmark}} - \def\@oddfoot - {\footnotesize{\hfil\pagename~\thepage}} - \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot} -\def\ps@firstpage - {\let\@oddhead\@empty - \def\@oddfoot - {\footnotesize{\hspace*{-\oddsidemargin}\leftmark\hfil\rightmark}} - \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot} +% \begin{macrocode} +\def\ps@firstpage% +{\let\@oddhead\@empty + \let\@evenhead\@empty + \def\@oddfoot{\footnotesize\leftmark\hfil\rightmark} + \def\@evenfoot{\footnotesize\rightmark\hfil\leftmark}} +% \end{macrocode} +% \begin{macrocode} +\def\ps@headings% +{\def\@oddhead{\footnotesize\headtoname~\toname\hfil\pagename~\thepage} + \def\@evenhead{\footnotesize\pagename~\thepage\hfil} + \def\@oddfoot{\footnotesize\leftmark\hfil\rightmark} + \def\@evenfoot{\footnotesize\rightmark\hfil\leftmark}} +% \end{macrocode} +% \begin{macrocode} +\def\ps@myheadings% +{\def\@oddhead{\footnotesize\leftmark\hfil\rightmark} + \def\@evenhead{\footnotesize\rightmark\hfil\leftmark} + \def\@oddfoot{\footnotesize\hfil\pagename~\thepage} + \def\@evenfoot{\footnotesize\pagename~\thepage\hfil}} % \end{macrocode} % -% \subsection{Declarations} +% \subsection{Document markup} +% +% These user commands are common to all usual letter classes. +% +% \subsubsection{Global declarations} +% +% \begin{macro}{\name} +% \begin{macro}{\signature} +% \begin{macro}{\address} +% \begin{macro}{\location} +% \begin{macro}{\telephone} +% \begin{macro}{\return} +% These macros work exactly the same way as with the standard \textsf{letter} class. They +% don't output anything, but just define an associated word containing their argument. The +% layout of |\telephonenum| (small text) and |\returnaddress| (underlined small text) is +% specific to this class and somewhat tricky, intended to manage the best possible appearance. +% Please note that the default contents of the associated words will be defined later. % -% \subsubsection{Commands} -% \begin{macro}{\name\fromname} -% \begin{macro}{\signature\fromsig} -% \begin{macro}{\address\fromaddress} -% \begin{macro}{\location\fromlocation} -% \begin{macro}{\telephone\telephonenum} -% \begin{macro}{\return\returnaddress} -% The standard \textsf{letter} class doesn't provide a |\return| command, but -% knows of the |\returnaddress| value. One should note that some of these values -% are functionally different from the standard class, and that |\@author| -% (set by the |\author| command) may be used to replace |\fromname| and |\fromsig| -% in most cases (see ...). Usually the user will use these commands in the preamble -% of his letter. But they can be altered anywhere to obtain some special effects -% (different addresses for the envelope page for example). % \begin{macrocode} -\newcommand*{\name}[1]{\def\fromname{#1}}\name{} -\newcommand*{\signature}[1]{\def\fromsig{#1}}\signature{} -\newcommand*{\address}[1]{\def\fromaddress{#1}}\address{} -\newcommand*{\location}[1]{\def\fromlocation{#1}}\location{} -\newcommand*{\telephone}[1]{\def\telephonenum{#1}}\telephone{} -\newcommand*{\return}[1]{\def\returnaddress{#1}}\return{} +\long\def\name#1{\def\fromname{#1}} +\long\def\signature#1{\def\fromsig{#1}} +\long\def\location#1{\def\fromlocation{#1}} +\long\def\address#1{\def\fromaddress{#1}} +\long\def\telephone#1{\def\telephonenum{\vtop{\footnotesize#1}}} +\long\def\return#1{\def\returnaddress{\underbar{\textsuperscript{#1}}}} % \end{macrocode} % \end{macro} % \end{macro} @@ -336,368 +995,662 @@ % \end{macro} % \end{macro} % \end{macro} -% \begin{macro}{\fromstreet} -% \begin{macro}{\fromplace} -% \begin{macro}{\toname} -% \begin{macro}{\toaddress} -% We additionaly declare some default values. These are computed at the begining of -% the letter environment (see xxx), but may be altered manually by the user. -% Here we ensure they are defined even if the letter environment is not invoked, to -% prevent runtime errors. +% +% \begin{macro}{\makelabels} +% \begin{macro}{\startlabels} +% The |\makelabels| command defines a |\startlabels| macro, which causes cover pages to be +% added at the end of each letter. See next page for more information. +% % \begin{macrocode} -\def\toname{}\def\toaddress{}\def\fromstreet{}\def\fromplace{} +\def\makelabels% +{\def\startlabels% + {\let\titletopmatter\@empty + \let\titlebotmatter\@empty + \let\foldmark\@empty}} % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % -% \subsubsection{Words} -% \begin{macro}{\ccname} -% \begin{macro}{\enclname} -% \begin{macro}{\pagename} -% \begin{macro}{\headtoname} -% These names are defined the same way as in the standard letter class. They -% will be altered by the linguistic packages (babel) at the begining of the document. -% If the user wants to alter them manually, he should do it after |\begin{document}| -% to obtain the expected result. +% \begin{macro}{\maketitle} +% This artful piece of code actually outputs the letterhead stuff. |\maketitle| is always +% called at the opening of the |letter| environment, and at its closing if the |\startlabels| +% flag is not |\@null|. It outputs the content of |\titletopmatter|, |\titlemidmatter|, +% |\titlebotmatter| in three horizontal strips stacked vertically. These strips have respective +% heights of |\titletopheight|, |\titlemidheight|, |\titlebotheight| and are always placed on +% a new odd page at an absolute position given by |\titlehead| and |\titlemargin|. The width of +% the strips is given by |\titlewidth|. |\longindentation| and |\indentedwidth| are computed +% here, so are |\addressmargin| and |\addresswidth| which are used by |\splitfield|. Some +% dedicated mecanism deals with the |\twoside| and |\twocolumns| cases (the letterhead is +% always issued on a clear odd page), executing the |\@maketitle| auxiliary macro. The +% |\foldmark| macro is called at the end of the letterhead. +% % \begin{macrocode} -\newcommand*{\ccname}{cc}\newcommand*{\enclname}{encl} -\newcommand*{\pagename}{Page}\newcommand*{\headtoname}{To} +\def\maketitle% +{\ifdim\addressmargin=\z@ + \addressmargin\titlewidth + \advance\addressmargin-\addresswidth + \else + \addresswidth\titlewidth + \advance\addresswidth-\addressmargin\fi + \longindentation\titlemargin + \advance\longindentation-\oddsidemargin + \clearpage + \if@twoside\ifodd\c@page + \else\thispagestyle{empty}\hb@xt@\z@{}\clearpage\fi\fi + \if@twocolumn\twocolumn[\@maketitle\leavevmode\vskip-\topskip] + \else\vbox{\@parboxrestore\@maketitle}\vskip-\parskip\fi + \advance\longindentation\addressmargin + \indentedwidth\textwidth + \advance\indentedwidth-\longindentation} +% \end{macrocode} +% \begin{macrocode} +\def\@maketitle% +{\vskip-\topmargin\vskip-\baselineskip + \vskip\titlehead\vskip-\headheight\vskip-\headsep + \leftskip\longindentation\rightskip\textwidth + \advance\rightskip-\paperwidth + \advance\rightskip-\titlemargin + \parbox[t][\titletopheight]{\titlewidth} + {\hb@xt@\z@{}\titletopmatter\strut}\par + \parbox[t][\titlemidheight]{\titlewidth} + {\hb@xt@\z@{}\titlemidmatter\strut}\par + \parbox[t][\titlebotheight]{\titlewidth} + {\hb@xt@\z@{}\titlebotmatter\strut}\par + \leftskip-\oddsidemargin\advance\leftskip-1in + \parbox[b][\z@]{\paperwidth}{\foldmark}\par} % \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} % \end{macro} % -% \subsubsection{Date} -% \begin{macro}{\today} -% This macro is identical to the one defined in the standard class. +% \subsubsection{The \texttt{letter} environment} +% +% \begin{environment}{letter} +% The |letter| environment is the foremost part of a letter. It takes the recipient's address +% as mandatory argument and |[i]| (default is |[n]|) as optional argument to set the +% |\parindent| value within the group represented by the environment. The first part of the +% code manages these arguments. It is sturdier than the standard \LaTeX\ |\newenvironment| in +% the sense that, for example, the mandatory argument is not... mandatory! At its opening, +% the |letter| environment tokenizes its mandatory argument into two fields, |\toname| and +% |\toaddress| (token separator is the first encountered |\\|). If the argument is null +% (|\begin{letter}{}| or |\begin{letter}|), these values won't be modified and thus may be +% defined before the opening of the environment, hence the easy mail merging extension. Then +% |\maketitle| is called to output the letterhead (the first page of the letter is always +% issued on a clear odd page, leaving a blank page if necessary in two sided documents). The +% |\pagestyle| of the first letter page is set to |firstpage| and the |letter| counter is +% incremented, while the |page| and |footnote| counters are reset. +% % \begin{macrocode} -\newcommand*{\today} - {\ifcase\month\or January\or February\or March\or April\or May\or June\or - July\or August\or September\or October\or November\or December\fi - \space\number\day, \number\year} +\def\letter{\futurelet\@let@token\ch@let}\def\ch@let% +{\ifx\@let@token[\expandafter\@letter\else\expandafter\ch@lea\fi} +\long\def\ch@lea#1 {\@letter[n]{#1} } +% \end{macrocode} +% \begin{macrocode} +\long\def\@letter[#1]#2 +{\ifx#1n\parindent\z@\fi\ifx\@null#2\else\@processto#2\\@@@ + \ifx\@empty\toaddress\else\@processto#2@@@\fi\fi + \maketitle\thispagestyle{firstpage} + \global\c@page\@ne\global\c@footnote\z@\global\advance\c@letter\@ne} +% \end{macrocode} +% \begin{macrocode} +\long\def\@processto#1\\#2@@@{\def\toname{#1}\def\toaddress{#2}} % \end{macrocode} -% \end{macro} % -% \subsection{Insertion commands} -% \begin{macro}{\maketitle} -% This macro will generate the addresses fields from given values. It is invocated by -% the letter environment, but can be used anywhere in the document (not in the preamble). -% The recipient address is defined as an argument to the letter environment, -% but one may use |\def\toname{}| and |\def\toaddress{}| to set it manually. -% -% This macro takes the same optional argument as the letter environment:\\ -% |[p]| (plain, default) will put the expeditor field, the date and the recipient field.\\ -% |[e]| (everything) will add the return address to the recipient field.\\ -% |[n]| (nofrom) will put only the recipient field.\\ -% |[r]| (return) will add the return address to the recipient field. -% \begin{macrocode} -\newcommand*{\maketitle}[1][p] - {\vspace*{-\parskip}\ifx n#1\vspace*{\fromheight}\else\ifx r#1\vspace*{\fromheight}% - \else\noindent\hspace{-\oddsidemargin}\parbox[t][\fromheight]{\addressmargin} - {\ifx\ch@aut\@author - \else\leavevmode\@author\\\fi - \ifx\@empty\fromlocation - \else\fromlocation\\\fi - \ifx\@empty\fromaddress - \else\fromaddress\par\medskip\fi - \ifx\@empty\telephonenum - \else{\footnotesize\telephonenum\par\medskip}\fi}% - \parbox[t]{\indentedwidth}{~\\\@date}\par\vspace*{-\parskip}\fi\fi - \noindent\hspace{\longindentation}\parbox[t][\toheight]{\indentedwidth} - {\ifx p#1\else\ifx n#1\else{\footnotesize\returnaddress\par\medskip}\fi\fi - \leavevmode\toname\\\toaddress\\}\vspace*{-\parskip}\par} +% At its closing, the |letter| environment removes the last skip, then checks for the +% definition of |\startlabels|. If undefined, nothing but a |\clearpage| happens. If defined, +% its contents is executed (usually a redefinition of |\titletopmatter|, |\titlemidmatter| and +% |\titlebotmatter|) and the |\maketitle| macro is called, taking the |\twoside| case in +% account (which may produce additional empty pages), then issuing a new page (intended to be +% a cover) followed by a |\clearpage|. +% +% \begin{macrocode} +\def\endletter{\removelastskip\ifx\startlabels\undefined\else% + \startlabels\maketitle\thispagestyle{empty}\fi\clearpage} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Page breaking control} +% +% \begin{macro}{\stopbreaks} +% \begin{macro}{\startbreaks} +% When the command |\stopbreaks| is issued no page breaks should occur until |\startbreaks| is +% called. These macros are used by the |\closing| command. +% +% \begin{macrocode} +\def\stopbreaks{\interlinepenalty\@M\def\par{\@@par\nobreak}} +\def\startbreaks{\interlinepenalty100\def\par{\@@par}} % \end{macrocode} % \end{macro} -% \begin{macro}{\opening} -% Unlike the standard letter |\opening| command, this one is very simplistic. It only creates -% the opening formula given in its mandatory argument. +% \end{macro} % -% There is an optional argument:\\ -% |[n]| (noindent, default) turns indentation off for the following text.\\ -% |[i]| (indent) turns indentation on for the following text. +% \subsubsection{The generic letter commands} +% +% \begin{macro}{\opening} +% Unlike the standard \textsf{letter} class, the |\opening| command doesn't generate the +% letterhead (this is done at the opening of the |letter| environment or by a direct call of +% |\maketitle|). The content of |\salutation| is either locally filled with the mandatory +% argument or recalled if the argument is null (either |\opening{}| or |\opening| without +% argument, look at the neat argument handling code), then output. The |\medskipamount| value +% controls the vertical spacing. % -% Note that the optional argument modifies the following text, not the opening itself! The -% indentation value is taken from |\letterindent|. % \begin{macrocode} -\newcommand{\opening}[2][n] - {\ifx i#1\parindent\letterindent\else\parindent\z@\fi\par\noindent#2\par\medskip} +\def\opening{\futurelet\@let@token\ch@ope}\def\ch@ope% +{\ifx\@let@token\bgroup\expandafter\ch@opa\else\expandafter\@opening\fi} +\def\ch@opa#1{\ifx\@null#1\else\def\salutation{#1}\fi\@opening} +% \end{macrocode} +% \begin{macrocode} +\def\@opening{\par\salutation\par\medskip} % \end{macrocode} % \end{macro} +% % \begin{macro}{\closing} -% This command generates the valediction line and the signature. -% The signature is horizontaly aligned width the recipient address field and -% verticaly spaced by |\sigspace|. The signature is one of the following: -% |\fromsig|, |\fromname|, |\@author|, depending on whether they are defined or not. +% The |\closing| command is to be called at the end of the letter body. It generates the +% valediction and the signature. Much like the |\opening| command, its argument either fills +% or retrieve a value, here |\valediction|. A |\medskip| is issued, page breaking is prevented +% and |\closingmatter| is added. |\closingmatter| is defined according to the class option +% |leftsig| and could be completely customized. % -% It takes the same optional argument as the |\opening| command, default is |[n]|. % \begin{macrocode} -\newcommand{\closing}[2][n] - {\ifx i#1\parindent\letterindent\else\parindent\z@\fi\par\medskip - #2\par\vspace*{.5\sigspace} - \noindent\hspace\longindentation - \ifx\@empty\fromsig - \ifx\@empty\fromname\@author\else\fromname\fi - \else\fromsig\fi - \par\vspace*{.5\sigspace}} +\def\closing{\futurelet\@let@token\ch@clo}\def\ch@clo% +{\ifx\@let@token\bgroup\expandafter\ch@cla\else\expandafter\@closing\fi} +\def\ch@cla#1{\ifx\@null#1\else\def\valediction{#1}\fi\@closing} % \end{macrocode} -% \end{macro} -% \begin{macro}{\longindentation} -% This macro will align the text contained in its argument with the recipient address. % \begin{macrocode} -\newcommand*{\longindent}[1] - {\par\noindent\hspace{\longindentation}\parbox[t]{\indentedwidth}{#1}\par\smallskip} +\def\@closing{\par\medskip\stopbreaks\valediction + \samepage\par\closingmatter\par\startbreaks} % \end{macrocode} % \end{macro} -% \begin{macro}{\conc} -% This command is intended to be used before the |\opening| command, to add a subject -% line. It accepts one mandatory argument (the actual text to be inserted) and one -% optional argument:\\ -% |[r]| (right, default) aligns against the text margin.\\ -% |[l]| (left) aligns with the expeditor address. +% +% \begin{macro}{\object} +% The |\object| macro outputs the content of |\@title|, either previously defined by a +% |\title| command or filled by a non empty argument (see |\opening| for an explanation of +% this behaviour). The |\bigskipamount| value controls the vertical spacing. Styling is left +% to user's preference, for example: |\object{\textbf{...}}|. % % \begin{macrocode} -\newcommand*{\conc}[2][r]{\ch@pul[#1]{\textbf{#2}}\par\bigskip} +\def\object{\futurelet\@let@token\ch@obj}\def\ch@obj% +{\ifx\@let@token\bgroup\expandafter\ch@oba\else\expandafter\@object\fi} +\def\ch@oba#1{\ifx\@null#1\else\title{#1}\fi\@object} % \end{macrocode} -% \end{macro} -% \begin{macro}{\ps} -% This command is useful to achieve certain effects. It aligns its text argument following -% the optional argument and dosen't close the current paragraph. The following text will -% continue on the same line. % \begin{macrocode} -\newcommand*{\ps}[2][r]{\ch@put[#1]{#2}{\ignorespaces}} +\def\@object{\noindent\@title\par\bigskip} % \end{macrocode} % \end{macro} +% +% \begin{macro}{\ps} % \begin{macro}{\cc} % \begin{macro}{\encl} -% These two commands are intended to be used at the end of the letter, but they can -% be placed anywhere in the document to obtain special effects. Their usage is quite similar -% to what is described in the standard letter class. They all take a mandatory -% argument (some text) and an optional argument:\\ -% |[r]| (right, default) aligns against the text margin.\\ -% |[l]| (left) aligns with the expeditor address. +% |\ps| is a shortcut for a simple \LaTeX\ list, with its first argument as item label and +% its second argument as a item contents. |\cc| and |\encl| are further shortcuts, using +% respectively |\ccname| and |\enclname| as label. There is a trick involved here: the list +% behaviour is altered after a |\closing| command (see |\closingmatter|); by these means the +% letter foot benefit from the powerful list feature while the lists defaults are kept at +% convenient values for use within the letter body.\medskip +% % \begin{macrocode} -\newcommand*{\cc}[2][r]{\ch@put[#1]{\emph{\ccname}}{#2}\par\medskip} -\newcommand*{\encl}[2][r]{\ch@put[#1]{\emph{\enclname}}{#2}\par\medskip} +\long\def\ps#1#2{\begin{list}{}{}\item[#1]#2\end{list}} +\long\def\cc#1{\ps{\ccname}{#1}} +\long\def\encl#1{\ps{\enclname}{#1}} % \end{macrocode} % \end{macro} % \end{macro} -% \begin{macro}{\section} -% \begin{macro}{\subsection} -% \begin{macro}{\subsubsection} -% These commands are not defined in the standard letter class. functionally, they do nothing -% but emphasize the text given as their argument. They cannot be used to generate -% a table of contents, because the necessary provisions are not implemented in this class. -% They take an optional argument:\\ -% |[r]| (right, default) aligns against the text margin.\\ -% |[l]| (left) aligns with the expeditor address. +% \end{macro} +% +% \subsubsection{Sections and paragraphs} +% +% Some sectioning commands are defined, but they are merely formatting commands. So there is +% no section numbering nor index and table of contents generation. +% +% \begin{macrocode} +\long\def\subparagraph#1{\par\textbf{#1}\hskip\labelsep} +\long\def\paragraph#1{\par\noindent\textbf{#1}\hskip\labelsep} +\long\def\subsubsection#1{\par\noindent\textbf{#1}\par\nobreak} +\long\def\subsection#1{\smallskip\subsubsection{#1}} +\long\def\section#1{\medskip\subsubsection{#1}} +% \end{macrocode} +% +% \subsubsection{Environments} +% +% This code is borrowed from the standard classes. Please look at the \LaTeXe\ documentation +% for further explanation. Remember that all these environments are lists which will be +% formatted according following the general lists parameters. +% +% \begin{macrocode} +\def\description +{\list{} + {\labelwidth\z@ + \itemindent-\leftmargin + \let\makelabel\descriptionlabel}}\def\enddescription{\endlist} +% \end{macrocode} +% \begin{macrocode} +\def\descriptionlabel#1{\hskip\labelsep\textbf{#1}} +% \end{macrocode} +% \begin{macrocode} +\def\verse +{\let\\\@centercr + \list{} + {\itemsep\z@ + \itemindent-\parindent + \listparindent\itemindent + \rightmargin\leftmargin + \advance\leftmargin\parindent} + \item\relax}\def\endverse{\endlist} +% \end{macrocode} +% \begin{macrocode} +\def\quotation +{\list{} + {\listparindent\parindent + \itemindent\listparindent + \rightmargin\leftmargin} + \item\relax}\def\endquotation{\endlist} +% \end{macrocode} % \begin{macrocode} -\newcommand*{\subsubsection}[2][r]{\par\ch@pul[#1]{\textbf{#2}}\par} -\newcommand*{\subsection}[2][r]{\smallskip\subsubsection[#1]{#2}} -\newcommand*{\section}[2][r]{\medskip\subsubsection[#1]{#2}} +\def\quote +{\list{} + {\rightmargin\leftmargin} + \item\relax}\def\endquote{\endlist} +% \end{macrocode} +% +% \subsubsection{Lists} +% +% This code is borrowed from the standard classes. Please look at the \LaTeXe\ documentation +% for further explanation. Please also note that list nesting is limited to four levels +% (seems to be enough for a letter). +% +% \begin{macrocode} +\def\@listI{} +\let\@listi\@listI +\let\@listii\@listI +\let\@listiii\@listI +\let\@listiv\@listI +% \end{macrocode} +% \begin{macrocode} +\def\theenumi{\@arabic\c@enumi} +\def\theenumii{\@alph\c@enumii} +\def\theenumiii{\@roman\c@enumiii} +\def\theenumiv{\@Alph\c@enumiv} +% \end{macrocode} +% \begin{macrocode} +\def\labelenumi{\theenumi.} +\def\labelenumii{(\theenumii)} +\def\labelenumiii{\theenumiii.} +\def\labelenumiv{\theenumiv.} +% \end{macrocode} +% \begin{macrocode} +\def\p@enumii{\theenumi} +\def\p@enumiii{\theenumi(\theenumii)} +\def\p@enumiv{\p@enumiii\theenumiii} +% \end{macrocode} +% \begin{macrocode} +\def\labelitemi{\textbullet} +\def\labelitemii{\textbf{\textendash}} +\def\labelitemiii{\textasteriskcentered} +\def\labelitemiv{\textperiodcentered} +% \end{macrocode} +% +% \subsection{Default settings} +% +% As in other classes, some values are set here rather than at kernel level. The values used +% by the \textsf{chletter} class are as generic as possible. +% +% \subsubsection{Lists} +% +% \begin{macro}{\labelsep} +% \begin{macro}{\labelwith} +% \begin{macro}{\leftmargin} +% These default values are defined at document level and altered by |\closingmatter| +% (see next page) in the following manner: |\labelwidth3\labelsep| (usually |18pt|), +% |\leftmargin2\parindent| (|36pt| in an indented letter, |0pt| in a default letter). +% +% \begin{macrocode} +\labelsep6\p@\labelwidth12\p@\leftmargin18\p@ +% \end{macrocode} +% \begin{macrocode} +\topsep\z@\partopsep3\p@\itemsep\z@\parsep3\p@ % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} -% \begin{macro}{\paragraph} -% \begin{macro}{\subparagraph} -% Contrary to the commands above, these do not accept an optional argument. +% +% \subsubsection{Environments} +% +% Exactly as in the standard classes. % \begin{macrocode} -\newcommand*{\subparagraph}[1]{\par\textbf{#1}~} -\newcommand*{\paragraph}[1]{\par\noindent\textbf{#1}~} +\arraycolsep5\p@ +\tabcolsep6\p@ +\arrayrulewidth.4\p@ +\doublerulesep2\p@ +\tabbingsep\labelsep +\skip\@mpfootins=\skip\footins +\def\theequation{\@arabic\c@equation} +% \end{macrocode} +% +% \subsubsection{Framed boxes} +% +% \begin{macro}{\fboxsep} +% \begin{macro}{\fboxrule} +% Apart from their ordinary application, the values defined here are used by the default +% |\foldmark| macro defined by the |foldmark| class option. +% +% \begin{macrocode} +\fboxsep3\p@ +\fboxrule.4\p@ % \end{macrocode} % \end{macro} % \end{macro} % -% \subsection{The \texttt{\textbackslash makelabels} Command} -% \begin{macro}{\makelabels} -% This acts as a flag for the letter environment. If true (i.e. |\makelabels| have -% been invoked with a given option before the |letter| environement), then a page will be -% added to the letter, containing only the addresses fields. This is intended to generate envelopes. +% \subsubsection{Footnotes} % -% This command passes its argument to the |letter| environment and then to |\maketitle|. An |[f]| argument will be -% interpreted at the end of the letter environment as a request to deactivate the labels -% generation mecanism. +% Light is right! This definition is minimalist, at the same time sensible. % \begin{macrocode} -\newcommand*{\makelabels}[1][r]{\let\ch@lab#1} +\long\def\@makefntext#1{\noindent\hb@xt@\z@{\hss\@makefnmark}#1} % \end{macrocode} +% +% \subsubsection{Letter} +% +% Some specific letter values are initialized here. +% +% \begin{macro}{\fromname} +% \begin{macro}{\fromsig} +% \begin{macro}{\fromaddress} +% \begin{macro}{\fromlocation} +% \begin{macro}{\telephonenum} +% \begin{macro}{\returnaddress} +% |\fromname| is not empty by default, so is |\fromsig|: they contain the |\@author| value, +% which is defined at kernel level to output nothing but a warning message (no author given). +% |\@author| will be modified by the \LaTeX\ |\author| command. |\fromlocation| and +% |\fromaddress| are somewhat redundant, but they may be used for special purpose. +% |\returnaddress| should also output nothing by default, but it has to leave an empty line, +% hence the |\null| trick (actually an empty |\hbox|). +% +% \begin{macrocode} +\def\fromname{\@author} +\def\fromsig{\@author} +\let\fromlocation\@empty +\let\fromaddress\@empty +\let\telephonenum\@empty +\def\returnaddress{\null} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % \end{macro} % -% \subsection{The Letter Environment} -% The aforementioned commands are arguably specific to letters. But they may be used as well outside -% the letter environment to achieve some special effects. It is not mandatory to use a letter -% environment with this class. -% \begin{environment}{letter} -% The letter environment creates a new page, resets numberings, computes some values, -% invokes the |\maketitle| macro, optionaly twice (following the flag set -% by |\makelabels|) to generate an additional envelope page. -% This is an important functional difference with the standard letter class. -% As a side effect, local declarations (|\name| for example) will alter only the additional -% envelope page if they are made inside the letter environement. -% -% It has the same mandatory argument as the standard class, nevertheless it accepts one optional argument -% which will be passed to |\maketitle|:\\ -% |[p]| (plain, default) will put the expeditor field, the date and the recipient field.\\ -% |[e]| (everything) will add the return address to the recipient field.\\ -% |[n]| (nofrom) will put only the recipient field.\\ -% |[r]| (return) will add the return address to the recipient field. -% \begin{macrocode} -\newenvironment*{letter}[2][p] - {\ch@pfr{\fromaddress}\ch@pto{#2} - \letterindent\parindent\parindent\z@\letterskip\parskip - \longindentation\addressmargin\addtolength\longindentation{-\oddsidemargin} - \indentedwidth\textwidth\addtolength\indentedwidth{-\longindentation} - \newpage\c@page\@ne\c@footnote\z@\pagestyle{plain}\thispagestyle{empty} - \vspace*{\fromtop}\maketitle[#1]} - {\vfil\pagebreak - \if f\ch@lab - \else\newpage\thispagestyle{empty}\vspace*{\fromtop}\maketitle[\ch@lab]\fi} +% \begin{macro}{\toname} +% \begin{macro}{\toaddress} +% These values retrieved or adjusted at the opening of a |letter| environment. +% They are initialized here to prevent an error in certain condition. +% +% \begin{macrocode} +\let\toname\@empty +\let\toaddress\@empty % \end{macrocode} -% \end{environment} +% \end{macro} +% \end{macro} % -% \subsection{Standard Definitions} -% -% \subsubsection{Lists Parameters} -% \begin{macrocode} -\leftmargini\parindent\leftmargin\leftmargini -\leftmarginii\leftmargini\leftmarginiii\leftmargini\leftmarginiv\leftmargini -\labelsep.25\parindent\labelwidth.75\parindent -\renewcommand\theenumi{\@arabic\c@enumi} -\renewcommand\theenumii{\@alph\c@enumii} -\renewcommand\theenumiii{\@roman\c@enumiii} -\renewcommand\theenumiv{\@Alph\c@enumiv} -\newcommand\labelenumi{\theenumi.} -\newcommand\labelenumii{(\theenumii)} -\newcommand\labelenumiii{\theenumiii.} -\newcommand\labelenumiv{\theenumiv.} -\renewcommand\p@enumii{\theenumi} -\renewcommand\p@enumiii{\theenumi(\theenumii)} -\renewcommand\p@enumiv{\p@enumiii\theenumiii} -\newcommand\labelitemi{\textbullet} -\newcommand\labelitemii{\textendash} -\newcommand\labelitemiii{\textasteriskcentered} -\newcommand\labelitemiv{\textperiodcentered} -% \end{macrocode} -% -% \subsubsection{New Environments} -% \begin{macrocode} -\newenvironment{description} - {\list{}{\labelwidth\z@\itemindent-\leftmargin - \let\makelabel\descriptionlabel}}{\endlist} -\newcommand*{\descriptionlabel}[1] - {\hspace\labelsep\textbf{#1}} -\newenvironment{verse} - {\let\\=\@centercr - \list{}{\itemsep\z@\itemindent-\parindent - \listparindent\itemindent\rightmargin\leftmargin - \addtolength\leftmargin\parindent} - \item[]}{\endlist} -\newenvironment{quotation} - {\list{}{\listparindent\parindent - \itemindent\listparindent\rightmargin\leftmargin} - \item[]}{\endlist} -\newenvironment{quote} - {\list{}{\rightmargin\leftmargin} - \item[]}{\endlist} -% \end{macrocode} -% -% \subsubsection{Existing Environments Parameters} -% \begin{macrocode} -\arraycolsep5\p@\tabcolsep6\p@ -\arrayrulewidth.4\p@\doublerulesep2\p@ -\tabbingsep\labelsep -\skip\@mpfootins=\skip\footins -\fboxsep3\p@\fboxrule.4\p@ -\renewcommand\theequation{\@arabic\c@equation} +% \begin{macro}{\salutation} +% \begin{macro}{\valediction} +% These values are retrieved or adjusted respectively by the |\opening| and |\closing| +% commands. They are initialized here to prevent an error in certain condition. +% +% \begin{macrocode} +\let\salutation\@empty +\let\valediction\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \subsubsection{Words} +% +% \begin{macro}{\ccname} +% \begin{macro}{\enclname} +% \begin{macro}{\pagename} +% \begin{macro}{\headtoname} +% These words are common to the common \textsf{letter} classes. They will be adjusted by the +% linguistic packages (\textsf{babel} or \textsf{polyglossia}). |\ccname| and |\enclname| are +% used respectively by the |\cc| and |\encl| macros; while |\pagename| and |\headtoname| are +% used within |\pagestyle| layouts and some additional packages. +% +% \begin{macrocode} +\def\ccname{cc} +\def\enclname{encl} +\def\pagename{Page} +\def\headtoname{To} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Date} +% +% \begin{macro}{\today} +% The |\@date| field, which appears in the letterhead, defaults to |\today|. The |\today| +% value will be adjusted by the linguistic packages (\textsf{babel} or \textsf{polyglossia}). +% +% \begin{macrocode} +\def\today +{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} % \end{macrocode} +% \end{macro} +% +% \subsubsection{Two column mode} +% +% \begin{macro}{\columnsep} +% This is tricky! The idea is to align the columns with the addresses. In a default +% (A4) letter, the second column will align with the recipient's address and the date. % -% \subsubsection{Footnotes Parameters} % \begin{macrocode} -\renewcommand\footnoterule - {\kern-3\p@\hrule\@width.4\columnwidth\kern2.6\p@} -\newcommand\@makefntext[1] - {\noindent\hb@xt@\z@{\hss\@makefnmark}#1} +\columnsep36\p@ % \end{macrocode} +% \end{macro} % -% \subsubsection{Column Mode} +% \subsubsection{The page style} +% +% We have |\pagetyle{plain}| pages in this document class (except the letterhead +% page which has |\thispagestyle{firspage}|). We use arabic page numbers. +% % \begin{macrocode} -\columnsep10\p@\columnseprule0\p@ +\pagestyle{plain} \pagenumbering{arabic} -\raggedbottom\onecolumn % \end{macrocode} % -% \subsection{Internal Declarations} -% The following macros are internal to the chletter class. +% \subsection{Later initializations} +% +% This code handles the class options |leftwin|, |leftsig|, |foldmark|, |footfill| and +% |twocolumn| (retrieved by the associated booleans). It defines the default layout of the +% letter and would be very interesting for those who wish to completely customize the letter +% appearance by redefining the relevant macros. % -% \subsubsection{Tokenizers} -% \begin{macro}{\ch@pfr} -% \begin{macro}{\ch@pto} -% \begin{macro}{\ch@cut} -% These macros are tokenizers which split their argument -% depending on what is defined or not by the user. -% They build |\fromstreet|, |\fromplace|, |\toname|, -% |\toaddress| and |\returnaddress|. Note that if -% |\returnaddress| is not empty, it will be left in place. +% \subsubsection{Letterhead layout} +% +% \begin{macro}{\titletopmatter} +% \begin{macro}{\titlemidmatter} +% \begin{macro}{\titlebotmatter} +% The default layout of the letterhead is defined here, taking in account the class option +% |leftwin|. |\titletopmatter|, |\titlemidmatter| and |\titlebotmatter| are three strips of +% |\titletopheight|, |\titlemidheight| and |\titlebotheight| respective heights. Please note +% the usage of |\splitfield{...}{...}| which cuts a strip in two columns of |\adressmargin| +% and |\addresswidth| respective widths. +% +% \begin{macrocode} +\if@leftwin + \def\titletopmatter% + {\splitfield + {}{\fromlocation\par\fromname\par\fromaddress\par\telephonenum}} + \def\titlemidmatter% + {\returnaddress\par\toname\par\toaddress} + \def\titlebotmatter% + {\splitfield + {}{\@date}} +% \end{macrocode} % \begin{macrocode} -\newcommand\ch@pfr[1] - {\expandafter\ch@cut#1\\\@empty - \ifx\ch@sec\@empty\else\expandafter\ch@cut#1\@empty\fi - \let\fromstreet\ch@fir\let\fromplace\ch@sec - \ifx\@empty\returnaddress - \ifx\@empty\fromname - \ifx\@author\ch@aut\def\returnaddress{\fromstreet, \fromplace} - \else\def\returnaddress{\@author, \fromstreet, \fromplace}\fi - \else\def\returnaddress{\fromname, \fromstreet, \fromplace}\fi\fi} -\newcommand\ch@pto[1] - {\expandafter\ch@cut#1\\\@empty - \ifx\ch@sec\@empty\else\expandafter\ch@cut#1\@empty\fi - \let\toname\ch@fir\let\toaddress\ch@sec} -\def\ch@cut#1\\#2\@empty{\def\ch@fir{#1}\def\ch@sec{#2}} +\else + \def\titletopmatter% + {\splitfield + {\fromlocation\par\fromname\par\fromaddress\par\telephonenum}{\@date}} + \def\titlemidmatter% + {\splitfield + {}{\returnaddress\par\toname\par\toaddress}} + \def\titlebotmatter% + {}\fi % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % -% \subsubsection{Extractors} -% \begin{macro}{\ch@put} -% \begin{macro}{\ch@pul} -% These two macros are used by some commands (|\ps|, |\cc|, etc.) to position some text -% outside of the margin, following their optional argument. +% \begin{macro}{\splitfield} +% The letterhead is divided in three vertically stacked strips of |\titlewidth| width, named +% respectively |\titletopmatter|, |titlemidmatter| and |titlebotmatter| (see above). The +% purpose of this command is to divide a strip in two columns, the first one of |\addressmargin| +% width, the second one of |\addresswidth| width (computed on the fly by |\maketitle|, see +% above). The letterhead may contain graphics (a logo for example), so we have to cope with +% the relative vertical placement of text and imported pictures, hence the |\hbox| and |\strut| +% in the definitions of the parboxes. +% % \begin{macrocode} -\newcommand{\ch@put}[3][r] - {\par\noindent\hspace{-\oddsidemargin}\makebox[\oddsidemargin][#1]{#2~}#3} -\newcommand{\ch@pul}[2][r] - {\noindent\ifx l#1\hspace{-\oddsidemargin}\fi#2} +\long\def\splitfield#1#2% +{\parbox[b][\baselineskip][t]{\addressmargin}{\hb@xt@\z@{}{#1}\strut}% + \parbox[b][\baselineskip][t]{\addresswidth}{\hb@xt@\z@{}{#2}\strut}} % \end{macrocode} % \end{macro} +% +% \subsubsection{Signature layout} +% +% \begin{macro}{\closingmatter} +% |\closingmatter| is output by the |\closing| command and can contain any piece of text or +% code. |\fooftill| is an extra glue for better letter foot balancing (see below). Please +% note the crafty use of the |\ps| command. Also remember that |\leftmargin| and |\labelwidth| +% values are changed by this |\closingmatter|. +% +% \begin{macrocode} +\if@leftsig + \def\closingmatter% + {\leftmargin2\parindent + \vskip4\bigskipamount + \ps{}{\fromsig} + \vskip2\bigskipamount plus\footfill + \labelwidth3\labelwidth + \advance\labelwidth-\labelsep} +% \end{macrocode} +% \begin{macrocode} +\else + \def\closingmatter% + {\leftmargin\longindentation + \vskip4\bigskipamount + \ps{}{\fromsig} + \vskip2\bigskipamount plus\footfill + \leftmargin2\parindent + \labelwidth3\labelwidth + \advance\labelwidth-\labelsep}\fi +% \end{macrocode} % \end{macro} % -% \subsubsection{Flags} -% \begin{macro}{\ch@lab} -% \begin{macro}{\ch@aut} -% These are flags used by the letter environment and the titling commands. |\ch@lab| defines -% whether or not a label page should be generated, and |\ch@aut| knows if |\@author| has been -% altered by the user. +% \subsubsection{Fold mark} +% +% \begin{macro}{\foldmark} +% The |foldmark| class option alters the |\foldmark| macro, which causes a line to be added +% between the letterhead and the main text. Default is |\@empty|. +% % \begin{macrocode} -\let\ch@lab=f\let\ch@aut=\@author +\if@foldmark\def\foldmark{\hrule\@width6\fboxsep\@height\fboxrule} +\else\let\foldmark\@empty\fi % \end{macrocode} % \end{macro} +% +% \subsubsection{Letter footer} +% +% \begin{macro}{\footfill} +% A conditionnal definition of |\footfill| will alter the layout of |\closingmatter| +% (see above), adding an extra vertical glue after the signature. Default is |\@empty|. +% +% \begin{macrocode} +\if@footfill\def\footfill{1fill} +\else\let\footfill\z@\fi +% \end{macrocode} % \end{macro} % -% \subsubsection{Dummies} -% These commands are here only for compatibility with the standard letter class. +% \subsubsection{Two column mode} +% +% The column separator (|\columnsep|) is initialized earlier in the class code. +% Please note that in one column mode we reverse the position of the margin paragraphs. +% % \begin{macrocode} -\def\@startlabels{}\let\@mlabel=\@gobbletwo +\if@twocolumn\twocolumn\sloppy +\else\onecolumn\reversemarginpar\fi % \end{macrocode} % -% \subsection{End Of Class} +% \subsection{Legacy} +% +% Unfortunately some widely spread packages still relie on this! +% % \begin{macrocode} -%</chletter> +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\relax} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\relax} % \end{macrocode} -%\newpage -%\tableofcontents -% \Finale % -\endinput
\ No newline at end of file +% \begin{macrocode} +%</chletter.cls> +% \end{macrocode} +% +% \pagebreak +% +% \section{Letter template} +% +% \setcounter{CodelineNo}{0} +% +% The following \LaTeX\ document is intended to be used as a template. It will also +% compile with the standard \textsf{letter} class and the older version of the +% \textsf{chletter} class.\bigskip +% +% Please note that the \textsf{chextras} companion package will simplify the preparation of +% Swiss documents by setting up linguistic packages, font encoding and document layout. +% Look at \textsf{chextras} documentation for further information. +% +% \begin{macrocode} +%<*chlettmp.tex> +% \end{macrocode} +% +% \begin{macrocode} +\documentclass{chletter} + +%%\usepackage[english,black]{chextras} + +\author{My name} +\address{My address\\My City} +\telephone{My phone\\My email} +\date{My location, \today} + +\begin{document} +\begin{letter}{Name\\Address\\City} + +\opening{Dear \toname,} + +Body text. + +\closing{Yours truly,} + +\encl{Enclosures} +\cc{Other recipients} + +\end{letter} +\end{document} +% \end{macrocode} +% \begin{macrocode} +%</chlettmp.tex> +% \end{macrocode} +% +% \pagebreak +% +% \Finale +% \PrintIndex +\endinput + + |