From 873660d1a83ece926fe7206288dda9c36b349c1b Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 12 Jan 2006 23:46:03 +0000 Subject: generic 1 git-svn-id: svn://tug.org/texlive/trunk@613 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/generic/midnight/labels.tex | 358 ++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 Master/texmf-dist/tex/generic/midnight/labels.tex (limited to 'Master/texmf-dist/tex/generic/midnight/labels.tex') diff --git a/Master/texmf-dist/tex/generic/midnight/labels.tex b/Master/texmf-dist/tex/generic/midnight/labels.tex new file mode 100644 index 00000000000..8b3b75bc008 --- /dev/null +++ b/Master/texmf-dist/tex/generic/midnight/labels.tex @@ -0,0 +1,358 @@ +\ifx\LABELS\relax\endinput\else\let\LABELS=\relax\fi % \input only once +% +% labels.tex: Macros to print address labels (and bulk letters). +% version: 1.0 release: 24 October 1991 +% +% copyright (c) 1991 Marcel R. van der Goot +% You can use these macros to typeset documents. You may +% distribute this file freely, provided that you also distribute +% the accompanying documentation. +% You may make changes to this file, or extract portions +% of it for inclusion in other files, provided that +% (1) you change the name of the file; +% (2) you give proper credit and include copyright +% information where applicable; +% (3) explain how an unchanged version can be obtained; and +% (4) document the usage of your macros/changes (if usage +% of your macros is not worth documenting, they must not +% be worth using). +% You are not allowed to use the name ``Midnight Macros'' for +% any changed files. +% The above rules for making changes do not apply where it +% is explicitly noted in this file that something can be changed +% to conform to your local installation. +% +% USAGE: +% See the file labels.doc +% You need Midnight/dolines.tex and Midnight/loop.tex to use these +% macros. +% +% original: csvax.cs.caltech.edu [131.215.131.131] in pub/tex +% (use anonymous ftp). Also in various archives. +% +% Caltech, Pasadena --- Marcel van der Goot +% marcel@cs.caltech.edu +% Caltech 256--80 +% Pasadena, CA 91125 +% USA +% (818) 356--4603 +% + +% update history: +% version 1.0: This one. +% release 24 Oct 1991: I undid the change from 6 Aug 1991: Matthias +% Feyerabend suggested a more elegant change that has the +% same result (involving \the\expandafter\lbl_txt#1). +% release 6 Aug 1991: Dolines.tex was changed since the previous +% release: it now calls \everyline with a single macro rather +% than with the text of the line. This required a change in +% the creation of \lbl_txt; \addlbl_txt was added. +% release 14 Feb 1991: The original +% + +%%%%%% CODE: (you don't need to read this to use the macros) + +\input dolines % CHANGE this filename to correspond to + % your installation + +%%%%%%% Registers +% All user-accessible registers. Some private registers are declared +% later. +% Individual labels: +\newdimen\vlblsize +\newdimen\hlblsize +\newskip\vindent +\newskip\hindent +\newdimen\lbloutline +\newtoks\beforelbl +\newtoks\afterlbl + +% Labels on a page: +\newcount\vlbls +\newcount\hlbls +\newdimen\vfirst +\newdimen\hfirst +\newdimen\vinter +\newdimen\hinter + +% We make `_' into a letter to make macros private +\vlbls=\catcode`\_ % minor trick to remember old value +\catcode`\_=11 + +\newbox\lbl_ % box in which a label is constructed + + +%%%%%%% Error message +% If a label is too large, we give an error message. \err_dim is the +% excess size of the label, \lbl_txt is the text of the label. \lbl_txt +% is set while reading the label, so that we can report which label is +% too large. Depending on the value of \err_act, more action is +% taken: 0 --> nothing, 1 --> print label anyway, others --> print +% this label on \lbl_log=lblerror.tex as well. \lbl_log is closed +% and an appropriate message printed by \close_log. + +\newdimen\err_dim +\newtoks\lbl_txt +\newcount\err_act +\newcount\err_cnt +\newwrite\lbl_log + +\let\erroraction=\err_act + +\def\err_lbl#1% #1 = "wide" or "high" + {{\global\advance\err_cnt by 1 + \newlinechar=`\^^J + \immediate\write16{^^J**** Label is \the\err_dim\space too #1:}% + \immediate\write16{\the\lbl_txt}% + \ifcase\err_act + \or\make_lbl + \else\immediate\write\lbl_log{\the\lbl_txt}% + \fi + }} + +\def\close_msg#1% + {\ifnum\err_cnt>0 \immediate\write16{#1}% + \fi + } + +\def\close_log + {\ifcase\err_act + \close_msg{**** \the\err_cnt\space error(s) ****}% + \or \close_msg{**** \the\err_cnt\space label(s) with errors % + are included in the dvi file ****}% + \else\immediate\closeout\lbl_log + \close_msg{**** \the\err_cnt\space error(s): see lblerror.tex ****}% + \fi + } + +%%%%%%% Reading a label +% Every group of lines is set in a vbox, using dolines.tex (see dolines.doc). +% \lbl_before corresponds to \beforelines (see dolines), etc. +% Every line itself is set in an hbox. The sizes of the hboxes and +% vboxes are not specified here, because we want to do our own checking +% rather than rely on TeX's checking and error messages. The computation +% in \lbl_before is used to position the baseline of the first line +% independently of the height of that line. \vindent is similar to TeX's +% \topskip. + +\def\lbl_before + {\global\lbl_txt={}% + \setbox\lbl_=\vbox\bgroup + \advance\vindent by -\baselineskip + \ifdim\vindent<0sp \vindent=0sp \fi + \vskip\vindent + \prevdepth=0sp + \the\beforelbl + } + +% #1 is always equal to `\_ln', which in turn expands to the line of text. +% That works fine with \hbox, but we must somehow expand \_ln first before +% we put it in \lbl_txt. That is what the second expandafter is for. The +% first expandafter is to expand \the\lbl_txt (and \_ln) before the '{' is +% read. Otherwise no expansion is done: TeX does not expand the tokens in +% the text of a token variable. +% --- thanks for this solution to Matthias Feyerabend. + +\def\lbl_every#1% + {\hbox{#1}% + \global\lbl_txt=\expandafter{\the\expandafter\lbl_txt#1^^J}% + } + +\def\lbl_after + {\the\afterlbl + \egroup % closes \lbl_=\vbox{...} + \check_lbl + } + +%%%%%%% Making a label +% \check_lbl checks whether the label is not too large, and, if not, +% calls \make_lbl. (\make_lbl can also be called from \err_lbl.) +% Note that \check_lbl only checks for the natural size of the label; +% if \hindent or \vindent have shrink components, the label may +% actually fit. + +\def\check_lbl + {\err_dim=\wd\lbl_ \advance\err_dim by \hindent + \ifdim\err_dim>\hlblsize + \advance\err_dim by -\hlblsize + \err_lbl{wide}% + \else\err_dim=\ht\lbl_ \advance\err_dim by \dp\lbl_ + \ifdim\err_dim>\vlblsize + \advance\err_dim by -\vlblsize + \err_lbl{high}% + \else\make_lbl + \fi \fi + } + +\def\make_lbl + {\setbox\lbl_=\vbox to \vlblsize{\unvbox\lbl_ \vss}% + \setbox\lbl_=\hbox to \hlblsize + {\kern -\lbloutline \vrule width\lbloutline + \hskip\hindent \box\lbl_ \hss + \vrule width\lbloutline \kern -\lbloutline + }% + \setbox\lbl_=\vbox + {\kern -\lbloutline \hrule height\lbloutline + \box\lbl_ + \hrule height\lbloutline \kern -\lbloutline + }% + \add_to_row + } + +%%%%%%% Making a page +% \lbl_out takes the label constructed in \lbl_ and adds it to the current +% row. If the row is full, as counted by \h_cnt, the row is added +% to the current page. Similarly, if \v_cnt indicates a full page, +% the page is shipped out. (Note: There is no interline glue between +% rows because of the way \unvbox does (not) affect \prevdepth.) +% \finish_page ships out any remaining incomplete page. +% \count1 is used to count the labels (this is only used to report +% to the user when a page is shipped out). + +\newbox\lbl_page +\newbox\lbl_row +\newcount\v_cnt +\newcount\h_cnt + +\def\add_to_row + {\ifnum\h_cnt=0 + \global\setbox\lbl_row=\hbox{\kern\hfirst \box\lbl_}% + \else\global\setbox\lbl_row= + \hbox{\unhbox\lbl_row \kern\hinter \box\lbl_}% + \fi + \global\advance\h_cnt by 1 \global\advance\count1 by 1 + \ifnum\h_cnt<\hlbls + \else\add_to_page \global\h_cnt=0 + \fi + } + +\def\add_to_page + {\ifnum\v_cnt=0 + \global\setbox\lbl_page=\vbox{\kern\vfirst \box\lbl_row}% + \else\global\setbox\lbl_page= + \vbox{\unvbox\lbl_page \kern\vinter \box\lbl_row}% + \fi + \global\advance\v_cnt by 1 + \ifnum\v_cnt<\vlbls + \else\shipout\box\lbl_page \global\v_cnt=0 \global\advance\count0 by 1 + \fi + } + +\def\finish_page + {\ifnum\h_cnt>0 \add_to_page \fi + \ifnum\v_cnt>0 \shipout\box\lbl_page \global\advance\count0 by1 \fi + } + +%%%%%%% Typesetting labels +% In \setup_lbl the \bgroup is to prevent some changes from continuing +% after \endlabels (e.g., catcode changes). Of course, we could also have +% reset them to the (presumed) old values in \endlabels. And anyway, +% it is a rather unnecessary refinement, since it doesn't make much +% sence to combine typesetting labels with other things in the same +% TeX run. We prevent changes of \erroraction while labels are being +% typeset, since such changes would cause confusion with respect to +% the log file. (Another unnecessary refinement: if you change the +% action you deserve what you get.) +% The \hsize is set properly in case \beforelbl or \afterlbl contains +% horizontal material (this will be typeset as a normal paragraph). +% It also allows the use of \line in these token registers. + +\def\catcode_lbl{\catcode`\&=12 \catcode`\#=12 } + +\def\setup_lbl + {\vfill\supereject + \ifcase\err_act\or\else + \immediate\openout\lbl_log=lblerror.tex %<- significant space + \fi + \let\beforelines=\lbl_before \let\afterlines=\lbl_after + \let\everyline=\lbl_every + \let\finishdolines=\endlabels \def\enddolines{\endlabels}% + \bgroup + \dimen0=\hlblsize \advance\dimen0 by-\hindent + \hsize=\dimen0 + \let\erroraction=\relax \err_cnt=0 + \h_cnt=0 \v_cnt=0 \global\count1=0 + \voffset=-1in \hoffset=-1in + \catcode_lbl + } + +\def\endlabels + {\finish_page + \egroup + \close_log + } + +\def\beginlabels{\setup_lbl \begindolines} + +\def\labelfile#1{\setup_lbl \filedolines{#1}\endlabels} + + +%%%%%%% Typesetting bulk letters +% This is kept quite simple: Labels are read one by one from a file, +% and consist of a vbox with an hbox for each line. No extra indentations +% or other frills. After each label has been read, we simply \input the +% bulk letter. In the letter, \bulkaddress will typeset the label. +% Just before we input the letter, we set \end=\relax, just in case the +% letter ends with \bye. (This is better than setting \bye=\relax, since +% \bye may insert extra material.) The grouping from \filedolines will +% restore the original \end. + +\def\bulk_before{\setbox\lbl_=\vbox\bgroup} +\def\bulk_every#1{\hbox{#1\strut}} + +\def\bulk_after + {\egroup % closes \setbox\lbl_=\vbox\bgroup + \catcode_plain + \let\end=\relax + \input\bulk_in % + \vfill\supereject + \catcode_lbl + } + +\def\bulkaddress{\copy\lbl_} + +\def\bulk#1#2% addresses, letter + {\vfill\supereject + \edef\catcode_plain{\catcode`\noexpand\&=\the\catcode`\&% + \catcode`\noexpand\#=\the\catcode`\#}% + \let\beforelines=\bulk_before \let\afterlines=\bulk_after + \let\everyline=\bulk_every + \catcode_lbl + \def\bulk_in{#2}% + \filedolines{#1}% + \catcode_plain + } + + +%%%%%%% Initial values +% \errorcontextlines (exists in TeX 3.0 and later versions) is set in +% order to not unnecessarily confuse unexperienced users. Supposedly, +% the macros above don't cause errors. Any errors are most likely +% caused by something in \beforelines or \afterlines. + +\catcode`\_=\vlbls % restore catcode + +\ifx\errorcontextlines\undefined % \then old TeX version +\else\errorcontextlines=-1 +\fi + +\erroraction=2 +\lbloutline=0sp +\beforelbl={} +\afterlbl={} + +% The following defaults are rather arbitrary, in practice the user +% always has to set these values. +\vlblsize=5cm +\hlblsize=10cm +\vindent=1.3\baselineskip +\hindent=0.5cm + +\vlbls=5 +\hlbls=2 +\vfirst=1cm +\hfirst=5mm +\vinter=2mm +\hinter=2mm + +%%%%%%% -- cgit v1.2.3