%% file: TXSletr.tex - Letter Format - TeXsis version 2.18 %% @(#) $Id: TXSletr.tex,v 18.1 2000/06/01 21:49:58 myers Exp $ %======================================================================* % % A format for typing simple business letters. These macros % follow closely the letter format given in The TeXbook. The macros % here are tuned for BNL stationary, but can easily be adapted for % other stationary. A typical letter would look like: % % \letter % set up letter document format % \withEnvelope % to create an envelope too % \letterhead{xxxx} % xxxx is phone extension % \address % get address in box % % line endings are respected! % \body % text of letter follows % Dear whoever, % % % % \closing % begin closing % Sincerely yours, % closing salutation, indented % Your Name % indented, followed by a space % Your Title % optional additional line(s) % \annotations % initials, enclosures, etc. % % can also use \ps % \cc % carbon copies % % to more than one person % \bye % end of letter % % ----------------------------------------------------------------------- \message{Letter Format,} \catcode`@=11 % @ is a letter here % dimensions, counters, and boxes: \hdimphone and \vdimphone are the % positions relative to the page edge -- not the print boundaries -- of the % telephone number in \phoneletterhead. They are correct here for BNL % stationary. Similarly, \hdimdate and \vdimdate are the positions for the % date. These can be changed in TXSsite.tex to fit other stationary with % a generally similar format. \newdimen\headlineoffset \headlineoffset = 0.25 truein \newdimen\longindent \longindent = 3.5 truein \newdimen\hdimphone \hdimphone = 6.2truein \newdimen\vdimphone \vdimphone = 1.9truein \newdimen\hdimdate \hdimdate = 5.5truein \newdimen\vdimdate \vdimdate = 2.15truein \newskip\bigletterskip % skip down before address \bigletterskip=0.5 true in plus 0.5 true in minus .375 true in % ----------------------------------------------------------------------- % Initialization. \LetterFormat is called by \letter but can also be % called separately. \def\LetterFormat{% % \nopagenumbers % kill page numbers \singlespaced % letters always begin \singlespaced \quoteon % automatic open/close quotes \headline={\LetterHeadline}% % running headline has addressee \let\endmode=\par % start with this for \endmode \def\addressee{}\def\theAddress{}% % start with no addressee or address \let\date=\letterdate % \date puts date on top of letter \let\body=\letterbody % \body begins text of letter \obsolete\text\body % \text is obsolete as of 2.17 \let\cc=\ccletr % carbon copy for letters } \def\Letter{% document format for letters \ContentsSwitchfalse % no table of contents \refswitchfalse % no reference list \auxswitchfalse % no forward references \texsis % initialize \LetterFormat} % Setup using \LetterFormat \def\letter{\Letter} % synonym % \LetterHeadline does the running heads for pages after the first \def\LetterHeadline{% % headline for extra pages \ifnum\pageno>1 % headline placement and spacing \ifx\addressee\empty\relax % no addressee, so {\hfil Page \folio}% % just page number \else % otherwise addressee, date, page {\tenrm To \addressee\hfil\today\hfil Page \folio}% \fi % \else\hfil\fi} % but nothing on page 1 % \LetterWidth adjusts the width of the letter to allow long or % short letters to be fit nicely on the page. \def\LetterWidth#1{% % set width for letter \hsize=#1 % set \hsize \dimen0=#1 % calculate horizontal shift ... \advance \dimen0 by -6.5truein % subtract default \divide \dimen0 by 2 % \advance \hoffset by -\dimen0 % center letter \advance \longindent by \dimen0 % adjust closing } \def\letterwidth{\LetterWidth} % synonym \def\endletter{\endmode % how to end a letter \par\vfill\supereject % as usual, from Plain TeX \checktags % any undefined tags? \end} % exit %----------------------------------------------------------------------- % \beginlinemode ends the previous mode and starts a mode where % \obeylines is in effect. \beginparmode ends the previous mode and % starts a mode where lines are concatenated. \def\beginlinemode{\endmode\begingroup\parindent=0pt\parskip=0pt \obeylines\def\endmode{\par\endgroup}} \def\beginparmode{\endmode\begingroup\parskip=\medskipamount \def\endmode{\par\endgroup}} %----------------------------------------------------------------------- % \address gets the address in a vbox, as well as printing it at % the top of the letter. Line endings are respected here. The first % line after \address is the \addressee, which is used in the heading on % all pages after the first. \def\address{% \vskip\bigletterskip % skip down for address \beginlinemode % look for line ends in address \getaddress} % and get address \newbox\theaddress % to collect the address in {\obeylines\gdef\getAddress#1 #2 {#1\gdef\addressee{#2}\global\setbox\theaddress=\vbox\bgroup%% #2 \def\endmode{\egroup\endgroup \copy\theaddress}% }}% end \gdef and \obeylines \let\getaddress=\getAddress % default address collection % Use \body before typing the body of the letter. This is defined % to be \letterbody. \text is no longer a synonym (as of 2.17)! \def\letterbody{% \vskip\bigletterskip % skip down for address \bigskip % skip some more \beginparmode % paragraph mode \raggedright\pretolerance=2500 % Letters are not justified \noindent} % don't indent salutation % Use \closing at the end of the letter. It automatically puts a % space for a signature between the 1st and 2nd lines after \closing. % It also defines \theSignature for a possible \Envelope. \def\closing{\beginlinemode\getclosing} {\obeylines\gdef\getclosing#1 #2 #3 {#1\nobreak\bigskip\nobreak\bigskip \leftskip=\longindent #2 \nobreak\vskip .5 true in \gdef\theSignature{#3}% #3 }} % \annotations and \ps are used at the end of the letter. \annotations % respects lines while \ps gives paragraph mode. \ps has no % indentation, but you have to provide the ``P.S.'' yourself. % \ccletr is \cc for letters, and \Encl can be used to note enclosures \def\annotations{\beginlinemode\nobreak\bigskip \def\par{\endgraf\nobreak}\obeylines\par} \def\ps{\beginparmode\nobreak\bigskip \interlinepenalty 5000\def\par{\endgraf\penalty 5000} \noindent} \def\ccletr{\beginlinemode \nobreak \bigskip % skip down \def\par{\endgraf\nobreak}% % as for \annotations \obeylines\par % obey lines \ccitem{cc:\ }}% % print cc: \def\cc{\ccletr} % synonyms \def\CC{\cc} % synonyms \def\Encl{\beginlinemode \nobreak \bigskip % skip down \def\par{\endgraf\nobreak}% % as for \annotations \obeylines\par % obey lines \ccitem{Encl:\ }} % print cc: \def\encl{\Encl} % synonym % \ccitem does the work for \cc and \Encl \def\ccitem#1{\setbox0\hbox{#1\quad}% % box0 = argument \parindent=\wd0 % get its width \hang % hanging indentation \rlap{\copy0}% % and write it \nobreak % forbid break \vskip-\baselineskip\relax} % kill the skip \def\newpage{\vfill\eject} %======================================================================* % LETTERHEADS (simple): % % \letterhead just spaces down and puts the date at the top of the % page. \phoneletterhead puts in a phone number and the date at positions % given by \hdimphone, \vdimphone and \hdimdate, \vdimdate relative to % the true page boundaries. Customized versions of these can be put % in the TXSsite.tex file (see the Installation Appendix in the Manual). \def\letterhead#1{% % \vbox{\vskip 0.5 truein}% % skip down for the date \line{\hfil\today}% % right justify date \vskip\bigletterskip}% % space down to the address \def\phoneletterhead#1{% % #1 is phone number \vbox{\vskip-\voffset\vskip-\headlineoffset % skip down to position \vskip\vdimphone} % of phone number \hbox{\hskip-\hoffset\hskip\hdimphone #1}% % skip over to number \vskip-\vdimphone\vskip\vdimdate % skip down to date \hbox{\hskip-\hoffset\hskip\hdimdate \today} % date } % \def\letterdate{% % \letterdate just puts date on letters \vbox{\vskip 0.5 truein}% % skip down for the date \line{\hfil\today}% % right justify date \bigskip} % space down to the address %======================================================================* % Printing Envelopes: % % \MakeEnvelope prints an envelope, using #1 as the address and #2 % as the return address. If you print this (in landscape mode!) and % feed a blank envelope through your printer you'll get a printed envelope. % % \withEnvelope changes the definition of \address in the letter macros % so that the address is saved in a macro, not a box. It then arranges % for an appropriate \MakeEnvelope command to be written to the file % \jobname.env at the end of the job (when you say \endletter or \bye). % Run that file through TeXsis and print the output (in landscape) and % you'll get your envelope. % % Note that the modified \address requires that you begin the body of % the letter with \body, not \text. % \message{with envelopes.} % Envelope Dimensions: (change these in TXSsite.tex if yours are different) \newdimen\EnvlWidth \EnvlWidth=24cm % Envelope width \newdimen\EnvlHeight \EnvlHeight=10.5cm % Envelope height \newdimen\EnvlVoffset \EnvlVoffset=1.25in % vertical start position % \withEnvelope changes \address to use the alternate version below, % and arranges to have the envelope file \jobname.env created at the % end of the job, using \Envelope. The way this is done is a real hack, % but it works: In TeXsis \bye calls \checktags to check for undefined % tags (labels for equations and such). But since tags aren't used all % that much in letters we simply change \checktags to call \Envelope instead. \def\withEnvelope{% \let\getaddress=\getEnvAddressee % \def\checktags{\emsg{\@comment Writing the envelope to \jobname.env...}% \Envelope % \immediate\write\Envout{\NX\bye}% make sure it ends with \bye! \gdef\checktags{}% % prevent recursion (really?) } } % Alternate version of \getaddress for \Envelope changes the % behaviour of \address. Everything up to the following \body is the % address, and the first line is the \addressee. {\obeylines\gdef\getEnvAddressee#1 #2 {#1\gdef\addressee{#2}\getEnvAddress}% \gdef\getEnvAddress#1\body{\xdef\theAddress{\addressee #1}\endaddress}% }% end \obeylines \def\endaddress{\endgroup % end \linemode \vbox{\parskip=0pt\parindent=0pt\theAddress\vskip 0pt}% print it \letterbody} % do the \body % \Envelope writes commands to the file \jobname.env for producing % an envelope addressed to the addressee, with the return address % of the signer of the letter constructed from \theSignature (from \closing) % and \ReturnAddress (from TXSsite.tex, or you set it yourself). \newwrite\Envout % output Envelope file \def\EnvInit{\@FileInit\Envout=\jobname.env[Envelope]\gdef\EnvInit{}} \def\Envelope{\endmode\def\endmode{\relax}% \EnvInit \immediate\write\Envout{\NX\texsis\NX\ATunlock}% \immediate\write\Envout{\NX\MakeEnvelope{\theAddress}\@comment}% \immediate\write\Envout{{\theSignature\NX\n\ReturnAddress}}% } % \MakeEnvelope{address}{return address} actually prints the envelope. % \MakeEnvelope sets things up and turns on \obeylines to see line % endings, then calls \@MakeEnvelope to actually make the envelope. \def\MakeEnvelope{\vfill\eject % start on a new page \hsize=\EnvlWidth\vsize=\EnvlHeight % size page to match envelope \hoffset= -0.90in % left offset is edge of envelope \voffset=\EnvlVoffset % down to the top of the envelope \emsg{Envelope offset is \the\EnvlVoffset\ from the top (hope that's okay).} \nopagenumbers % \begingroup\singlespaced\obeylines % single spaced \@MakeEnvelope}% \def\@MakeEnvelope#1#2{% print address & return address on envelope %% \tightbox{\loosebox{%---% ONLY FOR TESTING \vbox to \EnvlHeight{\hsize=\EnvlWidth % Envelope Size \vskip 0.2cm\line{\hskip 0.8cm % space return address down and over \vbox to 2.5cm{\hsize=8cm\parskip=0pt\parindent=0pt % #2\vss}\hfill}% % Return Address: \vskip 1cm plus 1fil\line{\hskip 9cm% space address down and over \vbox{\hsize=14cm\parskip=0pt\parindent=0pt % #1\vss}\hfill}% % Mailing Address \vskip 1cm plus 1fil}% % space below address %% }}%---% ONLY FOR TESTING \endgroup\vfill} % end \obeylines, skip rest of page \def\ReturnAddress{\hbox{\ }\hfill\relax}% change this in TXSsite.tex \def\theSignature{}% %======================================================================* % FORM LETTERS. % % The form letter macros formerly in TXSform.tex have been moved to a % style file, Formletr.txs, so that they are only loaded when needed % (since that is infrequent). But to be able to specify the label % dimensions in the site file we need to define the dimensions anyway. \newdimen\fullHsize \fullHsize=8.5in % hsize for label page \newdimen\fullVsize \fullVsize=11.50in % vsize for label page \newdimen\lblHsize \lblHsize=2.833in % width of standard label \newdimen\lblVsize \lblVsize=1.365in % ht. of std. label - a bit \newdimen\lblVoffset \lblVoffset=-.900in % vertical starting position \newdimen\lblHoffset \lblHoffset=-0.750in % horizontal starting position \autoload\formLetters{Formletr.txs}\autoload\formletters{Formletr.txs} \autoload\formLabels{Formletr.txs}\autoload\formlabels{Formletr.txs} \autoload\formEnvelopes{Formletr.txs}\autoload\formenvelopes{Formletr.txs} %>>> EOF TXSletr.tex <<<