%% [merge.sty]
%%
%%        MERGE -- A Form Letter Option to the LaTeX Letter Style
%%
%%                              by
%%
%%                      Graeme McKinstry
%%                      Computing Services Centre
%%                      University of Otago
%%                      P O Box 56
%%                      Dunedin, New Zealand
%%
%%              graeme%[email protected]
%%
%% A version of these macros appeared in TUGboat 8 #1, April 1987.
%%
%% Merge is a substyle [option] under the Latex style 'Letter' which
%% merges a standard letter with a separate file containing addresses
%% and opening lines.  Merge will read {address}{opening} pairs from a
%% specified file and merge them with a form letter by producing a separate
%% letter environment (containing unique "\begin{letter}{address}" and
%% "\opening{opening}" commands) for each pair.
%%
%% Detailed instructions for preparation of the form letter and the
%% separate address file appear below, after the macros.
%%
%%
%%      27 July 1988
%%      Special Thanks go to B. Beeton ([email protected]) for
%%      -- supplying the raw TeX and documentation from the TUGBoat article;
%%      -- adding some documentation;
%%      -- and for placing this file in the <tex.tugboat> archives at score.
%%
%%      28 July 1988
%%      C. Roberson (csrobe@icase.[arpa|edu], csrobe@[wm]cs.wm.edu)
%%      -- some additional documentation (mostly cleanup for .sty file);
%%      -- changed ID message to a form more similar to LaTeX's;
%%      -- changed "Could not open file" to "Could not open address file"
%%         so user would better understand for which filename TeX
%%         was prompting with the string "\@mergefile=";
%%      -- tested merge.sty;  It works!  Thanks, Graeme!
%%      -- submitted file to /public/latex-style archives @ cs.rochester.edu.
%%
%%      6 September 1988
%%      G. McKinstry
%%      -- enhanced the macros to handle running headlines properly;
%%      -- fixed some other problems from the original version not addressed
%%         fully by C. Roberson;
%%      -- submitted new file to the latex-style archives.
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% csr - changed next line to conform more to LaTeX greeting.
\typeout{Letter Sub-Style 'Merge'. Release 6 October 1986 by Graeme McKinstry}

%% The basic algorithm is:
%%      1. Open the address file.
%%      2. Read the addresses file getting the address and opening line.
%%      3. Process the contents of the MERGE environment and store it
%%         in a box (\@store). This is the standard part of the letter.
%%      4. Produce the start of the letter (your address (including date),
%%         their address, and the opening line).
%%      5. Make a copy of the standard letter (\@store) and unbox this copy.
%%      6. Repeat steps 2, 4, and 5 (not 3) until there are no more addresses.


\newbox\@store
\long\def\@contents{\global\setbox\@store=\vbox\bgroup}  % store the contents
\long\def\@endcontents{\egroup}                          % of the letter

\def\@sendaddress{test}
\def\@openingtext{test}
\newif\if@firsttime                          % For storing the standard letter
\@firsttimetrue                              %   the first time through.

\newread\@addrfile                           % allocate an input stream

\def\@openfile{\openin\@addrfile=\@mergefile % open the address file
\ifeof\@addrfile                             % i.e., didn't open successfully
 \loop
    \immediate\write16{Could not open address file \@mergefile}
    \closein\@addrfile                      % close the input stream
    \read16 to \@mergefile                  % get another file name
    \openin\@addrfile=\@mergefile           % open up input stream
    \ifeof\@addrfile
 \repeat                                    % repeat until successfully opened
\fi}

% The merge environment (used as the \begin{merge}. The argument (#1) is
% the name of the file containing the addresses (a default of .tex extension)
% This file is opened (\@openfile), read (\@readfile), and then the box
% containing the contents of the standard letter is started (\@contents).

\def\merge#1{\def\@mergefile{#1 }\@openfile
                \@readfile
                \@contents}

% Read address file getting the address and opening line. If this is the
% first through then there is no reason to call \endmerge as this will
% be called later on (when \end{merge} is used).

\def\@getopeningline{\global\read\@addrfile
                           to\@openingtext}  % get the opening line

\def\@readfile{\global\read\@addrfile to\@sendaddress   % get the address
             \ifeof\@addrfile
                \let\next=\relax
             \else
                \@getopeningline
                \if@firsttime
                   \let\next=\relax
                \else
                   \let\next=\endmerge
                \fi
             \fi\next}

\newbox\@letterbox       % For copy of \@store (the box containing the standard
                        %   letter.
\def\endmerge{\if@firsttime\@endcontents\global\@firsttimefalse\fi %
                                       % end contents if it is the first time
    \bgroup\let\oldletter=\letter
    \def\letter##1\@relax{\oldletter{##1}}  % redefines letter
    \expandafter\letter\@sendaddress\@relax % need to expand \@sendaddress
    \opening{\@openingtext\vskip2\parskip}
    \setbox\@letterbox=\copy\@store  % copy the contents of the letter
    \unvbox\@letterbox
    \endletter\egroup
    \ifeof\@addrfile
       \message{End of file}
       \let\next=\relax
    \else
       \let\next=\@readfile          % loop round yet again
    \fi\next}

\endinput

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% A letter, say LETTER.TEX, would be set up as follows:

%% \documentstyle[merge]{letter}
%%
%% \address{...}                % your address
%% \signature{...}              % your signature
%%
%% \begin{document}
%% \begin{merge}{myaddresses}   % MYADDRESSES.TEX contains addresses+openings
%%
%% With regard to ....          % letter starts
%%
%% \closing{...}                % closing
%% \ps{...}                     % \ps, \encl, \cc, etc.
%%
%% \end{merge}
%% \end{document}

%% The address file, MYADDRESSES.TEX, would contain:

%% {Computing Services Centre, \\       % first address
%%  University of Otago, \\
%%  Dunedin, \\
%%  New Zealand}
%% {Dear Graeme,}               % \opening for first address
%% {Charles S. Roberson\\       % next address
%%  Dept. of Computer Science\\
%%  College of William and Mary\\
%%  Williamsburg, VA  23185}
%% {Dear Chip,}                 % next \opening
%% ....                         % etc.

%% NOTES:
%%   Braces are matched, except that if the input is only one line then it
%%     is not necessary to contain it within braces.
%%   It is important to leave NO BLANK LINES at the end of the address file.
%%   Be sure to supply the "\\" for breaking the addresses. -csr

%% [merge.sty]