% \iffalse % %% File: labels.dtx %% Originally copyright (C) 1993-1994-1995-1998 by Sebastian Rahtz %% and Grant Gustafson %% Copyright (C) 2002-2003 by Julian Gilbey % % This program may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % This program consists of the files labels.dtx and labels.ins % together with the generated files labels.sty and olabels.sty. % \NeedsTeXFormat{LaTeX2e} %<*dtx> \ProvidesFile{labels.dtx}[2003/05/22 v.13] % % The version number also appears in the package code below. %<*driver> \documentclass{ltxdoc} \ProvidesFile{labels.drv}[2003/05/22 v.13] \GetFileInfo{labels.drv} \begin{document} \title{A package for making sticky labels in \LaTeX\thanks{This file has version number \fileversion, last revised \filedate.}} \author{Sebastian Rahtz, Leonor Barroca \and Grant Gustafson \and Julian Gilbey} \date{2003/05/22} \maketitle \tableofcontents \DocInput{labels.dtx} \end{document} % % \fi % \CheckSum{732} % \begin{abstract} % A \LaTeX\ style to print % a regular grid of ragged-right labels on a page, suitable for sheets % of labels % which can be fed through a laser printer. Macros are provided to % allow easy input of names and addresses in a form free of \TeX\ markup. % Equally useful is a feature for making multiple copies of a single % label, e.g., return address stickers to go with the labels. % \end{abstract} % % \section{Generating Style Files and Documentation} % Automatic generation of the style files uses the command line % \begin{center} |latex labels.ins| \end{center} % to create the files |labels.sty| (for \LaTeX{}2e) % and |olabels.sty| (for \LaTeX{}209). Usage in the preamble section of % a \LaTeX{} source file is % |\input{olabels.sty}| for \LaTeX{}209 and % |\usepackage{labels}| for \LaTeX{}2e. Backward compatibility with % \LaTeX{}209 may be removed suddenly in some future release. Please % observe that documentation is created by the command line % |latex labels.dtx|, % and no provision is made to produce documentation via \LaTeX{}209. % % \section{Usage} % This style file was written to produce a sheet of labels which can be % xeroxed onto \textsf{Avery brand} 5360 sticky-label material. This label % material is made for a xerox machine and it has 7 rows and 3 % columns of labels on |letterpaper|. It works for other label % layouts as well. In particular, the defaults for the most popular % paper sizes |letterpaper| and |a4paper| are $7$ % rows by $3$ columns and $8$ rows by $3$ columns, respectively. % % Other uses include production of disk labels, book labels, shipping % labels, name tags, door cards, photo galleries and compact membership % lists. % % The task of this package is to produce a rectangular grid of % items on a sheet of paper, with each item centered in its grid area. % It really doesn't matter what goes in the grid area: text, graphics or % any \LaTeX{} construct. For example, you might use the |fancybox| % package to produce oval-box or shadow-box name tags for a conference. % % \subsection{Paper Sizes} % The paper size is supplied by the document options for the class. % The European default is |a4paper| and the American default is % |letterpaper|, $8.5\times 11$-inch, inherited from the % class file, e.g., |article.cls|. % \begin{description} %\item[\textbf{a4paper}] 297mm by 210mm. %\item[\textbf{a5paper}] 210mm by 148mm. %\item[\textbf{b5paper}] 250mm by 176mm. %\item[\textbf{letterpaper}] 11in by 8.5in. %\item[\textbf{legalpaper}] 14in by 8.5in. %\item[\textbf{executivepaper}] 10.5in by 7.25in. %\end{description} % % \subsection{Label Stock Sizes} % A number of different label stocks are available for xerox machines % and laser printers. The typical stock has $m$ rows and $n$ columns % with various gutters on the page. Below is a table of \textsf{Avery} % products that are in common use in America. % % \medskip % %\DeleteShortVerb{\|} %{\small\rm %\begin{tabular}{|c|c|c|c|c|l|} %\hline %Label Size & Labels & Rows & Cols & Gutters &Avery \\ %in inches & per page & & & & Stock No \\ \hline %$1\frac{7}{16}\times2\frac{13}{16}$ & 21/page & 7 & 3 & Yes & 5360 \\ \hline %$2\times4\frac14$ & 10/page & 5 & 2 & Yes & 5352 \\ \hline %$2\times4$ & 10/page & 5 & 2 & Yes & 5327 \\ \hline %$1\times4$ & 20/page & 10 & 2 & Yes & 5161, 5261 \\ \hline %$1\frac{3}{8}\times2\frac{11}{16}$ & 21/page & 7 & 3 & Yes & 5329 \\ \hline %$1\times2\frac{5}{8}$ & 30/page & 10 & 3 & Yes & 5331, 5160, 5260 \\ \hline %$1\frac{1}{3}\times4$ & 14/page & 7 & 2 & Yes & 5162, 5262 \\ \hline %$\frac{1}{2}\times1\frac{3}{4}$ & 80/page & 20 & 4 & Yes & 5267 \\ \hline %$1\times2\frac34$ & 33/page & 11 & 3 & No & 5332, 5351, 5354, 5314 \\ \hline %\end{tabular} %} %\MakeShortVerb{\|} % % \medskip % % Another common label stock is \textsf{Dennison} 37-141, having 3 columns % and 8 rows of $1\frac38\times2\frac78$ gutterless labels on % letterpaper. The information by the manufacturer is not precisely % correct, because the first column \emph{is} exactly $2\frac78$ inches % wide, but the other two are $2\frac{13}{16}$ inches wide. % % A common problem with implementing this package on a new label stock % is precision of the laser printer, which prints the master, and the % xerox machine which prints the master onto the label stock. Some of % the above are for direct use on a laser printer, which removes one % source of error, but replaces it by the possibility that the label % stock will jam in the laser printer! % % \subsection{Customizing for Other Labels: the traditional method} % It is very likely that the label stock will be different than Avery 5360. % Generally, it is necessary to tailor the source file to a particular type % of label. % The lines below may be placed in the preamble and edited to suit % the application and the actual printer used for output. % \begin{verbatim} % \documentclass[12pt]{article} % \usepackage{labels} % \LabelCols=3% Number of columns of labels per page % \LabelRows=7% Number of rows of labels per page % \LeftBorder=8mm% Space added to left border of each label % \RightBorder=8mm% Space added to right border of each label % \TopBorder=9mm% Space to leave at top of sheet % \BottomBorder=2mm% Space to leave at bottom of sheet % \begin{document}% End of preamble % \end{verbatim} % These controls can also be issued after the beginning of the document, % but the results are undefined unless the following example is % followed, which uses the |\LabelSetup| control sequence: % \begin{verbatim} % \begin{document}% End of preamble % \LabelCols=3% Number of columns of labels per page % \LabelRows=7% Number of rows of labels per page % \LeftBorder=8mm% Space added to left border of each label % \RightBorder=8mm% Space added to right border of each label % \TopBorder=9mm% Space to leave at top of sheet % \BottomBorder=2mm% Space to leave at bottom of sheet % \LabelSetup% Invoke new settings % \end{verbatim} % For example, \emph{your} % grid maybe has only two columns of ten labels each, requiring the % first two variables to be reset. The gutter areas on the label % material dictate how to set the other parameters. % Personal adjustments can be made for the amount of white space around % each label. % % The printer driver is expected to print the page % \emph{exactly} as it should in vanilla \TeX, i.e., with the origin of % the page down one inch and right one inch from the top left hand % corner of the paper. If it doesn't, adjust the printer driver % parameters. % % A common problem with printers is that label output is % extra wide, requiring printing onto the very edges of the % paper. Some printers may not be able to maintain print quality % all the way to the edges of the paper. % Adjust the parameters |\LeftBorder|, |\RightBorder|, |\TopBorder|, % |\BottomBorder| as outlined below to solve this problem. % % First of all, |\TopBorder| is not the white space at the top of the % page, but the amount of space to leave at the top so that the first % label is centered on its grid. This number is determined by trial and % error using the actual printer, xerox machine and label stock to be % used in the production run. % % The second value |\BottomBorder| is determine empirically also, so % that the labels are all centered on their grids. A mathematical % formula to be satisfied is %\def\AA{\mbox{\texttt{paperheight}} - \mbox{\texttt{TopBorder}} - % \mbox{\texttt{BottomBorder}}} %\def\BB{\mbox{\texttt{LabelRows}}} %$$ \mbox{\texttt{Label Height}} = \frac{\AA}{\BB} $$ % The values |\LeftBorder| and |\RightBorder| are amounts of white space % to be added to the left and right of the actual label area so that the % label itself does not smash into the edge of the grid. The actual % label width is considerably smaller than the grid width (physical % width of the label stock). It is determined by the formula %\def\AA{\mbox{\texttt{paperwidth}}} %\def\BB{\mbox{\texttt{LabelCols}}} %\def\CC{\mbox{\texttt{LeftBorder}}} %\def\DD{\mbox{\texttt{RightBorder}}} %$$ \CC + \mbox{\texttt{Label Width}} + \DD = \frac{\AA}{\BB}$$ % Normally, the left and right white space dimensions are the same, but % there can be exceptions. It is best to determine the dimensions % empirically on the actual equipment to be used in the production run. % Visual guides from a |dvi| viewer can help, but be aware that the % laser printer may fail to print near the edge and the xerox machine % may either enlarge or shrink the image onto the label stock. % % An optional \textit{grid overlay} can be produced with the label output for % testing purposes by the preamble control sequence |\LabelInfotrue|. % Most |dvi| viewers are capable of showing the entire test grid. Once % printed, the overlay can be compared with the actual label stock to % see if the borders are in the proper place. By adjusting parameters, % the master copy off the laser printer should be able to pass through the % xerox machine automatically. % % \subsection{Customizing for Other Labels: the new method} % % One of the deficiencies of the method described above it that it is % unable to cope well with labels having spaces between them, and the % dimensions specified are not the natural ones which one would want % to measure. If the package option |newdimens| is given (and this % only works for users of \LaTeXe), then we can % give page parameters in a far more flexible manner as follows, where % these dimensions are suitable for Avery L7160 labels: % \begin{verbatim} % \documentclass[a4paper,12pt]{article} % \usepackage[newdimens]{labels} % \LabelCols=3% Number of columns of labels per page % \LabelRows=7% Number of rows of labels per page % \LeftPageMargin=7mm% These four parameters give the % \RightPageMargin=7mm% page gutter sizes. The outer edges of % \TopPageMargin=15mm% the outer labels are the specified % \BottomPageMargin=15mm% distances from the edge of the paper. % \InterLabelColumn=2mm% Gap between columns of labels % \InterLabelRow=0mm% Gap between rows of labels % \LeftLabelBorder=5mm% These four parameters give the extra % \RightLabelBorder=5mm% space used around the text on each % \TopLabelBorder=5mm% actual label. % \BottomLabelBorder=5mm% % \begin{document}% End of preamble % \end{verbatim} % (The |\LabelSetup| form can also be used, as above.) Thus the four % |\...PageMargin| parameters and the |\InterLabel...| paramenters % define the location of the physical labels on the page, and the % four |\...LabelBorder| parameters define how the space on each label % is to be used. % % As before, the printer driver is expected to print the page % \emph{exactly} as it should in vanilla \TeX, i.e., with the origin of % the page down one inch and right one inch from the top left hand % corner of the paper. If it doesn't, adjust the printer driver % parameters. % % We now describe how the locations of the labels are determined, as % we did before. The label height and label width are given by the % formul\ae: % $$\begin{array}{l} % \mbox{\texttt{LabelRows}}\times\mbox{\texttt{Label height}} + % (\mbox{\texttt{LabelRows}}-1)\times\mbox{\texttt{InterLabelRow}} =\\ % \qquad\mbox{\texttt{paperheight}} - \mbox{\texttt{TopPageMargin}} - % \mbox{\texttt{BottomPageMargin}} % \end{array}$$ % and % $$\begin{array}{l} % \mbox{\texttt{LabelColumns}}\times\mbox{\texttt{Label width}} + % (\mbox{\texttt{LabelColumns}}-1)\times\mbox{\texttt{InterLabelColumn}} =\\ % \mbox{\texttt{paperwidth}} - \mbox{\texttt{LeftPageMargin}} - % \mbox{\texttt{RightPageMargin}} % \end{array}$$ % Then, within each label, the label text is vertically centered in a % box which is indented |\TopLabelBorder| from the top of the label, % |\BottomLabelBorder| from the bottom, |\LeftLabelBorder| from the % left and |\RightLabelBorder| from the right. % % It is an error if $\mbox{\texttt{TopLabelBorder}} + % \mbox{\texttt{BottomLabelBorder}} \geq \mbox{\texttt{Label % height}}$, and similarly for the width; the results in such cases % may be unpredictable. % % Note that the |\LabelInfoTrue| function only draws the outlines of % the physical labels; see below for information on |\LabelGridtrue|. % % \subsection{Using an External Label source File} % The simplest form of input is very % short, as in the following example: % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \begin{document} % \labelfile{names.dat} % \end{document} % \end{verbatim} % where |names.dat| contains names and address in % \textit{plain format}. Source files in plain format may contain % extra blank lines (only one blank line between labels is required). % Sort fields should begin with |%| in column $1$, so they don't print % as part of the label. Leading and trailing blanks on lines are % ignored. The formfeed character Ctrl-L seems to be acceptable in the % source. A formfeed is not % ignored, even if it appears at the end of the file. For example, if % |^L| appears on a line by itself, then it either produces an empty % label or else a blank line, if it happens to be in a group of label % lines. The label data commonly appears on lines, flush left, with no % intervening blank lines, because a blank line signals a new label. To % purposely create blank labels, as for filling out a page of labels, % see the control sequence |\skiplabels{#1}|, \textit{infra}. The actual % text in the external file may contain \LaTeX{} markup controls. This % includes comment marks |%|, which will be ignored during typesetting. % %\section*{Source File Creation and Sorting} % Most mailing lists that already exist can be edited to create an % acceptable list in the proper format. If long lines are to wrap, % then force all the material to be wrapped onto one line in the source. % Otherwise, break the material into lines of the length desired. % Any special items in a mailing label can be coded in \LaTeX{}, e.g., % foreign names with accented characters, trademarks and font size % changes. % % Generally, raw sources have to be searched for special \LaTeX{} % controls and brought up to standard. The characters below may be % used in a source file for writing \LaTeX{} code. Generally, a raw % source has to be manually stripped of these characters. %\begin{verbatim} %Double quote \" Hash (number) \# Underscore \_ %Dollar \$ Percent \% Ampersand \& %Less than \< Greater than \> Vertical bar \| %Commercial at \@ Backslash \\ Circumflex \^ %Left brace \{ Right brace \} Tilde \~ %\end{verbatim} % % A typical comment line might start with |%| and then |^L| (ctrl-L) % followed by a sort key (e.g., the zip code or last name). The |emacs| % editor supports a method of sorting such records, thereby rearranging % the source file into a new label order. The method: % \begin{itemize} % \item % Mark the whole file as a region: |^[<| goes to the top of file, then % |^@| sets mark; follow by |^[>| to mark the whole file. %\item % Invoke |emacs|'s |sort-pages| external routine as follows. Press |^[x| % then enter |sort-pages| and press return. The region marked will be % sorted on the first line of each page, with a page delimited by |^L|. % For some |emacs| versions, the first line of the marked block has to % be empty, in order to produce a successful sort. % \end{itemize} % % \section*{General purpose \LaTeX{} Source} % % To set up a general-purpose \LaTeX{} source file, use % the following source, which prompts for the labels file name. % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \begin{document} % \promptlabels % \end{document} % \end{verbatim} % % \subsection{Labels in the Main File} % The names and addresses can appear directly in the main % file, rather than using \verb|\labelfile| to include them. % The file format is to be exactly as described above. Especially, % follow the advice about blank lines, which delimit labels. % This example makes use of the |labels| environment. % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \begin{document} % \begin{labels} % Me % My address % My City, State, Zipcode % % My Brother % His address % His City, State, Zipcode % \end{labels} % \end{document} % \end{verbatim} % % \subsection{Control Sequences to Make Labels} % There are other ways of accessing the same system. % \begin{enumerate} % \item The control sequence called |\addresslabel[#1]{#2}| accepts for % optional argument |#1| \LaTeX{} controls, e.g., font size and style, % and for argument |#2| the rows of a |tabular| array of one column. % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \begin{document} % \addresslabel[\small\sffamily] % {Me \\my street \\ mytown \\ England} % \end{document} % \end{verbatim} % % \item Boxed labels use the special macro called % |\boxedaddresslabel[#1]{#2}|, % as follows. This produces a frame-box around the label itself, leaving % lots of white space around the frame. An optional argument |[#1]| % is provided for local setting of \LaTeX{} controls, for example, % |[\fboxsep=3pt]| will change the white space near the frame. The % boolean variable % |\LabelInfotrue| appears in the preamble in order to print out % additional information, especially the label dimensions and the % settings of certain variables. % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \LabelInfotrue % \begin{document} % \boxedaddresslabel[\fboxsep=3pt] % {\textbf{Me} \\my street \\ mytown \\ England} % \end{document} % \end{verbatim} % % \item To \emph{duplicate} a label, there is a counter called % \verb|\numberoflabels| which you can set. % For example, to print a return address 21 times, use this % source: % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \numberoflabels=21 % \begin{document} % \addresslabel{Me \\my street \\ mytown \\ England} % \end{document} % \end{verbatim} % % \item For more sophisticated users, there is a macro % \verb|\genericlabel| which you can call, % with an argument of whatever you want to appear on the label (e.g., % for disk labels). Thus you could have % % \begin{tabular}{lp{1.0in}l} % \begin{minipage}{1.65in} % \begin{verbatim} % \genericlabel{% % \begin{tabular}{|c|} % \hline % My Amazing Program\\ % \hline % Disk 1 of 1\\ % \hline % \emph{We aim to serve}\\ % \hline % \end{tabular} % } % \end{verbatim} % \end{minipage} % & % \raggedright\sffamily % to produce a label like this: % & % \begin{minipage}{1.4in} % \begin{verbatim} % |------------------| % |My Amazing Program| % |------------------| % |Disk 1 of 1 | % |------------------| % |We aim to serve | % |------------------| % \end{verbatim} % \end{minipage} % \end{tabular} % \end{enumerate} % This feature has been used to print business cards with graphical % logo. % % \subsection{Wrapping Long Lines and Debugging} % Debugging of label files can be assisted by the internal error % messages which are emitted when a label box is too high or too wide % for the set parameters. This kind of error is unlikely to occur with % the standard controls and the \texttt{labels} environment, because by % default they use ragged right and wrap long lines. % % In all modes, you can opt for a grid around each label field by % setting a Boolean variable called |\LabelGridtrue|, e.g., % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \LabelGridtrue % \numberoflabels=21 % \begin{document} % \addresslabel{Me \\my street \\ mytown \\ England} % \end{document} % \end{verbatim} % By default you get no grids. The grids are useful for judging the % `spillover' of addresses onto adjacent labels, caused by long lines. % See also |\boxedaddresslabel|, which draws a tighter box with more % white space around the label text. Both can be used at the same time. % % \StopEventually{} % \section{The macros} % First of all, identify the package start, and specify that we % recognise the |newdimens| option. The |\iflabel@traddimens| macro % will record whether we are using the tradition |labels| dimension % system or not. % % \begin{macrocode} %<*package> %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{labels}[2003/05/22 v.13] %<*latex209> \newdimen\paperwidth \paperwidth=8.5in% 297mm for a4paper \newdimen\paperheight \paperheight=11in% 210mm for a4paper \def\settoheight#1#2{\setbox\@tempboxa% \hbox{#2}#1\ht\@tempboxa\setbox\@tempboxa\box\voidb@x} \def\PackageWarning#1#2{\typeout{#1: #2}} % \newif\iflabel@traddimens \label@traddimenstrue %\DeclareOption{newdimens}{\label@traddimensfalse} %\ProcessOptions % \end{macrocode} % We will be recording the size of a label, and the dimensions of the % grid, so we set up variables accordingly. % \begin{macrocode} \newcount\LabelCols \newcount\LabelRows \iflabel@traddimens \newdimen\LeftBorder \newdimen\RightBorder \newdimen\TopBorder \newdimen\BottomBorder \else \newdimen\LeftPageMargin \newdimen\RightPageMargin \newdimen\TopPageMargin \newdimen\BottomPageMargin \newdimen\InterLabelColumn \newdimen\InterLabelRow \newdimen\LeftLabelBorder \newdimen\RightLabelBorder \newdimen\TopLabelBorder \newdimen\BottomLabelBorder \fi \newcount\numberoflabels \newdimen\label@width \newdimen\label@height \newdimen\area@width \newdimen\area@height \newdimen\half@label \newdimen\half@area \newdimen\addr@width \newdimen\LabTmp \newsavebox\this@label \newcount\label@number \newcount\skip@labels \newcount\l@so@far \newcount\LabelTotal \newif\ifLabelGrid \newif\iffirst@label \newif\ifLabelInfo \first@labeltrue \LabelGridfalse \LabelInfofalse % \end{macrocode} % Set defaults for the labels based upon paper size and common use. % These values can be reset dynamically at runtime in the preamble. % \begin{macrocode} \ifdim\paperwidth=210mm\relax% \LabelCols=3\relax\LabelRows=8\relax% a4paper \else \LabelCols=3\relax\LabelRows=7\relax% letterpaper \fi% % \end{macrocode} % These variables are provided to allow you to force a border on the left % and right edges of each label. The values will affect every label, % of course, so you may need to experiment to get pleasing results. % The other variables adjust the gutter width at the top and bottom of a % page. They apply just to these two edges, and do not apply to a % particular label. Different defaults are necessary if we are using % |newdimens|. % A LaserJetIII seems to ignore about 8mm on the edges. Xerox machines % ignore even more, on all sides. % \begin{macrocode} \iflabel@traddimens \LeftBorder=8mm \RightBorder=8mm \TopBorder=9mm \BottomBorder=2mm \else \LeftPageMargin=4mm \RightPageMargin=4mm \TopPageMargin=5mm \BottomPageMargin=5mm \InterLabelColumn=0mm \InterLabelRow=0mm \LeftLabelBorder=5mm \RightLabelBorder=5mm \TopLabelBorder=4mm \BottomLabelBorder=4mm \fi % \end{macrocode} % We need to reset all the dimensions appropriately for a page of labels, % and the printer will need to know about the paper size as well. % \begin{macrocode} \textwidth=\paperwidth \textheight=\paperheight \topmargin=-1in \headheight=0em \headsep=0em \topskip=0em \footskip=0em \oddsidemargin=-1in \evensidemargin=-1in \pagestyle{empty} \parindent=0em \parskip=0pt % \end{macrocode} % Now calculate the size of labels simply as a proportion of the page % size (if you haven't got that right, this won't work, will it?). % This macro is to be executed before the first label is made. In % environment |labels| and macro |\genericlabel| (see below) this % happens automatically. If you write your own label environment or % macro, then model it after one of the aforementioned. % % We have two versions of this macro, depending on whether the % |newdimens| option has been set. % \begin{macrocode} \iflabel@traddimens \def\@LabelSetup{% \global\label@width\textwidth \global\divide\label@width by\LabelCols \global\label@height\textheight \global\advance\label@height by-\TopBorder \global\advance\label@height by-\BottomBorder \global\divide\label@height by\LabelRows % \end{macrocode} % The top margin of the paper is generally unused for % labels. \textsf{Avery} 5360 % label sheets have a $1/4$-inch gutter on the top and bottom. However, % there are no left or right margin gutters. We adjust the top margin to % keep the labels from printing on the gutter. % \begin{macrocode} \global\topmargin=-1in\global\advance\topmargin by\TopBorder % \end{macrocode} % It is not usually advisable to make the label printing go right to % the edge of the available area, so |\area@width| gives % the area that will actually be used for printing; the width is % cut down by |\LeftBorder| plus |\RightBorder|. These dimensions can be % set to zero if you have a design that uses the whole label. % \begin{macrocode} \global\area@width=\label@width \global\advance\area@width by -\LeftBorder \global\advance\area@width by -\RightBorder % \end{macrocode} % If the labels are to be produced on a grid, for debugging, then the % usual setting of |\fbox| separator width and |\fbox| rule width must % be subtracted so that the label box doesn't crash into the grid. % \begin{macrocode} \ifLabelGrid% \global\advance\area@width by-2\fboxsep \global\advance\area@width by-2\fboxrule \fi % \end{macrocode} % The height of the label box will be |2\half@label|. However, this box % will definitely crash into the grid lines. Reduce the label % height to account for the rule and separator widths that will be added % automatically by the boxing routine later on. % \begin{macrocode} \ifLabelGrid \global\advance\label@height by-2\fboxsep \global\advance\label@height by-2\fboxrule \fi \global\half@label=\label@height\divide\half@label by2\relax \global\label@number=1\relax } % \end{macrocode} % Now we handle the |newdimens| variant. The same general scheme % applies, but the calculations are different. % \begin{macrocode} \else \def\@LabelSetup{% \global\label@width\textwidth \global\advance\label@width by-\LeftPageMargin \global\advance\label@width by-\RightPageMargin \global\advance\label@width by-\LabelCols\InterLabelColumn \global\advance\label@width by\InterLabelColumn \global\divide\label@width by\LabelCols \ifdim\label@width<0pt \PackageWarning{labels}{Some dimensions are silly: label width \the\label@width~is negative!} \label@width=0pt \fi \global\label@height\textheight \global\advance\label@height by-\TopPageMargin \global\advance\label@height by-\BottomPageMargin \global\advance\label@height by-\LabelRows\InterLabelRow \global\advance\label@height by\InterLabelRow \global\divide\label@height by\LabelRows \ifdim\label@height<0pt \PackageWarning{labels}{Some dimensions are silly: label height \the\label@height~is negative!} \label@height=0pt \fi % \end{macrocode} % We now adjust the |\...margin| parameters to take account of % |\TopPageMargin| and |\LeftPageMargin|. % \begin{macrocode} \global\topmargin=-1in\global\advance\topmargin by\TopPageMargin \global\oddsidemargin=-1in\global\advance\oddsidemargin by\LeftPageMargin \global\evensidemargin=\oddsidemargin % \end{macrocode} % Again, |\area@width| gives the area that will actually be used for % printing; the width is cut down by |\LeftLabelBorder| plus % |\RightLabelBorder|. These dimensions can be set to zero if you % have a design that uses the whole label. Similarly, |\area@height| % gives the height of the printing area, |\half@label| gives half of % the label height and |\half@area| gives half of the printable area % height. % \begin{macrocode} \global\area@width=\label@width \global\advance\area@width by -\LeftLabelBorder \global\advance\area@width by -\RightLabelBorder \global\area@height=\label@height \global\advance\area@height by -\TopLabelBorder \global\advance\area@height by -\BottomLabelBorder \global\half@label=\label@height\divide\half@label by 2\relax \global\half@area=\area@height\divide\half@area by 2\relax \global\label@number=1\relax } \fi % \end{macrocode} % The boolean variable |\LabelInfotrue| is used to toggle the amount % of information printed at runtime. The boolean is placed in the % preamble to invoke a more informative printout. The default is no % information, but still echo a message, saying how to print more % information. % \begin{macrocode} \def\LabelSetup{\@LabelSetup \ifLabelInfo \typeout{Control sequences adjustable in the preamble:} \typeout{\LabelRows=\the\LabelRows} \typeout{\LabelCols=\the\LabelCols} \iflabel@traddimens \typeout{The newdimens option was not selected; the used parameters are:} \TypeoutBlurb{\TopBorder}{\TopBorder} \TypeoutBlurb{\BottomBorder}{\BottomBorder} \TypeoutBlurb{\LeftBorder}{\LeftBorder} \TypeoutBlurb{\RightBorder}{\RightBorder} \else \typeout{The newdimens option was selected; the used parameters are:} \TypeoutBlurb{\TopPageMargin}{\TopPageMargin} \TypeoutBlurb{\BottomPageMargin}{\BottomPageMargin} \TypeoutBlurb{\LeftPageMargin}{\LeftPageMargin} \TypeoutBlurb{\RightPageMargin}{\RightPageMargin} \TypeoutBlurb{\InterLabelColumn}{\InterLabelColumn} \TypeoutBlurb{\InterLabelRow}{\InterLabelRow} \TypeoutBlurb{\TopLabelBorder}{\TopLabelBorder} \TypeoutBlurb{\BottomLabelBorder}{\BottomLabelBorder} \TypeoutBlurb{\LeftLabelBorder}{\LeftLabelBorder} \TypeoutBlurb{\RightLabelBorder}{\RightLabelBorder} \fi \typeout{Computed values:} \TypeoutBlurb{Label Width}{\label@width} \TypeoutBlurb{Label Height}{\label@height} \else \typeout{To print info, put `\protect\LabelInfotrue' in the preamble} \fi } % \end{macrocode} % % We might want to print the same label several times, % so \verb|\sticky@label| will repeat \verb|\make@label| a % specified number of times (\verb|\numberoflabels|) % \begin{macrocode} \numberoflabels=1% % \end{macrocode} % % \begin{macrocode} \def\sticky@label{\l@so@far=0% \loop\ifnum\l@so@far<\numberoflabels\advance\l@so@far by 1\make@label% \repeat} % \end{macrocode} % % The real label-making macro appears below. % It assumes the actual text is in a box called \verb|\this@label|. % It is vital to make sure spaces are not included at the end of lines in % these macros, or all hell breaks loose. Internal checks are made for % box width and height, to report violations. The environments and % macros provided below always produce a ragged right box of fixed % width. Use |\genericlabel| to defeat the ragged right box and fixed % box width. % % \begin{macrocode} \def\make@label{% \ifnum\LabelTotal=0\vfill\eject\LabelTotal=\LabelRows\relax \multiply\LabelTotal by \LabelCols\fi \advance\LabelTotal by -1\relax \ifLabelGrid \let\boxing@type\framebox \else \let\boxing@type\makebox \fi % \end{macrocode} % The boxes made by the method below can overflow horizontally or % vertically. The code below emits an error message which pinpoints the % trouble and the degree of difficulty encountered. Most of the time % the text wrapping and ragged right controls fix the problem, but some % extra long lines can be troublesome. An essential part of this code is % to test the box for zero width, which will emit an empty label. If we % are doing it on purpose, then emit the label, otherwise discard it. % \begin{macrocode} \settowidth{\LabTmp}{\usebox{\this@label}}% \ifdim\LabTmp=0cm\let\action=\relax\else\let\action=\BuildB@x\fi %\TypeoutBlurb{Box Width}{\LabTmp}% \advance\LabTmp by -\area@width \ifdim\LabTmp>0cm\relax \PkgBlurb{Label too wide}{\LabTmp}\fi \settoheight{\LabTmp}% {\begin{tabular}{l}\usebox{\this@label}\end{tabular}}% %\TypeoutBlurb{Box height}{\LabTmp}% \iflabel@traddimens\advance\LabTmp by -\half@label \else\advance\LabTmp by -\half@area\fi \ifdim\LabTmp>0cm\relax \LabTmp=2\LabTmp\PkgBlurb{Label too tall}{\LabTmp}\fi % \end{macrocode} % Check for an empty box. Build the box provided it has some % dimension or else we are skipping labels on purpose. Otherwise, it's % empty and we discard it. % \begin{macrocode} \ifnum\skip@labels<\sk@pped\let\action=\BuildB@x\fi \action } % \end{macrocode} % Now build the box for the actual label. The box has minimum % height, which is set by using a vertical rule of zero width. At the % same time, set a minimum box width. % Set a position to half-way up a strut of the height of the label, % thus forcing text to be the correct height and vertically centered. % Apply box methods to adjust the white space left and right, using % horizontal rules of zero height. % \begin{macrocode} \def\BuildB@x{% \iflabel@traddimens \boxing@type[\label@width][c]{% \rule{0pt}{\label@height}% \raisebox{\half@label}[0pt][0pt]{% \rule{\LeftBorder}{0pt}% \usebox{\this@label}% \rule{\RightBorder}{0pt}% }}% % \end{macrocode} % We have a slightly different system when we are using the new % dimension system. We vertically center the label in the printing % area and indent in by the value of |\LeftLabelBorder|. We also mess % with the value of |\fboxsep| to make a framed box which doesn't % interfere with the placing of the label text. % \begin{macrocode} \else \begingroup \fboxsep=-\fboxrule \boxing@type{% \vbox to \label@height{% \vskip\TopLabelBorder \vss \hbox to \label@width{% \hskip\LeftLabelBorder \usebox{\this@label}% \hss }% \vss \vskip\BottomLabelBorder }% }% \endgroup \fi % \end{macrocode} % % Print |+| for this label to target errors by label number. % Empty labels made on purpose are printed as |x|. % Start a new line and print \verb"|" if we have printed a row % of |\LabelCols| labels. % \begin{macrocode} \ifnum\skip@labels<\sk@pped\message{x}\else\message{+}\fi \ifnum\label@number=\LabelCols \message{|}% \endgraf\nointerlineskip \iflabel@traddimens\else\vskip\InterLabelRow\fi \global\label@number=1 \else\global\advance\label@number by 1 \iflabel@traddimens\else\hskip\InterLabelColumn\fi \fi } % \end{macrocode} % To print out dimensions in more usual millimeters, % the following macros are used, which convert from \TeX's scaled points % into millimeters. The common \TeX{} points are also printed. % \begin{macrocode} \newcount\@Milli \def\ToMilli#1{\@Milli=#1\advance\@Milli by93225\relax \divide\@Milli by 186450\relax} \def\PkgBlurb#1#2{\ToMilli{#2}% \PackageWarning{labels}{#1 by \the\@Milli mm (\the #2)}% } \def\TypeoutBlurb#1#2{\ToMilli{#2}% \typeout{#1=\the\@Milli mm (\the #2)}% } % \end{macrocode} % % \section{User macros} % The basic case is a generic macro |\genericlabel{#1}| which takes its % argument |#1| and puts it out on a label. No ragged right. No fixed % width. Very basic. % \begin{macrocode} \newcommand{\genericlabel}[1]{% \iffirst@label\LabelSetup\first@labelfalse\fi% \savebox{\this@label}{#1}\sticky@label\@gobblecr} % \end{macrocode} % The more useful macro |\addresslabel[#1]{#2}| is based upon a tabular % environment, therefore it accepts lines ending in \verb"\\". It is % supposed to reproduce what is made by the |labels| environment. Extra % space left and right is removed from the tabular environment and the % width is fixed at value |\area@width| (see above for a discussion of % this computed dimension) with ragged right edge. The optional argument % |[#1]| is provided in order to set local values of certain variables, % for example, |[\fboxrule=2pt]| could appear as the optional argument % in order to locally change box rule size, without affecting the grid % line size used for debugging. % The plan is to use the common denominator of 2.09 and 2e, so % first we define some double argument double-talk. % \begin{macrocode} \long\def\L@dblarg#1{\@ifnextchar[{#1}{\L@xdblarg{#1}}} \long\def\L@xdblarg#1#2{#1[]{#2}} % \end{macrocode} % Using \LaTeX{2e} extensions, the command |\addresslabel[#1]{#2}| could % be coded as |\newcommand{\addresslabel}[2][]{...}|. % In coding common to both 2.09 and 2e, the following works: % \begin{macrocode} \long\def\addresslabel{\L@dblarg{\@addresslabel}} \long\def\@addresslabel[#1]#2{\genericlabel{#1% \begin{tabular}{@{}p{\area@width}@{}}\raggedright #2\end{tabular}}} % \end{macrocode} % The macro |\boxedaddresslabel[#1]{#2}| adds a framed box around the % address label defined above. The trouble here is in determining the % box width, which is reduced from its normal size by the widths of the % box rule and rule separator. The optional argument |[#1]| is the same % as for the previous macro, but here it performs a real service, % because it is often the case that box rule and box separator sizes % should be adjusted locally. % \begin{macrocode} \long\def\boxedaddresslabel{\L@dblarg{\@boxedaddresslabel}} \long\def\@boxedaddresslabel[#1]#2{\genericlabel{#1% \addr@width=\area@width\advance\addr@width by-2\fboxsep% \advance\addr@width by-2\fboxrule\fbox{% \begin{tabular}{@{}p{\addr@width}@{}}\raggedright #2\end{tabular}}}} % \end{macrocode} % The environment |labels|, for verbatim labels, will be defined. % \begin{macrocode} \long\def\labels {\iffirst@label\LabelSetup\first@labelfalse\fi\start@@label} \def\endlabels{\end@@label} % \end{macrocode} % The label contents are saved in a box called |\this@label|, formed as % a raggedright minipage of width |\area@width|. The trick is to make % the end of line character into a macro |^^M| which gets executed each % time it is encountered. By testing for blank lines, we can find the % end of a series of consecutive address lines and cause the macro to % terminate the label box definition, and possibly start another. The % usual action taken on intercept of an end of line character is to % insert |\newline|. It is only the case of a blank line that causes % us to end the current label. Here, swallow a pending \verb|^M|, to % avoid having a blank line at the start of each label. Extra blank % lines cause blank labels, which are thrown away when encountered, % later on. A technical point: we cannot use \verb|\sbox|, as % otherwise \TeX\ gets confused, attempting to use \verb|\bgroup| as % the second argument to \verb|\sbox|, which is not what we want. % \begin{macrocode} \def\start@@label{% \begin{lrbox}{\this@label}% \begin{minipage}{\area@width}\raggedright% \catcode `\^^M =\active\@gobblecr% } \def\end@@label{% \end{minipage}\end{lrbox}% \sticky@label} % \end{macrocode} % % The principal support macros needed to define the |labels| environment % will be defined below. These macros assume names and addresses appear % as consecutive lines separated by a blank line. If we are in the % middle of consecutive address lines, then just start a new line. % \begin{macrocode} \def\start@newline{\mbox{}\expandafter\newline}% % \end{macrocode} % If we have met a blank line, then finish the current label and start a % new label. % \begin{macrocode} \def\new@label{\end@@label\start@@label}% % \end{macrocode} % The macro |^^M| invokes either |\start@newline| or |\new@label|. To % define it, we use some hackery from Phil Taylor. Step one is to % activate a control sequence at end of line. % \begin{macrocode} \catcode `\^^M = \active% % \end{macrocode} % The opaque definition required uses |futurelet| to selectively expand % a control sequence during a definition. The macro |^^M| is supposed to % replace carriage returns by |\newline|, or else end this label and % start a new one with |\new@label|. The idea is to define |^^M| to be a % control sequence |\nexttoken|, active only when |^^M| has been made an % active control sequence. Then the expansion of |^^M{#1}| will be % |\nexttoken|, provided the next line |#1| following the current one % has no characters (except carriage return at the end). Otherwise, we % must be at the start of a new cluster of label lines. % \begin{macrocode} \def ^^M{\futurelet\nexttoken\isitapar}% \def\isitapar{\ifx^^M\nexttoken\let\action=\new@label\else% \let\action\start@newline\fi\action}% % \end{macrocode} % Definitions involving |^^M| are finished. Re-instate the original % catcode for carriage-return. % \begin{macrocode} \catcode `\^^M = 5\relax% % \end{macrocode} % The syntax of the |labels| environment can be shortened to a single % line, provided an input file name is known and the contents have been % prepared for use with the |labels| environment. % \begin{macrocode} \def\labelfile#1{\begin{labels}\input#1\end{labels}} % \end{macrocode} % In the interest of a general engine for label production, the program % can prompt for the file name at runtime. This kind of feature makes it % possible to run one batch file to create labels, regardless of the % source. % \begin{macrocode} \def\promptlabels{\typein[\labelfilename]{What is the name of the label file?} \labelfile{\labelfilename}} % \end{macrocode} % It is possible that a number of empty labels should be printed before % going on to print the next set of labels. % The |\skiplabels| macro takes an % integer argument of the number of empty labels to produce. An |x| is % printed on the terminal for each such empty label. For example: % \begin{verbatim} % \documentclass{article} % \usepackage{labels} % \begin{document} % \numberoflabels=19 % \boxedaddresslabel{Me \\my street \\ mytown \\ England} % \skiplabels{2}% Make 21 on first sheet % \numberoflabels=16 % \boxedaddresslabel{You \\your street \\ yourtown \\ England} % \end{document} % \end{verbatim} % \begin{macrocode} \newcount\sk@pped \def\skiplabels#1{\sk@pped=#1% \savebox{\this@label}{\rule{0pt}{.5in}}% \skip@labels=0\relax \loop\ifnum\skip@labels<\sk@pped\make@label% \advance\skip@labels by 1\relax\repeat} % % \end{macrocode} % % \section{History and acknowledgements} % \begin{itemize} % \item (SPQR) v.1, May 9th 1989 simply allowed % for |\addresslabel{... \\ ...\\...}| % \item (SPQR) v.2, July 15th permitted verbatim style with no explicit end of lines % \item (SPQR) v.3, March 1991 made more generic % \item (SPQR) v.4, January 1992 checked and made to work with emtex drivers % to my satisfaction, and documented to bare-bones level with `doc' system. % \item (SPQR) v.5, March 1993 allowed for |\skiplabels| % \item (SPQR) v.6, January 1994 for \LaTeXe % \item (SPQR) v.7, January 1994 fixes % \item (SPQR) v.8, April 1994 revised .dtx file % \item (GG) v.9, April 1995 revised .dtx file to Package so it % works with |article|, |report| and |book| classes. % Revisions by |gustafson@math.utah.edu|. % Made source independent of paper size (it depended on a4 paper). % Fixed extra space bug in tabular array of |\addresslabel| - % it did not reproduce results of the |labels| environment. % Minipage lines weren't ragged, now they are. % New controls to set spaces around labels. Corrected the label % placement computations. Error reporting for labels that % are too big for the set dimensions. Report in millimeters. % Invoked label setup at runtime. New |\boxedaddresslabel[#1]{#2}|. % Micrometer placement of label grid on the page. Introduced empty % label algorithm. Got rid of strange error messages. % \item (GG) v.9, May 1995. |newenvironment{labels}| failed under \LaTeX{} % 2.09 (1991), but worked under later versions! Defining |\labels| % and |\endlabels| fixed the problem. % \item (SPQR) v.10, June 1995. Checked and issued. % \item (GG) v.11, January 1998. % New counter |\LabelTotal| and page eject when this counter is % zero. % Beta version April 1996, released January 1998. Documented % \LaTeX{}209 style file |olabels.sty|. % \item (JDG) v.12, January 2002. % Introduced more natural dimension description system, which % is activated by the `|newdimens|' package option. This is only % implemented for the \LaTeXe\ version. % \item (JDG) v.13, May 2003. % Bug fix release: don't break with the color package (thanks % to Dominique de Waleffe for reporting it) % % \end{itemize} % The crucial macros which make the system bearable for mailing lists % by redefining end of line came from Phil Taylor; apologies % to him for using them in a \LaTeX\ style file! % % \Finale \endinput %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~}