% 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 \def\addresslabelformat#1{\global\*addrlbl={#1}}% \*addrlbl={} \def\*setlabel{\the\*addrlbl}% % 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