% Merge File Model Macro Definition File
\catcode`*=11
\catcode`"=\active
\catcode`,=\active
\catcode`@=\active
\newbox\FirstUp
\newbox\SecondUp
\newbox\ThirdUp
\newcount\*first \*first=0 % first token field
\newcount\*index \*index=0 % field index
\newcount\*lastentry \*lastentry=0 % last token filed
\newcount\*letternumber \*letternumber=0 % letter number from start
\newcount\LblsUp \LblsUp=1 % number of labels per line
\newcount\LblsAcross \LblsAcross=0 % counter for labels accross
\newdimen\LblMat \LblMat=0pt % left and right label margins
\newdimen\LblHt \LblHt=0in % vertical label size
\newdimen\LblWd \LblWd=0in % horozontal label size
\newif\if*check \*checkfalse % datacheck for manual entry
\newif\if*lbfopen \*lbfopenfalse % check for open label file
\newtoks\*csnametoks \*csnametoks={} % tokens for field names
\newtoks\*maillblfmt \*maillblfmt={} % label sheet format code
\newtoks\*addrlbl \*addrlbl={} % address label tokens
\newwrite\*labels % create label filee
\gdef,{\char'54{}}%
% Datacheck forces a print letter after each set of fields
\def\datacheck{\global\*checktrue}%
\def@{\ifnum\*index>0
\global\*index=\*first % reset index
\if*check
\global\advance\*letternumber by1
\immediate\write16{Letter number \the\*letternumber.
First Data Field: (\the\toks\*first) . . .
Last Data Field: (\the\toks\*lastentry ). }
\fi % write to log file for data check
\*prnletter % print current data
\fi
} % end of @ definition
% Take user defined names to build control sequences
\def\fieldnames#1{\par
\global\advance\count15 by 1 % new token register
\global\*first=\count15 % first new token register
\parsenames#1\end}% end fieldnames markup
% Separate name fields into individual entries
\def\parsenames#1{\ifx#1\end
\createfield
\let\next=\relax
\global\*lastentry=\count15
\global\*index=\*first
\*csnametoks={}
\else
\ifx#1,
\createfield
\global\advance\count15 by 1
\*csnametoks={}
\let\next=\parsenames
\else \*csnametoks=\expandafter{\the\*csnametoks#1}
\let\next=\parsenames
\fi\fi
\next}% end parsenames markup
% CREATEFIELD create control sequence names from name field entries
\def\createfield{\expandafter\xdef\csname\the\*csnametoks\endcsname
{\noexpand\the\toks\the\count15 }}% end createfield markup
% DEFINE " as name of merge command
\def"#1"{% set quote marks as active macro and delimiter
\ifnum\*index=0 \global\*index=\*first\fi
\global\toks\*index={#1} % gather argument in token variable
\ifnum\*index<\*lastentry % continue gathering process
\gdef,{\gdef,{\char'54{}}}% % drop , in data but not in text
\global\advance\*index by1 % index by 1
\ignorespaces % eliminate spurious spaces
\else % end process
\global\*index=0
\if*check
\global\advance\*letternumber by1
\immediate\write16{Letter number \the\*letternumber.
First Data Field: (\the\toks\*first) . . .
Last Data Field: (\the\toks\*lastentry ). }
\fi % write to log file for data check
\*prnletter % print current data
\fi}% end define " as macro name
% Merge letter text file merged for each data record
\def\*prnletter{% Print the letter text with current name/address fields
\catcode`"=12\catcode`@=3 % set " and @ to normal catcodes
\newpage % start new page for each letter
\setpagenumber{1} % reset page number
\inputletter % new page then get letter text file
\*savelabels{\*setlabel} % save address label information
\catcode`"=\active\catcode`@=\active % reset catcodes for markup defs
\relax}% end prnletter markup
% Give filename for letter text
\def\documentfilename#1{\gdef\inputletter{\input #1 }}%
% Give maillist data filename
\def\datafilename#1{\input #1 }%
% Print no empty lines with the line break markup
\def\noemptyspace#1#2{\edef\V{#1}\edef\W{\empty}%
\ifx\V\W% do nothing if empty argument
\else #1#2\fi% if not empty replace argument with the line break
}% end no emptyspace
\let\nes=\noemptyspace % set abbreviation
% SAVELABELS ships information for labels to the label file
\def\*savelabels#1{% Write Mail Label Information to TEXT1$$.LABEL
\if*lbfopen % do nothing if file TEXT1$$.LABEL already open
\else \immediate\openout\*labels=text1$$.label % open TEXT1$$.LABEL
\immediate\write\*labels{\the\*maillblfmt} % write format
\global\*lbfopentrue\fi % set open flag
\global\advance\LblsAcross by1 % set label postion pointer
\ifnum\LblsAcross>\LblsUp \global\LblsAcross=1 \fi
\edef\T{% create labels
\ifnum\LblsAcross=1 \setbox\FirstUp=\fi % left label
\ifnum\LblsAcross=2 \setbox\SecondUp=\fi% center label
\ifnum\LblsAcross=3 \setbox\ThirdUp=\fi % right label
\vtop to\LblHt{\hsize=\LblWd \leftskip=\LblMat \rightskip=\LblMat
\parindent=0pt #1\par\vfil} % make label to label size and width
\ifnum\LblsAcross=\LblsUp % print labels
\ifcase\LblsUp% case 0, no labels specified
\or\setbox\SecondUp=\null \setbox\ThirdUp=\null % one label
\or \setbox\ThirdUp=\null % two labels
\fi% end case % three label default
\line{\box\FirstUp\box\SecondUp\box\ThirdUp\hfil}
\fi}% end definition of T
\immediate\write\*labels{\T} % write information to file
}% end save labels definition
% Flushlabels prints any unprinted labels remaining in the markup
\def\*flushlabels{% print any remaining boxed labels
\ifcase\LblsUp % case ), no labels specified
\or \setbox\SecondUp=\null \setbox\ThirdUp=\null % one label
\or \setbox\ThirdUp=\null % two labels
\fi% end case % three label default
\immediate\write\*labels{\line{\box\FirstUp\box\SecondUp\box\ThirdUp
\hfil}}%
}% end flush any remaining labels
% Print the label file TEXT1$$.LABEL
\def\printlabels{\newpage % end last letter
\*flushlabels % print any remaining labels
\immediate\closeout\*labels % close data file
\setpagenumber{99} % labels begin on page 99
\input text1$$.label % input the address label data file
}% end print mailing labels
% Set format for the mailing labels
\def\maillabelformat#1{% Sets dimensions and margins of each label
\def\labelsetup##1{\global\*maillblfmt={##1}}%
\def\numberoflabelsperline##1{\global\LblsUp=##1}%
\def\labelheight##1{\global\LblHt=##1}%
\def\labelwidth##1{\global\LblWd=##1}%
\def\labelmat##1{\global\LblMat=##1}%
#1}% end mail label format
\let\mlfmt=\maillabelformat % set abbreviation
\catcode`*=12
% Set defaults for the mailing labels
% Maillabelformat sets the page and label information for mailing labels
\maillabelformat{\labelsetup{% Sets page and margin settings
\raggedbottom
\parskip=0pt plus0pt minus0pt
\runningheadformat{\bothpages{\line{}}}
\pageformat{\topmargin{1in}
\bottommargin{0pt}
\leftmargin{0pt}
\rightmargin{0pt}}% end page format
}% end labelsetup
\numberoflabelsperline{3}% three labels max
\labelheight{1in}
\labelwidth{2.75in}
\labelmat{.25in}
}% end mail label format