From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/envlab/README | 1 + macros/latex/contrib/envlab/elguide.pdf | Bin 0 -> 197107 bytes macros/latex/contrib/envlab/elguide.tex | 1103 +++++++++++++++++++ macros/latex/contrib/envlab/elold.ins | 27 + macros/latex/contrib/envlab/envlab.dtx | 1759 +++++++++++++++++++++++++++++++ macros/latex/contrib/envlab/envlab.ins | 25 + macros/latex/contrib/envlab/envlab.pdf | Bin 0 -> 200380 bytes macros/latex/contrib/envlab/readme.v12 | 89 ++ 8 files changed, 3004 insertions(+) create mode 120000 macros/latex/contrib/envlab/README create mode 100644 macros/latex/contrib/envlab/elguide.pdf create mode 100644 macros/latex/contrib/envlab/elguide.tex create mode 100644 macros/latex/contrib/envlab/elold.ins create mode 100644 macros/latex/contrib/envlab/envlab.dtx create mode 100644 macros/latex/contrib/envlab/envlab.ins create mode 100644 macros/latex/contrib/envlab/envlab.pdf create mode 100644 macros/latex/contrib/envlab/readme.v12 (limited to 'macros/latex/contrib/envlab') 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 Binary files /dev/null and b/macros/latex/contrib/envlab/elguide.pdf 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{}, +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{} 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{} 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{} works +for HP LaserJet 4MV: +\begin{verbatim} + \special{! <> 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|package|cfg> +%<+package>\ProvidesPackage{envlab} +%<+cfg>\ProvidesFile{envlab.cfg} +[1997/07/16 v1.2 Envelopes and Labels] +% +%<*driver|package> +%% +%% Copyright Boris Veytsman 1996, 1997 +%% +% +%<*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 +% +% +% \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} +% +% \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} +% +%<*cfg> +%% +%% The default options go here +%% +\ExecuteOptions{businessenvelope,rotateenvelopes,centerenvelopes} +\ExecuteOptions{printbarcodes,capaddress} +\ExecuteOptions{nopswait,printreturnaddress,nopsautotray,nore} +%% +\AtEndOfPackage{\relax % Customization goes here +} +% +%<*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} "". +% \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} +% "". +% \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} +% +% \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 Binary files /dev/null and b/macros/latex/contrib/envlab/envlab.pdf 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. -- cgit v1.2.3