% \iffalse
%
%% File: labels.dtx
%%   Originally copyright (C) 1993-1994-1995-1998 by Sebastian Rahtz
%%     and Grant Gustafson
%%   Copyright (C) 2002-2003 by Julian Gilbey <jdg@debian.org>
%
% 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]
%</dtx>
% 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}
%</driver>
% \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>
%<!latex209>\NeedsTeXFormat{LaTeX2e}
%<!latex209>\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}}
%</latex209>
\newif\iflabel@traddimens
\label@traddimenstrue
%<!latex209>\DeclareOption{newdimens}{\label@traddimensfalse}
%<!latex209>\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}
%</package>
%    \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         \~}
