summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/envlab
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/envlab
Initial commit
Diffstat (limited to 'macros/latex/contrib/envlab')
l---------macros/latex/contrib/envlab/README1
-rw-r--r--macros/latex/contrib/envlab/elguide.pdfbin0 -> 197107 bytes
-rw-r--r--macros/latex/contrib/envlab/elguide.tex1103
-rw-r--r--macros/latex/contrib/envlab/elold.ins27
-rw-r--r--macros/latex/contrib/envlab/envlab.dtx1759
-rw-r--r--macros/latex/contrib/envlab/envlab.ins25
-rw-r--r--macros/latex/contrib/envlab/envlab.pdfbin0 -> 200380 bytes
-rw-r--r--macros/latex/contrib/envlab/readme.v1289
8 files changed, 3004 insertions, 0 deletions
diff --git a/macros/latex/contrib/envlab/README b/macros/latex/contrib/envlab/README
new file mode 120000
index 0000000000..28713483ac
--- /dev/null
+++ b/macros/latex/contrib/envlab/README
@@ -0,0 +1 @@
+readme.v12 \ No newline at end of file
diff --git a/macros/latex/contrib/envlab/elguide.pdf b/macros/latex/contrib/envlab/elguide.pdf
new file mode 100644
index 0000000000..3c4a74fd8a
--- /dev/null
+++ b/macros/latex/contrib/envlab/elguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/envlab/elguide.tex b/macros/latex/contrib/envlab/elguide.tex
new file mode 100644
index 0000000000..f0e43669de
--- /dev/null
+++ b/macros/latex/contrib/envlab/elguide.tex
@@ -0,0 +1,1103 @@
+\documentclass{ltxguide}
+
+
+
+\usepackage{shortvrb}
+
+\newcommand{\EL}{\textsl{EnvLab}}
+\newcommand{\dvips}{\textsl{dvips}}
+\newcommand{\PS}{\textsl{PostScript}}
+\newcommand{\DS}{\textsl{DocStrip}}
+\newcommand{\mailing}{\textsl{mailing}}
+\newcommand{\graphics}{\textsl{graphics}}
+\newcommand{\gs}{\textsl{ghostscript}}
+\providecommand{\cs}[1]{{\ttfamily\char`\\{}#1}}
+\MakeShortVerb{\|}
+\renewcommand\star{{\ttfamily*}}
+\providecommand\marg[1]{%
+ {\ttfamily\char`\{}{\em#1\/}{\ttfamily\char`\}}}
+\providecommand\oarg[1]{%
+ {\ttfamily[}{\em#1\/}{\ttfamily]}}
+\providecommand\parg[1]{%
+ {\ttfamily(}{\em#1\/}{\ttfamily)}}
+
+\newenvironment{figpage}{%
+ \begin{minipage}{0.8\textwidth}}{\end{minipage}}
+
+\newcommand{\meta}[1]{$\langle${\em#1\/}$\rangle$}
+
+\begin{document}
+
+\title{Printing Envelopes and Labels in \LaTeXe: \EL\ Package.\\
+User Guide\thanks{\copyright Boris Veytsman, 1996, 1997}}
+\author{Boris Veytsman}
+\date{July 16, 1997}
+
+\maketitle
+
+\begin{abstract}
+ This package provides a comprehensive and easily customizable system
+ for creating mailing envelopes and labels in \LaTeXe. Includes
+ printing barcodes and address formatting according to the US Postal
+ Service rules.
+\end{abstract}
+
+\tableofcontents
+\listoffigures
+\listoftables
+
+
+
+
+\section{Introduction}
+\label{sec:Intro}
+
+The standard |\makelabels| command in the \LaTeXe\ |letter.cls|
+document class typesets labels on Avery 5352 sheets. A typical user
+may want more. \EL\ redefines |\makelabels| in\footnote{hopefully}
+a more useful and customizable way. \EL:
+\begin{itemize}
+\item Typesets mailing labels or envelopes on a number
+ of pre-defined label sheets \emph{or} envelopes.
+\item Can be easily configured for any customized label or envelope
+ sizes. The rule of thumb is: if you printer can print this, \EL\ can
+ typeset this.
+\item Can optionally print barcodes and/or process addresses according
+ to the United States Postal Service Rules.
+\item Allows you to include your logo in the return address.
+\item Painlessly interacts with mail merging packages such as
+ |mailing|.
+\item Does not require special fonts for address and barcodes
+ printing. The typesetting is implemented with standard fonts and
+ \LaTeX\ |\rule| commands.
+\end{itemize}
+
+This package was written with US mailing standards in mind. This is
+not a reflection of the author's americanocentrism: US standard was
+only one I had official documents about. If you want to add your
+national standards, please contact me with pointers to the
+corresponding documents.
+
+This document describes the basic usage of the package. More
+sophisticated users would want to typeset and browse |envlab.dtx| as
+well.
+
+\section{Installation}
+\label{sec:Install}
+
+The distribution of this package includes the following files:
+\begin{enumerate}
+\item |envlab.dtx|---fully documented program,
+\item |envlab.ins|---\DS\ instruction module,
+\item |elold.ins|---\DS\ instruction module for older
+ versions of \DS,
+\item |elguide.tex| (this file)---User Guide,
+\item |readme.|\emph{version\_number}---ReadMe file.
+\end{enumerate}
+To install the package
+\begin{enumerate}
+\item \LaTeX\ the file |envlab.ins|\footnote{If your |docstrip.tex| is
+ earlier than version 2.3, use |elold.ins| instead of
+ |envlab.ins|.}. It will produce three files: |envlab.drv|,
+ |envlab.sty| and |envlab.cfg|.
+\item (Optional) Look at the file |envlab.cfg| and change it
+ accordingly to your taste (see Section~\ref{sec:Cust}).
+\item Move the files |envlab.sty| and |envlab.cfg| to the
+ \LaTeX\ search path\footnote{The users of kpathsea based \TeX---like
+ te\TeX---should also issue |texhash| to update the search database.}
+\item Produce the documentation by \LaTeX ing the files |elguide.tex|
+ and (optional) |envlab.drv|.
+\item Enjoy!
+\end{enumerate}
+
+
+\section{Usage}
+\label{sec:Usage}
+
+
+\subsection{The basics}
+\label{sec:Basics}
+
+The package \EL\ is intended to be used with the \LaTeXe\ |letter|
+document class and similar custom classes. The standard document class
+defines the environment |letter|, which, among other things, writes to
+the main |.aux| file the information about mailing address. \EL\
+retrieves and typesets this information. In general one should not use
+\EL\ with document classes that do not provide this information. The
+package types an error message if it cannot find the |makelabels|
+command in the class it is called from\footnote{If you want to create
+ a custom letter class to be used with \EL, take care to write
+ commands \cs{startlabels} and
+ \cs{mlabel}\marg{from-address}\marg{to-address} to the |.aux| file.
+ Also define a \cs{makelabels} command. The latter can do
+ anything---\EL\ will redefine it anyway, but the package needs to
+ see \cs{makelabels} defined at the start up}.
+
+
+There are three ways to use \EL:
+
+\subsubsection{Automatic generation of envelopes or labels}
+ \begin{decl}
+ |\makelabels|
+ \end{decl}
+ Put in the preamble of your document:
+ |\usepackage|\oarg{options}|{envlab}| and |\makelabels|. The package
+ will generate envelopes or labels at the end of your document, ready
+ to be printed. An example of such usage is shown on
+ Fig.~\ref{fig:Auto}.
+
+ An interesting extension of this method is the use of \EL\ with
+ mail-merge packages. If such packages generate |letter|
+ environments, then \EL\ will happily produce envelopes or labels for
+ them. I tested \EL\ with the \mailing\ package available at
+ CTAN with excellent results. See an example on Fig.~\ref{fig:Merge}.
+
+\begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\usepackage[personalenvelope]{envlab}
+\makelabels
+
+\address{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}
+\signature{Joe}
+
+\begin{document}
+\begin{letter}{%
+ Mary McKeen\\2 Alpha Street\\Otherplace, NY 12346}
+ \opening{Dear Mary:}
+ I love only you
+ \closing{With love,}
+\end{letter}
+
+\begin{letter}{%
+ Lisa O'Hara\\2 Beta Street\\Anotherplace, NY 12347}
+ \opening{Dear Lisa:}
+ I love only you
+ \closing{With love,}
+\end{letter}
+\end{document}
+
+\end{verbatim}
+ \end{figpage}
+ \caption{Automatic generation of envelopes}
+ \label{fig:Auto}
+ \end{center}
+\end{figure}
+
+\begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\usepackage[avery5061label,alwaysbarcodes]{envlab}
+\makelabels
+
+\address{%
+Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}
+\signature{Joe}
+
+\usepackage{mailing}
+\addressfile{lovers.dat}
+\mailingtext{%
+ I love only you
+ \closing{With love,}}
+
+\begin{document}
+\makemailing
+\end{document}
+\end{verbatim}
+ \end{figpage}
+ \caption[\EL\ and \textsl{mailing} package.]{\EL\ and
+ \textsl{mailing} package. The file |lovers.dat| contains the
+ address data in the format described in the documentation for
+ \textsl{mailing} package.}
+ \label{fig:Merge}
+ \end{center}
+\end{figure}
+
+
+\subsubsection{Manual generation of envelopes or labels}
+\begin{decl}
+ |\startlabels|, |\mlabel|\marg{from-address}\marg{to-address}
+\end{decl}
+Sometimes you need to generate only mailing labels or envelopes, but
+not letters themselves. In this case prepare a separate document of
+|letter| document class. Put in the preamble of your document
+|\usepackage|\oarg{options}|{envlab}| and |\makelabels|, and in the
+body of your document the command |\startlabels|\footnote{It sets up
+ page parameters for envelopes and letters}, and commands
+|\mlabel|\marg{from-address}\marg{to-address} for each label you want
+to generate (see Fig.~\ref{fig:Manual})
+
+ \begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\usepackage[businessenvelope]{envlab}
+\makelabels
+
+\begin{document}
+\startlabels
+\mlabel{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}{%
+ Mary McKeen\\2 Alpha Street\\Otherplace, NY 12346}
+\mlabel{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}{%
+ Lisa O'Hara\\2 Beta Street\\Anotherplace, NY 12347}
+\end{document}
+\end{verbatim}
+ \end{figpage}
+ \caption{Manual generation of envelopes}
+ \label{fig:Manual}
+ \end{center}
+ \end{figure}
+
+
+\subsubsection{Printing of return labels}
+\begin{decl}
+ |\printreturnlabels|\marg{number}\marg{text}
+\end{decl}
+
+Sometimes you need to print only return labels. To print \marg{number}
+of labels with the \marg{text} on each use the command
+|\printreturnlabels|\marg{number}\marg{text}. It is better to put it in
+a separate document (see Fig.~\ref{fig:Return}).
+
+\begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\usepackage[avery5160label,noprintbarcodes,%
+nocapaddress]{envlab}
+\makelabels
+
+\begin{document}
+\printreturnlabels{180}{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}
+\end{document}
+\end{verbatim}
+ \end{figpage}
+ \caption{Printing of return labels}
+ \label{fig:Return}
+ \end{center}
+\end{figure}
+
+
+\subsection{Sizes of labels and envelopes}
+
+\NEWdescription{Version 1.2} \EL\ package recognizes three kinds of media:
+envelopes, labels and \NEWfeature{Version 1.2}``big labels''. Envelopes are
+printed one per physical page, they could be rotated (i.~e.\ inserted
+in the printer sidewise) and could carry both the shipping address and
+return address. Labels and big labels are peel-off labels that are
+printed several per physical page, they could not be rotated. The
+difference between labels and big labels is that labels have only
+shipping address while big labels have both return \emph{and} shipping
+addresses. These differences are summarized in Table~\ref{tab:diff}.
+The kind and the size of the media are set either by package options
+or by the corresponding commands.
+\begin{table}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{cccc}
+ \hline
+ Media & Number per page & Rotation & Return address \\
+ \hline
+ Envelopes & One & Settable & Yes\\
+ Labels & Several & Not rotated & No\\
+ Big Labels & Several & Not rotated & Yes\\
+ \hline
+ \end{tabular}
+ \caption{Differences between envelopes, labels and big labels}
+ \label{tab:diff}
+ \end{center}
+\end{table}
+
+
+\begin{decl}
+ |businessenvelope|,
+ |executiveenvelope|,
+ |bookletenvelope|,
+ |personalenvelope|,\\
+ |c6envelope|,
+ |c65envelope|,
+ |c5envelope|, |dlenvelope|
+\end{decl}
+\EL\ knows about a number of standard envelopes. The options listed in
+Table~\ref{tab:Env} are used to typeset the addresses for envelopes
+with the given width and height. For example, if you have
+$9.5''\times4.125''$ envelopes, use the command
+|\usepackage[businessenvelope]{envlab}|.
+
+\begin{table}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{ccc}
+ \hline
+ Package option & Width & Height\\
+ \hline
+ businessenvelope & 9.5$''$ & 4.125$''$\\
+ executiveenvelope & 7.5$''$ & 3.875$''$\\
+ bookletenvelope & 10.5$''$ & 7.5$''$\\
+ personalenvelope & 6.5$''$ & 3.625$''$\\
+ c6envelope & 162 mm & 114 mm\\
+ c65envelope & 224 mm & 114 mm\\
+ c5envelope & 229 mm & 162 mm\\
+ dlenvelope & 220 mm & 110 mm\\
+ \hline
+ \end{tabular}
+ \caption{Standard envelope sizes}
+ \label{tab:Env}
+ \end{center}
+\end{table}
+
+\begin{decl}
+ |\SetEnvelope|\oarg{top margin}\marg{width}\marg{height}
+\end{decl}
+If your envelope is not listed in Table~\ref{tab:Env}, put in the
+preamble of your document the command
+|\SetEnvelope|\marg{width}\marg{height}\footnote{The optional first
+ argument of this command is described in Section~\ref{sec:Print}}.
+Its arguments are dimensions of your envelope (together with the
+units!). For example, if you have $8''\times4''$ envelopes, use the
+command |\SetEnvelope{8in}{4in}|.
+
+\begin{decl}
+|avery5160label|,
+|avery5161label|,
+|avery5162label|,
+|avery5163label|,\\
+|avery5164label|,
+|avery5262label|,
+|herma4625label|
+\end{decl}
+\EL\ knows also about a number of commercially available labels.
+They are listed in Table~\ref{tab:Lab}. The dimensions $W$ and $H$ are
+the label total width and height, $t$ and $l$ are the distance between
+the edge of the paper and the label (see Fig.~\ref{fig:Labels}). The
+numbers $N_c$ and $N_r$ are correspondingly the numbers of columns and
+rows of labels on a sheet.
+
+\begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+\setlength{\unitlength}{0.00083300in}%
+%
+\begingroup\makeatletter\ifx\SetFigFont\undefined%
+\gdef\SetFigFont#1#2#3#4#5{%
+ \reset@font\fontsize{#1}{#2pt}%
+ \fontfamily{#3}\fontseries{#4}\fontshape{#5}%
+ \selectfont}%
+\fi\endgroup%
+\begin{picture}(5169,4051)(76,-3305)
+\thicklines
+\put(1201,-2761){\framebox(1700,900){}}
+\put(901,539){\line( 0,-1){975}}
+\put(1201,539){\line( 0,-1){1200}}
+\put(301,-361){\line( 1, 0){675}}
+\put(301,-661){\line( 1, 0){1125}}
+\put(301,-1861){\line( 1, 0){1200}}
+\put(376,-361){\vector( 0, 1){ 0}}
+\put(376,-361){\vector( 0,-1){300}}
+\put(376,-661){\vector( 0, 1){ 0}}
+\put(376,-661){\vector( 0,-1){1200}}
+\put(901,464){\vector(-1, 0){ 0}}
+\put(901,464){\vector( 1, 0){300}}
+\put(901,-361){\line( 0,-1){2900}}
+\put(1201,-1561){\framebox(1700,900){}}
+\put(3201,-1561){\framebox(1700,900){}}
+\put(3201,-2761){\framebox(1700,900){}}
+\put(901,-361){\line( 1, 0){4300}}
+\put(2901,239){\line( 0,-1){975}}
+\put(3201,539){\line( 0,-1){1275}}
+\put(2901,164){\vector(-1, 0){ 0}}
+\put(2901,164){\vector( 1, 0){300}}
+\put(1201,464){\vector(-1, 0){ 0}}
+\put(1201,464){\vector( 1, 0){2000}}
+\put( 76,-1336){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}$H$}}}
+\put(976,614){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}$l$}}}
+\put(151,-586){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}$t$}}}
+\put(2976,239){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}$r$}}}
+\put(2051,614){\makebox(0,0)[lb]{\smash{\SetFigFont{12}{14.4}{\rmdefault}{\mddefault}{\updefault}$W$}}}
+\end{picture}
+ \caption{Labels parameters}
+ \label{fig:Labels}
+ \end{center}
+\end{figure}
+
+\begin{table}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{ccccccccc}
+ \hline
+ Package option & $W$ & $H$ & $t$ & $l$ & $r$ & $N_c$ & $N_r$\\
+ \hline
+ avery5160label & 2.75$''$ & 1$''$ & 0.5$''$ & 0.19$''$ &
+ 0.12$''$ & 3 & 10\\
+ avery5161label & 4.19$''$ & 1$''$ & 0.5$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 10\\
+ avery5162label & 4.19$''$ & 1.33$''$ & 0.83$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 7\\
+ avery5163label & 4.19$''$ & 2$''$ & 0.5$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 5\\
+ avery5164label & 4.19$''$ & 3.33$''$ & 0.5$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 3\\
+ avery5262label & 110 mm & 34 mm & 21 mm & 4 mm &
+ 5 mm & 2 & 7\\
+ herma4625label & 105 mm & 42.3 mm & 0 mm & 5 mm &
+ 5 mm & 2 & 7\\
+ \hline
+ \end{tabular}
+ \caption{Standard label sizes}
+ \label{tab:Lab}
+ \end{center}
+\end{table}
+
+\begin{decl}
+ |\SetLabel|%
+ \marg{$W$}\marg{$H$}\marg{$t$}\marg{$l$}\marg{$r$}\marg{$N_c$}\marg{$N_r$}
+\end{decl}
+If your label size is not listed in Table~\ref{tab:Lab}, put in the
+preamble of your document the command |\SetLabel|\marg {$W$}\marg
+{$H$}\marg {$t$}\marg {$l$}\marg {$r$}\marg {$N_c$} \marg{$N_r$}. This
+command is completely analogous to the command |\SetEnvelope|
+described above.
+
+\begin{decl}
+|avery5163biglabel|,
+|avery5164biglabel|
+\end{decl}
+\NEWfeature{Version 1.2}
+``Big labels'' are big enough to carry both shipping and return
+addresses, otherwise their dimensions are completely analogous to the
+ones of labels. The predefined big labels are listed in
+Table~\ref{tab:BigLab}. Note the difference between package options,
+say, |avery5163label| and |avery5163biglabel|: while the physical
+media is same, the formatting of addresses is quite different.
+
+\begin{table}[tbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{ccccccccc}
+ \hline
+ Package option & $W$ & $H$ & $t$ & $l$ & $r$ & $N_c$ & $N_r$\\
+ \hline
+ avery5163biglabel & 4.19$''$ & 2$''$ & 0.5$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 5\\
+ avery5164biglabel & 4.19$''$ & 3.33$''$ & 0.5$''$ & 0.16$''$ &
+ 0.19$''$ & 2 & 3\\
+ \hline
+ \end{tabular}
+ \caption{Standard big label sizes}
+ \label{tab:BigLab}
+ \end{center}
+\end{table}
+
+\begin{decl}
+ |\SetBigLabel|%
+ \marg{$W$}\marg{$H$}\marg{$t$}\marg{$l$}\marg{$r$}\marg{$N_c$}\marg{$N_r$}
+\end{decl}
+\NEWfeature{Version 1.2}
+If your label size is not listed in Table~\ref{tab:BigLab}, put in the
+preamble of your document the command |\SetBigLabel|\marg {$W$}\marg
+{$H$}\marg {$t$}\marg {$l$}\marg {$r$}\marg {$N_c$} \marg{$N_r$}.
+
+
+\subsection{Printing details}\label{sec:Print}
+
+\EL\ typesets envelopes or sheets of labels just after the main text
+of all letters in the documents. Most printers that have paper tray
+and manual feeding slot use manual slot if it is not empty and tray
+otherwise. When printing envelopes or labels on such printers, you
+wait until the text of letters is printed, and then insert envelopes
+or label sheets one by one in the manual feeding slot.
+
+\begin{decl}
+ |\AtBeginLabels|\marg{Printer specific commands}\\
+ |\AtBeginLabelPage|\marg{Printer specific commands}
+\end{decl}
+However some printers have several paper trays and even paper trays
+for envelopes. Moreover, sometimes the switching between trays can be
+performed automatically by software commands. If you know such
+commands for your printer and know how to insert them in the |.dvi| file
+(e.g. through |\special|s), you can use the hook
+|\AtBeginLabels|. Put the printer specific commands in the
+argument of |\AtBeginLabels|. If you succeed, please e-mail me these
+commands and the specifications of your printer, so I can include them
+in the future releases of \EL. \NEWfeature{Version 1.1} Note that the
+command |\AtBeginLabels| is cumulative: if you use it several times in
+the same document, the new commands will be appended without overwriting
+the previous definitions.
+
+\NEWfeature{Version 1.1}
+The command |\AtBeginLabelPage| works in the
+same way, but its argument will be inserted at the beginning of each
+\emph{page} of \EL\ output, i.e. before printing each envelope or
+label sheet.
+
+The code for \PS{} printers is described in Section~\ref{sec:PS}.
+
+There are differences in the handling of the text close to paper edges
+from printer to printer. Since envelopes and label sheets have text
+near the edges, you might need to tune the offsets. For labels you
+can use the command |\SetLabel| to do this. The optional first
+argument of the command |\SetEnvelope| sets the distance between the
+leading edge of ``logical paper'' and the physical leading edge of the
+envelope (0 pt by default).
+
+\begin{decl}
+ |rotateenvelopes|, |norotateenvelopes| \\
+ Options for \graphics\ package
+\end{decl}
+Usually envelopes are printed in the landscape mode, i.e. rotated by
+$90^\circ$. The package options |rotateenvelopes| (default) and
+|norotateenvelopes| control the rotation. Note that if you want to
+rotate envelopes, you need the standard package \graphics\
+installed on your system. Also, you need a |dvi| driver that
+understands rotation commands of the \graphics\ package. (I
+think currently only \dvips\ does this). The package
+\graphics\ is called internally by \EL. If you need to pass
+specific options to the \graphics\ package, include it in the
+list of options of \EL. For example, the command
+|\usepackage[personalenvelope,dvips]{envlab}| calls \graphics\
+with the option |dvips|.
+
+\begin{decl}
+ |centerenvelopes|, |leftenvelopes|,
+ |rightenvelopes|,\\
+ |customenvelopes|, |\EnvelopeLeftMargin|
+\end{decl}
+Most of manual feeding slots accept non-standard paper (like
+envelopes) \emph{centered}. However there are some printers that
+require non-standard paper to be pushed to the left or right end of
+the slot. The package options |centerenvelopes| (this is the default
+option), |leftenvelopes|, |rightenvelopes| and |customenvelopes|
+control the position of the envelope with respect to the slot. The
+first three options are self-explanatory. The fourth gives the control
+over the envelope positioning to the user. If you choose this option,
+you must set the length |\EnvelopeLeftMargin| before printing the
+envelopes. For example to shift the envelope for $2''$ from the left
+edge use |\setlength{\EnvelopeLeftMargin}{2in}|
+
+\begin{decl}
+ |\FirstLabel|\marg{Row}\marg{Col}
+\end{decl}
+\NEWdescription{Version 1.2} Sometimes you need to print labels on a
+partially used sheet. \NEWfeature{Version 1.1} The command
+|\FirstLabel|\marg{Row}\marg{Col} allows you to start printing of
+labels from the given position. For example, the command
+|\FirstLabel{3}{2}| causes \EL\ to start printing labels beginning
+with the second label in the third row. Note that labels are printed
+row by row (\emph{not} column by column, like in the standard \LaTeXe\
+|letter| class).
+
+
+\subsection{Formatting of the address (barcodes and capitalization)}
+
+In the United States (and many other countries as well) the mailing
+pieces are sorted by machines. This process is greatly facilitated if
+the addresses typesetting is enhanced for machine readability.
+
+
+USPS standards \cite{Pub25} establish two ways for making the addresses
+machine readable: barcodes and special printing of addresses for
+optical character recognition (OCR) devices. In principle any method
+would be sufficient, but it seems reasonable to play it safe using
+\emph{both} methods. Therefore \EL\ by default both prints barcodes
+and prepares addresses for OCR. This behavior can be controlled
+through package options.
+
+Note that only ``To-Address'' should be machine-readable. The return
+address can be formatted more freely. You can, for example, include
+your logo in the \emph{return} address (see Section~\ref{sec:Cust})
+
+\begin{decl}
+ |printbarcodes|, |noprintbarcodes|
+\end{decl}
+The addresses in the US contain ``zipcodes''---strings of five digits
+(5-code) or 9 digits divided by dash (5+4 code). The 5+4 code is
+actually a detalization\footnote{There is an even finer detalization
+ provided by the so called DPC numbers \cite{Pub25}. \EL\ does not
+ support it yet}, so the zipcode 12345-6789 can be written as just
+12345. This code is converted into a series of long and short bars and
+printed on a label or envelope. If the option |printbarcodes|
+(default) is selected, \EL\ tries to extract zipcode from the address
+and print it. It defines zipcode as a sequence of digits that:
+\begin{enumerate}
+\item Has no characters other than digits and dashes (-) inside it
+\item Has no groups in braces (|{}|)inside it and is not braced itself
+\item \label{item:Last} Is the last in the address field
+\end{enumerate}
+The option |noprintbarcodes| suppresses the typesetting of barcodes.
+
+\begin{decl}
+ |alwaysbarcodes|, |noalwaysbarcodes|
+\end{decl}
+Sometimes the rule~\ref{item:Last} is too harsh. Consider, for example,
+the following address:
+\begin{quote}
+ Mr. A. B. User\\
+ 32 Omega Road\\
+ Palo Alto Ca 12345\\
+ USA
+\end{quote}
+Obviously it has a zipcode, however \EL\ normally will not see it. The
+option |alwaysbarcodes| lifts this restriction, and \EL\ typesets barcodes
+for the last number met in the address even if it is followed by some other
+characters. Be careful with this option! If you select it, all addresses
+must actually have zipcodes. Otherwise \EL\ will happily convert to bars a
+street or apartment number.
+
+This option is especially useful if the addresses are not typed in
+manually, but are prepared by some mail merge program like
+\mailing\ package. Then they can contain spaces at the end, and
+\EL\ will not recognize zipcodes unless |alwaysbarcodes| is selected.
+The option |noalwaysbarcodes| (default) suppresses this behavior.
+
+\begin{decl}
+ |capaddress|, |nocapaddress|
+\end{decl}
+To facilitate OCR \EL\ typesets addresses in \textsf{\large 12pt sans
+ serif} font. The machine readability of the addresses is increased
+if the following recommendations of US Postal service are followed:
+\begin{itemize}
+\item Converting the addresses to uppercase
+\item Stripping punctuation from the addresses
+\item Inserting 1 pt kern between the letters
+\end{itemize}
+The result looks rather ugly for human eye. However, it is intended not for
+humans, but for machines. We will call this processing \emph{address
+ capitalization}. \EL\ performs capitalization of the
+``To-addresses'' automatically if the option |capaddress| (default) is
+selected. The option |nocapaddress| suppresses capitalization of the
+addresses.
+
+If you decide to capitalize the addresses, be careful with the
+accented letters. Since \EL\ processes the address letter by
+letter\footnote{Rather, token by token}, it tries to insert kern
+between |\"| and |u| in the word |M\"uller| causing an
+error. Therefore all accented letters should be enclosed in
+braces. The correct way to typeset Herr.~M{\"u}ller is
+|Herr.~M{\"u}ller|\footnote{I probably should strip all accents since
+ they might confuse OCR. However USPS says nothing about accents, and
+ I decided to preserve them.}.
+
+\subsection{Printing of return addresses}
+
+
+\begin{decl}
+ |printreturnaddress|, |noprintreturnaddress|
+\end{decl}
+\NEWfeature{Version 1.1}
+The return addresses are printed on the envelopes if the package option
+|printreturnaddress| (default) is chosen. Alternatively, the package
+option |noprintreturnaddress| suppresses the printing of the return
+address. Section~\ref{sec:Cust} describes how to customize your return
+address.
+
+
+\subsection{Change of settings for some labels}
+
+\begin{decl}
+ |\suppresslabels|, |\resumelabels|,\\
+ |\suppressonelabel|, |\resumeonelabel|
+\end{decl}
+\NEWfeature{Version 1.2} In many cases your |.tex| file contains many
+|letter| environments. By default, if the command |\makelabels|
+appears in the preamble, all them will generate mailing labels.
+Sometimes you may want to override this behavior. \EL{} provides four
+handy commands for this. The command |\suppresslabels| issued anywhere
+before |\end{letter}| will suppress printing of mailing labels for the
+current and subsequent letters---until the command |\resumelabels| is
+issued. The commands |\suppressonelabel| and |\resumeonelabel| are
+similar, but act only on the current label.
+
+
+
+
+\begin{decl}
+ |\ChangeEnvelope|, |\ChangeLabel|, |\ChangeBigLabel|
+\end{decl}
+\NEWfeature{Version 1.2} The commands |\SetEnvelope|, |\SetLabel|,
+|\SetBigLabel| have immediate effect: they set the sizes of all
+following mailing labels. The mailing labels, automatically generated
+by |letter| environments, are written to the |.aux| file, and
+therefore they all will be printed for the envelope or labels size set
+by the last |\Set| command. Sometimes, however, one needs to print
+envelopes for the different |letter| environments at different sizes.
+The commands |\ChangeEnvelope|, |\ChangeLabel| and |\ChangeBigLabel|
+have the same meaning and arguments as the corresponding |\Set|
+commands. However, instead of setting the media, they write the
+information into the |.aux| file, and the actual change is delayed
+until the |.aux| file is read (i.~e.~at the end of the document).
+Therefore they act only on the mailing labels, extracted from the
+|letter| environments, that follow this command.
+
+
+
+\subsection{Enhancements for the \texttt{letter} environment}
+
+\NEWfeature{Version 1.2}
+Some people letters contain below the address the subject like this
+\begin{quote}
+ Re: our recent talk
+\end{quote}
+A way to do this is to include it in the address (see
+Figure~\ref{fig:wrong}). However, this additional info will be put in
+the mailing label, which is wrong. The package \EL{} defines a command
+|\re| to cope with this.
+
+\begin{figure}[tbp]
+ \leavevmode
+\begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\address{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}
+\signature{Joe}
+
+\begin{document}
+
+\begin{letter}{%
+ Mary McKeen\\
+ 2 Alpha Street\\
+ Otherplace, NY 12346\\[2ex]
+ Re: Our love}
+ \opening{Dear Mary:}
+ I love only you
+ \closing{With love,}
+\end{letter}
+\end{document}
+\end{verbatim}
+\end{figpage}
+\caption{A wrong way to include subject information in the letter}
+ \label{fig:wrong}
+\end{figure}
+
+\begin{decl}
+ |re|, |nore|
+\end{decl}
+This command poses the following problem. The rest of the \EL{}
+package meant to work not only with the standard |letter| class, but
+with any other letter classes that write address information to the
+|.aux| file in the standard format. However, if a package makes a
+change to the formatting of the letter itself, we cannot be guaranteed
+that it will work with all letter classes. Therefore we chose the
+following solution: the additional features are enabled only if the
+package option |re| is selected. If the option |nore| (default) is
+selected, the package works in the ``compatibility mode'', and the
+additional features are disabled\footnote{For \TeX perts: if the
+ option |re| is chosen, \EL{} redefines the \cs{opening} command. See
+ the file |envlab.dtx| for additional information.}.
+
+
+
+
+\begin{decl}
+ |\re|
+\end{decl}
+\NEWfeature{Version 1.2}
+The command |\re| defines additional subject information to be put
+between the address and opening. It is very simple: just put
+|\re|\marg{Subject} anywhere before the |\opening| command (see
+Figure~\ref{fig:right}).
+
+\begin{figure}[tbp]
+\leavevmode
+\begin{figpage}
+\begin{verbatim}
+\documentclass[12pt]{letter}
+
+\usepackage[avery5160label,re]{envlab}
+\makelabels
+
+\address{%
+ Joe Casanova\\1 Lambda Street\\Anyplace, NY 12345}
+\signature{Joe}
+
+\begin{document}
+
+ \begin{letter}{%
+ Mary McKeen\\
+ 2 Alpha Street\\
+ Otherplace, NY 12346}
+ \re{Our love}
+ \opening{Dear Mary:}
+ I love only you
+ \closing{With love,}
+ \end{letter}
+\end{document}
+\end{verbatim}
+\end{figpage}
+\caption{The \EL{} way to include subject information in the letter}
+ \label{fig:right}
+\end{figure}
+
+Actually the scope of the |\re| command is the same as the scope of
+the commands like |\address| or |\signature|: if it is issued outside
+the |letter| environment, it affect all subsequent letters. If it is
+issued inside the |letter| environment (but before the |\opening|
+command), it is local to the current letter. To disable global |\re|,
+just issue this command with empty argument: |\re{}|.
+
+
+\section{Customization}
+\label{sec:Cust}
+
+\begin{decl}
+ |\returnaddress|
+\end{decl}
+Many people and companies want to print their logos on the
+envelopes. You can include any image in your return address. The macro
+|\returnaddress| controls the contents of the ``From-address'' field
+on your envelope. \EL\ takes it from the |\address| command in your
+document. However you can easily redefine it. For example, if the file
+|mylogo.eps| contains your logo, you put in the preamble
+|\renewcommand{\returnaddress}{\protect\includegraphics{mylogo}}| to
+customize your envelopes. If you want return labels with your logo,
+use command like
+|\printreturnlabels{180}{{\protect\includegraphics{mylogo}}|.
+\NEWdescription{Version 1.1} You can
+include both logos and textual information into the |\returnaddress| macro.
+While customizing return address, it is useful to know that
+\LaTeX\ |letter| document class stores the contents of the |\address|
+command in the |\fromaddress| macro, so the default definition of the
+return address implemented in \EL\ is
+|\renewcommand{\returnaddress}{\fromaddress}|.
+
+\begin{decl}
+ Customization of lengths
+\end{decl}
+All lengths (heights, widths, margins) are user-customizable. Consult
+the file |envlab.dtx| for their definitions and use.
+
+\begin{decl}
+ |\ReName|
+\end{decl}
+\NEWfeature{Version 1.2}
+The subject name for the |\re| command is stored in the |\ReName|
+macro. Normally it is defined as plain style ``Re: ''. To
+|\newcommand{\ReName}{Re: }| (note the space after semicolon!). To
+change this, use |\renewcommand|, for example
+|\renewcommand{\ReName}{\textbf{Subject: }}|.
+
+
+\begin{decl}
+ |envlab.cfg|
+\end{decl}
+If you use \EL\ for some time, you probably would have a number of
+options and commands that you execute in most documents prepared with
+the package. You can save the typing by putting such commands in the
+configuration file |envlab.cfg|. A sample configuration file is
+included in the \EL\ distribution. You are free to hack it in any way
+you like\footnote{\emph{Important:} |envlab.cfg| is the only file you
+ should modify. You are \emph{not} allowed to modify any other files
+ in the \EL\ distribution.}. This file consists of two parts:
+|\ExecuteOptions|\marg{options} and
+|\AtEndOfPackage|\marg{customization commands}. The options listed in
+the first part supersede the default options of \EL. However the
+options explicitly listed as the arguments of the |\usepackage|
+command supersede the options in the configuration file. The commands
+listed in the second part of the configuration file---as the arguments
+of the |\AtEndOfPackage| command---supersede all definitions in the
+package itself. Therefore by hacking |envlab.cfg| you can completely
+change the behavior of the package without modifying \EL.
+
+
+\section{Commands for \PS{} printers}
+\label{sec:PS}
+
+
+I myself know next to nothing about programming of \PS{} printers, and
+the following is based on contributions of \EL{} users.
+
+\begin{decl}
+ |pswait|, |nopswait|
+\end{decl}
+\NEWfeature{Version 1.1}
+If you use \dvips, you can ask it to switch your printer to manual
+mode just before printing envelopes and labels. The printer will print the
+main body of the letter(s) using the paper tray, and then stop, waiting for
+envelopes or label sheets to be fed in the manual slot. The option
+|pswait|, based on the code by \emph{William Slough}
+\texttt{<cfwas@eiu.edu>},
+inserts the corresponding \PS\ |special|s in your output.
+The option |nopswait| (default) suppresses this behavior.
+
+\begin{decl}
+ |\PSwait|
+\end{decl}
+\NEWfeature{Version 1.1} William Slough's code can be useful in
+other situations when you need to switch to manual mode in the
+middle of the document. The command |\PSwait| inserts the
+corresponding \PS\ code in the \dvips\ output. (An attentive reader
+has probably already guessed that the |pswait| option is implemented
+through the command |\AtBeginLabels{\PSwait}|).
+
+\begin{decl}
+ |psautotray|, |nopsautotray|
+\end{decl}
+\NEWfeature{Version 1.2}
+\emph{Uri Blumenthal} \texttt{<uri@ibm.net>} wrote code for automatic
+switching to other trays For example, if your envelopes are loaded
+into \texttt{/otherenvelopetray}, try the following code:
+\begin{verbatim}
+\AtBeginLabels{%
+ \special{ps:clear grestore
+ statusdict begin false setduplexmode
+ /manualfeed true def
+ /otherenvelopetray end 0 0 bop }}
+\end{verbatim}
+If the package option |psautotray| is selected, \EL{} will try to
+guess the proper tray from the envelope you chose. The option
+|nopsautotray| (default) disables this feature. At present this
+mechanism is rather experimental; I would be grateful for
+failure/success reports as well as for suggestions. Note that |pswait|
+and |psautotray| options are not compatible (|psautotray| switches the
+printer to the manual mode anyway). If you selected them both, only
+the one selected last will be chosen.
+
+\NEWdescription{Version 1.2}
+Another solution by \emph{Robert Estes}
+\texttt{<estes@ece.ucdavis.edu>} works for Optra R+ printers:
+\begin{verbatim}
+\AtBeginLabels{\special{ps:
+clear grestore
+1 dict dup /MediaPosition null put setpagedevice
+1 dict dup /ManualFeed true put setpagedevice
+1 dict dup /Policies 1 dict dup /PageSize 2 put put setpagedevice
+2 dict dup /PageSize [297 684] put dup /ImagingBBox null put setpagedevice
+0 0 bop
+}}
+\end{verbatim}
+
+\NEWdescription{Version 1.2}
+The code by \emph{Greg Jumper} \texttt{<jumper@lens.sri.com>} works
+for HP LaserJet 4MV:
+\begin{verbatim}
+ \special{! <</ManualFeed true /DeferredMediaSelection true
+ /PageSize [297 684] /ImagingBBox null>> setpagedevice}
+\end{verbatim}
+
+
+
+\section{Bugs and limitations}
+\label{sec:Bugs}
+
+\NEWdescription{Version 1.1}
+The most important limitation of \EL\ is related to an essential
+limitation of \TeX\ itself. People usually want their envelopes printed
+rotated $90^\circ$, so the envelopes are inserted in the printed by the
+short side. Unfortunately \TeX\ was not designed with the text rotation
+in mind. Therefore ``basic'' \TeX\ does not allow to typeset envelopes in
+this manner. The standard \LaTeXe\ package \graphics\ uses \PS\ to add
+this functionality to \TeX. \EL\ uses \graphics\ internally if the option
+|rotateenvelopes| (default) is in effect. Therefore to typeset rotated
+envelopes you need \graphics\ and either a \PS\ printer or \gs. Otherwise
+use |norotatenvelopes| option if your printed can process envelopes
+inserted by the long side. I understand that there is a problem with
+printing rotated text on non-\PS\ printers. Probably the authors of
+|dvi| drivers should be urged to address it.
+
+\NEWdescription{Version 1.1}
+\EL\ thinks that all options it cannot understand belong to the
+\graphics\ package and sends them there. Therefore if you misspell
+an option of the \EL\ package, you will receive an error message from the
+\graphics\ package rather than from \EL.
+
+
+Please send bug reports to |boris@plmsc.psu.edu|. You can find
+experimental versions of \EL\ at my homepage
+(|http://planck.psu.edu/~boris|).
+
+
+
+\section{Acknowledgements}
+
+\NEWdescription{Version 1.2} Since the first version of \EL{} was
+released, many users helped me with bug reports, suggestions and code
+contributions to enhance it. I would like to express my gratitude to
+Uri Blumenthal, Arnie Ostebee, William Slough, Ed Reingold, Jos
+Jansen, Juergen Schlegelmilch, Jim Hill, Greg Jumper, Robert Estes,
+Genick Bar-Meir and many others for their help.
+
+
+\section{Legalese}
+
+The package \EL\ is provided ``as is'' and comes with absolutely no
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for
+a particular purpose. The entire risk as to the quality and
+performance of the program is with you. Should the program prove
+defective, you assume the cost of all necessary servicing, repair or
+correction.
+
+In no event unless required by applicable law will the author of the
+program be liable to you for damages, including any general, special,
+incidental or consequential damages arising out of any use of the
+program or out of inability to use the program (including but not
+limited to loss of data or data being rendered inaccurate or losses
+sustained by you or by third parties as a result of a failure of the
+program to operate with any other programs), even if such holder or
+other party has been advised of the possibility of such damages.
+
+In particular, while every effort was made to provide typesetting of
+mailing pieces accordingly to the United States Postal Service
+recommendations, the author of the package does not warrant neither
+successful delivery of mail nor granting of mailing discounts in the
+USA or any other countries.
+
+
+
+
+\EL\ package is covered by the same license as the current \LaTeXe\
+package (see the files |legal.txt| and |modguide.tex| in the \LaTeXe\
+distribution).
+
+Avery and all Avery codes are trademarks of Avery Dennison Corporation.
+\bigskip
+
+
+
+\begin{thebibliography}{1}
+\addcontentsline{toc}{section}{\protect\refname}
+ \bibitem{Pub25}
+ USPS.
+ \newblock {\em Designing Business Letter Mail (Pub 25)}, August 1995.
+\end{thebibliography}
+
+
+
+
+
+
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
+
+
+
+
+
+
+
+
+
diff --git a/macros/latex/contrib/envlab/elold.ins b/macros/latex/contrib/envlab/elold.ins
new file mode 100644
index 0000000000..c743c1bdfc
--- /dev/null
+++ b/macros/latex/contrib/envlab/elold.ins
@@ -0,0 +1,27 @@
+\def\batchfile{elold.ins}
+\input docstrip
+\keepsilent
+
+
+\generateFile{envlab.drv}{t}{\from{envlab.dtx}{driver}}
+
+
+
+\generateFile{envlab.sty}{t}{\from{envlab.dtx}{package}}
+
+
+\preamble
+
+
+You are allowed and encouraged to modify THIS file.
+
+The first part of this file contains default options for your site.
+The second part (inside AtEndOfPackage declaration) should contain
+customization commands specific to your site.
+
+Good luck
+
+
+\endpreamble
+
+\generateFile{envlab.cfg}{t}{\from{envlab.dtx}{cfg}}
diff --git a/macros/latex/contrib/envlab/envlab.dtx b/macros/latex/contrib/envlab/envlab.dtx
new file mode 100644
index 0000000000..6e479b4da5
--- /dev/null
+++ b/macros/latex/contrib/envlab/envlab.dtx
@@ -0,0 +1,1759 @@
+% \iffalse
+%<*driver>
+\ProvidesFile{envlab.drv}
+%</driver>
+%<*driver|package|cfg>
+%<+package>\ProvidesPackage{envlab}
+%<+cfg>\ProvidesFile{envlab.cfg}
+[1997/07/16 v1.2 Envelopes and Labels]
+%</driver|package|cfg>
+%<*driver|package>
+%%
+%% Copyright Boris Veytsman 1996, 1997
+%%
+%</driver|package>
+%<*driver|package|cfg>
+% \fi
+%%
+% \CheckSum{1378}
+%% \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 \~}
+% \iffalse
+%</driver|package|cfg>
+%
+% \section{Documentation driver}
+%<*driver>
+% Nothing interesting here\dots
+% \begin{macrocode}
+\documentclass{ltxdoc}
+\DoNotIndex{\@Alph,\@alph,\@arabic,\@badmath}
+\DoNotIndex{\@centercr}
+\DoNotIndex{\@empty,\@ignoretrue}
+\DoNotIndex{\@ixpt}
+\DoNotIndex{\@M,\@minus,\@ne,\@plus}
+\DoNotIndex{\\,\addtolength}
+\DoNotIndex{\advance}
+\DoNotIndex{\ast,\begin,\begingroup,\bfseries,\bgroup,\box}
+\DoNotIndex{\bullet}
+\DoNotIndex{\cdot,\cr,\day,\DeclareOption}
+\DoNotIndex{\def,\DocInput,\documentclass}
+\DoNotIndex{\DoNotIndex,\egroup,\ifx,\else,\fi,\endtrivlist}
+\DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup}
+\DoNotIndex{\endlist,\everycr,\ExecuteOptions}
+\DoNotIndex{\filedate,\filename,\fileversion}
+\DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule}
+\DoNotIndex{\hsize,\hskip,\hspace,\hss,\ifcase,\or,\fi}
+\DoNotIndex{\ifvmode,\fi,\ifnum,\fi,\input}
+\DoNotIndex{\kern,\leavevmode,\let,\leftmark}
+\DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark}
+\DoNotIndex{\month,\newcommand,\newcounter,\newenvironment}
+\DoNotIndex{\NeedsTeXFormat,\newdimen}
+\DoNotIndex{\newpage,\nobreak,\noindent,\number}
+\DoNotIndex{\p@}
+\DoNotIndex{\pagestyle,\par}
+\DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions}
+\DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright}
+\DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font}
+\DoNotIndex{\rightmargin,\rlap,\rmfamily}
+\DoNotIndex{\setbox,\setcounter,\setlength}
+\DoNotIndex{\skip,\slshape,\space}
+\DoNotIndex{\trivlist,\typeout,\tw@}
+\DoNotIndex{\vskip,\vspace,\year,\z@}
+%
+\DoNotIndex{\@ptsize,\@sptoken,\addtocounter,\afterassignment}
+\DoNotIndex{\AtEndOfPackage,\baselineskip,\boxmaxdepth,\clearpage}
+\DoNotIndex{\clubpenalty,\csname,\CurrentOption,\DeclareRobustCommand}
+\DoNotIndex{\eject,\endcsname,\evensidemargin,\expandafter}
+\DoNotIndex{\footnotesize,\footskip,\fromaddress,\futurelet}
+\DoNotIndex{\headheight,\headsep,\hfuzz,\ignorespaces}
+\DoNotIndex{\InputIfFileExists,\large,\lineskip,\loop}
+\DoNotIndex{\MakeUppercase,\MessageBreak,\mbox,\multiply}
+\DoNotIndex{\newcount,\newif,\newlength,\newtoks,\nolinebreak}
+\DoNotIndex{\nopagebreak,\normalfont,\normalsize,\null,\newline}
+\DoNotIndex{\oddsidemargin,\PackageError,\PackageInfo}
+\DoNotIndex{\paperheight,\paperwidth,\parbox,\parindent}
+\DoNotIndex{\PassOptionsToPackage,\ProvidesPackage,\RequirePackage}
+\DoNotIndex{\rule,\selectfont,\sffamily,\sloppy,\small,\spaceskip}
+\DoNotIndex{\stepcounter,\textheight,\textwidth,\the,\topmargin}
+\DoNotIndex{\unhbox,\voidb@x,\vsize,\vfuzz,\widowpenalty,\xspaceskip}
+\DoNotIndex{\AtBeginDocument,\AtEndDocument}
+\usepackage{enumerate}
+\CodelineIndex
+\RecordChanges
+\EnableCrossrefs
+\begin{document}
+ \DocInput{envlab.dtx}
+\end{document}
+% \end{macrocode}
+%</driver>
+% \fi
+%
+% \changes{v0.9}{1996/05/31}{Beta version}
+% \changes{v0.91}{1996/05/31}{Added new option---"alwaysbarcodes"}
+% \changes{v1.0}{1996/06/09}{First released version}
+% \changes{v1.1}{1996/07/08}{Fixed typos in "elold.ins"}
+% \changes{v1.1}{1996/07/08}{Updated User Guide}
+% \changes{v1.2}{1996/07/10}{Changed envlab.ins: made it parallel.}
+%% \changes{v1.2}{1996/07/16}{Updated User Guide}
+%
+% \newcommand{\EL}{\textsl{EnvLab}}
+%
+%
+% \GetFileInfo{envlab.drv}
+%
+% \title{Printing Envelopes and Labels in \LaTeXe: \EL\ Package
+% \thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}
+% \thanks{\copyright Boris Veytsman, 1996, 1997}
+% }
+% \author{Boris Veytsman}
+% \date{\filedate}
+% \maketitle
+%
+% \tableofcontents
+%
+%
+% \section{Introduction}
+% \MakeShortVerb{\"}
+% The standard "\makelabels" command in the \LaTeXe\ "letter.cls"
+% documentclass typesets labels on Avery 5352 sheets. A typical user
+% may want more. \EL\ redefines "\makelabels" in\footnote{hopefully}
+% a more useful and customizable way
+%
+% The detailed usage of the package is described in the file
+% "elguide.tex". Here we just comment the macros.
+%
+% \StopEventually
+%
+% \section{Identification}
+%
+% First, we must say ``Hello world.''
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+% \end{macrocode}
+%
+% \begin{macro}{\envlab@ok}
+% \begin{macro}{\envlab@oops}
+% \changes{v1.2}{1997/07/10}{Used \cs{@ifundefined} instead of direct check}
+% Now let us check whether we in the letter documentclass. Actually we
+% will accept any class that has "\makelabels" defined (custom letter
+% classes, etc.)
+% \begin{macrocode}
+\def\envlab@oops{%
+ \PackageError{envlab}%
+ {Envlab is used outside of \MessageBreak%
+ a letter-compatible documentclass}%
+ {You are trying to use Envelopes & Labels\MessageBreak%
+ package, but your documentclass does not\MessageBreak%
+ understand address formatting commands.\MessageBreak%
+ Try standard document class letter\MessageBreak}}
+\def\envlab@ok{%
+ \PackageInfo{envlab}%
+ {Envelopes & Labels package: found makelabels...\MessageBreak%
+ Seems everything is OK. Good luck.}}
+\@ifundefined{makelabels}{\envlab@oops}{\envlab@ok}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \section{Preliminary code}
+%
+% \subsection{Switches, etc.}
+%
+%
+% \DescribeMacro{\if@envelope}
+% \DescribeMacro{\if@biglabel}
+% \changes{v1.2}{1997/07/13}{Added Big Labels---thanks to Genick
+% Bar-Meir, "meyerson@msi.umn.edu"}
+% There are three kinds of things we can print: envelopes (default)
+% labels and big labels The differences are summarized in
+% Table~\ref{tab:diffs}.
+% \begin{table}
+% \begin{center}
+% \begin{tabular}{cccc}
+% \hline
+% Media & Number per page & Rotation & Return address \\
+% \hline
+% Envelopes & One & Settable & Yes\\
+% Labels & Several & Not rotated & No\\
+% Big Labels & Several & Not rotated & Yes\\
+% \hline
+% \end{tabular}
+% \end{center}
+% \caption{Differences between envelopes, labels and big labels}
+% \label{tab:diffs}
+% \end{table}
+%
+% \begin{macrocode}
+\newif\if@envelope
+\@envelopetrue
+\newif\if@biglabel
+\@biglabelfalse
+% \end{macrocode}
+%
+% \DescribeMacro{\if@rotateenvelopes}
+% \DescribeMacro{\if@printreturnaddress}
+% Now we must determine whether we want to rotate envelopes and
+% whether to include return address (both yes by default).
+% \begin{macrocode}
+\newif\if@rotateenvelopes
+\@rotateenvelopestrue
+\newif\if@printreturnaddress
+\@printreturnaddresstrue
+% \end{macrocode}
+%
+% \DescribeMacro{\@envelopeposition}
+% Now let us decide how to print envelopes. They can be either centered
+% (default) \emph{or} shifted to the left or to the right of the paper
+% tray. The
+% counter "\@envelopeposition" can be, correspondingly, either 0 or 1
+% or 2. The value of
+% 3 corresponds to the ``custom placing'', when the user sets
+% "\EnvelopeLeftMargin" manually.
+%
+% \begin{macrocode}
+\newcount\@envelopeposition
+\@envelopeposition=0\relax
+% \end{macrocode}
+%
+% \begin{macro}{\if@pswait}
+% \changes{v1.1}{1996/07/08}{Added \cs{if@pswait}}
+% \begin{macro}{\if@psautotray}
+% \changes{v1.1}{1997/07/13}{Added \cs{if@psautotray}}
+% \begin{macro}{\PSEnvelopeTray}
+% \changes{v1.1}{1997/07/13}{Added \cs{PSEnvelopeTray}}
+% The switches "\if@pswait" and "\if@psautotray" control optional manual
+% feeding of envelopes and labels in \textsl{Postscript} printers
+% (see Section~\ref{sec:Print} for details). The register
+% "\PSEnvelopeTray" contains the name of the required tray.
+% \begin{macrocode}
+\newif\if@pswait
+\@pswaitfalse
+\newif\if@psautotray
+\@psautotrayfalse
+\newtoks\PSEnvelopeTray
+\PSEnvelopeTray={/otherenvelopetray }
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@barcodes}
+% \begin{macro}{\if@alwaysbarcodes}
+% We can either print bar codes (default) or not. The second switch
+% forces to print barcodes even if they are not last in the address
+% (like "Pa 16801\\USA")
+% \begin{macrocode}
+\newif\if@barcodes
+\newif\if@alwaysbarcodes
+\@barcodestrue
+\@alwaysbarcodesfalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\if@EL@redefine@opening}
+% \changes{v1.2}{1997/07/14}{Wrote new command}
+% Now let us decide whether to mess with the "\opening" command.
+% \begin{macrocode}
+\newif\if@EL@redefine@opening
+\@EL@redefine@openingfalse
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\if@capitalizeaddress}
+% Also, we can either capitalize the address (default) or not.
+% \begin{macrocode}
+\newif\if@capitalizeaddress
+\@capitalizeaddresstrue
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Lengths and numbers}
+%
+% We want all lengths to be user settable, so no "@" in the names.
+%
+%
+% \DescribeMacro{\EnvelopeWidth}
+% \DescribeMacro{\EnvelopeHeight}
+% \DescribeMacro{\EnvelopeTopMargin}
+% \DescribeMacro{\EnvelopeLeftMargin}
+% An envelope has four basic lengths.
+% The first two are self-evident. The third is the distance between the
+% edge of the paper and the leading edge of the envelope. All
+% pre-defined envelope sizes set this to zero. The fourth is the distance
+% between the left edge of the paper and the envelope. Its value depends
+% on the value of the "\@envelopeposition" variable. We will preset it to
+% zero
+% \begin{macrocode}
+\newlength{\EnvelopeWidth}
+\newlength{\EnvelopeHeight}
+\newlength{\EnvelopeTopMargin}
+\newlength{\EnvelopeLeftMargin}
+\setlength{\EnvelopeLeftMargin}{0pt}
+% \end{macrocode}
+%
+%
+% \DescribeMacro{\LabelWidth}
+% \DescribeMacro{\LabelHeight}
+% \DescribeMacro{\LabelTopMargin}
+% \DescribeMacro{\LabelLeftMargin}
+% \DescribeMacro{\LabelRightMargin}
+% A label has more parameters.
+% The first two are the same as for the envelopes. The next two define the
+% distances from the paper edges to the beginning of the labels. The
+% last one describes the distance between the labels.
+% \begin{macrocode}
+\newlength{\LabelWidth}
+\newlength{\LabelHeight}
+\newlength{\LabelTopMargin}
+\newlength{\LabelLeftMargin}
+\newlength{\LabelRightMargin}
+% \end{macrocode}
+%
+% \DescribeMacro{\c@LabelMaxCol}
+% \DescribeMacro{\c@LabelMaxRow}
+% The following numbers define, how many labels are in each row and how
+% many rows are on each page
+% \begin{macrocode}
+\newcounter{LabelMaxCol}
+\newcounter{LabelMaxRow}
+% \end{macrocode}
+%
+% The lengths above are \emph{external} parameters that determine an
+% envelope or a label. Now we will describe \emph{internal} lengths. We
+% define them here because the commands "\SetEnvelope" and "\SetLabel"
+% determine them basing on the given envelope or label type.
+%
+%
+% \DescribeMacro{\FromAddressTopMargin}
+% \DescribeMacro{\FromAddressLeftMargin}
+% \DescribeMacro{\FromAddressHeight}
+% \DescribeMacro{\FromAddressWidth}
+% \DescribeMacro{\ToAddressTopMargin}
+% \DescribeMacro{\ToAddressLeftMargin}
+% \DescribeMacro{\ToAddressWidth}
+% The following lengths are self-evident.
+% \begin{macrocode}
+\newlength{\FromAddressTopMargin}
+\newlength{\FromAddressLeftMargin}
+\newlength{\FromAddressHeight}
+\newlength{\FromAddressWidth}
+\newlength{\ToAddressTopMargin}
+\newlength{\ToAddressLeftMargin}
+\newlength{\ToAddressWidth}
+% \end{macrocode}
+%
+% \subsection{Main setting commands}
+%
+% OK, we are ready to set up envelopes and labels.
+%
+% \begin{macro}{\SetEnvelope}
+% \changes{v1.2}{1997/07/14}{Added \cs{@biglabelfalse}}
+% The command "\SetEnvelope" has three parameters: optional top Margin,
+% width and height of the envelope.
+% \begin{macrocode}
+\DeclareRobustCommand{\SetEnvelope}[3][0pt]{%
+ \@envelopetrue%
+ \@biglabelfalse%
+ \setlength{\EnvelopeTopMargin}{#1}%
+ \setlength{\EnvelopeWidth}{#2}%
+ \setlength{\EnvelopeHeight}{#3}%
+ \setlength{\FromAddressTopMargin}{0.5in}%
+ \setlength{\FromAddressLeftMargin}{0.5in}%
+ \setlength{\FromAddressHeight}{0.33\EnvelopeHeight}%
+ \setlength{\FromAddressWidth}{0.5\EnvelopeWidth}%
+ \setlength{\ToAddressTopMargin}{0.5in}%
+ \setlength{\ToAddressLeftMargin}{0.5in}%
+ \setlength{\ToAddressWidth}{3in}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetLabel}
+% \changes{v1.2}{1997/07/14}{Added \cs{@biglabelfalse}}
+% The command "\SetLabel" has seven parameters: five lengths and two
+% numbers. All are mandatory:
+% \begin{macrocode}
+\DeclareRobustCommand{\SetLabel}[7]{%
+ \@envelopefalse%
+ \@biglabelfalse%
+ \setlength{\LabelWidth}{#1}%
+ \setlength{\LabelHeight}{#2}%
+ \setlength{\LabelTopMargin}{#3}%
+ \setlength{\LabelLeftMargin}{#4}%
+ \setlength{\LabelRightMargin}{#5}%
+ \setcounter{LabelMaxCol}{#6}%
+ \setcounter{LabelMaxRow}{#7}%
+ \setlength{\ToAddressTopMargin}{0.1in}%
+ \setlength{\ToAddressLeftMargin}{0.2in}%
+ \setlength{\ToAddressWidth}{\LabelWidth}%
+ \addtolength{\ToAddressWidth}{-\ToAddressLeftMargin}%
+ \addtolength{\ToAddressWidth}{-\LabelRightMargin}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetBigLabel}
+% \changes{v1.2}{1997/07/14}{Wrote new command}
+% The command "\SetBigLabel" has seven parameters: five lengths and two
+% numbers. All are mandatory:
+% \begin{macrocode}
+\DeclareRobustCommand{\SetBigLabel}[7]{%
+ \@envelopefalse%
+ \@biglabeltrue%
+ \setlength{\LabelWidth}{#1}%
+ \setlength{\LabelHeight}{#2}%
+ \setlength{\LabelTopMargin}{#3}%
+ \setlength{\LabelLeftMargin}{#4}%
+ \setlength{\LabelRightMargin}{#5}%
+ \setcounter{LabelMaxCol}{#6}%
+ \setcounter{LabelMaxRow}{#7}%
+ \setlength{\FromAddressTopMargin}{0.0in}%
+ \setlength{\FromAddressLeftMargin}{0.5in}%
+ \setlength{\FromAddressHeight}{0.33\LabelHeight}%
+ \setlength{\ToAddressTopMargin}{0.1in}%
+ \setlength{\ToAddressLeftMargin}{0.5in}%
+ \setlength{\ToAddressWidth}{\LabelWidth}%
+ \addtolength{\ToAddressWidth}{-\ToAddressLeftMargin}%
+ \addtolength{\ToAddressWidth}{-\LabelRightMargin}%
+ \setlength{\FromAddressWidth}{\ToAddressWidth}}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Defining options}
+%
+% \subsection{Envelope Sizes}
+% \changes{v1.2}{1996/07/22}{Added new option: dlenvelope (thanks to
+% "J.P.Jansen@net.HCC.nl")}
+% \changes{v1.2}{1997/07/13}{Added \cs{PSEnvelopeTray} to envelope
+% options}
+% \begin{macrocode}
+\DeclareOption{businessenvelope}{\SetEnvelope{9.5in}{4.125in}%
+ \PSEnvelopeTray={/com10envelopetray }}
+\DeclareOption{executiveenvelope}{\SetEnvelope{7.5in}{3.875in}%
+ \PSEnvelopeTray={/monarcenvelopetray }}
+\DeclareOption{bookletenvelope}{\SetEnvelope{10.5in}{7.5in}}
+\DeclareOption{personalenvelope}{\SetEnvelope{6.5in}{3.625in}}
+\DeclareOption{c6envelope}{\SetEnvelope{162mm}{114mm}}
+\DeclareOption{c65envelope}{\SetEnvelope{224mm}{114mm}}
+\DeclareOption{c5envelope}{\SetEnvelope{229mm}{162mm}%
+ \PSEnvelopeTray={/162x229cenvelopetray }}
+\DeclareOption{dlenvelope}{\SetEnvelope{220mm}{110mm}%
+ \PSEnvelopeTray={/dlenvelopetray }}
+% \end{macrocode}
+%
+% \subsection{Labels sizes}
+%
+% \changes{v1.2}{1996/07/22}{Added new option: herma4625label (thanks to
+% "J.P.Jansen@net.HCC.nl")}
+% \changes{v1.2}{1996/09/06}{Added new option: avery5262label (thanks to
+% Uri Blumenthal "uri@ibm.net")}
+% \changes{v1.2}{1997/07/13}{Added new option: avery5164biglabel}
+% \changes{v1.2}{1997/07/13}{Added new option: avery5163biglabel}
+%
+% \begin{macrocode}
+\DeclareOption{avery5160label}{%
+ \SetLabel{2.75in}{1in}{0.5in}{0.19in}{0.12in}{3}{10}}
+\DeclareOption{avery5161label}{%
+ \SetLabel{4.19in}{1in}{0.5in}{0.16in}{0.19in}{2}{10}}
+\DeclareOption{avery5162label}{%
+ \SetLabel{4.19in}{1.33in}{0.83in}{0.16in}{0.19in}{2}{7}}
+\DeclareOption{avery5163label}{%
+ \SetLabel{4.19in}{2in}{0.5in}{0.16in}{0.19in}{2}{5}}
+\DeclareOption{avery5164label}{%
+ \SetLabel{4.19in}{3.33in}{0.5in}{0.16in}{0.19in}{2}{3}}
+\DeclareOption{herma4625label}{%
+ \SetLabel{105mm}{42.3mm}{0mm}{5mm}{5mm}{2}{7}}
+\DeclareOption{avery5262label}{%
+ \SetLabel{110mm}{34mm}{21mm}{4mm}{5mm}{2}{7}}
+\DeclareOption{avery5163biglabel}{%
+ \SetBigLabel{4.19in}{2in}{0.5in}{0.16in}{0.19in}{2}{5}%
+ \setlength{\ToAddressTopMargin}{0.1in}}%
+\DeclareOption{avery5164biglabel}{%
+ \SetBigLabel{4.19in}{3.33in}{0.5in}{0.16in}{0.19in}{2}{3}}%
+% \end{macrocode}
+%
+% \subsection{Optional switches}
+%
+% \changes{v1.1}{1996/07/08}{Added new options: "printreturnaddress",
+% "noprintreturnaddress"}
+% \changes{v1.1}{1996/07/08}{Added new options: "pswait",
+% "nopswait"}
+% \changes{v1.2}{1997/07/13}{Added new options: "psautotray",
+% "nopsautotray"}
+% \changes{v1.2}{1997/07/14}{Added new options: "re", "nore"}
+% All this should be evident\dots
+%
+% \begin{macrocode}
+\DeclareOption{rotateenvelopes}{\@rotateenvelopestrue}
+\DeclareOption{norotateenvelopes}{\@rotateenvelopesfalse}
+\DeclareOption{centerenvelopes}{\@envelopeposition=0\relax}
+\DeclareOption{leftenvelopes}{\@envelopeposition=1\relax}
+\DeclareOption{rightenvelopes}{\@envelopeposition=2\relax}
+\DeclareOption{customenvelopes}{\@envelopeposition=3\relax}
+\DeclareOption{printbarcodes}{\@barcodestrue}
+\DeclareOption{noprintbarcodes}{\@barcodesfalse\@alwaysbarcodesfalse}
+\DeclareOption{alwaysbarcodes}{\@alwaysbarcodestrue\@barcodestrue}
+\DeclareOption{noalwaysbarcodes}{\@alwaysbarcodesfalse}
+\DeclareOption{capaddress}{\@capitalizeaddresstrue}
+\DeclareOption{nocapaddress}{\@capitalizeaddressfalse}
+\DeclareOption{printreturnaddress}{\@printreturnaddresstrue}
+\DeclareOption{noprintreturnaddress}{\@printreturnaddressfalse}
+\DeclareOption{pswait}{\@pswaittrue\@psautotrayfalse}
+\DeclareOption{nopswait}{\@pswaitfalse}
+\DeclareOption{psautotray}{\@psautotraytrue\@pswaitfalse}
+\DeclareOption{nopsautotray}{\@psautotrayfalse}
+\DeclareOption{re}{\@EL@redefine@openingtrue}
+\DeclareOption{nore}{\@EL@redefine@openingfalse}
+% \end{macrocode}
+%
+% \subsection{Unknown options}
+%
+% All options we did not declare above are probably the options for the
+% "graphics" package; let us send them there.
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{graphics}}
+% \end{macrocode}
+%
+% \subsection{Default options}\label{sec:DefOpt}
+%
+% \changes{v1.1}{1996/07/08}{Fixed typo in "businessenvelope" option}
+% \changes{v1.1}{1996/07/09}{Added default options: "nopswait",
+% "printreturnaddress"}
+%
+% \begin{macrocode}
+\ExecuteOptions{businessenvelope,rotateenvelopes,centerenvelopes}
+\ExecuteOptions{printbarcodes,capaddress}
+\ExecuteOptions{nopswait,printreturnaddress,nopsautotray,nore}
+% \end{macrocode}
+%
+% \section{Configuration file}
+%
+% At this point we will look for the configuration file. This file is
+% named "envlab.cfg". The options declared in this file will supersede
+% the ones declared in Section~\ref{sec:DefOpt}, but will be in their
+% turn be superseded by the options explicitly defined when the package
+% is loaded.
+% \begin{macrocode}
+\InputIfFileExists{envlab.cfg}{%
+ \typeout{Loading configuration file envlab.cfg}}{%
+ \typeout{Configuration file envlab.cfg is not found}}
+% \end{macrocode}
+%
+% Now let us discuss the structure of the configuration file. We want it
+% to contain default options, and therefore to be loaded before the
+% "\ProcessOptions" command. On the other hand we want it to contain
+% some definitions that \emph{supersede} the ones in this package. The
+% hook "\AtEndOfPackage" helps to do this: we will just delay all
+% definitions until later.
+%
+% OK, let's construct an example of "envlab.cfg" file. The commands here
+% essentially repeat Section~\ref{sec:DefOpt}, but we want to be
+% foolproof\dots
+% \begin{macrocode}
+%</package>
+%<*cfg>
+%%
+%% The default options go here
+%%
+\ExecuteOptions{businessenvelope,rotateenvelopes,centerenvelopes}
+\ExecuteOptions{printbarcodes,capaddress}
+\ExecuteOptions{nopswait,printreturnaddress,nopsautotray,nore}
+%%
+\AtEndOfPackage{\relax % Customization goes here
+}
+%</cfg>
+%<*package>
+% \end{macrocode}
+%
+% \section{Processing options and loading packages}
+% \changes{v0.92}{1996/06/06}{Added \cs{IfFileExists} when loading packages}
+% \begin{macrocode}
+\ProcessOptions
+\IfFileExists{graphics.sty}{%
+ \RequirePackage{graphics}}{%
+ \PackageWarning{envlab}{%
+ You don't have the graphics package!\MessageBreak
+ Probably you will not be able to print\MessageBreak
+ envelopes sidewise. \MessageBreak}}
+% \end{macrocode}
+%
+% \section{Document layout}
+%
+% \subsection{Printer specific commands}
+% \label{sec:Print}
+%
+% \DescribeMacro{\@beginlabelshook}
+% \changes{v1.1}{1996/07/09}{Replaced \cs{@printpreamble} with
+% \cs{@beginlabelshook}}
+% The command "\@beginlabelshook" is called at the beginning of the
+% printing of envelopes and labels. We define it to be a no-op, but it
+% is possible to introduce some printer-specific commands (like paper
+% change).
+% \begin{macrocode}
+\def\@beginlabelshook{\relax}
+% \end{macrocode}
+%
+% \DescribeMacro{\@beginlabelpagehook}
+% \changes{v1.1}{1996/07/09}{Introduced new command
+% \cs{@beginlabelpagehook}}
+% The command "\@beginlabelpagehook" is like "\@beginlabelshook", but is
+% called at the beginning of each \emph{page}
+% of envelopes and labels.
+% \begin{macrocode}
+\def\@beginlabelpagehook{\relax}
+% \end{macrocode}
+%
+% \begin{macro}{\AtBeginLabels}
+% \changes{v1.1}{1996/07/08}{Made \cs{AtBeginLabels} cumulative}
+% \begin{macro}{\AtBeginLabelPage}
+% \changes{v1.1}{1996/07/09}{Introduced \cs{AtBeginLabelPage}}
+% The hooks "\AtBeginLabels" and "\AtBeginLabelPage" redefine
+% "\@beginlabelshook" and "\@beginlabelpagehook". They are built like
+% the standard \LaTeXe\ hooks
+% "\AtBeginDocument", "\AtBeginDvi", etc. In the implementation we use the
+% \emph{internal} \LaTeXe\ command "\g@addto@macro". In the current
+% (June~1996) \LaTeXe\ release it is defined as:
+% \DescribeMacro{\g@addto@macro}
+% \begin{verbatim}
+% \long\def\g@addto@macro#1#2{{%
+% \toks@\expandafter{#1#2}%
+% \xdef#1{\the\toks@}}}
+% \end{verbatim}
+% We quote this definition in case \emph{They} change Their minds\dots\
+% \begin{macrocode}
+\def\AtBeginLabels{\g@addto@macro\@beginlabelshook}
+\def\AtBeginLabelPage{\g@addto@macro\@beginlabelpagehook}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\PSwait}
+% \changes{v1.1}{1996/07/09}{Put William Slough's code in a separate macro}
+% \textsl{PostScript} printers can be switched to the manual feeding mode
+% with the following code by \emph{William Slough} "<cfwas@eiu.edu>".
+% \begin{macrocode}
+\def\PSwait{\special{ps: clear grestore @manualfeed 0 0 bop}}
+% \end{macrocode}
+% The author explains his code in the following way:
+% \begin{quotation}
+% Here is a possible explanation:
+%
+% The clear removes operands from the PostScript stack, which has the
+% effect of reversing some actions from the *previous* bop. Unfortunately,
+% it reverses other important actions too (such as font size), but the
+% grestore seems to get these back. Then the desired @manualfeed, followed
+% by the ``bop'' for the beginning of page. The pair of 0's are used for
+% bop and are completely bogus. However, from what I could detect, 0's are
+% as good as anything. The values that DVIPS provides for bop seem to be
+% related to DVI page numbers.
+%
+% I make no guarantee about the reliability of this solution, but initial
+% tests indicate it will work for my environment.
+% \end{quotation}
+% \end{macro}
+%
+% \begin{macro}{\PSautotray}
+% \changes{v1.2}{1997/07/13}{Wrote new command}
+% This implements the code by \emph{Uri Blumenthal}
+% "<uri@.ibm.net>".
+% \begin{macrocode}
+\edef\PSautotray{%
+ \special{ps:clear grestore
+ statusdict begin false setduplexmode
+ /manualfeed true def
+ \the\PSEnvelopeTray end 0 0 bop }}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.1}{1996/07/08}{Added implementation of the "pswait" option}
+% \changes{v1.1}{1996/07/09}{Moved \cs{PSwait} code to \cs{AtBeginLabelPage}}
+% \changes{v1.1}{1996/07/15}{Moved \cs{PSwait} code to
+% \cs{AtBeginLabels}}
+% \changes{v1.1}{1997/07/13}{Added implementation of the "psautotray" option}
+% The option "pswait" puts the "\PSwait" code in the beginning of each
+% page. The option "\psautotray" puts there the "\PSautotray" code.
+% \begin{macrocode}
+\if@pswait
+ \AtBeginLabels{\PSwait}%
+\else
+ \if@psautotray
+ \AtBeginLabels{\PSautotray}%
+ \fi
+\fi
+% \end{macrocode}
+%
+%
+% \subsection{Some useful counters for labels}
+%
+%
+%
+% \DescribeMacro{\c@LabelCountCol}
+% \DescribeMacro{\c@LabelCountRow}
+% These counters store the position of the currently printed label:
+% \begin{macrocode}
+\newcounter{LabelCountCol}
+\newcounter{LabelCountRow}
+% \end{macrocode}
+%
+%
+% \DescribeMacro{\c@LabelOffsetCol}
+% \DescribeMacro{\c@LabelOffsetRow}
+% And these counters provide the offset for the label printed on a
+% partially used sheet:
+% \begin{macrocode}
+\newcounter{LabelOffsetCol}
+\newcounter{LabelOffsetRow}
+\setcounter{LabelOffsetCol}{1}
+\setcounter{LabelOffsetRow}{1}
+% \end{macrocode}
+%
+% \begin{macro}{\FirstLabel}
+% \changes{v1.1}{1996/07/08}{Introduced new command \cs{FirstLabel}}
+% The command "\FirstLabel"\marg{Row}\marg{Col} sets the counters
+% "LabelOffsetRow" and "LabelOffsetCol".
+% \begin{macrocode}
+\DeclareRobustCommand{\FirstLabel}[2]{%
+ \setcounter{LabelOffsetRow}{#1}%
+ \setcounter{LabelOffsetCol}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Fonts}
+%
+%
+% \begin{macro}{\@toaddressfont}
+% \begin{macro}{\@fromaddressfont}
+% \changes{v1.1}{1996/07/08}{Fixed documentation about \cs{@fromaddressfont}}
+% We want the address to be printed in \textsf{\large 12pt sans serif}
+% font. The return address will be printed in 10pt normal font.
+% \begin{macrocode}
+\def\@toaddressfont{%
+ \ifcase\@ptsize \large\or\normalsize\or\small\fi%
+ \sffamily\selectfont}
+\def\@fromaddressfont{%
+ \ifcase\@ptsize \normalsize\or\small\or\footnotesize\fi%
+ \normalfont}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Return address}
+%
+% \begin{macro}{\returnaddress}
+% \changes{v1.2}{1997/07/13}{Deleted check for \cs{if@envelope}}
+% The standard letter class defines "\returnaddress" to be null. This
+% is sensible if we are printing labels, but not so good if we are
+% printing \emph{envelopes}. Therefore let us redefine it:
+% \begin{macrocode}
+\def\returnaddress{\fromaddress}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Margins, page styles, etc.}
+%
+%
+% \begin{macro}{\startlabels}
+% \changes{v1.2}{1996/09/07}{Added \cs{clearpage}}
+% \changes{v1.2}{1996/09/20}{Added percent signs}
+% \changes{v1.2}{1997/07/10}{Moved here calculations for
+% \cs{EnvelopeLeftMargin}}
+% \changes{v1.2}{1997/07/10}{Added \cs{LabelLeftMargin}}
+% The command "\startlabels" is the internal command that prepares
+% the paper for labels or envelopes, resets the internal counters and
+% calls "\@beginlabelshook".
+% \begin{macrocode}
+\def\startlabels{%
+ \clearpage%
+ \pagestyle{empty}%
+ \setlength{\topmargin}{-1.0in}%
+ \if@envelope%
+ \addtolength{\topmargin}{\EnvelopeTopMargin}%
+ \else \addtolength{\topmargin}{\LabelTopMargin}%
+ \fi%
+ \setlength{\headheight}{0pt}%
+ \setlength{\headsep}{0pt}%
+ \setlength{\footskip}{0pt}%
+ \setlength{\textheight}{200in}%
+ \setlength\paperheight{\textheight}%
+ \global\vsize=200in\relax%
+ \addtolength{\textheight}{-\topmargin}%
+ \addtolength{\textheight}{-1.0in}%
+ \setlength{\oddsidemargin}{-1.0in}%
+ \if@envelope\relax%
+ \else%
+ \addtolength{\oddsidemargin}{\LabelLeftMargin}%
+ \fi%
+ \setlength{\evensidemargin}{\oddsidemargin}%
+ \setlength{\textwidth}{20in}%
+ \hsize=20in%
+ \baselineskip=0pt%
+ \lineskip=0pt%
+ \parindent=0pt%
+ \if@envelope
+% \end{macrocode}
+%
+% Now we can calculate "\EnvelopeLeftMargin"
+%
+% \begin{macrocode}
+ \ifcase\the\@envelopeposition%
+ \setlength{\EnvelopeLeftMargin}{\paperwidth}%
+ \if@rotateenvelopes%
+ \addtolength{\EnvelopeLeftMargin}{-\EnvelopeHeight}%
+ \else%
+ \addtolength{\EnvelopeLeftMargin}{-\EnvelopeWidth}%
+ \fi%
+ \setlength{\EnvelopeLeftMargin}{0.5\EnvelopeLeftMargin}%
+ \or%
+ \setlength{\EnvelopeLeftMargin}{0pt}%
+ \or%
+ \setlength{\EnvelopeLeftMargin}{\paperwidth}%
+ \if@rotateenvelopes%
+ \addtolength{\EnvelopeLeftMargin}{-\EnvelopeHeight}%
+ \else%
+ \addtolength{\EnvelopeLeftMargin}{-\EnvelopeWidth}%
+ \fi%
+ \else%
+ \relax%
+ \fi%
+ \else%
+% \end{macrocode}
+%
+% Initializing labels counters\ldots
+%
+% \begin{macrocode}
+ \setcounter{LabelCountCol}{\theLabelOffsetCol}%
+ \setcounter{LabelCountRow}{\theLabelOffsetRow}%
+ \ifnum\theLabelOffsetRow>1%
+ \null%
+ \loop \vspace*{\LabelHeight}%
+ \addtocounter{LabelOffsetRow}{-1} \ifnum\theLabelOffsetRow>1%
+ \repeat%
+ \fi%
+ \ifnum\theLabelOffsetCol>1%
+ \loop \hspace*{\LabelWidth}\nolinebreak%
+ \addtocounter{LabelOffsetCol}{-1} \ifnum\theLabelOffsetCol>1%
+ \repeat%
+ \fi%
+ \nopagebreak%
+ \fi%
+ \spaceskip0pt\relax%
+ \xspaceskip 0pt\relax%
+ \clubpenalty=0%
+ \widowpenalty=0%
+ \raggedbottom%
+ \sloppy%
+ \setlength\hfuzz{5in}%
+ \setlength\vfuzz{5in}%
+ \ignorespaces%
+ \@beginlabelshook%
+ \@beginlabelpagehook%
+ \nopagebreak}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Printing of the addresses}
+%
+% \DescribeMacro{\PrintReturnAddress}
+% This macro uses the text as an argument and prints it according to
+% the conventions.
+% \begin{macrocode}
+\newcommand{\PrintReturnAddress}[1]{%
+ \vspace*{\FromAddressTopMargin}
+ \null\hspace{\FromAddressLeftMargin}
+ \parbox[t][\FromAddressHeight]{\FromAddressWidth}%
+ {\@fromaddressfont \lineskip=1pt
+ \if@printreturnaddress #1\else\relax\fi}}
+% \end{macrocode}
+%
+% \DescribeMacro{\PrintAddress}
+% This macro works like "\PrintReturnAddress", with several important
+% differences: it prints barcodes if necessary \emph{and}
+% capitalizes the address.
+% \begin{macrocode}
+\newcommand{\PrintAddress}[1]{%
+ \vspace*{\ToAddressTopMargin}
+ \leavevmode
+ \null\hspace*{\ToAddressLeftMargin}
+ \parbox[t]{\ToAddressWidth}{%
+ \lineskip=1pt
+ \if@barcodes \PrintBarCode{#1} \fi
+ \@toaddressfont
+ \if@capitalizeaddress \@make@capitalize{#1} \else #1 \fi}}
+% \end{macrocode}
+%
+% \subsection{Label setup}
+%
+% \begin{macro}{\PrintLabel}
+% \changes{v1.2}{1996/09/20}{Added percent signs}
+% This macro prints a label in a parbox
+% \begin{macrocode}
+\newcommand{\PrintLabel}[1]{%
+ \parbox[t][\LabelHeight]{\LabelWidth}{%
+ \PrintAddress{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PrintBigLabel}
+% \changes{v1.2}{1997/07/13}{Wrote new command}
+% This macro makes a minipage with addresses on it, similarly to
+% "\PrintEnvelope" below.
+% \begin{macrocode}
+\newcommand{\PrintBigLabel}[2]{%
+ \begin{minipage}[t][\LabelHeight]{\LabelWidth}%
+ \baselineskip=0pt%
+ \lineskip=0pt%
+ \parindent=0pt%
+ \begin{center}%
+ \PrintReturnAddress{#1}\\%
+ \rule{\ToAddressWidth}{0.1pt}%
+ \PrintAddress{#2}%
+ \end{center}%
+ \end{minipage}}
+% \end{macrocode}
+%
+%
+% \subsection{Envelope setup}
+%
+% Labels include one box per label, so their setup is simple. The
+% situation with envelopes is different: they contain several boxes, and
+% could be rotated, centered, etc.
+%
+% \begin{macro}{\PrintEnvelope}
+% \changes{v1.2}{1996/09/20}{Added percent signs}
+% This macro makes a minipage with addresses on it.
+% \begin{macrocode}
+\newcommand{\PrintEnvelope}[2]{%
+ \begin{minipage}[t][\EnvelopeHeight]{\EnvelopeWidth}%
+ \baselineskip=0pt%
+ \lineskip=0pt%
+ \parindent=0pt%
+ \PrintReturnAddress{#1}\\%
+ \begin{center}%
+ \PrintAddress{#2}%
+ \end{center}%
+ \end{minipage}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@PrintEnvelope}
+% The following macro checks for rotation:
+% \begin{macrocode}
+\newcommand{\@PrintEnvelope}[2]{%
+ \if@rotateenvelopes\rotatebox{90}{\PrintEnvelope{#1}{#2}}%
+ \else\PrintEnvelope{#1}{#2}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Printing of envelopes and labels}
+%
+% \subsection{Main Command}
+%
+% \begin{macro}{\mlabel}
+% Now we are prepared to print actual envelopes and labels. It is done by
+% the "\mlabel" command. It has two forms: for labels and envelopes.
+% \begin{macrocode}
+\renewcommand{\mlabel}[2]{\ignorespaces%
+ \spaceskip 0pt\relax%
+ \xspaceskip 0pt\relax%
+% \end{macrocode}
+%
+% \subsection{Printing of one envelope}
+% \changes{v1.1}{1996/07/09}{Put \cs{@beginlabelpagehook} in the envelope
+% printing}
+% \begin{macrocode}
+ \if@envelope%
+ \leavevmode%
+ \hspace*{\EnvelopeLeftMargin}%
+ \@PrintEnvelope{#1}{#2}%
+ \clearpage%
+ \@beginlabelpagehook%
+% \end{macrocode}
+% \subsection{Printing of one label}
+% \changes{v1.1}{1996/07/09}{Put \cs{@beginlabelpagehook} in the label
+% printing}
+% \changes{v1.2}{1997/07/14}{Added printing of big labels}
+% \begin{macrocode}
+ \else%
+ \ignorespaces%
+ \ifnum\theLabelCountCol>\theLabelMaxCol%
+ \\\nopagebreak%
+ \stepcounter{LabelCountRow}%
+ \setcounter{LabelCountCol}{1}%
+ \fi%
+ \ifnum\theLabelCountRow>\theLabelMaxRow%
+ \vfill\eject\@beginlabelpagehook%
+ \setcounter{LabelCountRow}{1}%
+ \setcounter{LabelCountCol}{1}%
+ \fi%
+ \if@biglabel%
+ \PrintBigLabel{#1}{#2}%
+ \else%
+ \PrintLabel{#2}%
+ \fi%
+ \ignorespaces\nolinebreak%
+ \stepcounter{LabelCountCol}%
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Printing of return labels}
+%
+% We print only mailing addresses on labels. The user is supposed to have
+% preprinted return labels. Here we describe a utility for printing them.
+% This utility should be used in a separate document.
+%
+% \DescribeMacro{\@numreturnlabels}
+% The counter "\@numreturnlabels" stores the number of return labels to
+% be printed. Note that it is a \TeX\ counter, not a \LaTeX\ one.
+% \begin{macrocode}
+\newcount\@numreturnlabels
+% \end{macrocode}
+%
+% \DescribeMacro{\printreturnlabels}
+% This macro has two parameters: the number of labels to be printed and
+% the text that is printed. It is the same on all labels.
+% \begin{macrocode}
+\newcommand{\printreturnlabels}[2]{%
+ \@numreturnlabels=#1
+ \def\@toaddressfont{\@fromaddressfont}
+ \@capitalizeaddressfalse
+ \@barcodesfalse
+ \startlabels
+ \loop \mlabel{\relax}{#2} \advance\@numreturnlabels by -1
+ \ifnum\@numreturnlabels>0\repeat}
+% \end{macrocode}
+%
+% \section{Barcodes}
+%
+% \subsection{Main command}
+%
+% The USPS Postnet codes are printed accordingly to the specifications
+% Ref.~\cite{Pub25}. The scanning algorithm
+% is stolen from David Carlisle's \textsf{enumerate} package~\cite{Enum}.
+%
+% \DescribeMacro{\PrintBarCode}
+% First, we extract barcodes by the command "\@extractbarcode". Then
+% we print them by "\@printbarcode".
+% \begin{macrocode}
+\newcommand{\PrintBarCode}[1]{%
+ \@extractbarcode{#1}
+ \@printbarcode}
+% \end{macrocode}
+%
+% \subsection{Extraction of barcodes}\label{sec:Extract}
+% \changes{v1.2}{1996/07/10}{Deleted \cs{global} from zipcode
+% extracting commands}
+% We define zipcode as a sequence of digits (0--9) that:
+% \begin{itemize}
+% \item Has no characters other than digits and dashes (-) inside it
+% \item Has no bracketed groups inside it and is not bracketed itself
+% \item Is the last in the address field unless "\if@alwaysbarcodes=true"
+% \end{itemize}
+%
+% We print this sequence plus the \emph{control character}.
+% The latter is defined as minus sum of digits of the
+% zip code
+% modulo 10 (that is, the complement of the sum of digits to a
+% multiple of 10).
+%
+% First, some internal registers.
+% \DescribeMacro{\@zipcode}
+% \DescribeMacro{\@zipcodesum}
+% \DescribeMacro{\@zipcodefound}
+% The token list "\@zipcode" contains barcode found so far. The register
+% "\@zipcodesum" first contains the sum of digits of the barcode, and
+% then the control character. The
+% switch "\@zipcodefound" shows whether we found zip code so far.
+% \begin{macrocode}
+\newtoks\@zipcode
+\newcount\@zipcodesum
+\newif\if@zipcodefound
+% \end{macrocode}
+%
+%
+%
+% There are two modes for gobbling tokens:
+% \begin{enumerate}[{State} A:]
+% \item We are outside a potential zipcode sequence
+% ("\if@zipcodefound=false")\label{state:notfound}
+% \item We are inside a potential zipcode sequence
+% ("\if@zipcodefound=true")\label{state:found}
+% \end{enumerate}
+%
+% \begin{itemize}
+%
+% \item \DescribeMacro{\@endaddress} \DescribeMacro{\@finishzipcode}
+% If we meet in any state the special token "\@endaddress", we
+% gobble it and finish the loop.
+% \begin{macrocode}
+\long\def\@finishzipcode#1{}
+% \end{macrocode}
+%
+% \item \DescribeMacro{\@firstzipcode} If we meet a number (0--9) in
+% state~\ref{state:notfound}, we initialize registers, process the
+% token and go to state~\ref{state:found}
+% \begin{macrocode}
+\long\def\@firstzipcode#1{%
+ \@zipcode{#1}
+ \@zipcodesum=#1\relax
+ \@zipcodefoundtrue
+ \@zipcodeloop}
+% \end{macrocode}
+%
+% \item \DescribeMacro{\@continuezipcode} If we meet a number (0--9)
+% in state~\ref{state:found}, we just process it.
+% \begin{macrocode}
+\long\def\@continuezipcode#1{%
+ \@zipcode=\expandafter{\the\@zipcode#1}
+ \advance\@zipcodesum by #1
+ \@zipcodeloop}
+% \end{macrocode}
+%
+% \item \DescribeMacro{\@dashzipcode} If we meet a dash in
+% state~\ref{state:found}, we gobble it.
+% \begin{macrocode}
+\long\def\@dashzipcode#1{\@zipcodeloop}
+% \end{macrocode}
+%
+% \item \DescribeMacro{\@spacezipcode} If we meet a space in any
+% state, we gobble it and go to the state~\ref{state:notfound}. The
+% trick is from Carlisle's \textsf{enumerate} package.
+% \begin{macrocode}
+\def\@spacezipcode{%
+ \@zipcodefoundfalse
+ \afterassignment\@zipcodeloop\let\EL@temp= }
+% \end{macrocode}
+%
+% \item \DescribeMacro{\@abortzipcode} If we meet anything else in any
+% mode, we gobble it and go to state~\ref{state:notfound}
+% \begin{macrocode}
+\long\def\@abortzipcode#1{%
+ \@zipcodefoundfalse
+ \@zipcodeloop}
+% \end{macrocode}
+%
+% \end{itemize}
+%
+%
+% \DescribeMacro{\@zipcodeloop}
+% \DescribeMacro{\EL@temp}
+% \changes{v1.2}{1997/07/14}{Changed \cs{@temp} to \cs{EL@temp} to
+% avoid clashes with amsmath}
+% This macro is simple. We just put the next token into "\EL@temp" and
+% process it through "\@zipcodeloop@".
+% \begin{macrocode}
+\def\@zipcodeloop{\futurelet\EL@temp\@zipcodeloop@}
+% \end{macrocode}
+%
+% \DescribeMacro{\@zipcodeloop@}
+% \DescribeMacro{\EL@tempa}
+% \changes{v1.2}{1997/07/14}{Changed \cs{@tempa} to \cs{EL@tempa} to
+% avoid clashes with amsmath}
+% This macro performs actual processing\dots We put the command
+% that gobbles the next token into "\EL@tempa"
+% \begin{macrocode}
+\def\@zipcodeloop@{%
+ \ifx \@endaddress\EL@temp \def\EL@tempa{\@finishzipcode} \else
+ \ifx 0\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 1\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 2\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 3\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 4\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 5\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 6\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 7\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 8\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx 9\EL@temp \if@zipcodefound \def\EL@tempa{\@continuezipcode}
+ \else \def\EL@tempa{\@firstzipcode} \fi \else
+ \ifx -\EL@temp \if@zipcodefound \def\EL@tempa{\@dashzipcode}
+ \else \def\EL@tempa{\@abortzipcode} \fi \else
+ \ifx \@sptoken\EL@temp \def\EL@tempa{\@spacezipcode} \else
+ \def\EL@tempa{\@abortzipcode}
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \EL@tempa}
+% \end{macrocode}
+%
+%
+% \DescribeMacro{\@extractbarcode}
+% The command "\@extractbarcode" puts barcode into the "\@zipcode",
+% and calculates the control character (10 minus sum of the digits
+% of the barcode).
+% \begin{macrocode}
+\long\def\@extractbarcode#1{%
+ \@zipcodefoundfalse
+ \@zipcodeloop#1\@endaddress
+ \if@alwaysbarcodes \@zipcodefoundtrue \fi
+ \if@zipcodefound
+ \ifnum\the\@zipcodesum>0
+ \loop \advance \@zipcodesum by -10 \ifnum\the\@zipcodesum>0
+ \repeat
+ \fi
+ \multiply\@zipcodesum by -1
+ \fi}
+% \end{macrocode}
+%
+% \subsection{Printing barcodes}
+%
+% \DescribeMacro{\@barcodewidth}
+% \DescribeMacro{\@barcodeLheight}
+% \DescribeMacro{\@barcodeSheight}
+% \DescribeMacro{\@barcodeskip}
+% First, some lengths. ``L'' and ``S'' below refer to ``long'' and
+% ``short'' bars correspondingly.
+% \begin{macrocode}
+\newlength{\@barcodewidth}
+\newlength{\@barcodeLheight}
+\newlength{\@barcodeSheight}
+\newlength{\@barcodeskip}
+\setlength{\@barcodewidth}{0.020in}
+\setlength{\@barcodeLheight}{0.125in}
+\setlength{\@barcodeSheight}{0.050in}
+\setlength{\@barcodeskip}{0.026in}
+% \end{macrocode}
+%
+% \DescribeMacro{\@barL}
+% \DescribeMacro{\@barS}
+% The following macros print long and short bars.
+% \begin{macrocode}
+\DeclareRobustCommand{\@barL}{%
+ \rule{\@barcodewidth}{\@barcodeLheight}\hspace{\@barcodeskip}}
+\DeclareRobustCommand{\@barS}{%
+ \rule{\@barcodewidth}{\@barcodeSheight}\hspace{\@barcodeskip}}
+% \end{macrocode}
+%
+% \DescribeMacro{\@printonezip}
+% \DescribeMacro{\@printbarcode}
+% The scanning of "\@zipcode" is simpler than the scanning of the address:
+% the only tokens we can meet are digits. Well, we will add an end marking
+% token to the list. Let it be the letter ``S'' (from ``Stop'').
+% \begin{macrocode}
+\def\@printonezip#1{%
+ \ifx1#1\@barS\@barS\@barS\@barL\@barL\else
+ \ifx2#1\@barS\@barS\@barL\@barS\@barL\else
+ \ifx3#1\@barS\@barS\@barL\@barL\@barS\else
+ \ifx4#1\@barS\@barL\@barS\@barS\@barL\else
+ \ifx5#1\@barS\@barL\@barS\@barL\@barS\else
+ \ifx6#1\@barS\@barL\@barL\@barS\@barS\else
+ \ifx7#1\@barL\@barS\@barS\@barS\@barL\else
+ \ifx8#1\@barL\@barS\@barS\@barL\@barS\else
+ \ifx9#1\@barL\@barS\@barL\@barS\@barS\else
+ \ifx0#1\@barL\@barL\@barS\@barS\@barS\else
+ \ifx S#1\def\EL@tempa{\relax}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
+ \EL@tempa}
+\def\@printbarcode{%
+ \if@zipcodefound
+ \mbox{%
+ \@barL%
+ \def\EL@tempa{\@printonezip}%
+ \expandafter\EL@tempa\the\@zipcode S%
+ \def\EL@tempa{\@printonezip}%
+ \expandafter\EL@tempa\the\@zipcodesum S%
+ \@barL}
+ \\[1ex]
+ \fi}
+% \end{macrocode}
+%
+%
+%
+% \section{Capitalization}
+%
+%
+% \changes{v1.2}{1996/07/10}{Deleted \cs{global} from capitalization commands}
+%
+%
+%
+% These macros process the address (actually, any string) according to the
+% USPS recommendations. Specifically, they:
+% \begin{itemize}
+% \item Strip dots (.) and commas (,) from the address unless they are
+% enclosed in brackets
+% \item Make all letters uppercase
+% \item Add 1pt space between letters
+% \item Add 1em space between words
+% \end{itemize}
+% An interesting question is whether we should de-accent accented
+% letters. USPS says nothing about it. In the present version accents
+% are \emph{not} stripped. However due to the scanning algorithm they
+% should be enclosed by brackets, like this:
+% "{\u S}andor {\c C}edi".
+%
+%
+%
+% \DescribeMacro{\@addr@cap}
+% We store the capitalized address in the token list "\@addr@cap".
+% \begin{macrocode}
+\newtoks\@addr@cap
+% \end{macrocode}
+%
+% The following macros process the tokens one by one.
+%
+% \DescribeMacro{\@finishaddrcap}
+% If we meet the special token "\@endaddress", we gobble it and stop.
+% \begin{macrocode}
+\long\def\@finishaddrcap#1{}
+% \end{macrocode}
+%
+% \DescribeMacro{\@dotcommaaddrcap}
+% If we meet comma or dot, we gobble it and do \emph{not} stop. This macro
+% is also useful for gobbling \LaTeXe\ \textsf{letter} commands like
+% "\voidb@x" and "\unhbox".
+% \begin{macrocode}
+\long\def\@dotcommaaddrcap#1{%
+ \@addrcaploop}
+% \end{macrocode}
+%
+% \DescribeMacro{\@newlineaddrcap}
+% If we meet "\\", we add it to the list
+% \begin{macrocode}
+\long\def\@newlineaddrcap#1{%
+ \@addr@cap=\expandafter{\the\@addr@cap #1}
+ \@addrcaploop}
+% \end{macrocode}
+%
+% \DescribeMacro{\@bgroupaddrcap}
+% If we meet "\bgroup", we add it to the list the complete group (uppercase)
+% \begin{macrocode}
+\long\def\@bgroupaddrcap#1{%
+ \@addr@cap=\expandafter{\the\@addr@cap {\MakeUppercase{#1}}}
+ \@addrcaploop}
+% \end{macrocode}
+%
+% \DescribeMacro{\@spaceaddrcap}
+% If we meet a space we gobble it (oh-oh) and add it to the list.
+% \begin{macrocode}
+\def\@spaceaddrcap{%
+ \@addr@cap=\expandafter{\the\@addr@cap\hspace{0.6em}}
+ \afterassignment\@addrcaploop\let\EL@temp= }
+% \end{macrocode}
+%
+% \DescribeMacro{\@otheraddrcap}
+% And if we meet anything else, we make it uppercase and add to the
+% list
+% \begin{macrocode}
+\def\@otheraddrcap#1{%
+ \@addr@cap=\expandafter{\the\@addr@cap%
+ \MakeUppercase{#1}\kern1pt\relax}
+ \@addrcaploop}
+% \end{macrocode}
+%
+%
+% \DescribeMacro{\@addrcaploop}
+% This macro is simple. We just put the next token into "\EL@temp" and
+% process it through "\@addrcaploop@".
+% \begin{macrocode}
+\def\@addrcaploop{\futurelet\EL@temp\@addrcaploop@}
+% \end{macrocode}
+%
+% \DescribeMacro{\@addrcaploop@}
+% This macro performs actual processing\dots
+% \begin{macrocode}
+\def\@addrcaploop@{%
+ \ifx \@endaddress\EL@temp \def\EL@tempa{\@finishaddrcap} \else
+ \ifx .\EL@temp \def\EL@tempa{\@dotcommaaddrcap} \else
+ \ifx ,\EL@temp \def\EL@tempa{\@dotcommaaddrcap} \else
+ \ifx \voidb@x\EL@temp \def\EL@tempa{\@dotcommaaddrcap} \else
+ \ifx \unhbox\EL@temp \def\EL@tempa{\@dotcommaaddrcap} \else
+ \ifx \\\EL@temp \def\EL@tempa{\@newlineaddrcap} \else
+ \ifx \bgroup\EL@temp \def\EL@tempa{\@bgroupaddrcap} \else
+ \ifx \@sptoken\EL@temp \def\EL@tempa{\@spaceaddrcap} \else
+ \def\EL@tempa{\@otheraddrcap}
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \EL@tempa}
+% \end{macrocode}
+%
+% \DescribeMacro{\@make@capitalize}
+% \begin{macrocode}
+\long\def\@make@capitalize#1{%
+ \@addr@cap={\relax}
+ \@addrcaploop#1\@endaddress
+ \the\@addr@cap}
+% \end{macrocode}
+%
+%
+% \section{Games with \texttt{.aux} file}
+%
+% The commands described in this section write something to the
+% |.aux| file, and thus change the way \EL\ treats the labels and
+% envelopes. Since the action is delayed till the |.aux| file is
+% processed, these commands affect only the labels automatically
+% extracted from the |letter| environment, and do not affect the
+% labels explicitly defined by the |\mlabel| commands in the main
+% file.
+%
+%
+% \changes{v1.2}{1996/09/07}{Added \cs{@@mlabel}}
+% \DescribeMacro{\@@mlabel}
+% The macro |\@@mlabel| stores the status of the |\@mlabel| as
+% determined by |\makelabels|. It is a no-op at the start.
+% If |\makelabels| redefines |\@mlabel|, we catch it through the
+% |\AtEndDocument| hook. Note that since |\makelabel| is allowed
+% only in the preamble, we are not in danger of redefining commands too
+% early.
+% \begin{macrocode}
+\let\@@mlabel=\@gobbletwo
+\AtEndDocument{\let\@@mlabel=\@mlabel}
+% \end{macrocode}
+%
+%
+% The next four commands redefine |\@mlabel| to suppress or resume
+% printing mailing labels.
+%
+% \begin{macro}{\suppresslabels}
+% \changes{v1.2}{1996/09/06}{Wrote new command}
+% This command suppress printing labels and envelopes until it is
+% resumed by |\resumelabels| or similar commands.
+% \begin{macrocode}
+\def\suppresslabels{\if@filesw\immediate\write\@auxout{%
+ \string\@suppresslabels}\fi}
+% \end{macrocode}
+%
+% \begin{macro}{\@suppresslabels}
+% \changes{v1.2}{1996/09/07}{Deleted the \cs{AtBeginDocument} hook}
+% This is the internal command that performs the actual
+% processing.
+% \begin{macrocode}
+\def\@suppresslabels{\let\@mlabel=\@gobbletwo}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\resumelabels}
+% \changes{v1.2}{1996/09/06}{Wrote new command}
+% \begin{macro}{\@resumelabels}
+% \changes{v1.2}{1996/09/07}{Changed \cs{mlabel} to \cs{@@mlabel} and
+% deleted the \cs{AtBeginDocument} hook}
+% These commands resume printing labels and envelopes if it was
+% suppressed by |\suppresslabels| or similar commands.
+% \begin{macrocode}
+\def\resumelabels{\if@filesw\immediate\write\@auxout{%
+ \string\@resumelabels}\fi}
+\def\@resumelabels{\let\@mlabel=\@@mlabel}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\suppressonelabel}
+% \changes{v1.2}{1996/06/09}{Wrote new command}
+% \begin{macro}{\@suppressonelabel}
+% \changes{v1.2}{1996/09/07}{Deleted the \cs{AtBeginDocument} hook}
+% \begin{macro}{\@old@mlabel}
+% These commands suppress printing of one label or envelope.
+% The macro |\@old@mlabel| is used to store the
+% system state.
+% \begin{macrocode}
+\def\suppressonelabel{\if@filesw\immediate\write\@auxout{%
+ \string\@suppressonelabel}\fi}
+\def\@suppressonelabel{\let\@old@mlabel=\@mlabel%
+ \def\@mlabel{%
+ \let\@mlabel=\@old@mlabel%
+ \@gobbletwo}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\printonelabel}
+% \changes{v1.2}{1996/06/09}{Wrote new command}
+% \begin{macro}{\@printonelabel}
+% \changes{v1.2}{1996/09/07}{Changed \cs{mlabel} to \cs{@@mlabel} and
+% deleted the \cs{AtBeginDocument} hook}
+% These commands resume printing for one label or envelope
+% The macro |\@old@mlabel| is used to store the
+% system state.
+% \begin{macrocode}
+\def\printonelabel{\if@filesw\immediate\write\@auxout{%
+ \string\@printonelabel}\fi}
+\def\@printonelabel{\let\@old@mlabel=\@mlabel%
+ \def\@mlabel{%
+ \let\@mlabel=\@old@mlabel%
+ \@@mlabel}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ChangeEnvelope}
+% \changes{v1.2}{1996/09/07}{Wrote new command}
+% \begin{macro}{\@ChangeEnvelope}
+% \begin{macro}{\@ChangeEnvelopeStar}
+% This macro writes |\@SetEnvelope| to the |.aux| file. It has
+% two forms: starred and and unstarred. In the unstarred mode it also
+% writes |\@startlabels| to the |.aux| file. In the unstarred form it
+% does not.
+% Since we want to treat \emph{both} stars and optional arguments, we
+% introduce two internal commands that can be invoked by the main
+% macro.
+% \begin{macrocode}
+\def\ChangeEnvelope{\@ifstar{\@ChangeEnvelopeStar}{\@ChangeEnvelope}}
+\newcommand\@ChangeEnvelopeStar[3][0pt]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetEnvelope[#1]{#2}{#3}}%
+ \fi}
+\newcommand\@ChangeEnvelope[3][0pt]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetEnvelope[#1]{#2}{#3}}
+ \immediate\write\@auxout{\string\@startlabels}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@SetEnvelope}
+% We define this command as no-op at beginning, and then redefine it
+% before reading |.aux| file.
+% \begin{macrocode}
+\def\@SetEnvelope[#1]#2#3{}
+\AtEndDocument{\let\@SetEnvelope=\SetEnvelope}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ChangeLabel}
+% \changes{v1.2}{1997/07/11}{Wrote new command}
+% \begin{macro}{\@ChangeLabel}
+% \begin{macro}{\@ChangeLabelStar}
+% This macro writes |\@SetLabel| to the |.aux| file. It has
+% two forms: starred and and unstarred. In the unstarred mode it also
+% writes |\@startlabels| to the |.aux| file. In the unstarred form it
+% does not.
+% Since we want to treat \emph{both} stars and optional arguments, we
+% introduce two internal commands that can be invoked by the main
+% macro.
+% \begin{macrocode}
+\def\ChangeLabel{\@ifstar{\@ChangeLabelStar}{\@ChangeLabel}}
+\newcommand\@ChangeLabelStar[7]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetLabel{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
+ \fi}
+\newcommand\@ChangeLabel[7]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetLabel{#1}{#2}{#3}{#4}{#5}{#6}{#7}}
+ \immediate\write\@auxout{\string\@startlabels}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@SetLabel}
+% We define this command as no-op at beginning, and then redefine it
+% before reading |.aux| file.
+% \begin{macrocode}
+\def\@SetLabel#1#2#3#4#5#6#7{}
+\AtEndDocument{\let\@SetLabel=\SetLabel}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ChangeBigLabel}
+% \changes{v1.2}{1997/07/13}{Wrote new command}
+% \begin{macro}{\@ChangeBigLabel}
+% \begin{macro}{\@ChangeBigLabelStar}
+% This macro writes |\@SetBigLabel| to the |.aux| file. It has
+% two forms: starred and and unstarred. In the unstarred mode it also
+% writes |\@startlabels| to the |.aux| file. In the unstarred form it
+% does not.
+% Since we want to treat \emph{both} stars and optional arguments, we
+% introduce two internal commands that can be invoked by the main
+% macro.
+% \begin{macrocode}
+\def\ChangeBigLabel{\@ifstar{\@ChangeBigLabelStar}{\@ChangeBigLabel}}
+\newcommand\@ChangeBigLabelStar[7]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetBigLabel{#1}{#2}{#3}{#4}{#5}{#6}{#7}}%
+ \fi}
+\newcommand\@ChangeBigLabel[7]{%
+ \if@filesw\immediate\write\@auxout{%
+ \string\@SetBigLabel{#1}{#2}{#3}{#4}{#5}{#6}{#7}}
+ \immediate\write\@auxout{\string\@startlabels}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@SetLabel}
+% We define this command as no-op at beginning, and then redefine it
+% before reading |.aux| file.
+% \begin{macrocode}
+\def\@SetBigLabel#1#2#3#4#5#6#7{}
+\AtEndDocument{\let\@SetBigLabel=\SetBigLabel}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \section{Reimplementation of the \cs{opening} command}
+% \DescribeMacro{\re}
+% Some people like to put below the address information like
+% \begin{quote}
+% Re: our recent talk
+% \end{quote}
+% A way to do this is to include it in the address like this:
+% \begin{verbatim}
+% \begin{letter}{%
+% Dr.~Austin Tankel\\
+% Some University\\
+% Anytown, Pa 12345\\[1ex]
+% Re: Our recent talk}
+% \opening{Dear Austin:}
+% \end{verbatim}
+% However, this additional info will be put in the mailing label,
+% which is wrong. Here we describe a macro that works like this:
+% \begin{verbatim}
+% \begin{letter}{%
+% Dr.~Austin Tankel\\
+% Some University\\
+% Anytown, Pa 12345}
+% \re{Our recent talk}
+% \opening{Dear Austin:}
+% \end{verbatim}
+%
+%
+% Now, the implementation.
+% First, lets us check whether the option "re" is chosen (otherwise we
+% don't bother to redefine the commands):
+% \begin{macrocode}
+\if@EL@redefine@opening
+% \end{macrocode}
+%
+% \begin{macro}{\re}
+% \changes{v1.2}{1997/07/14}{Wrote new command}
+% \begin{macro}{\recontentents}
+% \changes{v1.2}{1997/07/14}{Wrote new command}
+% The command "\re" just defines "\recontents". Also, we initialize
+% "\recontents" to be initially empty
+% \begin{macrocode}
+ \newcommand*{\re}[1]{\def\recontents{#1}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\ReName}
+% \changes{v1.2}{1997/07/14}{Wrote new command}
+% By default it is just plain style ``Re: '' (note the space!)
+% \begin{macrocode}
+ \def\ReName{Re: }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\opening}
+% \changes{v1.2}{1997/07/14}{Reimplemented standard command
+% \cs{opening}}
+% Now we redefine the standard "\opening" command to include the "\re"
+% info. Here is the quote from the standard "letter"
+% class~\cite{letter}:
+% \begin{quotation}
+% Text is begun with the |\opening| command, whose argument
+% generates the salutation, as in
+%\begin{verbatim}
+% \opening{Dear Henry,}
+%\end{verbatim}
+% This should produce everything up to and including the
+% `Dear Henry,' and a |\par| command that follows.
+% Since there's a |\vfil| at the bottom of every page,
+% it can add vertical fill to position a short letter.
+% It should use the following commands:
+% \begin{itemize}
+% \item |\toname| : name part of `to' address.
+% Will be one line long.
+% \item |\toaddress| : address part of `to' address.
+% The lines separated by |\\|.
+% \item |\fromname| : name of sender.
+% \item |\fromaddress| : argument of current |\address|
+% declaration-- null if none. Should use standard institutional
+% address if null.
+% \item |\fromlocation| : argument of current |\location|
+% declaration--null if none.
+% \item |\telephonenum| : argument of current |\telephone|
+% declaration--null if none.
+% \end{itemize}
+% \end{quotation}
+% We just "\ReName" and "\recontents" here\ldots
+% \begin{macrocode}
+ \renewcommand*{\opening}[1]{\ifx\@empty\fromaddress
+ \thispagestyle{firstpage}%
+ {\raggedleft\@date\par}%
+ \else % home address
+ \thispagestyle{empty}%
+ {\raggedleft\begin{tabular}{l}\ignorespaces
+ \fromaddress \\*[2\parskip]%
+ \@date \end{tabular}\par}%
+ \fi
+ \vspace{2\parskip}%
+ {\raggedright \toname \\ \toaddress \par}%
+ \ifx\@empty\recontents\relax
+ \else
+ {\raggedright \ReName \recontents \par}%
+ \fi
+ \vspace{2\parskip}%
+ #1\par\nobreak}%
+% \end{macrocode}
+% \end{macro}
+%
+% Now we close \cs{if@EL@redefine@opening}:
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% And the last line:
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+% \clearpage
+% \addcontentsline{toc}{section}{\protect\refname}
+% \begin{thebibliography}{1}
+% \bibitem{Enum}
+% David Carlisle.
+% \newblock {\em The \textsf{enumerate} package}.
+% \newblock {CTAN}, v2.02 edition, January 1994.
+% \bibitem{letter}
+% Leslie Lamport, Frank Mittelbach, and Rainer Sch{\"o}pf.
+% \newblock Standard letter document class for {\LaTeX} version 2e.
+% \newblock CTAN, 199c.
+% \bibitem{Pub25}
+% USPS.
+% \newblock {\em Designing Business Letter Mail (Pub 25)}, August 1995.
+% \end{thebibliography}
+%
+% \clearpage
+% \addcontentsline{toc}{section}{Change History}
+% \PrintChanges
+%
+% \clearpage
+% \addcontentsline{toc}{section}{Index}
+% \PrintIndex
+%
+\endinput
+
diff --git a/macros/latex/contrib/envlab/envlab.ins b/macros/latex/contrib/envlab/envlab.ins
new file mode 100644
index 0000000000..68e4cedbb7
--- /dev/null
+++ b/macros/latex/contrib/envlab/envlab.ins
@@ -0,0 +1,25 @@
+\def\batchfile{envlab.ins}
+\input docstrip
+\keepsilent
+
+
+\declarepreamble\cfg
+
+You are allowed and encouraged to modify THIS file.
+
+The first part of this file contains default options for your site.
+The second part (inside AtEndOfPackage declaration) should contain
+customization commands specific to your site.
+
+Good luck
+
+\endpreamble
+
+\generate{%
+ \file{envlab.drv}{\from{envlab.dtx}{driver}}
+ \file{envlab.sty}{\from{envlab.dtx}{package}}
+ \usepreamble\empty\usepreamble\cfg\file{envlab.cfg}{\from{envlab.dtx}{cfg}}}
+
+
+
+
diff --git a/macros/latex/contrib/envlab/envlab.pdf b/macros/latex/contrib/envlab/envlab.pdf
new file mode 100644
index 0000000000..40740bed37
--- /dev/null
+++ b/macros/latex/contrib/envlab/envlab.pdf
Binary files differ
diff --git a/macros/latex/contrib/envlab/readme.v12 b/macros/latex/contrib/envlab/readme.v12
new file mode 100644
index 0000000000..4f32a6aced
--- /dev/null
+++ b/macros/latex/contrib/envlab/readme.v12
@@ -0,0 +1,89 @@
+ Envelopes and Labels
+ LaTeX2e package
+ Version 1.2
+
+ Boris Veytsman
+ boris@plmsc.psu.edu
+ home page http://planck.psu.edu/~boris
+
+ July 16, 1997
+
+
+This package provides a comprehensive and easily customizable
+system for creating mailing envelopes and labels in LaTeXe. It
+includes printing of barcodes and address formatting according to
+the US Postal Service rules.
+
+The standard makelabels command in the LaTeXe letter.cls
+document class typesets labels on Avery 5352 sheets. A typical user
+may want more. EnvLab redefines makelabels in (hopefully})
+a more useful and customizable way. EnvLab:
+ - Typesets mailing labels or envelopes on a number of pre-defined
+label sheets or envelopes.
+ - Can be easily configured for any customized label or envelope
+sizes. The rule of thumb is: if you printer can print this, EnvLab can
+typeset this.
+ - Can optionally print barcodes and/or process addresses according to
+the United States Postal Service Rules.
+ - Allows you to include your logo in the return address.
+ - Painlessly interacts with mail merging packages such as mailing.
+ - Does not require special fonts for address and barcodes printing.
+The typesetting is implemented with standard fonts and LaTeX \rule
+commands.
+
+This package was written with US mailing standards in mind. This is
+not a reflection of the author's americanocentrism: US standard was
+only one I had official documents about. If you want to add your
+national standards, please contact me with pointers to the
+corresponding documents.
+
+The distribution of this package includes the following files:
+ - envlab.dtx---fully documented program
+ - envlab.ins---DocStrip instruction module
+ - elold.ins---DocStrip instruction module for older versions of
+DocStrip
+ - elguide.tex---User Guide
+ - readme.version_number---Read Me file
+
+To install the package
+ - LaTeX the file envlab.ins. It will produce three files: envlab.drv,
+envlab.sty and envlab.cfg. NOTE: If your version of DocStrip is older
+than 2.3, use elold.ins instead of envlab.ins.
+ - (Optional) Look at the file envlab.cfg and change it accordingly to
+your taste.
+ - Move the files envlab.sty and envlab.cfg to the LaTeX search
+path. NOTE: users of kpathsea based TeX (like teTeX) should also issue
+texhash to update the search database.
+ - Produce the documentation by LaTeX ing the files elguide.tex and
+(optional) envlab.drv.
+ - Enjoy!
+
+----------------------------------------------------------------------
+What's new in version 1.2
+
+ - Bug fixes. The package is now compatible with amsmath.
+ - New media type: big labels. They are typeset like labels, but carry
+both shipping and return addresses.
+ - New commands to control the automatic generation of mailing labels.
+ - New commands to change the media type for mailing labels in the
+middle of the document.
+ - New PostScript code for selecting the paper trays (thanks to EnvLab
+users).
+ - Enhancements to the letter environment for typesetting the subject
+information.
+ - Documentation update.
+
+
+----------------------------------------------------------------------
+What's new in version 1.1
+
+ - Bug fixes, including correcting the nasty typos in default options &
+elold.ins.
+ - New options controlling the printing of return addresses.
+ - \AtBeginLabels now behaves like \AtBeginDocument and \AtBeginDvi: the
+changes are cumulative.
+ - New hook \AtBeginLabelPage.
+ - New command and options controlling switching the printer to manual feed
+mode while printing envelopes and labels (thanks to William Slough, Eastern
+Illinois University).
+ - New command \FirstLabels controlling offsets for the labels.