diff options
Diffstat (limited to 'macros/latex/contrib/cdpbundl')
-rw-r--r-- | macros/latex/contrib/cdpbundl/00readme.txt | 267 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/Makefile | 131 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/README | 34 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/cdp-ver-0-36.pdf | bin | 0 -> 352497 bytes | |||
-rw-r--r-- | macros/latex/contrib/cdpbundl/cdp-ver-0-36.tex | 1107 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/cdpbundl-doc.pdf | bin | 0 -> 400639 bytes | |||
-rw-r--r-- | macros/latex/contrib/cdpbundl/cdpbundl.dtx | 7746 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/cdpbundl.ins | 193 | ||||
-rw-r--r-- | macros/latex/contrib/cdpbundl/manifest.txt | 108 |
9 files changed, 9586 insertions, 0 deletions
diff --git a/macros/latex/contrib/cdpbundl/00readme.txt b/macros/latex/contrib/cdpbundl/00readme.txt new file mode 100644 index 0000000000..56b06303e3 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/00readme.txt @@ -0,0 +1,267 @@ + +This is file `00readme.txt'. +(Start your first tour of the C.D.P. Bundle by reading this file.) + +This file is part of a work named "C.D.P. Bundle". + +Copyright (C) 1999-2018 by Gustavo MEZZETTI + <gustavo.mezzetti@istruzione.it>. + +The C.D.P. Bundle may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +The C.D.P. Bundle has the LPPL maintenance status + "author-maintained". + +The file `manifest.txt' that comes along with this file specifies +what the C.D.P. Bundle consists of; more precisely, it explains how +the locutions "Work" and "Compiled Work", used in the LaTeX Project +Public License, are to be interpreted in the case of this work. + +This file, after giving a brief description of the C.D.P. Bundle, +explains how to install it and how to generate its--alas, still +incomplete!--documentation. + +February 8, 2018 (vers. 0.36d) + + + +CONTENTS +======== + +- A dozen lines description of the software +- Drawbacks +- Installation in a snapshot +- Checking the contents of the distribution +- How to install the C.D.P. Bundle +- How to generate the documentation +- The makefile + + + +A DOZEN LINES DESCRIPTION OF THE SOFTWARE +========================================= + +The C.D.P. Bundle was originally developed for a free association named +"C.D.P." (more on it in the documentation), to typeset its official letters +with the appropriate letterhead; but more generally, it can be used to +typeset business letters bearing a letterhead of your choice and formatted +according to Italian style conventions. Its modular structure, however, +provides you with building blocks of increasing level, by means of which +you should be able to adapt the letter format to a wide variety of styles. +It is also possible to write letters divided into sections and paragraphs, +to include floating figures and tables, and to use the commands +"\tableofcontents", "\listoffigures", and "\listoftables" to compile the +relevant indexes. A single input file can contain several letters, and +each letter will have its own table of contents, etc., independent of the +other ones. + + + +DRAWBACKS +========= + +The documentation included in this distribution is absolutely minimal. For +meaningful instructions on how to use the macros, the reader is referred to +other documents available at the web site of the past author's department, +which, however, are written in Italian. Since the main purpose of these +macros is to typeset letters according to Italian conventions, this should +not be a problem. I will consider translating the documentation in English +only if at least 5 persons ask me to. Nobody has asked yet. + + + +INSTALLATION IN A SNAPSHOT +========================== + +The C.D.P. Bundle is distributed in the usual .dtx + .ins format. The main +file is `cdpbundl.dtx', with installation script `cdpbundl.ins'. Do the +usual things to install it and to generate the documentation. If you don't +know what the usual things are, read below. Note that in order to generate +the documentation you should do the following: + +latex; latex; makeindex (.idx); makeindex (.glo); latex; latex. + + + +CHECKING THE CONTENTS OF THE DISTRIBUTION +========================================= + +Before installing the C.D.P. Bundle and generating its documentation, it is +a good idea to read the file `manifest.txt', which lists all the files that +make up the distribution, to check that you don't lack any of them (in +particular, that you have the file `manifest.txt' itself!). If you do find +that some files are missing, don't hesitate to complain to the distributor +from whom you obtained the others: this person, company, or institution is +infringing the copyright (actually, the copyleft) of the C.D.P. Bundle. +Please remember, however, that in order to comply with the copyright a +distributor is only requested to supply the files listed in `manifest.txt' +under the title "MEANING OF THE TERM `Work'", but not those listed under +"MEANING OF THE TERM `Compiled Work'". + + + +HOW TO INSTALL THE C.D.P. BUNDLE +================================ + +Note that in many pre-packaged TeX distributions, like MiKTeX and TeX Live, +the C.D.P. Bundle is already installed, and you can use it straight away. + +If, for some reason, you need to install the C.D.P. Bundle yourself, follow +these steps (but also see the section titled "The makefile", below): + +1) Make sure that the files `cdpbundl.dtx' and `cdpbundl.ins' are placed in +the same directory; below, we shall indicate this directory as "the current +directory". + +2) Run LaTeX (or plain TeX) once on the file `cdpbundl.ins'. This will +generate, in the current directory, the following LaTeX input files: + + articoletteracdp.cls + cdpaddon.sty + cdpbabel.sty + cdpnamesenglish.ldf + cdpnamesitalian.ldf + cdpshues-example.def + cdpshues.cfg + epson-stylus-740.def + hp-laserjet-4500.def + letteracdp.cls + +3) Move all the files listed in 2) from the current directory to a LaTeX +input directory--see b) and c) below. + +4) If you wish, delete the file `cdpbundl.log' to save disk space. + +Installation is now finished! The following comments may be useful: + +a) The above listing of all the files you need to move is also displayed on +the terminal at the end of the run of the file `cdpbundl.ins'. + +b) The documentation of your TeX installation should tell you how to find +the LaTeX input directory/ies, and probably also how to create new LaTeX +input directories reserved to hold your private classes and packages. + +c) If you are not able to find the LaTeX input directories, or you are not +allowed to modify them and cannot create your personal LaTeX input +directories, do this: place all the files listed under 2) above in any +directory of your choice (a newly created, empty directory would be the +best choice, however); then put all the LaTeX source files that you want to +typeset using the C.D.P. Bundle in that same directory. Of course, this +solution becomes impractical if the number of such source files exceeds a +dozen or so; but for a few files you can do this way, at least until you +decide to finally learn how to create your private LaTeX input directories! +:-) + +d) You may also choose to install the C.D.P. Bundle inside the main texmf +tree of your TeX installation (as opposed to installing it inside a +directory devoted to private classes and packages). In this case, note +that the TDS-compliant location for the C.D.P. Bundle, that is, the +directory inside which you should put all the files listed in 2), is + + tex/latex/cdpbundl/ + +The documentation, on the other hand, should be stored inside + + doc/latex/cdpbundl/ + +Of course, in order to do so you must have appropriate access priviledges +to the texmf tree of your site. + + + +HOW TO GENERATE THE DOCUMENTATION +================================= + +A shortened form of the documentation, already typeset and packaged in PDF, +is provided in the file `cdpbundl-doc.pdf' that you might have found on +some sites (e.g., the CTAN sites). This file, however, is not part of the +C.D.P. Bundle and distributors are not requested to include it among the +distributed files. Moreover, it does not contain any implementation notes +(in which most users, though, are not at all interested). + +If the distributor from whom you obtained the C.D.P. Bundle did not provide +the file `cdpbundl-doc.pdf', or if you want the full documentation, +complete with all the available implementation notes (but, alas, still +unfinished for many respects), you can generate it following these steps +(but also see the section titled "The makefile", below): + +1) Run LaTeX (_not_ plain TeX) _twice_ on the file `cdpbundl.dtx'. +This, among other things, will generate the files `cdpbundl.idx' and +`cdpbundl.glo' in the same directory as the file `cdpbundl.dtx'. + +2) Run MakeIndex on the file `cdpbundl.idx' obtained in 1), using the style +file `gind.ist', which is part of the standard LaTeX distribution. + +3) Run MakeIndex on the file `cdpbundl.glo' obtained in 1), using the style +file `gglo.ist', which is part of the standard LaTeX distribution, and +specifying the file `cdpbundl.gls' as the output file. + +4) Run LaTeX _two_ more times on the file `cdpbundl.dtx'. + +5) If you wish, you can now delete the following files, to save disk space: + + cdpbundl.aux + cdpbundl.glo + cdpbundl.gls + cdpbundl.idx + cdpbundl.ilg + cdpbundl.ind + cdpbundl.lof + cdpbundl.log + cdpbundl.out + cdpbundl.toc + +After step 4), you should get the documentation in DVI format in the file +`cdpbundl.dvi', located in the same directory as `cdpbundl.dtx', with all +indexes, table of contents, etc. correctly set. + +However, if you are neurotic (as I am) and have a fast computer, you could +run LaTeX three or four times, instead of two, in step 1)... :-) + +Other LaTeX typesetting engines should work in the same way, perhaps +producing the output in a different format; for example, you may use +pdflatex in place of LaTeX to obtain the documentation in PDF. + + + +THE MAKEFILE +============ + +Starting with version 0.36 of the C.D.P. Bundle, a (quite trivial!) +makefile that "knows" how to produce the documentation is offered along +with the Bundle itself. Although it is not a required part of the +distribution (as per LPPL), you may find that some distributors supply it +all the same (I hope the CTAN sites will do so). With this makefile in +the same directory as `cdpbundl.dtx', the shell command + + make doc + +will take all the necessary actions to produce the full documentation +(in PDF; the modifications you need to introduce into the makefile +in order to obtain DVI output should be quite obvious, however). + +The same makefile can also be used to extract the various class, package, +and ancillary (definition and configuration) files: simply issue the +command + + make code + +at the shell prompt; whereas + + make + +will _both_ extract the code _and_ typeset the documentation. Type + + make help + +for more information. + + +Have fun with the C.D.P. Bundle! + diff --git a/macros/latex/contrib/cdpbundl/Makefile b/macros/latex/contrib/cdpbundl/Makefile new file mode 100644 index 0000000000..ac43bf4094 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/Makefile @@ -0,0 +1,131 @@ +# makefile +# +# 2018 Feb 08 +# +# Macro definitions +ROOT_NAME = cdpbundl +DTX_NAME = $(ROOT_NAME).dtx +INS_NAME = $(ROOT_NAME).ins +DOC_AUX_FIL = $(ROOT_NAME).aux $(ROOT_NAME).log \ + $(ROOT_NAME).glo $(ROOT_NAME).gls \ + $(ROOT_NAME).idx $(ROOT_NAME).ind \ + $(ROOT_NAME).ilg $(ROOT_NAME).glg \ + $(ROOT_NAME).toc $(ROOT_NAME).lof \ + $(ROOT_NAME).hd $(ROOT_NAME).out +DOCUM_FILE = $(ROOT_NAME).pdf +CODE_FILES = letteracdp.cls \ + articoletteracdp.cls \ + cdpaddon.sty \ + cdpbabel.sty \ + *.ldf \ + *.def \ + cdpshues.cfg +# +LATEX = pdflatex +MAKEINDEX = makeindex + +# +define GEN_FAKE_INDEX + @echo '\\begin{theindex}' > $(ROOT_NAME).ind + @echo '\\end{theindex}' >> $(ROOT_NAME).ind + @echo "Generating fake .ind file." +endef +# +define GEN_FAKE_GLOSSARY + @echo '\\begin{theglossary}' > $(ROOT_NAME).gls + @echo '\\end{theglossary}' >> $(ROOT_NAME).gls + @echo "Generating fake .gls file." +endef + + + +.PHONY: default +.PHONY: code doc +.PHONY: clean cleandoc cleanaux cleancode cleanall +.PHONY: help + +# Default target +default: doc code + +# Generating the code +################################################################ +# # +# PLEASE NOTE THAT THE INSTALLER SCRIPT IS EXECUTED WITH # +# openout_any=r # +# # +################################################################ +code: + openout_any=r tex $(INS_NAME) + +# Generating the documentation +doc: $(DOCUM_FILE) + +$(DOCUM_FILE): $(DTX_NAME) +# Hack for getting index and glossary in the toc since first run: + $(GEN_FAKE_INDEX) + $(GEN_FAKE_GLOSSARY) +# We know how many runs are needed: + $(LATEX) $(DTX_NAME) + $(LATEX) $(DTX_NAME) + $(MAKEINDEX) -s gind.ist -t $(ROOT_NAME).ilg -o $(ROOT_NAME).ind \ + $(ROOT_NAME).idx + $(MAKEINDEX) -s gglo.ist -t $(ROOT_NAME).glg -o $(ROOT_NAME).gls \ + $(ROOT_NAME).glo + $(LATEX) $(DTX_NAME) + $(LATEX) $(DTX_NAME) + +# Cleaning up: command "make clean" defaults to "make cleanall" +clean: cleanall + +# Cleaning the code files +cleancode: + -rm $(CODE_FILES) + +# Cleaning the documentation files +cleandoc: cleanaux + -rm $(DOCUM_FILE) + +# Cleanng just the auxiliary files used in producing the documentation +cleanaux: + -rm $(DOC_AUX_FIL) + +# Cleaning up all the generated files +cleanall: cleancode cleandoc + +# Giving help +help: + @echo "Here is a list of the available commands:" + @echo + @echo " make" + @echo " Generate both the code and the documentation (see below)." + @echo + @echo " make code" + @echo " Generate the LaTeX sources for all the classes, packages," + @echo " definition files, etc. of the C.D.P. Bundle; these files go" + @echo " into the LaTeX input directories." + @echo + @echo " make doc" + @echo " Generate the documentation (in PDF); the resulting PDF file" + @echo " goes into the LaTeX documentation directories (the auxiliary" + @echo " files may be discarded)." + @echo + @echo " make clean" + @echo " make cleanall" + @echo " These two commands are synonyms; they remove all of the" + @echo " generated files (both code and documentation)." + @echo + @echo " make cleancode" + @echo " Remove the LaTeX source files (the \"code files\")." + @echo + @echo " make cleandoc" + @echo " Remove the documentation, together with all the auxiliary" + @echo " files used to generate it." + @echo + @echo " make cleanaux" + @echo " Remove only the auxiliary files used to generate the" + @echo " documentation." + @echo + @echo " make help" + @echo " Print this help message." + @echo + diff --git a/macros/latex/contrib/cdpbundl/README b/macros/latex/contrib/cdpbundl/README new file mode 100644 index 0000000000..a66239f197 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/README @@ -0,0 +1,34 @@ +(Version indicator: 2018 Feb 08) + +The C.D.P. Bundle was originally developed for a free association named +"C.D.P." (more on it in the documentation), to typeset its official letters +with the appropriate letterhead; but more generally, it can be used to +typeset business letters bearing a letterhead of your choice and formatted +according to Italian style conventions. Its modular structure, however, +provides you with building blocks of increasing level, by means of which +you should be able to adapt the letter format to a wide variety of styles. +It is also possible to write letters divided into sections and paragraphs, +to include floating figures and tables, and to use the commands +"\tableofcontents", "\listoffigures", and "\listoftables" to compile the +relevant indexes. A single input file can contain several letters, and +each letter will have its own table of contents, etc., independent of the +other ones. + +The C.D.P. Bundle may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. + +For more information, read the following files: + +00readme.txt -- start by reading this file +cdpbundl-doc.pdf -- overview of the C.D.P. Bundle (PDF) +cdp-ver-0-36.pdf -- instructions specific to version 0.36 (PDF) + +Other files that make up the distribution are: + +manifest.txt -- legal stuff +cdpbundl.dtx -- main source file +cdpbundl.ins -- installation script + +See the file `manifest.txt' for a more precise specification of what +files constitutes a LPPL-compliant distribution. diff --git a/macros/latex/contrib/cdpbundl/cdp-ver-0-36.pdf b/macros/latex/contrib/cdpbundl/cdp-ver-0-36.pdf Binary files differnew file mode 100644 index 0000000000..853cac7aa8 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/cdp-ver-0-36.pdf diff --git a/macros/latex/contrib/cdpbundl/cdp-ver-0-36.tex b/macros/latex/contrib/cdpbundl/cdp-ver-0-36.tex new file mode 100644 index 0000000000..87e3cc0b7f --- /dev/null +++ b/macros/latex/contrib/cdpbundl/cdp-ver-0-36.tex @@ -0,0 +1,1107 @@ +\begin{filecontents}{myarticletter.cls} +\NeedsTeXFormat{LaTeX2e}[1998/06/01] % LaTeX2e is required! +\ProvidesClass{myarticletter} + [2018/02/08 v0.03 (development)] +\LoadClassWithOptions{articoletteracdp}[2018/02/08] +\input{mylogo.def} +\endinput +\end{filecontents} + + + +\begin{filecontents}{mylogo.def} +\ProvidesFile{mylogo.def}[2018/02/08 v0.03 (development)] + +\RequirePackage[customletterhead]{cdpaddon}[2018/02/08] +\RequirePackage{color} + +\DeclareFontFamily{T1}{my@calli}{} +\DeclareFontShape{T1}{my@calli}{m}{n}{<->s*[1.44]callig15}{} +\definecolor{my@lh@color}{rgb}{0,.4,.4} + +\begin{customletterhead}{\textwidth} + \color{my@lh@color} + \fontsize{17}{21}\usefont{T1}{my@calli}{m}{n} + \leftline{% + \setlength{\unitlength}{1cm}% + \begin{picture}(0,0) + \put(-2,0){\framebox(1.8,1.2){% + \normalsize\ttfamily My Logo% + }} + \end{picture}% + My Company'\,s Letterhead\enspace + \hrulefill\hspace{-2cm}% + } +\end{customletterhead} + +\settowidth{\longindentation}{% + \fontsize{17}{21}\usefont{T1}{my@calli}{m}{n}% + My Company'\,s Letterhead\enspace +} + +\begin{customletterfoot}{\textwidth} + \color{my@lh@color} + \fontsize{5}{6}\usefont{T1}{pplx}{m}{n} + \raggedleft + \ruleacrossheadorfoot[-2cm] + My (almost unreadable) \textsc{small print},\\ + aligned along the \textit{right} edge\\ + of the main text. +\end{customletterfoot} + +\renewcommand*{\foldingtagrule}{% + \color{my@lh@color}\CDPFactoryFoldingTagRule +} + +\endinput +\end{filecontents} + + + +\documentclass + [twoside,boldsubject,italicsignature,shortindent,signaturerule] + {myarticletter}[2018/02/08] +\usepackage[T1]{fontenc} +\usepackage[english]{cdpbabel} +\usepackage[bookmarksnumbered,hypertexnames=false]{hyperref} +\usepackage{lipsum} + +\name{Gustavo Mezzetti} +\signature{Gustavo Mezzetti} +\address{ + Gustavo \textsc{Mezzetti}\\ + \protect\href + {mailto:gustavo.mezzetti@istruzione.it} + {\nolinkurl{gustavo.mezzetti@istruzione.it}} +} +\date{February~8, 2018} + +\hypersetup{ + pdftitle = {The C.D.P. Bundle version 0.36}, + pdfauthor = {G. Mezzetti}, + pdfsubject = {Instructions on how use the C.D.P. Bundle}, + pdfcreationdate = {D:20180208120000}, + pdfmoddate = {D:20180208120000} +} + +\pagestyle{headings} +\setcounter{tocdepth}{2} + +\newcommand*{\pdfbslash}{} +{\catcode`\|=0 |catcode`|\=12 |gdef|pdfbslash{\\}} + +\DeclareRobustCommand*{\packlass}[1]{{\normalfont\sffamily #1}} +\DeclareRobustCommand*{\opz}[1]{{\normalfont\ttfamily #1}} +\DeclareRobustCommand*{\env}[1]{% + {\texorpdfstring{\normalfont\ttfamily}{}#1}% +} +\DeclareRobustCommand*{\sty}[1]{{\normalfont\ttfamily #1}} +\DeclareRobustCommand*{\filedir}[1]{{\normalfont\ttfamily #1}} +\DeclareRobustCommand*{\cntr}[1]{{\normalfont\ttfamily #1}} +\DeclareRobustCommand*{\command}[1]{% + {\texorpdfstring{\normalfont\ttfamily \char\escapechar}{\pdfbslash}#1}% +} +\newcommand*{\meta}[1]{\(\langle\textit{#1}\rangle\)} +\newcommand*{\strongemph}[1]{\textbf{#1}} +\newcommand*{\zerolistvertspaces}{% + \setlength{\parskip}{0pt}% + \setlength{\topsep}{\parskip}% + \setlength{\partopsep}{\parskip}% +} + +\newcommand*{\lcdp}{\packlass{letteracdp}} +\newcommand*{\acdp}{\packlass{articoletteracdp}} +\newcommand*{\hyre}{\packlass{hyperref}} +\newcommand*{\cdpa}{\packlass{cdpaddon}} +\newcommand*{\adic}{\packlass{lettcdpadi}} +\newcommand*{\adip}{\packlass{adiseal}} +\newcommand*{\babel}{\packlass{babel}} +\newcommand*{\cdpbabel}{\packlass{cdpbabel}} +\newcommand*{\Bundle}{C.D.P. Bundle} +\newcommand*{\oclh}{\opz{customletterhead}} +\newcommand*{\eclh}{\env{customletterhead}} +\newcommand*{\eclf}{\env{customletterfoot}} + +\makeatletter + +\newcounter{listing}[letter] +\renewcommand*\thelisting{\@arabic\c@listing} +\@ifdefinable\fps@listing{\def\fps@listing{tbp}} +\@ifdefinable\ftype@listing{\def\ftype@listing{4}} +\@ifdefinable\ext@listing{\def\ext@listing{lol}} +\@ifdefinable\fnum@listing{\def\fnum@listing{\listingname~\thelisting}} +\newenvironment*{listing} + {\@float{listing}} + {\end@float} +\newenvironment*{listing*} + {\@dblfloat{listing}} + {\end@dblfloat} +\newcommand*\listoflistings{% + \section*{\listlistingname \sectionmark\listlistingname}% + \if@loX@in@toc@ + \addcontentsline{toc}{section}{\protect\listlistingname}% + \fi + \@starttoc{lol}% +} +\@ifdefinable\l@listing{\let\l@listing\l@figure} +\newcommand*\listlistingname{List of listings} +\newcommand*\listingname{Listing} +\@ifdefinable\toclevel@listing{\def\toclevel@listing{\toclevel@figure}} +% Note that we use "\def" here, not "\let". + +\newcommand*\cleantop{% + \dimen@ \baselineskip + \advance \dimen@ -\topskip + \prevdepth \dimen@ +} +\newcommand*\cleanbot{% + \dimen@ \baselineskip + \advance \dimen@ -\topskip + \advance \dimen@ -\prevdepth + \vskip \dimen@ + \prevdepth \z@ +} +\newcommand*\cleanbotp{% + \vskip -\prevdepth + \prevdepth \z@ +} + +\makeatother + +\hfuzz = 0pt +\vfuzz = 0pt + + + + + + +\begin{document} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Letter no. 1 % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{letterhead}[Whom it may concern]{ + To whom may be concerned\\ + with writing letters with \LaTeX\\ + (and want them to bear a letterhead + of \emph{their own} choice!) +}[ + The \Bundle\ version 0.36. +] + +\opening{Dear friends:} + +This letter describes the new ``bells and whistles'' that have been made +available in version~0.36 of the \Bundle. This version is just a provisional +patch applied on what essentially remains ``fossil'' code, in need of a thorough +redesign; nonetheless, it does provide some long-awaited features, most +prominently the ability to modify, with reasonable ease, the letterhead produced +by the \env{letterhead} environment. + +The author wishes to thank Lorenzo Pantieri for having promoted, in his +excellent work +``\href{http://www.lorenzopantieri.net/LaTeX_files/Complementi.pdf} +{\emph{Complementi all'Arte di scrivere con \LaTeX}}'' (``Additions to The art +of writing with \LaTeX''), the use of the \lcdp\ document class, which is the +main component of the \Bundle. This letter (indirectly) uses the \acdp\ +document class. + + + +\tableofcontents +\listoflistings + + + +\setcounter{secnumdepth}{0} + +\section{Introduction} + +The \Bundle\ was essentially written between 1999 and 2000 (for an Italian +audience), and even at that time it contained code that was already deprecated; +even worse, its design was flawed since the beginning, because it had been +conceived for a specific and limited application (the letters of the C.D.P., +exactly), and was adapted for more general use only as an afterthought. + +A thorough redesign would therefore be needed; on the other hand, some users +have suggested, or asked for, improvements and additions, in particular for what +concerns the use of the bundle with other languages besides Italian (see +Section~\ref{S:Languages}), that can be implemented rather easily by means of +provisional patches. I~have already been deferring the introduction of these +comparatively harmless enhancements for five years, waiting for the right moment +to undertake the task of redesigning the bundle from scratch, but now I~have +resolved to simply patch up the existing version. + +The version herein presented, therefore, is far from being optimal: no serious +attempt has been made to remove ``fossil'' code, nor to bring it up to date with +modern \LaTeX\ usage. I~have removed, however, the \adip\ package and the +\adic\ document class, of which, probably, nobody besides me even remembers the +purpose. + +Though\marginpar{\hfill\strongemph{$*{*}*\;$WOW!!$\;*{*}*$}}, +% Yes, I know, I should use \textasteriskcentered... +\strongemph{good news} are coming for all those users who asked for a means to +\strongemph{customize the letterhead} produced by the \Bundle: a reasonably +viable method for doing so has been provided at +last!~\facesmile\facesmile\facesmile\space The method requires the use of the +\cdpa\ package, passing in the new option \oclh. You can specify the contents +of your custom head and foot by means of two new environments, called \eclh\ and +\eclf, which are similar, to a certain extent, to the \env{minipage} +environment. This should give you the maximum freedom in designing the +letterhead (having recourse to \env{picture}s and images, if you wish to), +whilst adopting an interface you are surely well familiar with. See +Section~\ref{S:Letterhead} for more information. + +Another nifty feature is the ability to draw a thin rule to guide your hand in +signing your letters: you ask for this behavior by passing the new +\opz{signaturerule} option to the \lcdp\ document class. See +Section~\ref{S:Options} for more information. + +Finally, some minor corrections of an aesthetic nature have also been brought +in, which are concisely discussed in Section~\ref{S:Adjustments}. + + + +\setcounter{secnumdepth}{2} + +\section{My own letterhead, at last!} +\label{S:Letterhead} + +One of the questions that users ask most frequenty about the \Bundle\ is perhaps +``How the hell can I~put \emph{my own} letterhead in the place of that silly +greenish thing?''; so, let's start with this one! + +%%%% +\begin{listing}[p] + \cleantop +\begin{verbatim} +\documentclass + [twoside,boldsubject,italicsignature,shortindent,signaturerule] + {letteracdp}[2018/02/08] +\usepackage[T1]{fontenc} +\usepackage[english]{cdpbabel} +\usepackage[customletterhead]{cdpaddon}[2018/02/08] +\usepackage{url,lipsum} + +\address{ + Gustavo \textsc{Mezzetti}\\ + \protect\url{gustavo.mezzetti@istruzione.it} +} +\signature{Gustavo Mezzetti} +\date{February~8, 2018} +\place{Padova} + + + +% Definition of your letterhead occurs here: + +\begin{customletterhead}{\textwidth} + \centering \Huge + My Huge Centered Letterhead +\end{customletterhead} +\begin{customletterfoot}{\textwidth} + \raggedleft \tiny + \ruleacrossheadorfoot + My (almost unreadable) small print\\ + flushed against the right margin. +\end{customletterfoot} + + + +\begin{document} + +\begin{foldedletterhead}[Whom it may concern] + {To whom it may concern} + [My own letterhead, at last!] + +\makepresentation +\maketopdate\relax + +\lipsum[1-2] + +\makesignature + +\end{foldedletterhead} + +\end{document} +\end{verbatim} + \caption{How to customize the letterhead} + \label{lis:customletter} + \cleanbotp +\end{listing} +%%%% + + + +\paragraph{For the impatient} +\label{P:LetterHeadImpatient} + +Listing~\ref{lis:customletter} explains what you have to do, in order to define +a simple customized letterhead, by means of a practical example. It shows the +complete contents of the \LaTeX\ source file: by mimicking this code, you should +easily obtain what suits your needs. Let us skim briefly through it. + +First of all, note that we load the \cdpa\ package, with the \oclh\ option (as +well as a few other useful packages that, of course, have nothing to do with +letterheads). Then come the usual declarations concerning the sender, the date, +etc. + +Still in the preamble---as we will soon see, we could do this in other places +too, but also the preamble is absolutley OK\@---we start a \eclh\ environment. +This environment has the following synopsis: +% +\begin{flushleft} + \verb|\begin{customletterhead}{|\meta{wdth}\verb|}|\quad + \meta{text}\quad + \verb|\end{customletterhead}| +\end{flushleft} +% +As you can see, it resembles a \env{minipage} environment, except that you +cannot specify the vertical alignment of the material contained therein (because +you don't need to: the mini page you are producing has not to be aligned with +any nearby constructs); and indeed, it creates a ``mini page'' of width +\meta{wdth} containing the \meta{text} you specify. This \meta{text} should be +your letterhead: for example, the code shown here will produce a letterhead, +centered between the margins of the body of the main text, which reads ``My Huge +Centered Letterhead''---and actually looks like that!~\facesmile + +Next, we do the same for the footer, using the \eclf\ environment, which is +syntactically identical to \eclh: +% +\begin{flushleft} + \verb|\begin{customletterfoot}{|\meta{wdth}\verb|}|\quad + \meta{text}\quad + \verb|\end{customletterfoot}| +\end{flushleft} +% +By examining the code, you can easily tell that, this time, the footer will be +aligned against the right margin (\verb|\raggedleft|) and set in \verb|\tiny| +type---which is what the text itself says, after all. But what does the +\verb|\ruleacrossheadorfoot| command do? Well, it simply draws a horizontal +rule, which\ldots\ yes, extends across the whole footer. You could use one of +the standard commands for producing rules, here (\LaTeX's \verb|\rule|, plain +\TeX's \verb|\hrule|), but this one has been specifically crafted for use inside +the two abovementioned environments; it consumes no vertical space, and does not +alter the distance (\verb|\baselinekip|) between the baselines of adjacent lines +of text. Moreover, it can take optional arguments to modify its appearance, as +we shall see \hyperref[P:FinePoints]{in a minute}. + +You can try out this example by yourself (I~advise you to do so), but for your +convenience the output it typesets is reproduced in a separate letter that you +find enclosed with this one, just after it in this same file. If you have a +look at the result, you will be glad to note that the thin sign that the +\env{foldedletterhead} environment is supposed to draw along the right edge of +the sheet, to mark the exact point where it should be folded, is drawn also when +the original letterhead is replaced by yours. This is just fine (but see also +Paragraph~\ref{P:FinePoints}). + + + +\paragraph{A deeper look} +\label{P:Deeper} + +As you, certainly, have already guessed, the two environments introduced +\hyperref[P:LetterHeadImpatient]{above} simply save their contents into a box; +the \oclh\ option causes these two boxes to be used in place of the header and +the footer, respectively, that had been originally defined by the \lcdp\ +document class. More precisely, when the \oclh\ option is in force, a copy of +those boxes is centered, with first-order infinite glue, in the header (resp., +in the footer) line, pretending that they have zero height and depth, with the +bottom (resp., top) margin of the box defined by \eclh\ (resp., \eclf) aligned +along the baseline of the header (resp., of the footer) line of the page. Note +that the \cdpa\ package defines the \eclh\ and \eclf\ environments, and their +associated storage boxes, even if you do \emph{not} specify the \oclh\ option: +this option simply dictates whether or not those two boxes should be \emph{used} +for the letterhead. This is good, since it means that the presence or absence +of the \oclh\ option will not affect the \emph{syntax} of your document, but +only the appearance of the typeset output, which is how options should behave. + + + +\paragraph{The letterhead is defined locally} +\label{P:Local} + +As we indicated in Paragraph~\ref{P:LetterHeadImpatient}, the output produced by +listing~\ref{lis:customletter} is shown in a separate letter enclosed after this +one; you may be wondering how I~managed to produce two (or, actually, several) +letters with different letterheads in a single \LaTeX\ run (yes, it \emph{was} a +single run). Well, I~am the author of the package, and I~could have played some +nasty trick; but actually I~didn't need to, because the \eclh\ and \eclf\ +environments save their contents in their associated storage boxes +\emph{locally}. This means that if they are postioned \emph{within} the +environment that produces a certain letter (say, \emph{e.g.}, +\env{foldedletterhead}), the header and the footer will be changed \emph{only} +for that letter; for subsequent ones, the former header and footer will be +reinstated. Of course, the redefinitions must occur before the \verb|\opening| +command (or anything else that typesets text). + +%%%% +\begin{listing}[tbp] + \cleantop +\begin{verbatim} +\begin{foldedletterhead}[Someone Else]{ + To Someone Else\\ + Some other place\\ + Some other city +}[ + Another letterhead. +] + +\begin{customletterhead}{\textwidth} + \raggedright \Huge + A different head +\end{customletterhead} +\begin{customletterfoot}{\textwidth} + \centering + \ruleacrossheadorfoot + A different foot +\end{customletterfoot} + +\opening{Dear Someone,} + +\lipsum[1-2] + +\closing{Best regards.} + +\end{foldedletterhead} +\end{verbatim} + \caption{How to customize the letterhead for a single letter} + \label{lis:customletterlocal} + \cleanbot +\end{listing} +%%%% + +This point is further illustrated in listing~\ref{lis:customletterlocal}, which +shows how to customize the letterhead for just a single letter. This code has +been copied and then pasted toward the end of this file, to show, in a third, +independent letter, the output it produces. Actually, for this I~\emph{did} +have to play some tricks not included in the code of the listing, in order to +``decolor'' the thin sign that marks the point where the sheet is to be folded, +and to reset the value of the \verb|\longindentation| parameter; but both these +changes can be made ``locally'' too. There is a slight complication deriving +from the fact that, in order for a change to \verb|\longindentation| to turn +effective in a given ``letter-making'' environment, the change must occur +\emph{outside} the ``letter-making'' environment itself: this forced me to +supply an additional level of grouping. + + + +\paragraph{Your own classes for your own letterhead} +\label{P:Classes} + +If you know \LaTeX\ well, there will probably be one last point that still +bothers you. We said, in Paragraph~\ref{P:LetterHeadImpatient}, that the \eclh\ +and \eclf\ environments can very well be embedded in the preamble, without +causing any trouble: how come the typesetting that occurs inside these +environments does not trigger the ``Missing \verb|\begin{document}|'' error? +The answer is simply that these two environments have been specifically made +exempt from this error, precisely in order to permit you to include them in the +preamble too; and this, in turn, has been done because the concept of +``preamble'' also covers the code included in custom classes that you write +yourself. + +This means that you can write your own custom classes that produce your own +custom letterhead, which is nice.~\facesmile\space We use the plural, because +you will surely want to define customized versions of \emph{both} the \lcdp\ +class \emph{and} the \acdp\ class; the best way to do so is to write three +distinct files, as we are now going to explain. + +%%%% +\begin{listing}[p] + \cleantop +\begin{verbatim} +\NeedsTeXFormat{LaTeX2e} % LaTeX2e is required! +\ProvidesClass{myletter} + [2018/02/08 v0.03 (development)] +\LoadClassWithOptions{letteracdp}[2018/02/08] +\input{mylogo.def} +\endinput +\end{verbatim} + \caption{Contents of the\/ \filedir{myletter.cls} file} + \label{lis:myletter} +\end{listing} +%%%% + +%%%% +\begin{listing}[p] +\begin{verbatim} +\NeedsTeXFormat{LaTeX2e} % LaTeX2e is required! +\ProvidesClass{myarticletter} + [2018/02/08 v0.03 (development)] +\LoadClassWithOptions{articoletteracdp}[2018/02/08] +\input{mylogo.def} +\endinput +\end{verbatim} + \caption{Contents of the\/ \filedir{myarticletter.cls} file} + \label{lis:myarticletter} +\end{listing} +%%%% + +%%%% +\begin{listing}[p] + \cleantop +\begin{verbatim} +\ProvidesFile{mylogo.def}[2018/02/08 v0.03 (development)] + +\RequirePackage[customletterhead]{cdpaddon}[2018/02/08] + +\begin{customletterhead}{\textwidth} + \centering \Huge + My Huge Centered Letterhead +\end{customletterhead} +\begin{customletterfoot}{\textwidth} + \raggedleft \tiny + \ruleacrossheadorfoot + My (almost unreadable) small print\\ + flushed against the right margin. +\end{customletterfoot} + +\endinput +\end{verbatim} + \caption{Contents of the\/ \filedir{mylogo.def} file} + \label{lis:mylogo} + \cleanbotp +\end{listing} +%%%% + +So, let us suppose that you want to define two custom classes, named +\packlass{myletter} and \packlass{myarticletter}, respectively, that both +produce the same letterhead as the one we saw in listing~\ref{lis:customletter}. +For this, you write three files called \filedir{myletter.cls}, +\filedir{myarticletter.cls}, and \filedir{mylogo.def}, whose contents are +reproduced in listings \ref{lis:myletter}, \ref{lis:myarticletter}, +and~\ref{lis:mylogo}, respectively. As you can see, the purpose of +\filedir{myletter.cls}\slash\filedir{myarticletter.cls} is just to supply ``glue +code'' toward (the \lcdp\slash\acdp\ classes and) the \filedir{mylogo.def} file, +which is the single place where the redefinition of the letterhead occurs. + +%%%% +\begin{listing}[tbp] + \cleantop +\begin{verbatim} +\ProvidesFile{mylogo.def}[2018/02/08 v0.03 (development)] + +\RequirePackage[customletterhead]{cdpaddon}[2018/02/08] +\RequirePackage{color} + +\DeclareFontFamily{T1}{my@calli}{} +\DeclareFontShape{T1}{my@calli}{m}{n}{<->s*[1.44]callig15}{} + +\definecolor{my@lh@color}{rgb}{0,.4,.4} + +\begin{customletterhead}{\textwidth} + \color{my@lh@color} + \fontsize{17}{21}\usefont{T1}{my@calli}{m}{n} + \leftline{% + \setlength{\unitlength}{1cm}% + \begin{picture}(0,0) % you can use \includegraphics instead + \put(-2,0){\framebox(1.8,1.2){% + \normalsize\ttfamily My Logo% + }} + \end{picture}% + My Company'\,s Letterhead\enspace + \hrulefill\hspace{-2cm}% + } +\end{customletterhead} + +\settowidth{\longindentation}{% + \fontsize{17}{21}\usefont{T1}{my@calli}{m}{n}% + My Company'\,s Letterhead\enspace +} + +\begin{customletterfoot}{\textwidth} + \color{my@lh@color} + \fontsize{5}{6}\usefont{T1}{pplx}{m}{n} + \raggedleft + \ruleacrossheadorfoot[-2cm] + My (almost unreadable) \textsc{small print},\\ + aligned along the \textit{right} edge\\ + of the main text. +\end{customletterfoot} + +\renewcommand*{\foldingtagrule}{% + \color{my@lh@color}\CDPFactoryFoldingTagRule +} + +\endinput +\end{verbatim} + \caption{Contents of a more elaborated\/ \filedir{mylogo.def} file} + \label{lis:mylogo-more} + \cleanbotp +\end{listing} +%%%% + +Listing~\ref{lis:mylogo-more} shows a more elaborate example of a +\filedir{mylogo.def} file to go together with the same two class files shown in +listings~\ref{lis:myletter} and~\ref{lis:myarticletter}. Here we have added a +touch of superior style not only by employing color and some fancy fonts, but +also by having recourse to the fine adjustments described in +\hyperref[P:FinePoints]{the next paragraph} (because of the fonts, this example +might not work on all \TeX\ installations). The letterhead defined by this +example is exactly the same as the one this letter itself bears on its first +page. + + + +\paragraph{Fine points of style} +\label{P:FinePoints} + +The first fine point of style that should be noted in +listing~\ref{lis:mylogo-more} is that the \verb|\longindentation| rigid length +is set equal to the width of the writing of the letterhead (``My Company's +Letterhead''). Since the ``letter-making'' environments indent the address of +the addressee precisely by the amount of \verb|\longindentation|, this will +cause such addresses to be neatly aligned with a visually relevant element of +the design of the letterhead (the rule on the right); you should do the same +with your own letterhead, if it contains a similarly relevant component. If you +do not yourself assign it a value, \verb|\longindentation| is set to half the +value of \verb|\textwidth|. + +The second fine point to note is that the sign that marks the fold is drawn in +the same color as the rest of the letterhead. The \Bundle\ computes the +vertical position of this sign, but to actually draw it, it calls the +\verb|\foldingtagrule| command, which the end user can redefine. This command +works similarly to \verb|\footnoterule|, and, like the latter, should take up no +vertical space. Its ``factory'' definition is backed up in the +\verb|\CDPFactoryFoldingTagRule| command (which should \emph{never} be +redefined, of course); as you can see, in listing~\ref{lis:mylogo-more} we +redefine \verb|\foldingtagrule| to simply invoke the factory default after +setting the appropriate color. + +The third, and last, point to note is that the \verb|\ruleacrossheadorfoot| +command can get an optional argument in which an inset from the text margins can +be specified; a \emph{negative} inset, like here, causes the rule to protrude +into the margins. A second optional argument let you indicate different insets +for the left and the right margin, in this order. Note that these arguments +\emph{must} contain \emph{rigid} lengths. + + + +\section{Other languages besides Italian} +\label{S:Languages} + +Like many other document classes and packages, the classes of the \Bundle\ mark +up some portions of the output they produce by adding certain descriptive +strings, that, by default, are written in Italian. For example, when you have +requested the \sty{headings} page style, the name of the addressee, which is +printed atop pages, is preceded by the string ``\emph{A:}'' (=~``To:''); +similarly, when you issue the command \verb|\tableofcontents| in a documents +that adopts the \acdp\ document class, the table it produces is titled +``\emph{Sommario}'' (=~``Contents''); and so on. + +When the \Bundle\ was used only by the members of the \emph{Coordinamento}, the +Italian defaults it provided for those captions were, of course, quite adequate; +as long as its use remained confined to the Italian \LaTeX\ community, they were +still acceptable; but now, questions about how to adapt the \Bundle\ to foreign +languages have begun to be asked in some Internet forums by users around the +world, pushing me to reconsider the matter. + +Of course, the Italian captions are not (nor they have ever been) ``hard-wired'' +in the code: they are defined by macros that follow the usual naming conventions +(\verb|\headtoname|, \verb|\contentsname|, and so on). Thus, it's only a matter +of redefining these ``hooks'' to suit the target language. However, it would be +desirable to have some standard definitions set for each language; but +unfortunately, this cannot be attained just by loading the \babel\ package, for +two reasons. In the first place, there are some captions that are specific to +the \Bundle\ and are therefore not cared for by the \babel\ package: for +example, the (optional) subject of a letter is preceded by the expansion of +\verb|\subjectname| (which is ``\emph{Oggetto:}'' in Italian and should be +``Subject:'' in English), a hook the \babel\ package knows nothing about. +Secondarily, even for those hooks that are standard, sometimes the definition +provided by the \babel\ package seems (at least to me) not adequate for a +letter; in particular, alas, if you load \babel\ with the \opz{italian} option +(as you ordinarily do when you are writing in Italian), it actually +\emph{cancels} the definitions preset by the \Bundle, substituting for them +strings that I~deem more suitable for articles or books, for which they are +indeed intended, than for letters (for example, \( \verb|\contentsname| \to +\mbox{``\emph{Indice}''} \) in \babel, instead of \( \verb|\contentsname| \to +\mbox{``\emph{Sommario}''} \), as defined by the \Bundle; \( \verb|\refname| \to +\mbox{``\emph{Riferimenti bibliografici}''} \) in \babel, instead of \( +\verb|\refname| \to \mbox{``\emph{Testi citati}''} \), as I~prefer). + +To supply a \emph{provisional} solution to this problem, a new component has +been added to the \Bundle: the \cdpbabel\ package. The idea is that, when using +one of the document classes of the \Bundle, you load the \cdpbabel\ package +\emph{instead of} \babel, and let the former load the latter on your behalf; in +this way, you offer it a chance to augment, or amend, the definitions made by +\babel\ itself. This solution might seem inelegant (and admittedly it is), but +the problem is more subtle than it may look at first sight, involving also +compatibility issues with existing documents, and I~need to further investigate +it. It is hoped that a more satisfactory scheme will be found for future +releases. + +In practice, all the \cdpbabel\ package has to do is (to load \babel\ and) to +issue an \verb|\addto{\captions|\meta{language}\verb|}{|\ldots\verb|}| command +(or better, one such command for each required \meta{language}), with ``\ldots'' +replaced by the appropriate redefinitions; the list, and the details, of such +redefintions are of course dictated by \meta{language}, so \cdpbabel\ takes them +from what we will call a ``C.D.P. language definition file''. This is a text +file that, by convention, must be named +\filedir{cdpnames}\meta{language}\filedir{.ldf}, where \meta{language} is the +name of the corresponding language option (for example, +% +\begin{verbatim} + \usepackage[english,italian]{cdpbabel} +\end{verbatim} +% +invokes both \filedir{cdpnamesenglish.ldf} and \filedir{cdpnamesitalian.ldf}, in +this order), and which must adhere to the format shown in +listing~\ref{lis:cdpnames}. + +%%%% +\begin{listing}[tbp] + \cleantop + \zerolistvertspaces + \begin{flushleft} + \verb|\ProvidesFile{cdpnames|\meta{language}\verb|.ldf}[|% + \meta{date \& version}\verb|]| + \end{flushleft} +\begin{verbatim} + +\def\@cdpbabel@letter@names{% +\end{verbatim} + \begin{flushleft} + \verb| \def\subjectname {|\meta{Subject:}\verb|}%|\\ + \verb| \def\registeredname {|\meta{Registered}\verb|}%|\\ + \verb| \def\registeredRRname {|\meta{Registered R.R.}\verb|}%|\\ + \verb| \def\andccname {|\meta{cc (in addresses)}\verb|}%|\\ + \verb| \def\ccname {|\meta{cc (at end of letters)}\verb|}%|\\ + \verb| \def\enclname {|\meta{Encl:}\verb|}%|\\ + \verb| \def\PSname {|\meta{P.S.:}\verb|}%|\\ + \verb| \def\headtoname {|\meta{To:}\verb|}%|\\ + \verb| \def\lettername {|\meta{Letter}\verb|}%| + \end{flushleft} +\begin{verbatim} + % More captions could be added in the future. +} +\def\@cdpbabel@artlet@names{% +\end{verbatim} + \begin{flushleft} + \verb| \def\contentsname {|\meta{Contents}\verb|}%|\\ + \verb| \def\listfigurename {|\meta{List of figures}\verb|}%|\\ + \verb| \def\listtablename {|\meta{List of tables}\verb|}%|\\ + \verb| \def\refname {|\meta{References}\verb|}%|\\ + \verb| \def\indexname {|\meta{Index}\verb|}%|\\ + \verb| \def\figurename {|\meta{Figure}\verb|}%|\\ + \verb| \def\tablename {|\meta{Table}\verb|}%|\\ + \end{flushleft} +\begin{verbatim} + % More captions could be added in the future. +} + +\endinput +\end{verbatim} + \caption{Contents of a + \filedir{cdpnames}\protect\meta{language}\filedir{.ldf} file} + \label{lis:cdpnames} + \cleanbot +\end{listing} +%%%% + +As you can see, a ``C.D.P. language definition file'' must define two macros, +named \verb|\@cdpbabel@letter@names| and \verb|\@cdpbabel@artlet@names|, +respectively: in the first you put the redefinitions that should be added to +\verb|\captions|\meta{language} when only the \lcdp\ class has been loaded; in +the second you list the additional redefinitions that apply if the \acdp\ class +is loaded too; and that's all. Listing~\ref{lis:cdpnames} details exactly what +hooks need to be redefined when switching to another language; in principle, you +must supply a suitable redefinition for each of them, but of course, when a hook +is already defined by the \babel\ package in a way that you think suits, you may +omit it from your list (or, perhaps better, comment it out). + +At present, the \Bundle\ ships with \emph{just two} such definition files +included: they are \filedir{cdpnamesitalian.ldf}, for Italian, and +\filedir{cdpnamesenglish.ldf}, for English. For all other languages, you'll +have to write and install appropriate files yourself. Needless to say, you are +most welcome if, after doing so, you want to contribute your work for inclusion +in future releases of the \Bundle. Look at these two provided files, and in +particular at \filedir{cdpnamesenglish.ldf}, for inspiration about the intended +meaning of the captions (which sould be quite obvious, however). + + + +\section{The new \opz{signaturerule} option} +\label{S:Options} + +Some users have asked for a means to add a thin rule in signatures, just above +the signer's name, to mark the place when the handwritten signature should be +put. Although, in my opinion, such usage is highly questionable (only pupils in +primary school need rules to guide their writing!\@), nevertheless it has now +been supported. You request this behavior by passing the new +\opz{signaturerule} option to the \lcdp\ document class. Indeed, the decision +whether to draw the rule or not is a matter of style and, as such, should be +made, once for all, for the whole document. + +Even if you do specify the \opz{signaturerule} option, the rule will \emph{not} +be drawn inside a \env{signatureenv*} environment, because this environment is +meant exactly to be used when you are not going to sign the letter by hand. +This applies also to the \mbox{$*$-form} of the \verb|\closing| and of the +\verb|\makesignature| commands, which are used for the same purpose and which +invoke, directly or indirectly, precisely the \env{signatureenv*} environment. + +To produce the rule, the \lcdp\ class calls the \verb|\signaturerule| command, +which you can customize, if you want to, to suit your needs. This command is +called in \LaTeX's ``LR~mode'' (or, to be more precise, in \TeX's ``restricted +horizontal mode''), and it should construct a horizontal box containing the +rule, aligned along the baseline of the box itself; for example, +% +\begin{verbatim} + \renewcommand*{\signaturerule}{% + \makebox[5cm]{\hrulefill} + } +\end{verbatim} +% +could be a typical (re)definition. The default definition of +\verb|\signaturerule| is actually like this one, except that it draws a thinner +rule, and that it allows you to specify the horizontal length of the rule +(\emph{i.e.}, its width). Specifically, the \verb|\signaturerulewidth| +parameter, which is a rigid length, indicates the width of the rule produced by +the default definition of \verb|\signaturerule|. Should you ever redefine the +latter, you should honor this parameter in your redefinition, \emph{e.g.}, +% +\begin{verbatim} + \renewcommand*{\signaturerule}{% + \makebox[\signaturerulewidth]{\hrulefill} + } +\end{verbatim} +% +But I~think you will hardly need this: most users will content themselves with +changing the width of the rule. + +For completeness' sake, the \opz{nosignaturerule} option is defined too: it is +the default, and it does not draw the rule. + + + +\section{Aesthetic adjustments} +\label{S:Adjustments} + +The \verb|\cc| and \verb|\encl| command have been reimplemented in such a way to +include the ``correct'' interline glue above and below their output. Remember +that the output produced by these command is kept on the same page as the +signature; this means, in particular, that the \verb|\encl| command should be +used only for very short lists of enclosures (one item or two). For longer +lists, utilize the \env{enclosures} environment, which mildly encourages a page +break above itself. + + + +\section{A sample letter} +\label{S:Sample} + +Listing~\ref{lis:sample} shows a sample input file that illustrates the features +covered in this letter: it uses the \packlass{myletter} sample class defined in +Paragraph~\ref{P:Classes}, with the letterhead drawn by the ``more elaborate'' +version of the \filedir{mylogo.def} file that is reproduced in +listing~\ref{lis:mylogo-more}, the \opz{signaturerule} option described in +Section~\ref{S:Options}, and the \verb|\encl| command touched upon in +Section~\ref{S:Adjustments}. As before, the output produced by this example is +shown in a separate letter at the end of this file. + +%%%% +\begin{listing}[tbp] + \cleantop +\begin{verbatim} +\documentclass + [twoside,boldsubject,italicsignature,shortindent,signaturerule] + {myletter} +\usepackage[T1]{fontenc} +\usepackage[english]{cdpbabel} +\usepackage{url,lipsum} + +\name{Michael Youngster Name} +\address{ + Mike Y. \textsc{Name}\\ + Sails Manager\\ + \protect\url{m.y.name@my.company.com} +} +\signature{Mike Y. Name\\Sails Manager} +\date{February~8, 2018} +\place{Mamina del Rey} + +\hfuzz = 0pt +\vfuzz = 0pt + + + +\begin{document} + +\begin{foldedletterhead}[R.~J.~Drofnats]{ + Revinu~J. \textsc{Drofnats}\\ + Department of Farm Ecology\\ + University of St.\,Anford\\ + Haga Alto, CA~94321 +}[ + Our new sails. +] + +\opening{Dear affectionate customer:} + +we are delighted to have the opportunity of presenting our new +collection of sails for the incoming yachting season\ldots + +\lipsum[1-2] + +\closing{Sincerely,} + +\encl{2018 Catalogue\\Invitation card} + +\end{foldedletterhead} + +\end{document} +\end{verbatim} + \caption{A sample input file that uses the new features} + \label{lis:sample} + \cleanbotp +\end{listing} +%%%% + + + +\epilogue + +That, more or less, is all we had to say about version~0.36 of the \Bundle. For +further information, write to the author: his e-mail address is on the first +page. + +\closing*{Best regards.} + +\PS +Please note that \packlass{myletter} also used to be (a great many years ago) +the obsolete name of the \packlass{akletter} document class. Instructing you to +create a custom class by that name shouldn't cause you any trouble in +2018~\facesmile, but I~want to inform you all the same of the potential name +conflict. + +\end{letterhead} + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Letter no. 2 % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begingroup + +\date{February~8, 2018} + +\begin{customletterhead}{\textwidth} + \centering \Huge + My Huge Centered Letterhead +\end{customletterhead} +\begin{customletterfoot}{\textwidth} + \raggedleft \tiny + \ruleacrossheadorfoot + My (almost unreadable) small print\\ + flushed against the right margin. +\end{customletterfoot} +\setlength\longindentation{.5\textwidth} +\let \foldingtagrule = \CDPFactoryFoldingTagRule + +\begin{foldedletterhead}[Whom it may concern] + {To whom it may concern} + [My own letterhead, at last!] + +\makepresentation +\maketopdate\relax + +\lipsum[1-2] + +\makesignature + +\end{foldedletterhead} + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Letter no. 3 % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{foldedletterhead}[Someone Else]{ + To Someone Else\\ + Some other place\\ + Some other city +}[ + Another letterhead. +] + +\begin{customletterhead}{\textwidth} + \raggedright \Huge + A different head +\end{customletterhead} +\begin{customletterfoot}{\textwidth} + \centering + \ruleacrossheadorfoot + A different foot +\end{customletterfoot} + +\opening{Dear Someone,} + +\lipsum[1-2] + +\closing{Best regards.} + +\end{foldedletterhead} + +\endgroup + + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Letter no. 3 % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{foldedletterhead}[R.~J.~Drofnats]{ + Revinu~J. \textsc{Drofnats}\\ + Department of Farm Ecology\\ + University of St.\,Anford\\ + Haga Alto, CA~94321 +}[ + Our new sails. +] + +\name{Michael Youngster Name} +\address{ + Mike Y. \textsc{Name}\\ + Sails Manager\\ + \protect\url{m.y.name@my.company.com} +} +\signature{Mike Y. Name\\Sails Manager} +\date{February~8, 2018} +\place{Mamina del Rey} + +\opening{Dear affectionate customer:} + +we are delighted to have the opportunity of presenting our new collection of +sails for the incoming yachting season\ldots + +\lipsum[1-2] + +\closing{Sincerely,} + +\encl{2018 Catalogue\\Invitation card} + +\end{foldedletterhead} + + +\end{document} diff --git a/macros/latex/contrib/cdpbundl/cdpbundl-doc.pdf b/macros/latex/contrib/cdpbundl/cdpbundl-doc.pdf Binary files differnew file mode 100644 index 0000000000..de219c9602 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/cdpbundl-doc.pdf diff --git a/macros/latex/contrib/cdpbundl/cdpbundl.dtx b/macros/latex/contrib/cdpbundl/cdpbundl.dtx new file mode 100644 index 0000000000..82ac568da6 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/cdpbundl.dtx @@ -0,0 +1,7746 @@ +% \iffalse +% (This is a META-COMMENT.) +% +% This is file `cdpbundl.dtx'. +% +% This file is part of a work named "C.D.P. Bundle". +% +% Copyright (C) 1999-2018 by Gustavo MEZZETTI +% <gustavo.mezzetti@istruzione.it>. +% +% The C.D.P. Bundle may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% The C.D.P. Bundle has the LPPL maintenance status +% "author-maintained". +% +% The file `manifest.txt' that comes along with this file specifies +% what the C.D.P. Bundle consists of; more precisely, it explains how +% the locutions "Work" and "Compiled Work", used in the LaTeX Project +% Public License, are to be interpreted in the case of this work. +% +% Note that the distribution of this file alone is "distribution of +% only part of the Work" in the sense of the LaTeX Project Public +% License, and is not allowed. +% +% (End of the META-COMMENT.) +% \fi +% +% \def\filename{cdpbundl.dtx} +% \def\fileversion{0.36d} +% \def\filedate{2018/02/08} +% \def\docdate {2018/02/08} +% \def\doclongdate{February~8, 2018} +% +% \CheckSum{4989} +% +% \DeclareRobustCommand*{\Bundle}{C.D.P. Bundle} +% +% \changes{0.30}{2001 Jul 01}{First release of the \Bundle.} +% \changes{0.31}{2001 Dec 01}{Added support for the \protect\opz{usePS} +% option in the \protect\packlass{\protect\cdpaddon} package.} +% \changes{0.32}{2002 Jul 01}{Removed support for the \protect\opz{usePS} +% option in the \protect\packlass{\protect\cdpaddon} package.} +% \changes{0.33}{2005 Jan 01}{Reorganized code of the +% \protect\packlass{\protect\articoletteracdp} class and of the +% \protect\packlass{\protect\cdpaddon} package to make it compatible +% with the \protect\packlass{\protect\HyperRef} package.} +% \changes{0.34}{2006 Jan 01}{Improved interaction with the +% \protect\packlass{\protect\HyperRef} package.} +% \changes{0.34}{2006 Jan 01}{Corrected positioning of floats +% in float pages.} +% \changes{0.34}{2006 Jan 01}{Added \texttt{\protect\bslash place} command.} +% \changes{0.35}{About 2013}{This version was never publicly released, but some +% of the changes listed below for vers.~0.36 were actually introduced in this +% version.} +% \changes{0.36}{2015 Feb 08}{Added \texttt{\protect\bslash OpeningSequence} +% command and related macros, in part.\ the \texttt{\protect\bslash +% ChosenMakeOpening} hook.} +% \changes{0.36}{2015 Feb 08}{Added \texttt{\protect\bslash ClosingSequence} +% command and related macros, in particular \texttt{\protect\bslash +% ChosenMakeClosing} and \texttt{\protect\bslash ChosenMakeSignature}.} +% \changes{0.36}{2015 Feb 08}{Eventually added functionality to the +% \protect\packlass{\protect\cdpaddon} package to support user-defined +% letterheads.} +% \changes{0.36}{2015 Feb 08}{Added \protect\relax the +% \protect\opz{signaturerule} option, and its related stuff (the +% \texttt{\protect\bslash signaturerule} command, the \texttt{\protect\bslash +% signaturerulewidth} parameter), to support rules that mark where to sign by +% hand.} +% \changes{0.36}{2015 Feb 08}{Delegated to a new command +% (\texttt{\protect\bslash foldingtagrule}) the task of drawing the sign that +% shows where the sheet is to be folded.} +% \changes{0.36}{2015 Feb 08}{Removed the \protect\packlass{\protect\adiseal} +% package and the \protect\packlass{\protect\lettcdpadi} document class.} +% \changes{0.36}{2015 Feb 08}{Tidied up in several points the code of the +% \protect\packlass{\protect\cdpaddon} package.} +% \changes{0.36}{2015 Feb 08}{Added \protect\packlass{\protect\cdpbabel} +% package and related language definition files for English and Italian.} +% +%% \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 \~} +% +% \MakeShortVerb{\"} +% \DeleteShortVerb{\|} +% +% \DoNotIndex{\begin,\end,\def,\let,\else,\fi,\@ifdefinable,\@empty} +% \DoNotIndex{\newcommand,\renewcommand} +% \DoNotIndex{\newenvironment,\renewenvironment} +% \DoNotIndex{\z@,\z@skip,\p@,\@ne,\tw@,\thr@@,\@m,\@M,\m@ne} +% \DoNotIndex{\setlength,\setcounter,\addtolength} +% \DoNotIndex{\expandafter,\do,\relax,\advance,\multiply,\divide} +% \DoNotIndex{\DeclareOption,\ExecuteOptions,\ProcessOptions} +% \DoNotIndex{\",\.} +% +% \IndexPrologue{ +% \section{\indexname} +% Numbers in italics refer to the page where the corresponding entry +% is described, the ones underlined to the code line of the +% definition, the rest to the code lines where the entry is used. +% } +% \setcounter{IndexColumns}{2} +% +% \GlossaryPrologue{\section{Change History}} +% \let \GlossaryParms = \IndexParms +% +% \setcounter{StandardModuleDepth}{1} +% +% \newcommand*{\DS}{\textsf{DocStrip}} +% \renewcommand*{\partname}{Part} +% \newcommand*{\cdpbundl}{cdpbundl} +% \newcommand*{\letteracdp}{letteracdp} +% \newcommand*{\articoletteracdp}{articoletteracdp} +% \newcommand*{\adiseal}{adiseal} +% \newcommand*{\lettcdpadi}{lettcdpadi} +% \newcommand*{\cdpaddon}{cdpaddon} +% \newcommand*{\cdpbabel}{cdpbabel} +% \newcommand*{\babel}{babel} +% \newcommand*{\HyperRef}{hyperref} +% \newcommand*{\pictee}{pict2e} +% \newcommand*{\epsfig}{epsfig} +% \newcommand*{\cdpnamesenglish}{cdpnamesenglish.ldf} +% \newcommand*{\cdpnamesitalian}{cdpnamesitalian.ldf} +% \newcommand*{\example}{cdpshues-example.def} +% \newcommand*{\epson}{epson-stylus-740.def} +% \newcommand*{\hplj}{hp-laserjet-4500.def} +% \newcommand*{\cdpshues}{cdpshues.cfg} +% \newcommand*{\textoken}[1]{\(\langle\mbox{\normalfont #1}\rangle\)} +% +% \makeatletter +% +% \newcounter{paramlist} +% \renewcommand*{\theparamlist}{^^A +% \ifnum \value{paramlist}>\z@ +% \ifnum \value{paramlist}<10 +% \arabic{paramlist}^^A +% \else +% \@ctrerr +% \fi +% \fi +% } +% \newenvironment*{paramlist}{^^A +% \setcounter{paramlist}\z@ +% \@beginparpenalty \@M \relax +% \setlength\topsep{\z@}^^A +% \tabbing +% \(\mbox{\#0}\leftarrow {\,}\)\=\kill +% }{^^A +% \endtabbing +% } +% \newcommand*{\param}{^^A +% \stepcounter{paramlist}^^A +% \(\mbox{\#\theparamlist}\leftarrow{}\)\>^^A +% } +% \newcommand*{\myspecialindex}[2] +% {\special@index{#1\actualchar#2\encapchar main}} +% +% \makeatother +% +% \newcommand*{\counterindex}[1]{\myspecialindex{#1}{{\string\ttfamily +% \space #1} (counter)}\index{counters:\levelchar{\protect\ttfamily +% #1}\encapchar usage}} +% \newcommand*{\optuseindex}[1]{\SortIndex{#1}{\protect\opz{#1}^^A +% (option)\encapchar usage}\index{options:\levelchar +% \protect\opz{#1}\encapchar usage}} +% \newcommand*{\opz}[1]{{\normalfont\ttfamily #1}} +% \newcommand*{\iopz}[1]{$\mbox{\opz{#1}}\optuseindex{#1}} +% \newcommand*{\eopz}[1]{\mathbin{|}\mbox{\opz{#1}}\optuseindex{#1}} +% \newcommand*{\fopz}{$} +% \newcommand*{\packlass}[1]{{\normalfont\sffamily #1}} +% \newcommand*{\filedir}[1]{{\normalfont\ttfamily #1}} +% \newcommand*{\env}[1]{{\normalfont\ttfamily #1}} +% \newcommand*{\cnt}[1]{{\normalfont\ttfamily #1}} +% \newcommand*{\sty}[1]{{\normalfont\ttfamily #1}} +% \newcommand*{\eqref}[1]{(\ref{#1})} +% \newcommand*{\strongemph}[1]{\textbf{#1}} +% \newcommand*{\zerolistvertspaces}{^^A +% \setlength{\parskip}{0pt}^^A +% \setlength{\topsep}{\parskip}^^A +% \setlength{\partopsep}{\parskip}^^A +% } +% \newcommand*{\closeofsentencespace}{\spacefactor \sfcode `. \space} +% +% \DeclareFixedFont{\lhnss}{OT1}{cmss}{m}{n} {12} +% \DeclareFixedFont{\lhbss}{OT1}{cmss}{m}{n} {17} +% \DeclareFixedFont{\lhrm} {OT1}{cmr} {m}{n} {9} +% \DeclareFixedFont{\lhit} {OT1}{cmr} {m}{it}{9} +% \DeclareFixedFont{\lhtt} {OT1}{cmtt}{m}{n} {9} +% +% \providecommand*{\pdfbookmark}[3][]{} +% \providecommand*{\href}[3][]{#3} +% \providecommand*{\nolinkurl}[1]{\url{#1}} ^^A if hyperref isn't loades, +% ^^A hand over to url package +% \providecommand{\hypersetup}{} +% +% +% +% \title{ +% The \Bundle\thanks{This file has version +% \fileversion, release date \filedate; +% last documentation update: \docdate. +% Copyright \copyright~1999--2018 by G.~Mezzetti +% (see page~\pageref{S:Copy}).} +% } +% \author{G. Mezzetti} +% \date{\doclongdate} +% +% \hypersetup{ +% pdftitle = {The C.D.P. Bundle}, +% pdfauthor = {G. Mezzetti}, +% pdfsubject = {Documentation of the C.D.P. Bundle}, +% pdfkeywords = {letter, letterhead}, +% pdfcreationdate = {D:20180208120000}, +% pdfmoddate = {D:20180208120000}, +% bookmarksopen, +% bookmarksopenlevel = 1 +% } +% +% \pdfbookmark[0]{Front Matter}{FrontMatter} +% \maketitle +% +% \begin{abstract} +% A bundle of \LaTeX\ (former \LaTeXe) classes and packages is +% described, which was used by the \emph{Coordinamento dei Dottorandi e +% dei Dottori di Ricerca dell'Universit\`{a} di Padova} (a free and +% informal association of Ph.D. students and Ph.D.'s at the +% university of Padua, Italy) to write its ``official'' letters. +% These classes and packages took care of formatting the letters as +% required by the standards of this association; in particular, they +% made it very easy to include its seal, both in black-and-white and +% in color, at the top of pages. +% \end{abstract} +% +% \tableofcontents +% \listoffigures +% +% \clearpage +% \begingroup +% +% \setlength{\parskip}{\medskipamount} +% \setlength{\parindent}{0pt} +% +% \section*{Copyright notice} +% \label{S:Copy} +% \vspace{-\parskip} +% +% Copyright \copyright~1999--2018 by Gustavo \textsc{Mezzetti}. All +% rights are reserved, except as noted below. +% +% This document has been produced by feeding to a \LaTeX\ typesetting +% engine the file \filedir{\filename} version \fileversion\ (\docdate). +% This file is part of a work named ``\Bundle''. +% +% The \Bundle\ may be distributed and/or modified under the +% conditions of the \LaTeX\ Project Public License, either version~1.3 +% of this license or (at your option) any later version. The latest +% version of this license is in +% \begin{list}{\setlength{\topsep}{0pt}}\item\relax +% \ttfamily +% http://www.latex-project.org/lppl.txt +% \end{list} +% and version~1.3 or later is part of all distributions of \LaTeX\ +% version 2005/12/01 or later. +% +% The \Bundle\ has the LPPL maintenance status ``author-maintained''. +% +% The file \filedir{manifest.txt} included in the \Bundle\ +% specifies what the \Bundle\ consists of; more precisely, +% it explains how the locutions ``Work'' and ``Compiled Work'', +% used in the \LaTeX\ Project Public License, are to be interpreted +% in the case of this work. +% +% Permission is granted to make new printed copies of this document, +% by any means (\emph{e.g.}, photocopying, direct printing from the +% electronic version, and so on). +% +% Note, though, that distribution of this document alone is +% ``distribution of only part of the Work'' in the sense of the +% \LaTeX\ Project Public License, and should therefore be avoided: +% please distribute, in addition, the source file \filedir{\filename} +% together with all other files listed in \filedir{manifest.txt}, +% as explained in the file \filedir{manifest.txt} itself and also in +% Subsection~\ref{sS:License} on page~\pageref{sS:License}, to which you +% are referred for more information. +% +% \section*{Author's address} +% \vspace{-\parskip} +% +% The recommended way to contact the author is by e-mail; his address is: +% +% \begin{list}{\setlength{\topsep}{0pt}}\item\relax +% \href{mailto:gustavo.mezzetti@istruzione.it} +% {\nolinkurl{gustavo.mezzetti@istruzione.it}} +% \end{list} +% +% Please include the \emph{exact} phrase \verb*|C.D.P. Bundle| in the +% \emph{subject} of your message; otherwise, your message could be +% thrown away by a mail filter. In this regard, the weakness of the +% laws concerning the protection of privacy forces me to explicitly +% forbid the use of the above address for any kind of advertising, +% marketing, polling, or similar commercial or statistical contact. +% +% \endgroup +% +% +% +% \setcounter{secnumdepth}{0} +% +% +% +% \clearpage +% \section{Introduction} +% +% The \emph{Coordinamento dei Dottorandi e dei Dottori di Ricerca +% dell'Universit\`a di Padova} (henceforth simply referred to as +% ``\emph{Coordinamento}'') was a free association of Ph.D.'s and Ph.D. +% students who took their degree, or were studying for it, at the +% University of Padova (Padua), Italy. Discussing its precise nature is +% completely outside the scope of this document; the only thing that +% concerns us here is that it wrote letters of a somewhat +% ``official'' kind, which, for this reason, had to bear its letterhead +% on the top of their first page. The classes and packages herein described +% were used for preparing this kind of letters, automatically taking care of +% printing the letterhead; but besides this, they incorporated much more +% functionality than the standard \packlass{letter} \LaTeX\ class, +% and it was precisely this additional functionality that proved useful +% also in more general contexts, thus determining the adoption of the +% \Bundle\ in (certain niches of) the \LaTeX\ community. +% +% \subsection{Credits and disclaimer} +% +% The \packlass{\letteracdp} document class was originally based on +% the \packlass{letter} standard \LaTeX\ class. During the time, it +% went through so many deep revisions, that by now it retains +% practically no relation with the original \packlass{letter} class; +% but we want to acknowledge the ``historical'' source anyway. The +% \packlass{\articoletteracdp} document class uses some ideas borrowed +% from the \packlass{article} standard \LaTeX\ class. +% +% The author thanks heartfully Alessandro Ambrosi and Roberto +% Strepparava, who tested the software and constantly stimulated +% improvements and refinements, and Paolo Cojazzi, who, besides this, +% also helped with the compression tools. +% +% As usual with computer software, no warranty is given that +% this code will work properly, or even that it will work at all. +% Using this code can even result in loss of data and/or damages +% to your disks and your storage media. +% If you use this code, you do so exclusively at your own risk! +% +% See Subsection~\ref{sS:License} and the \LaTeX\ Project Public +% License for more information. +% +% \subsection{About this document} +% +% This document, like many documentation files distributed for +% \LaTeX, is divided into two parts. +% +% The first part, \emph{User's Manual}, should contain all the +% documentation you need to succesfully \emph{use} the classes and +% packages that this document presents; but unfortunately (for you!), +% this document is still unfinished, so this information is \emph{not} +% given here; instead, you are referred to some other sources (all +% available through the world-wide web). The only pieces of +% information you will find in this part are how to install those +% classes and packages and how to generate this documentation. This +% part, however, specifies to what extent, and under what conditions, +% you are allowed to use and distribute the classes and packages +% presented in this document. +% +% The second part, \emph{Implementation}, can be omitted if you want +% (explanations on how to omit it are given at the beginning of the +% part itself), and contains information that concerns only +% ``hackers'' who want to learn how the macros that this document +% presents are \emph{implemented}. Actually, this part contains the +% complete listing of the \LaTeX\ code that implements the +% macros---unfortunately, almost without comments---in the usual \DS\ +% format; if you are not a \LaTeX\ hacker, this part will not mean +% anything to you. +% +% \subsection{About this release: a provisional patch} +% +% The \Bundle\ was essentially written between 1999 and 2000 (for +% an Italian audience), and even at that time it contained code that was +% already deprecated; even worse, its design was flawed since the +% beginning, because it had been conceived for a specific and limited +% application (the letters of the C.D.P., exactly), and was adapted for +% more general use only as an afterthought. +% +% A thorough redesign would therefore be needed; on the other hand, some +% users have suggested, or asked for, improvements and additions, in +% particular for what concerns the use of the bundle with other +% languages besides Italian, that can be implemented rather easily by +% means of provisional patches. I~have already been deferring the +% introduction of these comparatively harmless enhancements for five +% years, waiting for the right moment to undertake the task of +% redesigning the bundle from scratch, but now I~have resolved to simply +% patch up the existing version. +% +% The macros presented in this document, therefore, are far from being +% optimal: no serious attempt has been made to remove ``fossil'' code, nor +% to bring it up to date with modern \LaTeX\ usage. The only exception to +% this is a small change that has been made to the fonts used to print the +% letterhead of the \emph{Coordinamento}, switching them from OT1 encoding +% to~T1---because this just required hitting the \meta{DEL} key half a dozen +% of times!~^^A ( paren match +% ;-)\closeofsentencespace Of course, nobody will +% care about this, since the least likely reason for which you might want to +% use the \Bundle\ is to produce that letterhead.\footnote{Note, however, +% that the ability to compose the letterhead of the \emph{Coordinamento} is +% still required in order to typeset the documentation given in the +% References.} For this same +% motive, essentially, I~have also removed the \packlass{\adiseal} package +% and the \packlass{\lettcdpadi} document class, of which, probably, nobody +% besides me even remembers the purpose. +% +% Though\marginpar{\hfill\strongemph{$*{*}*\;$WOW!!$\;*{*}*$}}, +% ^^A Yes, I know, I should use \textasteriskcentered... +% \strongemph{good news} are coming for all those users who asked +% for a means to \strongemph{customize the letterhead} produced by the +% \Bundle: a reasonably viable method for doing so has been provided +% at last!~:-D\closeofsentencespace The method requires the use +% of the \packlass{\cdpaddon} package, passing in the new option +% \opz{customletterhead}. You specify the contents of your custom head and +% foot by means of two new environments, called \env{customletterhead} and +% \env{customletterfoot}, respectively, which are similar, to a certain +% extent, to the \env{minipage} environment. This should give you maximum +% freedom in designing the letterhead, whilst adopting an interface you are +% surely well familiar with. +% See Subsection~\ref{sS:Customization} for more information. +% +% Another nifty feature is the ability to draw a thin rule to guide your +% hand in signing your letters: you ask for this behavior by passing the new +% \opz{signaturerule} option to the \packlass{\letteracdp} document class. +% See Subsection~\ref{sS:Options} for more information. +% +% Sorry, but for now I~cannot offer any more. +% +% \paragraph*{About version 0.36d.} +% It became necessary to release a patch of version~0.36, which has in turn +% been given the version number 0.36d, because an awful bug was discovered +% that absolutely required correction; I~then took this opportunity to +% eliminate as well a few minor errors in the code that I~had noticed +% meanwhile. I~should also mention the fact that the fonts used to print the +% letterhead of the \emph{Coordinamento} have been switched back to OT1 +% encoding (please don't ask why). Unfortunately, all the remarks set forth +% above about the weaknesses in the code design remain valid in this patched +% version too. +% +% +% +% \setcounter{secnumdepth}{3} +% +% +% +% \clearpage +% \part{User's Manual} +% +% \section{About this part} +% +% We shall only give instructions on how to install the bundle and +% how to generate this documentation; partial instructions on how to use +% the classes and packages contained in the bundle can be found +% in several documents written by the author +% \cite{tutti,esempi,etichette,novita,nts,ver028,cdpaddon,ver031,ver036}, +% but a systematic user's manual is no longer foreseen.~\mbox{:-(}^^A ) match +% \closeofsentencespace +% Note that including in this document the instructions on how to generate +% the document itself may seem pretty useless, but actually isn't: +% you might be reading a copy obtained from another person. +% +% \section{Installing the \Bundle\ and generating this documentation} +% +% As usual for \LaTeX\ distributions, the \Bundle\ is +% distributed in the form of a \filedir{.dtx} file, namely +% \filedir{cdpbundl.dtx}, and an accompanying \filedir{.ins} file, +% namely \filedir{cdpbundl.ins}. +% +% \subsection{Installation} +% +% To install the bundle, run \LaTeX\ (or plain \TeX) once on the file +% \filedir{cdpbundl.ins}. This will generate the following \LaTeX\ +% input files: +% \begin{quote} +% \ttfamily +% \articoletteracdp.cls\\ +% \cdpaddon.sty\\ +% \cdpbabel.sty\\ +% \cdpnamesenglish\\ +% \cdpnamesitalian\\ +% \example\\ +% \cdpshues\\ +% \epson\\ +% \hplj\\ +% \letteracdp.cls +% \end{quote} +% To finish the installation, move them into a \LaTeX\ input +% directory. (If you want, you can discard one, more, or all of the +% files whose name ends in \filedir{.def}, each of which contains color +% definitions for the seal appropriate for a particular printer. See +% Subsection~\ref{sS:config} for information about how these files +% are used for this purpose.) The above listing of all the files you +% need to move is also displayed on the terminal at the end of the run +% of the file \filedir{cdpbundl.ins}. The documentation of your \TeX\ +% installation should tell you how to find the \LaTeX\ input +% directory/ies, and probably also how to create new \LaTeX\ input +% directories reserved to hold your private classes and packages. +% +% Note that the TDS-compliant directory where the above files should be +% put is +% \begin{quote} +% \texttt{tex/latex/cdpbundl/} +% \end{quote} +% +% \subsection{Configuring the \protect\packlass{\cdpaddon} package} +% \label{sS:config} +% +% The \packlass{\cdpaddon} package is the part of the \Bundle\ +% that takes care of coloring the C.D.P. seal, which appears in +% black-and-white if you don't load this package. Experience by trial +% and error has shown that some configuration work may be necessary in +% order to obtain (more or less) correctly-\null looking colors in the +% seal. This happens because different printers may render color hues +% in different ways, sometimes producing surprising results. +% +% The configuration mechanism works as follows. For each printer +% you plan to use there should be a definition file that specifies what +% hues should be used to color the C.D.P. seal. To select which +% file to load, the user indicates its name in an option passed to the +% \packlass{\cdpaddon} package. If the user gives no such indication, +% the package reads from a configuration file the name of the default +% definition file, and uses that file. In both cases, if the +% designated definition file cannot be read, the package issues a +% warning and resorts, for the hues, to an emergency definition +% (which, as you can expect, is not very pleasant to the eye). +% +% \subsubsection{Writing color definition files} +% +% The task of a color definition file is simply to define two colors +% called "slight@col" and "strong@col" (when the definition file is +% read, the "@"~characters are treated as ordinary letters): +% "slight@col" is the color used to paint the inner of the D and of +% the P in the seal, "strong@col" is the color used to draw the lines. +% You define these colors by means of the "\definecolor" command: see +% the \textsl{\LaTeX book} \cite[Section~7.3 and +% Subsection~C.14.3]{LaTeXbook} for information on colors and the +% "\definecolor" command. +% +% The file \filedir{\example}, too, contains comments which explain +% how to write new definition files for the \packlass{\cdpaddon} +% package. Indeed, this file is supplied only as a prototype: I suggest +% that you write a new file by making a copy of it (with the +% appropriate name) and modifying it with the help of the comments. +% The colors defined in this file are just an example, and indeed they +% are exactly the emergency colors used internally by the +% \packlass{\cdpaddon} package when it cannot load a definition +% file---that is, a completely useless definition! +% +% The file \filedir{\example} uses the \texttt{named} color model, +% but of course you can use any color model you want. Indeed, it is +% best to use ``direct'' color models like \texttt{rgb} or +% \texttt{cmyk}, that allow you to drive the printer with precision: +% after all, it is exactly for this purpose that you are writing the +% file. The other two definition files included in the \Bundle\ +% illustrate the use of these color models. +% +% \subsubsection{Selecting a color definition file via an option} +% +% The first way to select a particular color definition file among the +% ones you have installed is to pass a suitable option to the +% \packlass{\cdpaddon} package. More precisely, the option name has +% the form \opz{printer:}\( \langle\textit{bare file name}\rangle \), +% all in a row without intervening spaces, where \( +% \langle\textit{bare file name}\rangle \) is the name of the +% definition file you want to load \emph{without} the extension +% \filedir{.def}. For example, to load a file called +% \filedir{acme-wilejet.def}, you pass the option +% \opz{printer:acme-wilejet}. Explicitly, you would write +% \begin{verbatim}\usepackage[printer:acme-wilejet]{cdpaddon}\end{verbatim} +% to load the \packlass{\cdpaddon} package and the color definitions +% suitable for the ACME WileJet printer (the printer preferred by +% 8~coyotes out of~10). Similarly, to load the file +% \filedir{\example} you would write +% \begin{verbatim}\usepackage[printer:cdpshues-example]{cdpaddon}\end{verbatim} +% and so on. Of course, you can still specify, as well, the other +% options listed in~\cite{cdpaddon}: for instance, +% \begin{verbatim}\usepackage[hypertext,printer:acme-wilejet]{cdpaddon}\end{verbatim} +% activates the hyperlinks and selects the colors for the +% ACME WileJet printer. +% +% When no \opz{printer:}\ldots\ option is specified, a default +% definition file is loaded, as explained in the next section. For +% elegance, you can explicitly request this default definition file with +% the \opz{printer:Default} option (note the capitalization). Of +% course, this implies that you cannot have a definition file called +% \filedir{Default.def}; but \filedir{default.def} is absolutely OK, +% and you can select it with \opz{printer:default}. Moreover, the +% \opz{printer:None} option forces the \packlass{\cdpaddon} package to +% ignore the configuration file and to use the emergency, built-in +% colors; again, \opz{printer:none}, instead, tries to load a color +% definition file called \filedir{none.def}. +% +% \subsubsection{Declaring the default color definition file} +% +% Most users will have only one printer, and even those users who +% have access to several printers will use one of them more often than +% the others. Therefore, it is wise to have a second way of selecting +% a definition file, to be used when the user does not specify one. +% This is done by indicating in a configuration file the name of a +% default color definition file. This configuration file is called +% \filedir{\cdpshues}. +% +% The \filedir{\cdpshues} file should contain only zero or one (but +% preferably one!) "\DeclareCDPSealHuesDefault" command. This command +% may be used only here, and only once, since it deactivates itself +% when executed, and also stops \LaTeX\ from reading any further in +% the configuration file. In its unique (mandatory) argument, one +% puts the name, \emph{without} the extension \filedir{.def}, of the +% default color definition file. Do not include any other command in +% your configuration file, because the effect of any other command is +% undefined. +% +% The \filedir{\cdpshues} file included in the \Bundle\ contains +% comments that help you to modify it in order to declare your +% personal default color definition file. The recommended way of +% doing this is: +% \begin{enumerate} +% ^^A ( paren match +% \renewcommand*{\labelenumi}{\theenumi)} +% \item +% make a backup copy (good idea indeed!) of the original configuration +% file under a convenient name, for example +% \filedir{\cdpshues.original}; +% \item +% modify the \filedir{\cdpshues} file following the advice given +% in its comments; +% \item +% if you want, delete all comments from the (new version of the) +% \filedir{\cdpshues} file, to save disk space. +% \end{enumerate} +% +% The obsolete version of the \packlass{\cdpaddon} package +% documented in~\cite{cdpaddon} was not configurable: it was +% programmed to read the color definitions from a file called +% \filedir{cdpshues.def}, and this name was hard-coded in the package. +% To maintain compatibility with this version, the file +% \filedir{\cdpshues} included in the \Bundle\ designates as the +% default color definition file exactly a file named +% \filedir{cdpshues.def}. Consequently, if you install the supplied +% files without making any change to them, the \packlass{\cdpaddon} +% package will continue to exhibit the old behavior, reading the +% legacy \filedir{cdpshues.def} file if you have one installed, and +% adopting the emergency colors otherwise. Note that no actual +% \filedir{cdpshues.def} file is included in the \Bundle. +% +% \subsection{Defining the captions for unsupported languages} +% +% Like many other document classes and packages, the classes and +% packages of the \Bundle\ mark up some portions of the output they +% produce by adding certain descriptive strings, that, by default, are +% written in Italian. For example, when you have requested the +% \sty{headings} page style, the name of the addressee, which is printed +% atop pages, is preceded by the string ``\emph{A:}'' (=~``To:''); +% similarly, when you issue the command "\tableofcontents" in a documents +% that adopts the \packlass{\articoletteracdp} document class, the table it +% produces is titled ``\emph{Sommario}'' (=~``Contents''); and so on. +% +% When the \Bundle\ was used only by the members of the +% \emph{Coordinamento}, the Italian defaults it provided for those captions +% were, of course, quite adequate; as long as its use remained circumscribed +% to the Italian \LaTeX\ community, they were still acceptable; but now, +% questions about how to adapt the \Bundle\ to foreign languages have +% begun to be asked in some Internet forums by users around the world, +% pushing me to reconsider the matter. +% +% Of course, the Italian captions are not (nor they have ever been) +% ``hard-wired'' in the code: they are defined by macros that follow the +% usual naming conventions ("\headtoname", "\contentsname", and so on). +% Thus, it's only a matter of redefining these ``hooks'' to suit the target +% language. However, it would be desirable to have some standard +% definitions set for each language; but unfortunately, this cannot be +% attained just by loading the \packlass{\babel} package, for two reasons. +% In the first place, there are some captions that are specific to the +% \Bundle\ and are therefore not cared for by the \packlass{\babel} +% package: for example, the (optional) subject of a letter is preceded by +% the expansion of "\subjectname" (which is ``\emph{Oggetto:}'' in Italian +% and should be ``Subject:'' in English), a hook the +% \packlass{\babel} package knows nothing about. Secondarily, even for +% those hooks that are standard, sometimes the definition provided by the +% \packlass{\babel} package seems (at least to me) not adequate for a +% letter; in particular, alas, if you load \packlass{\babel} with the +% \opz{italian} option (as you ordinarily do when you are writing in +% Italian), it actually \emph{cancels} the definitions preset by the +% \Bundle, substituting for them strings that I~deem more suitable for +% articles or books, for which they are indeed intended, than for letters +% (for example, \( "\contentsname" \to \mbox{``\emph{Indice}''} \) +% in \packlass{\babel}, instead of +% \( "\contentsname" \to \mbox{``\emph{Sommario}''} \), as defined by the +% \Bundle; +% \( "\refname" \to \mbox{``\emph{Riferimenti bibliografici}''} \) +% in \packlass{\babel}, +% instead of \( "\refname" \to \mbox{``\emph{Testi citati}''} \), as +% I~prefer; etc.).\footnote{I~do not insist on these captions being defined +% in the way the \Bundle\ currently uses: if the \LaTeX\ community +% thinks that such definitions are inadequate, I~have no objection at all, +% of course, to changing them.} +% +% To supply a \emph{provisional} solution to this problem, a new component +% has been added to the \Bundle: the \packlass{\cdpbabel} package. +% The idea is that, when using one of the document classes of the +% \Bundle, you load the \packlass{\cdpbabel} package \emph{instead of} +% \packlass{\babel}, and let the former load the latter on your behalf; +% in this way, you offer it a chance to augment, or amend, the definitions +% made by \packlass{\babel} itself. This solution might seem inelegant +% (and admittedly it is), but the problem is more subtle than it may look +% at first sight, involving also compatibility issues with existing +% documents, and I~need to further investigate it. Hopefully, a more +% satisfactory scheme will be found for future releases.\footnote{More +% generally, it can be observed that the document classes of the +% \Bundle\ rely too heavily on ancillary packages, and that this reconfirms +% the ``patched-up'' nature of their design; just think of the entanglement +% between the \packlass{\letteracdp} class and the \packlass{\cdpaddon} +% package---a typical Italian \emph{pasticcio}, it should be admitted!} +% +% In practice, all the \packlass{\cdpbabel} package has to do is (to load +% \packlass{\babel} and) to issue an +% "\addto{\captions"\meta{language}"}{"\ldots"}" command (or better, +% one such command for each required \meta{language}), with ``\ldots'' +% replaced by the appropriate redefinitions; the list, and the details, +% of such redefintions are of course dictated by \meta{language}, +% so \packlass{\cdpbabel} takes them from what we will call a ``C.D.P. +% language definition file''. This is a text file that, by convention, +% must be named \filedir{cdpnames}\meta{language}\filedir{.ldf}, +% where \meta{language} is the name of the corresponding language option +% (for example, +% \begin{verbatim}\usepackage[english,italian]{cdpbabel}\end{verbatim} +% invokes both \filedir{\cdpnamesenglish} and \filedir{\cdpnamesitalian}, +% in this order), and which must adhere to the format shown +% in fig.~\ref{fig:cdpnames}. +% +% \begin{figure}[tbp] +% \fontsize{9}{11}\selectfont +% \zerolistvertspaces +% \begin{flushleft} +% "\ProvidesFile{cdpnames"\meta{language}".ldf}["\meta{date \& version}"]" +% \end{flushleft} +% \begin{verbatim} +% +%\def\@cdpbabel@letter@names{%\end{verbatim} +% \begin{flushleft} +% " \def\subjectname {"\meta{Subject:}"}%"\\ +% " \def\registeredname {"\meta{Registered}"}%"\\ +% " \def\registeredRRname {"\meta{Registered R.R.}"}%"\\ +% " \def\andccname {"\meta{cc (in addresses)}"}%"\\ +% " \def\ccname {"\meta{cc (at end of letters)}"}%"\\ +% " \def\enclname {"\meta{Encl:}"}%"\\ +% " \def\PSname {"\meta{P.S.:}"}%"\\ +% " \def\headtoname {"\meta{To:}"}%"\\ +% " \def\lettername {"\meta{Letter}"}%" +% \end{flushleft} +% \begin{verbatim} +% % More captions could be added in the future. +%} +%\def\@cdpbabel@artlet@names{%\end{verbatim} +% \begin{flushleft} +% " \def\contentsname {"\meta{Contents}"}%"\\ +% " \def\listfigurename {"\meta{List of figures}"}%"\\ +% " \def\listtablename {"\meta{List of tables}"}%"\\ +% " \def\refname {"\meta{References}"}%"\\ +% " \def\indexname {"\meta{Index}"}%"\\ +% " \def\figurename {"\meta{Figure}"}%"\\ +% " \def\tablename {"\meta{Table}"}%"\\ +% \end{flushleft} +% \begin{verbatim} +% % More captions could be added in the future. +%} +% +%\endinput\end{verbatim} +% \caption{Contents of a +% \protect\filedir{cdpnames}\meta{language}\protect\filedir{.ldf} file} +% \label{fig:cdpnames} +% \end{figure} +% +% As you can see, a ``C.D.P. language definition file'' must define two +% macros, named "\@cdpbabel@letter@names" and "\@cdpbabel@artlet@names", +% respectively: in the first you put the redefinitions that should be +% added to "\captions"\meta{language} when only the \packlass{\letteracdp} +% class has been loaded; in the second you list the additional redefinitions +% that apply if the \packlass{\articoletteracdp} class is loaded too; +% and that's all. The listing shown in fig.~\ref{fig:cdpnames} details exactly +% what hooks need to be redefined when switching to another language; +% in principle, you must supply a suitable redefinition for each of them, +% but of course, when a hook is already defined by the \packlass{\babel} +% package in a way that you think suits, you may omit it from your list +% (or, perhaps better, comment it out). Look at the two provided files +% for inspiration, and in particular at \filedir{\cdpnamesenglish} for the +% intended meaning of the captions (which sould be quite obvious, however). +% +% At present, the \Bundle\ ships with \emph{just two} such definition +% files included, namely \filedir{\cdpnamesitalian} for Italian +% and \filedir{\cdpnamesenglish} for English: for all other languages, +% you'll have to write and install appropriate files yourself. +% Needless to say, you are most welcome if, after doing so, you want to +% contribute your work for inclusion in future releases of the +% \Bundle. Suggestions for amending the captions specified in the two +% existing files are most welcome too; for Italian, it is also a matter of +% updating the captions originally defined by the \packlass{\letteracdp} +% and \packlass{\articoletteracdp} document classes so that they remain +% ``in sync'' with those specified in the \filedir{\cdpnamesitalian} file. +% +% It is hardly worth remarking that ``C.D.P. language definition files'' +% naturally belong to the same directory where the \Bundle\ is located, +% and \emph{not} to any directory of the \packlass{\babel} system! +% +% One final word of clarification: two of the abovementioned captions, +% namely "\ccname" +% and "\andccname", look like they are the same, but they actually differ: +% the latter is prepended to \emph{addresses} to which the letter is sent +% as a ``carbon copy'', whilst the former is used when the names from those +% addresses are enumerated again \emph{at the end} of a letter (in the same +% place where enclosures are also listed). In Italian, "\andccname" +% should expand to ``\emph{e~p.~c.}'', but "\ccname" just to +% ``\emph{P.~c.}''; hence, there is at least one language in which the +% distinction is relevant. +% +% \subsection{Documentation} +% +% To produce this documentation, run \LaTeX\ three times (for the +% table of contents to be correct) on the file \filedir{\cdpbundl.dtx}. +% This won't produce the index and the change history, however: for +% those, you have to run MakeIndex on the files \filedir{\cdpbundl.idx} +% and \filedir{\cdpbundl.glo}, produced during the previous \LaTeX\ +% run, with the styles \filedir{gind.ist} and \filedir{gglo.ist}, +% respectively (these styles are part of the standard \LaTeX\ +% distribution); then pass \filedir{\cdpbundl.dtx} through \LaTeX\ +% twice more. +% +% Starting with version 0.36 of the \Bundle, a (quite trivial!\@) makefile +% that ``knows'' how to produce the documentation is offered along with the +% Bundle itself. Although it is not a required part of the distribution +% (as per LPPL\@), you may find that some distributors supply it all the +% same (I~hope the CTAN\@ sites will do so). With this makefile in the same +% directory as \filedir{\filename}, the shell command +% \begin{quote} +% \ttfamily +% make doc +% \end{quote} +% will take all the necessary actions to produce the full documentation +% (in PDF\@; the modifications you need to introduce into the makefile +% in order to obtain DVI\@ output should be quite obvious, however). +% +% The same makefile can also be used to extract the various class, package, +% and ancillary (definition and configuration) files: simply issue the +% command +% \begin{quote} +% \ttfamily +% make code +% \end{quote} +% at the shell prompt; whereas +% \begin{quote} +% \ttfamily +% make +% \end{quote} +% will \emph{both} extract the code files \emph{and} typeset the +% documentation. Type +% \begin{quote} +% \ttfamily +% make help +% \end{quote} +% for more information. +% +% \section{How to use the \Bundle} +% +% The \Bundle\ v.~0.36 contains two \LaTeX\ document classes, +% namely \packlass{\letteracdp} and \packlass{\articoletteracdp}, +% and two helper \LaTeX\ packages, called \packlass{\cdpaddon} +% and \packlass{\cdpbabel}, plus a certain number of definition +% and configuration files related to these packages. +% As already said, the actual purpose of this section is not +% to explain you how to use these macro files, but only to give you +% references to documents where you can find the explanations. +% +% For instructions on how to use the \packlass{\letteracdp} class +% the reader is referred to \cite{tutti,esempi,etichette,nts,ver028,ver031}. +% Note, however, that the class is syntactically compatible with the +% \packlass{letter} standard \LaTeX\ class, in the sense that a +% document prepared for the \packlass{letter} class can be compiled +% without errors with the \packlass{\letteracdp} class; but the output +% will be different. +% +% As a minimal reference, fig.~\ref{fig:input} illustrates the typical +% structure of a simple input file for the \packlass{\letteracdp} +% document class. +% +% \iffalse +% Meta-comment: a <*gobble> guard is needed here to prevent the +% DocStrip program from putting the lines beginning with "%%" in the +% generated files. +%<*gobble> +% \fi +% \begin{figure}[tbp] +% \zerolistvertspaces +% \begin{verbatim}\documentclass[boldsubject,italicsignature,smartindent]{letteracdp} +%% Of course, the above options are a matter of personal taste... +%\usepackage[T1]{fontenc} % as it is now customary +%% Since we are writing in English, we need to redefine some captions; +%% the following package automatically takes care of this: +%\usepackage[english]{cdpbabel} +%% Presently only two languages are supported: "english" and "italian". +% +%% Name, address and signature of the sender (the name is optional): +%\name{Revinu Jitis Drofnats} +%\address{ +% Revinu~J. \textsc{Drofnats}\\ +% Department of Farm Ecology\\ +% University of St.\,Anford\\ +% Haga Alto, CA~94321 (U.S.A.) +%} +%\signature{R.~J. Drofnats\\Professor} +%\date{February~8, 2018} % as usual, date is optional, default is \today +%\place{St.\,Anford} % place where the letter is written (optional) +% +%% Uncomment the following declaration if you want running heads: +%% \pagestyle{headings} +% +% +% +%\begin{document} +% +%\begin{letterhead}[Brian~K. Reid]{ +% Prof.~Brian~K. \textsc{Reid}\\ +% Department of Electrical Engineering\\ +% Stanford University\\ +% Stanford, CA~94305 (U.S.A.) +%}[ +% This is the optional subject of the letter. +%] +% +%\opening{Dear Prof.~Reid,} +% +%this letter is typeset using a \texttt{letterhead} environment, so it +%will be printed with the letterhead of the \emph{Coordinamento} above +%it; if you don't want it, use the \texttt{letter} environment instead. +%You can also use the \texttt{foldedletterhead} environment in place +%of the \texttt{letterhead} environment (or \texttt{foldedletter} in +%place of \texttt{letter}) to obtain a letter prepared to be folded in +%three parts, as one usually does before putting it in an envelope. +%Experiment to see what happens. +% +%\closing{Sincerely,} +% +%\end{letterhead} +% +%\end{document}\end{verbatim} +% \caption{A sample input file for the \protect\packlass{\letteracdp} +% document class} +% \label{fig:input} +% \end{figure} +% \iffalse +%</gobble> +% \fi +% +% For instructions on how to use the \packlass{\articoletteracdp} +% class, see~\cite{novita}. +% +% For instructions on how to use the \packlass{\cdpaddon} package, +% see~\cite{cdpaddon}. Note, however, that this document describes an +% obsolete version, which lacks the ability to deal with several color +% definition files. The use of the \packlass{\cdpaddon} package for +% customizing the letterhead, though, is covered in~\cite{ver036}. +% +% For instructions on how to use the \packlass{\cdpbabel} package, +% see~\cite{ver036}. +% +% Please note that before using the \Bundle\ you must read the +% following license to see whether its terms are acceptable for you, +% especially for what concerns the lack of any warranty; if they are +% not, don't use this program. +% +% \subsection{License} +% \label{sS:License} +% +% The \Bundle\ is \emph{not} in the public domain: its author, +% Gustavo \textsc{Mezzetti}, owns the copyright, and in general retains +% all the rights therein; but as a special exception, the author +% grants you the permissions indicated below. +% +% \subsubsection{Distribution and/or modification} +% +% The \Bundle\ may be distributed and/or modified under the +% conditions of the \LaTeX\ Project Public License, either version~1.3 +% of this license or (at your option) any later version. The latest +% version of this license is in +% \begin{quote} +% \ttfamily +% http://www.latex-project.org/lppl.txt +% \end{quote} +% and version~1.3 or later is part of all distributions of \LaTeX\ +% version 2005/12/01 or later. +% +% The \Bundle\ has the LPPL maintenance status ``author-maintained''. +% +% The file \filedir{manifest.txt} included in the \Bundle\ +% specifies what the \Bundle\ consists of; more precisely, +% it explains how the locutions ``Work'' and ``Compiled Work'', +% used in the \LaTeX\ Project Public License, are to be interpreted +% in the case of this work. +% +% \subsubsection{Use} +% +% The use of the \Bundle\ is unrestricted, provided that you +% accept the terms and conditions of the \LaTeX\ Project Public +% License and of the following subsection for what concerns the absence +% of any warranty. +% +% \subsubsection{No warranty} +% +% There is absolutely no warranty for the \Bundle. The +% Copyright Holder provides the \Bundle\ ``as is'', without +% 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 \Bundle\ is with you. Should the +% \Bundle\ prove defective, you assume the cost of all necessary +% servicing, repair, or correction. +% +% In no event will The Copyright Holder, or any other party who may +% distribute and/or modify the \Bundle\ as permitted by the +% \LaTeX\ Project Public License, be liable to you for damages, +% including any general, special, incidental or consequential damages +% arising out of any use of the \Bundle\ or out of inability to +% use it (including, but not limited to, loss of data, data being +% rendered inaccurate, or losses sustained by anyone as a result of any +% failure of the \Bundle\ to operate with any other programs), +% even if The Copyright Holder or said other party has been advised of +% the possibility of such damages. +% +% \subsection{Options of the \protect\packlass{\letteracdp} class} +% \label{sS:Options} +% +% Of course, you load the \packlass{\letteracdp} class by means of the +% usual "\documentclass" declaration, which allows you to specify +% various options. For some reason, the complete list of all the +% options recognized by this class has never been given in any of the +% previous documents containing instructions about it; so, we give it +% here. +% +% We shall now list all the options recognized by the +% \packlass{\letteracdp} class, including the standard ones it can +% understand. If an option does not appear in the list given below, +% then that option is not recognized by the \packlass{\letteracdp} +% class, even if it is a standard one (that is, documented in the +% \textsl{\LaTeX book}~\cite{LaTeXbook}). +% +% We begin with the list of standard options. Since they are +% already described in the \textsl{\LaTeX book}~\cite{LaTeXbook}, we +% describe only the options that behave differently from the standard; +% the others are just listed without description. +% +% \begin{description} +% +% \item[\iopz{10pt}\eopz{11pt}\eopz{12pt}\fopz] +% +% \item[\iopz{letterpaper}\eopz{legalpaper}\eopz{executivepaper}\eopz +% {a4paper}\eopz{a5paper}\eopz{b5paper}\fopz] +% \hfil\null\linebreak +% Note that \packlass{\letteracdp} uses \opz{a4paper} as the default. +% +% \item[\iopz{landscape}\fopz] +% +% \item[\iopz{final}\eopz{draft}\fopz] +% +% \item[\iopz{oneside}\eopz{twoside}\fopz] +% +% \item[\iopz{onecolumn}\eopz{twocolumn}\fopz] The \opz{twocolumn} +% option is recognized, but triggers an error; the \opz{onecolumn} +% option is recognized, but it is ignored because in any case the +% document is typeset in one-column mode. Note, however, that +% requesting \opz{onecolumn} as a global option could make sense: +% precisely, it could serve to inform possible packages that the +% document has only one column. But, precisely for this reason, this +% option is requested by default during the class initialization; +% there is hence no reason to specify it, but it does no harm. +% +% \item[\iopz{leqn}\fopz] +% +% \item[\iopz{fleqn}\fopz] +% +% \end{description} +% +% We now list the option specific to the \packlass{\letteracdp} class. +% +% \begin{description} +% +% \item[\iopz{mediumsubject}\eopz{boldsubject}\fopz] +% The \opz{mediumsubject} option requests that the subject of the +% letters be typeset in medium weight, while the \opz{boldsubject} +% option makes it appear in boldface type. The default is +% \opz{mediumsubject}. +% +% \item[\iopz{uprightsignature}\eopz{italicsignature}\fopz] +% The \opz{uprightsignature} option requests that the signature of the +% letters be typeset in upright shape, while the \opz{italicsignature} +% option makes it appear in italic shape. The default is +% \opz{uprightsignature}. +% +% \item[\iopz{signaturerule}\eopz{nosignaturerule}\fopz] +% Drawing or not a thin rule to mark the spot where you should sign a +% letter is a matter of style that, as such, should apply to the whole +% document; for this reason, this behavior is requested by menas of an +% option, namely \opz{signaturerule}. As you can guess, \opz{signaturerule} +% causes the rule to be drawn, while \opz{nosignaturerule}, which is defined +% for the sake of completeness, suppresses it. Anyway, the rule is never +% drawn inside a \env{signatureenv*} environment; this includes signatures +% generated by the \mbox{$*$-form} of the "\closing" command. +% You can adjust the width of the rule by modifying, with "\setlength", +% the "\signaturerulewidth" rigid length. +% +% \item[\iopz{noPS}\eopz{usePS}\fopz] +% These two options are obsolete (to say the least!\@) and should +% \emph{not} be used any longer. If you want to improve the graphical +% quality of the seal, simply load the \packlass{\pictee} package in +% your document, along with the \packlass{\cdpaddon} package (of course, +% if you do so, PostScript or PDF\@ printing will be needed to produce the +% output). +% +% \item[\iopz{indent}\eopz{noindent}\eopz{smartindent}\eopz{shortindent}\fopz] +% These options are used to specify the paragraph indentation, but +% only for letters; any portion of text that is not included in a +% letter---but normally there is no such text---is not affected by +% these options. The \opz{indent} option sets the paragraph +% indentation, for letters, to one tenth of the text width, +% unless this amount looks too bad, in which case the indentation +% is set to 2~picas. The \opz{noindent} option completely +% suppressess paragraph indentation within letters. The \opz{smartindent} +% option sets the paragraph indentation, for letters, to the width +% of (the last line of) the salutation, unless this amount looks +% too bad, in which case it behaves like \opz{indent}. The \opz{shortindent} +% option maintains also for letters the same indentation used for +% text not included in letters (see below); its name, chosen to be +% more easily remembered, is due to the fact that normally it involves +% a shorter indentation than the default one. The default is \opz{indent}. +% I repeat that these options do not affect any text that should appear +% outside of letters, whose paragraphs will be always indented by +% 2~em, where the unit of 1~em is taken from the main document font; +% this is also the paragraph indentation for letters if the +% \opz{shortindent} option is specified. Paragraphs of +% postscripts are never indented. +% +% \item[\iopz{105x37labels}\eopz{70x37labels}\eopz{Avery5352labels}\fopz] +% These options indicate the format of the address labels. The +% first two options indicate address labels of mm~105\,$\times$\,37 +% and mm~70\,$\times$\,37, respectively. The third option +% indicates the address labels used by the standard \packlass{letter} +% class. Note the uppercase letter in \opz{Avery5352labels}. The +% default is \opz{105x37labels}. +% +% \end{description} +% +% \subsection{Customizing the letterhead} +% \label{sS:Customization} +% +% A new, long-awaited feature is available at last: it is now possible, +% with reasonable ease, to customize the letterhead produced by the +% \env{letterhead} environment.~:-D\closeofsentencespace +% As a matter of fact, this customization has always been possible---the +% \env{letterhead} environment would have been completely useless +% otherwise---but instructions on how to carry it out were given uniquely +% in documents that were only privately circulated; moreover, these +% instructions required you to modify some of the internal commands of the +% \Bundle. What the present version does is to provide a reasonable user +% interface for making these internal changes and (which is not less +% important) to document this interface. +% +% The customization of the letterhead basically involves the following three +% steps: +% +% \begin{enumerate} +% +% \item +% First of all, you need to load the \packlass{\cdpaddon} package, +% which is part of the \Bundle, passing to it the (new) option +% \opz{customletterhead}. +% +% \item +% The \packlass{\cdpaddon} package defines two environments, named +% \env{customletterhead} and \env{customletterfoot}, respectively, +% that can be used more or less like a \env{minipage} environment. +% You should put, in any place before the first letter (not entirely exact, +% but almost so: we'll refine this information underneath), a +% \env{customletterhead} environment holding the +% description of your letterhead. Just pretend you are composing a +% \env{minipage} with your letterhead inside. +% +% \item +% If you also want to customize the page footer (as it is ordinarily the +% case), define its contents inside a similarly placed +% \env{customletterfoot} environment. +% If you omit this step, the footer will be empty. +% +% \end{enumerate} +% +% \DescribeEnv{customletterhead}^^A +% \DescribeEnv{customletterfoot}^^A +% More formally, the \packlass{\cdpaddon} package makes two new environments +% available, named as stated above, that conform to the following syntax: +% +% \begin{flushleft} +% "\begin{customletterhead}{"\meta{wdth}"}"\quad +% \meta{text}\quad +% "\end{customletterhead}"\\ +% "\begin{customletterfoot}{"\meta{wdth}"}"\quad +% \meta{text}\quad +% "\end{customletterfoot}" +% \end{flushleft} +% +% Both these environments typeset \meta{text} in a \env{minipage} with +% width \meta{wdth} and save the result in a box register specifically +% reserved for this purpose (each environment has its own, dedicated +% register); subsequently, if the \opz{customletterhead} option has been +% specified, the contents of these box registers are used in place of the +% header and footer ordinarily defined by the \packlass{\letteracdp} +% document class. Note that the \packlass{\cdpaddon} package defines the +% \env{customletterhead} and \env{customletterfoot} environments in any +% case, \emph{independently} of which options you pass to it. +% +% The contents specified inside \env{customletterhead} and +% \env{customletterfoot} will be horizontally centered in the header and +% footer boxes, respectively; these boxes are defined by the page layout, +% but normally their left and right edges coincide with those of the main +% text. If the \meta{wdth} you have specified for the contents themselves +% exceeds the width available in the header\slash footer, they will stick +% out by the same amount of space on both sides (in brief: the contents are +% centered with "\hss" at both ends). Normally, you pass "\textwidth" as +% the \meta{wdth} parameter\footnote{I~have long been in doubt whether to make +% \meta{wdth} an optional parameter, with default value equal to +% \texttt{\bslash textwidth}; eventually, I~decided for a syntax that +% parallels the syntax of the \env{minipage} environment, and should +% therefore be obvious to remember.} and align things as you prefer +% \emph{inside} the \env{minipage}, perhaps creating sub-boxes or using +% \env{picture}s. +% +% Coming to vertical alignment, the boxes produced by the +% \env{customletterhead}\slash\env{customletterfoot} environments are +% ``smashed'' down to null height and depth; +% for \env{customletterhead}, the bottom edge of the box +% is aligned with the baseline of the header, whilst for +% \env{customletterfoot} it is the top edge which is aligned +% with the baseline of the footer. If you want the contents of +% \env{customletterhead} to sink below the baseline of the header, +% simply backspace vertically at their end, \emph{i.e.}, +% use "\vspace{"\meta{dist}"}" with a negative \meta{dist}, +% and the bottom edge of your custom header will be placed exactly +% \( \left|\meta{dist}\right| \) below the baseline of the header +% as defined by the general page layout. +% Similarly, a "\vspace{"\meta{dist}"}" with a negative \meta{dist} +% placed at the beginning of your custom footer will rise its top edge +% exactly \( \left|\meta{dist}\right| \) above the baseline of the footer +% defined by the general page layout. +% +% \iffalse +% Meta-comment: a <*gobble> guard is needed here to prevent the +% DocStrip program from putting the lines beginning with "%%" in the +% generated files. +%<*gobble> +% \fi +% \begin{figure}[tbp] +% \zerolistvertspaces +% \begin{verbatim}\documentclass +% [twoside,boldsubject,italicsignature,shortindent,signaturerule] +% {letteracdp}[2015/01/20] +%\usepackage[T1]{fontenc} +%\usepackage[english]{cdpbabel} +%\usepackage[customletterhead]{cdpaddon}[2015/01/21] +%\usepackage{url,lipsum} +% +%\address{ +% Gustavo \textsc{Mezzetti}\\ +% \protect\url{gustavo.mezzetti@istruzione.it} +%} +%\signature{Gustavo Mezzetti} +%\date{February~8, 2018} +%\place{Padova} +% +% +% +%% Definition of your letterhead occurs here: +% +%\begin{customletterhead}{\textwidth} +% \centering \Huge +% My Huge Centered Letterhead +%\end{customletterhead} +%\begin{customletterfoot}{\textwidth} +% \raggedleft \tiny +% \ruleacrossheadorfoot +% My (almost unreadable) small print\\ +% flushed against the right margin. +%\end{customletterfoot} +% +% +% +%\begin{document} +% +%\begin{foldedletterhead}[Whom it may concern] +% {To whom it may concern} +% [My own letterhead, at last!] +% +%\makepresentation +%\maketopdate\relax +% +%\lipsum[1-2] +% +%\makesignature +% +%\end{foldedletterhead} +% +%\end{document}\end{verbatim} +% \caption{How to customize the letterhead} +% \label{fig:customletter} +% \end{figure} +% \iffalse +%</gobble> +% \fi +% +% Fig.~\ref{fig:customletter} shows a sample input file for a letter with +% customized letterhead. Note that, among the others, we load the +% \packlass{\cdpaddon} package with the \opz{customletterhead} option. +% Note also that the \env{customletterhead}\slash\env{customletterfoot} +% environments \emph{can} be placed in the preamble; this makes it very easy +% to create a definition file containing the description of your custom +% letterhead, to be subsequently loaded in your source files, +% or even to define your custom version of the \packlass{\letteracdp} +% and \packlass{\articoletteracdp} document classes. For example, the three +% files \filedir{myletter.cls}, \filedir{myarticletter.cls}, and +% \filedir{mylogo.def}, whose contents are listed in +% fig.~\ref{fig:myletter}, \ref{fig:myarticletter}, and~\ref{fig:mylogo}, +% respectively, together define two new classes, called \packlass{myletter} +% and \packlass{myarticletter}, that respectively parallel +% \packlass{\letteracdp} and \packlass{\articoletteracdp}, but produce the +% same letterhead as the file of +% fig.~\ref{fig:customletter}.\footnote{Please note that \packlass{myletter} +% also used to be (a great many years ago) the obsolete name of the +% \packlass{akletter} document class. Instructing you to create a custom +% class by that name shouldn't cause you any trouble in +% ^^A ( paren match +% 2018~:-), but I~want to inform you all the same of the potential name +% conflict.} +% +% \begin{figure}[tbp] +% \zerolistvertspaces +% \begin{verbatim}\NeedsTeXFormat{LaTeX2e} % LaTeX2e is required! +%\ProvidesClass{myletter} +% [2018/02/08 v0.01 (development)] +%\LoadClassWithOptions{letteracdp}[2015/01/20] +%\input{mylogo.def} +%\endinput\end{verbatim} +% \caption{Contents of the \protect\filedir{myletter.cls} file} +% \label{fig:myletter} +% \end{figure} +% +% \begin{figure}[tbp] +% \zerolistvertspaces +% \begin{verbatim}\NeedsTeXFormat{LaTeX2e} % LaTeX2e is required! +%\ProvidesClass{myarticletter} +% [2018/02/08 v0.01 (development)] +%\LoadClassWithOptions{articoletteracdp}[2015/01/20] +%\input{mylogo.def} +%\endinput\end{verbatim} +% \caption{Contents of the \protect\filedir{myarticletter.cls} file} +% \label{fig:myarticletter} +% \end{figure} +% +% \begin{figure}[tbp] +% \zerolistvertspaces +% \begin{verbatim}\ProvidesFile{mylogo.def}[2018/02/08 v0.01 (development)] +% +%\RequirePackage[customletterhead]{cdpaddon}[2015/01/21] +% +%\begin{customletterhead}{\textwidth} +% \centering \Huge +% My Huge Centered Letterhead +%\end{customletterhead} +%\begin{customletterfoot}{\textwidth} +% \raggedleft \tiny +% \ruleacrossheadorfoot +% My (almost unreadable) small print\\ +% flushed against the right margin. +%\end{customletterfoot} +% +%\endinput\end{verbatim} +% \caption{Contents of the \protect\filedir{mylogo.def} file} +% \label{fig:mylogo} +% \end{figure} +% +% One final word: the \env{customletterhead}\slash\env{customletterfoot} +% environments save their contents in their respective box registers by +% means of a \emph{local} assignment, subject to ordinary scoping rules: +% this can be useful if you want to change the letterhead for just a single +% letter in a source file that contains many ones. +% +% See~\cite{ver036} for more information. +% +% \StopEventually{ +% \setcounter{secnumdepth}{0} +% \providecommand*\bysame{\leavevmode\hbox to3em{\hrulefill}\thinspace} +% +% \clearpage +% \pdfbookmark[0]{Back Matter}{BackMatter} +% \begin{thebibliography}{99} +% \addcontentsline{toc}{section}{\refname} +% +% \bibitem{LaTeXbook} +% L.~Lamport, \emph{\LaTeX---A Document Preparation System---User's +% Guide and Reference Manual}, 2nd~edition, Addison-Wesley, +% Reading, 1994. +% +% \bibitem{tutti} +% G.~Mezzetti, \emph{Breve presentazione d'una classe \LaTeX, denominata +% \packlass{\letteracdp}, utile nella preparazione delle lettere del +% Coordinamento}, technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/presentazione.tex}} +% +% \bibitem{esempi} +% \bysame, \emph{Esempi d'uso della classe \packlass{\letteracdp}}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/esempi.tex}} +% +% \bibitem{etichette} +% \bysame, \emph{Etichette degli indirizzi con la classe \packlass{\letteracdp}}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/etichett.tex}} +% +% \bibitem{novita} +% \bysame, \emph{Grandi novit\`{a} per \packlass{\letteracdp}: +% arriva \packlass{\articoletteracdp}!}, technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/novita.tex}} +% +% \bibitem{nts} +% \bysame, \emph{Forse non tutti sanno che\ldots}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/nontuttisanno.tex}} +% +% \bibitem{ver028} +% \bysame, \emph{Annuncio delle versioni 0.28 della classe \packlass{\letteracdp} +% e 0.08 della classe \packlass{\articoletteracdp}}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/ver0-28.tex}} +% +% \bibitem{cdpaddon} +% \bysame, \emph{Il pacchetto \packlass{\cdpaddon}}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/cdpaddonistr.tex}} +% +% \bibitem{ver031} +% \bysame, \emph{Annuncio della versione 0.31 del \emph{\Bundle}}, +% technical note downloadable from:\\ +% \rlap{\url{http://www.math.unipd.it/~mezzetti/Gustavo/Ludic/CDP/ver0-31.tex}} +% +% \bibitem{ver036} +% \bysame, \emph{The \Bundle\ version~0.36}, +% included in the documentation of the \packlass{\cdpbundl} package,\\ +% \href{file:cdp-ver-0-36.pdf} +% {\nolinkurl{$TEXMF/doc/latex/cdpbundl/cdp-ver-0-36.pdf}} +% +% \end{thebibliography} +% } +% +% +% +% \clearpage +% \part{Implementation} +% +% \changes{0.36a-c}{Between 2015 and 2018}{Never publicly released.} +% +% \section{About this part} +% +% This part is of interest only to \LaTeX\ hackers; to avoid +% having this part printed, look in the file \filedir{\filename} +% for a line that looks \emph{exactly} like this +% \begin{verbatim}%% \OnlyDescription % uncomment to discard Implementation part\end{verbatim} +% and remove the two leading percent signs ("%%"). +% +% \section{A driver for this document} +% +% This part of the file is \emph{not} included in any generated file: +% it is simply the driver. +% \begin{macrocode} +%<*driver> +% \end{macrocode} +% +% To begin with, we load the \packlass{ltxdoc} class and the +% \packlass{hypdoc} package. +% \begin{macrocode} +\documentclass{ltxdoc} +\usepackage{hypdoc} +% \end{macrocode} +% We now set a few typesetting options. +% First of all, we want a history listing and a full index, the latter +% organized by line numbers. +% \begin{macrocode} +\RecordChanges +\EnableCrossrefs +\CodelineIndex +% \end{macrocode} +% If you don't want to include the second part of this document, +% \emph{Implementation}, uncomment the line containing the command +% "\OnlyDescription". +% \begin{macrocode} +%% \OnlyDescription % uncomment to discard Implementation part +% \end{macrocode} +% Finally, setting "\hfuzz" and "\vfuzz" to 0~points is only one +% of the many neurotic symptoms of the author! +% \begin{macrocode} +\hfuzz = 0pt +\vfuzz = 0pt +% \end{macrocode} +% Now input this same file, using \DS\ conventions. +% \begin{macrocode} +\begin{document} + \DocInput{cdpbundl.dtx} +% \end{macrocode} +% Then print the change list and the index. We put these commands in +% the driver, rather than in the comments of this file, because +% producing the change list and the index is somewhat cumbersome, and some +% users could prefer to omit them: such users should simply use a +% different driver. +% \begin{macrocode} + \clearpage \PrintChanges + \clearpage \PrintIndex +% \end{macrocode} +% When this file is read directly by \LaTeX\ without the intervention +% of \DS, the following line will make \TeX\ stop +% reading. +% \begin{macrocode} +\end{document} +% \end{macrocode} +% End of driver module. +% \begin{macrocode} +%</driver> +% \end{macrocode} +% \noindent\null\par +% +% \section{The code for the \protect\packlass{\letteracdp} class} +% +% This part of the file goes into \filedir{\letteracdp.cls}. +% \begin{macrocode} +%<*letter> +% \end{macrocode} +% The reader must be warned that this is only a preliminary release +% of this code: a thorough reorganization of the macros has already +% been planned for future releases. Instead of putting all the code +% in a single file and giving it the form of a document class, +% in future releases the code will be split into several files, +% part of which will be packages, part definition and/or +% configuation files, and so on. +% +% \subsection{Identification} +% +% I don't remember exactly why I asked for the June 1997 release +% of \LaTeXe, but I am sure that there was a reason; so, let us +% continue to ask for it. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1997/06/01] % LaTeX2e is required! +% \end{macrocode} +% The usual identification; the string \texttt{(**incomplete**)} +% will eventually be removed, I hope! +% \begin{macrocode} +\ProvidesClass{letteracdp} + [2018/02/08 v0.36d (**incomplete**)] +% \end{macrocode} +% Print a copyright message on the terminal, just below the name +% of the class. +% \begin{macrocode} +\typeout{Copyright (C) 1999-2018 by Gustavo MEZZETTI, + all rights reserved.} +% \end{macrocode} +% +% \begin{macro}{\@letteracdp} +% Define a macro containing the name of the class; it will be used +% in error and warning messages. This is done for two reasons: +% first of all, to save tokens in macro definitions, but also to +% avoid the risk of mispelling the name of the class in some place. +% \begin{macrocode} +\@ifdefinable\@letteracdp{\def\@letteracdp{letteracdp}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Initial code} +% +% \begin{macro}{\Coordinamento} +% \changes{0.36d}{2018 Feb 08}{Made the accent of ``Universit\`a'' +% independent of the currently selected font encoding.}^^A +% Define the following macros near the beginning of the code, so it +% will be easy to change them. The first one is the full name of the +% \emph{Coordinamento}: +% \begin{macrocode} +\newcommand*\Coordinamento{% + Coordinamento dei Dottorandi e dei Dottori di Ricerca + dell'Universit\`a di Padova% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CoordinamentoWWW} +% The second one is its web address: +% \begin{macrocode} +\newcommand*\CoordinamentoWWW{% + http://www.dei.unipd.it/\string~assdott/% +} +% \end{macrocode} +% \end{macro} +% +% Declare the fonts used to print the letterhead and the footer. In 1999 +% I~knew so little about font selection in \LaTeXe\ that I~believed that it +% was necessary to declare them as ``fixed fonts'' in order to preserve them +% from being affected by options (\emph{e.g.}, \opz{12pt}), packages +% (\emph{e.g.}, \opz{times}), and so on. Of course, this is nonsense, and it +% is probably wiser to switch to "\usefont"; but for the moment (vers.~0.36d) +% I~am not (yet) going to do so. +% \changes{0.36d}{2018 Feb 08}{Switched the fonts for the CDP\ letterhead +% back to OT1 encoding.}^^A +% Note that, in vers.~0.36d, the fonts for the CDP\ letterhead have been +% switched back to OT1 encoding. +% \begin{macro}{\@lh@nss} +% Main font for letterhead is Computer Modern Sans Serif 12pt +% (LetterHead\slash Normal Sans Serif): +% \begin{macrocode} +\DeclareFixedFont\@lh@nss{OT1}{cmss}{m}{n} {12} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@lh@bss} +% A couple of initials are printed using a bigger font, that is, +% Computer Modern Sans Serif 17pt (LetterHead\slash Bigger Sans +% Serif): +% \begin{macrocode} +\DeclareFixedFont\@lh@bss{OT1}{cmss}{m}{n} {17} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@lh@rm} +% Main font for footer: Computer Modern Roman 9pt +% (LetterHead\slash RoMan): +% \begin{macrocode} +\DeclareFixedFont\@lh@rm {OT1}{cmr} {m}{n} {9} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@lh@it} +% The words ``World Wide Web'' are printed in italics +% (LetterHead\slash ITalics): +% \begin{macrocode} +\DeclareFixedFont\@lh@it {OT1}{cmr} {m}{it}{9} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@lh@tt} +% And finally, the web address is printed in teletype font +% (LetterHead\slash TeleType): +% \begin{macrocode} +\DeclareFixedFont\@lh@tt {OT1}{cmtt}{m}{n} {9} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ptsize} +% The following macro will be used later to decide which ``class +% layout'' file to load. +% \begin{macrocode} +\newcommand\@ptsize{} +% \end{macrocode} +% \end{macro} +% +% A couple of useful commands that are missing from the \LaTeX\ +% kernel; we leave this explicative comment in the code too. +% \begin{macrocode} +%% A couple of useful things that are missing from the LaTeX kernel: +% \end{macrocode} +% \begin{macro}{\@newrigidlength} +% The first is similar to "\newlength", but allocates a +% \textoken{dimen} rather than a \textoken{glue}. +% \begin{macrocode} +\@ifdefinable\@newrigidlength{\def\@newrigidlength#1{% + \@ifdefinable#1{\newdimen#1}% +}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@msetlength} +% The second can be used to say, for instance, +%\begin{verbatim} +%\@msetlength{\someRubberLength}{2}{\anotherRubberLength} +%\end{verbatim} +% to set "\someRubberLength" to twice the value of +% "\anotherRubberLength", without destroying the stretch and +% shrink components (recall that, on the contrary, +%\begin{verbatim} +%\setlength{\someRubberLength}{2\anotherRubberLength} +%\end{verbatim} +% only sets the \emph{natural length} of "\someRubberLength" to +% twice the \emph{natural length} of "\anotherRubberLength", and +% both the stretch and shrink components of "\someRubberLength" to +% zero). +% \begin{macrocode} +\@ifdefinable\@msetlength{\def\@msetlength#1#2#3{% + #1#3\multiply#1#2\relax +}} +% \end{macrocode} +% \end{macro} +% +% A number of counter, lengths, etc.\ are defined here, early in the code, to +% detect as soon as possible if any name conflicts with an already defined +% one. The idea was that, since the class is pretty long, it is better to +% avoid to discover near the end that it cannot be used because of a name +% that is already defined; but of course, with the speed of modern computers +% this is not at all a problem, so this is just more nonsense that should be +% eliminated. Presently, however, they are almost all listed here; for many +% of them, some explanations are given here, and a more precise description +% is deferred until the spot where the corresponding entity is used. +% +% \counterindex{letter} +% First, we introduce a counter to keep track of the number of letters +% produced. \textbf{Warning:} {\em this counter is used also for +% internal bookkeeping, so don't change its value unless you know what +% you are doing!} +% \begin{macrocode} +\newcounter{letter} +% \end{macrocode} +% +% \counterindex{emptyaddrlabels} +% The following five counters are used in connection with the +% address labels optionally printed at the end of a compiled file. +% The \cnt{emptyaddrlabels} counter holds the number of labels to +% leave blank when starting to print (the first sheet of) the address +% labels; this is useful if some labels on the same sheet have already +% been peeled off. +% \begin{macrocode} +\newcounter{emptyaddrlabels} +% \end{macrocode} +% \counterindex{addrlabelrows} +% A single sheet of address labels contains many labels. For example, +% in the well-known (in the U.S.) Avery 5352 format each sheet +% contains ten labels, organized in two columns and five rows. Other +% formats contain different number of rows and columns of labels. To +% cope with all these different formats, the number of rows and +% columns of labels is kept in two counters: \cnt{addrlabelrows} holds +% the number of rows +% \begin{macrocode} +\newcounter{addrlabelrows} +% \end{macrocode} +% \counterindex{addrlabelcolumns} +% and \cnt{addrlabelcolumns} holds the number of columns. +% \begin{macrocode} +\newcounter{addrlabelcolumns} +% \end{macrocode} +% \counterindex{label} +% The \cnt{addrlabelrows} and \cnt{addrlabelcolumns} counters are +% usually set once for all by the code provided in a suitable +% "\DeclareOption" declaration, as the result of the user's request of +% one of the options devoted to specifying the address label format +% (\opz{105x37labels}, etc.). In some exceptional circumstances, they +% can also be reset by the user, but even in this case, once set they +% are not changed any more. They are therefore not real ``counters'', +% but rather (style) parameters. The following two counters, instead, +% are ``real'', \emph{running} counters: they hold a running index +% which identifies the current label. The \cnt{label} counter holds +% the index of a label inside a given letter +% \begin{macrocode} +\newcounter{label}[letter] +% \end{macrocode} +% \counterindex{totallabel} +% while the \cnt{totallabel} counter holds the global index of a +% label, that is, the index of the label in the whole document. +% \begin{macrocode} +\newcounter{totallabel} +% \end{macrocode} +% It is possible that a single letter has more than one label +% associated, because sometimes letters are sent to more than one +% addressee. +% +% \counterindex{equation} +% \counterindex{footnote} +% \counterindex{mpfootnote} +% In our document class, the letter is the main unit in which the +% document is organized. Therefore, we want that equations, footnotes, +% and footnotes inside minipages be numbered within letters. +% \begin{macrocode} +\@addtoreset{equation}{letter} +\@addtoreset{footnote}{letter} +\@addtoreset{mpfootnote}{letter} +% \end{macrocode} +% +% \begin{macro}{\@lh@left@margin} +% The second type of parameters we are going to define are rigid lengths +% (\textoken{dimen}'s). The first two govern the position of the CDP\ seal +% with respect to the text margins (see also fig.~\ref{fig:plo} on +% page~\pageref{fig:plo}). More precisely, "\@lh@left@margin" is the +% horizontal distance from the left margin of text to the \emph{right} edge +% of the seal\ldots +% \begin{macrocode} +\@newrigidlength\@lh@left@margin +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@lh@right@margin} +% \ldots and "\@lh@right@margin" is the distance from the right edge of +% the rule found in the rightmost part of the letterhead to the right +% margin of text. +% \begin{macrocode} +\@newrigidlength\@lh@right@margin +% \end{macrocode} +% \end{macro} +% A couple of lenghts used as internal registers, to hold +% values that must be passed to certain macros---we shall explain +% their use when we come to it. +% \begin{macrocode} +\@newrigidlength\@block@inden +\@newrigidlength\@block@width +% \end{macrocode} +% \begin{macro}{\longindentation} +% The following are style parameters used to govern the typesetting +% of the addresses and of the signature. Some of them, in turn, are +% defined in terms of another, crucial style parameter, the so-called +% ``long indentation''; this is the length by which items that appear +% in the right-hand half of the letter should be indented: roughly, it +% is equal to half the value of "\textsize", but it can be fine-tuned +% at ``"\begin{document}"-time'' for better alignment with some parts +% of the letterhead. +% \begin{macrocode} +\@newrigidlength\longindentation +% \end{macrocode} +% \end{macro} +% \begin{macro}{\senderindentation} +% The amount by which the sender address should be indented: +% \begin{macrocode} +\@newrigidlength\senderindentation +% \end{macrocode} +% \end{macro} +% \begin{macro}{\senderwidth} +% The width of the column in which the sender address should be +% typeset: +% \begin{macrocode} +\@newrigidlength\senderwidth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addresseeindentation} +% The indentation\ldots +% \begin{macrocode} +\@newrigidlength\addresseeindentation +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addresseewidth} +% \ldots and column width for the addresse address: +% \begin{macrocode} +\@newrigidlength\addresseewidth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\signatureindentation} +% Indentation\ldots +% \begin{macrocode} +\@newrigidlength\signatureindentation +% \end{macrocode} +% \end{macro} +% \begin{macro}{\signaturewidth} +% \ldots and width for the signature: +% \begin{macrocode} +\@newrigidlength\signaturewidth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\signaturerulewidth} +% The width of the rule drawn by the ``factory'' definition of +% "\signaturerule" (which is backed up in "\CDPFactorySignatureRule"): +% \begin{macrocode} +\@newrigidlength\signaturerulewidth + \setlength\signaturerulewidth{5cm} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\foldedheight} +% There are macros that provide the ability to typeset letters that +% are going to be folded before being put into the envelopes; these +% macros ensure that no text is typeset astride of the folding. The +% vertical distance from the upper edge of the \emph{paper} (not of +% the text) to the folding is kept in "\foldedheight". A value of +% zero or less (\emph{e.g.}, $-"\maxdimen"$) prohibits folded letters: +% this can be useful for certain paper sizes, and for safety it is set +% here as the default. For paper sizes that allow folded letters, the +% actual value of "\foldedheight" is set by the code given in the +% relevant "\DeclareOption". +% \begin{macrocode} +\@newrigidlength\foldedheight + \setlength\foldedheight{-\maxdimen} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@folding@ht} +% In general, the default setting of "\foldedheight" provided by the +% option handling mechanism should be sufficient. However, the user +% is allowed to change the value of "\foldedheight", preferably in the +% preamble, but also in the document body, if a certain simple +% precaution is taken. This can be useful if one wants to alter the +% default behavior, \emph{e.g.}, to have letters that are two-folded +% rather then three-folded, or to allow folded letters also when using +% a paper format, like A5, that normally does not allow them. Useful, +% sure, but it rises a problem: the algorithm that decides where to +% split the text between the part that must go above the folding and +% the part that must go below it requires that the value of +% "\foldedheight" lie within a certain range. Obviously we cannot ask +% the user to know what range is acceptable, so we adopt the following +% solution: we define an ``internal backup'' of "\foldedheight", +% called "\@folding@ht" for historical reasons; then, the user is +% asked to call the macro "\checkfoldedheight" (see below) whenever +% (s)he changes the value of "\foldedheight"; this macro checks the +% new value and, if it is OK, copies it in the internal dimension +% "\@folding@ht" (actually, after some scaling conversions), otherwise +% it sets an internal flag which disables folded letters and issues a +% warning. A slight variant of "\checkfoldedheight", which differs +% only in the warning produced, is called automatically at the +% "\begin{document}", so the user is \emph{not} required to call +% "\checkfoldedheight" if the changes to "\foldedheight" are made in +% the preamble. +% \begin{macrocode} +\@newrigidlength\@folding@ht +% \end{macrocode} +% \end{macro} +% The following three dimensions will be described when we come to +% the point where they are used. +% \begin{macrocode} +\@newrigidlength\@lh@folding@ht +\@newrigidlength\@above@folding@margin +\@newrigidlength\@above@folding@shrink +% \end{macrocode} +% +% Now we pass to rubber lengths, \emph{i.e.}, \TeX's +% \textoken{skip}'s. The first two are something like internal +% registers used to pass certain style parameters back and forth +% between macros. +% \begin{macrocode} +\newlength\@block@space +\newlength\@block@andspace +% \end{macrocode} +% \begin{macro}{\@below@folding@skip} +% This is an internal style parameter which specifies the amount of +% vertical blank space that should be left, in folded letters, between +% the folding and the text that follows it. It can be redefined in +% packages or other classes, or, in an emergency, by the final user. +% It is a rubber length, but in this class it is assigned, as we shall +% see later, a value without stretch or shrink components. Note that +% the actual space left between the folding and the text will usually +% be greater than, or at most equal to, the value of +% "\@below@folding@skip", because lines of text are usually aligned to +% integer multiples of half the "\baselineskip". +% \begin{macrocode} +\newlength\@below@folding@skip +% \end{macrocode} +% \end{macro} +% +% The following ten (rubber) length are style parameters that affect +% the amount of vertical space left before and after certain building +% blocks, like addresses and signature. The user can freely change +% them with "\setlength". Note that all these spaces are added with +% "\addvspace", so only the largest one survives if two of them occur +% in a row. +% \begin{macro}{\aboveaddressvspace} +% The amount of vertical space above the sender's or addressee's +% address: +% \begin{macrocode} +\newlength\aboveaddressvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\andaddressvspace} +% The amount of vertical space between two consecutive addresses +% separated with "\and" or "\andcc": +% \begin{macrocode} +\newlength\andaddressvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\belowaddressvspace} +% The amount of vertical space below the sender's or addressee's +% address: +% \begin{macrocode} +\newlength\belowaddressvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\abovesubjectvspace} +% The amount of vertical space above the subject: +% \begin{macrocode} +\newlength\abovesubjectvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\presubjectvspace} +% The amount of vertical space between the text specified with +% "\presubject" (if any) and the main body of the subject: +% \begin{macrocode} +\newlength\presubjectvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\belowsubjectvspace} +% The amount of vertical space below the subject: +% \begin{macrocode} +\newlength\belowsubjectvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\abovesignaturevspace} +% The amount of vertical space above the signature: +% \begin{macrocode} +\newlength\abovesignaturevspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\abovesignatureshortvspace} +% The amount of vertical space above the signature when the +% \mbox{$*$-form} of the "\makesignature" command is used (this +% happens, for instance, when the \mbox{$*$-form} of the +% "\closing" command is used): +% \begin{macrocode} +\newlength\abovesignatureshortvspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\belowsignaturevspace} +% The amount of vertical space below the signature: +% \begin{macrocode} +\newlength\belowsignaturevspace +% \end{macrocode} +% \end{macro} +% \begin{macro}{\belowpresentationvspace} +% The amount of vertical space below the presentation as a whole +% (the presentation contains the sender address, the addressee +% address, and the optional subject); this also ends the block of +% these style parameters: +% \begin{macrocode} +\newlength\belowpresentationvspace +% \end{macrocode} +% \end{macro} +% +% Allocation of some other rigid lengths (\textoken{dimen}'s) +% follows: these concern the layout of the sheets of address +% labels that the user wants to employ. To save a few keystrokes, +% we define the "\do" macro to do the allocation and to initialize +% the value of the allocated length to zero. +% \begin{macrocode} +\def\do#1{\@newrigidlength #1\setlength #1\z@} +% \end{macrocode} +% Then we allocate and initialize the individual lengths. +% \begin{macro}{\addrlabelsleftmargin} +% This is the amount of horizontal space between the left edge of the +% sheet of address labels and the left edge of the leftmost column of +% labels on the sheet. +% \begin{macrocode} +\do\addrlabelsleftmargin +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabelstopmargin} +% This is the amount of vertical space between the top edge of the +% sheet of address labels and the top edge of the upper row of labels +% on the sheet. +% \begin{macrocode} +\do\addrlabelstopmargin +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabelshsep} +% This is the amount of horizontal space between two columns of labels +% on the sheet. +% \begin{macrocode} +\do\addrlabelshsep +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabelsvsep} +% This is the amount of vertical space between two rows of labels on +% the sheet. +% \begin{macrocode} +\do\addrlabelsvsep +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabelborder} +% Normally, you don't want to write into the labels starting from +% their physical border: you want to leave a little margin between the +% text inside the labels and their edges. The amount of margin is +% kept in this style parameter (sorry, no provision is made to specify +% different margins in the two directions). +% \begin{macrocode} +\do\addrlabelborder +% \end{macrocode} +% \end{macro} +% +% The following four lengths don't have reasonable default values, +% so they are not initialized here. The code for each individual +% address label option will initialize the first two, and the +% other two are computed later. +% \begin{macro}{\addrlabelwidth} +% The (horizontal) width of a single address label. +% \begin{macrocode} +\@newrigidlength\addrlabelwidth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabelheight} +% The (vertical) height of a single address label. +% \begin{macrocode} +\@newrigidlength\addrlabelheight +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabeltrimwidth} +% This is a computed value, that the user should regard as +% read-only: it is the width of a single address label +% ("\addrlabelwidth"), diminished by twice the width of the +% border ("\addrlabelborder"). +% \begin{macrocode} +\@newrigidlength\addrlabeltrimwidth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\addrlabeltrimheight} +% Analogous: "\addrlabelheight" diminished by twice +% "\addrlabelborder". This ends this block of code. +% \begin{macrocode} +\@newrigidlength\addrlabeltrimheight +% \end{macrocode} +% \end{macro} +% +% Now, we just declare a few names we are going to use. The idea +% is to trigger an error message if one of them is already defined. +% \begin{macro}{\@cdp@reserved} +% This is a reserved name that will be used as a +% ``general-purpose'' container, much like "\reserved@a", etc. +% \begin{macrocode} +\@ifdefinable\@cdp@reserved{} +% \end{macrocode} +% \end{macro} +% Miscellaneous names, we shall describe them in a more +% appropriate place. +% \begin{macrocode} +\@ifdefinable\@empty@block{} +\@ifdefinable\@beginlabels{} +\@ifdefinable\@beginlabelgroup{} +\@ifdefinable\@mlabel{} +\@ifdefinable\@endlabelgroup{} +\@ifdefinable\@endlabels{} +\@ifdefinable\startaddrlabel{} +\@ifdefinable\stopaddrlabel{} +\@ifdefinable\ifactuallabel{} +\@ifdefinable\ChosenMakeOpening{} +\@ifdefinable\ChosenMakeClosing{} +\@ifdefinable\ChosenMakeSignature{} +% \end{macrocode} +% +% \begin{macro}{\@lett@decl} +% We define a token register used to save declarations to execute +% when a letter begins (see below). +% \begin{macrocode} +\@ifdefinable\@lett@decl{\newtoks\@lett@decl} +% \end{macrocode} +% \end{macro} +% +% We finally arrive to something simple and clearly comprehensible. +% We initialize the addresses, the signature, etc. to empty strings. +% To do that, we define the "\do" macro as follows: +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\let#1\@empty}} +% \end{macrocode} +% \begin{macro}{\thesenderaddress} +% The address of the sender, \emph{including her/his name}: +% \begin{macrocode} +\do\thesenderaddress +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thesendername} +% The name of the sender (essentially, this is provided only for +% compatibility with the \packlass{letter} standard \LaTeX\ class): +% \begin{macrocode} +\do\thesendername +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thesendersignature} +% The signature of the sender: +% \begin{macrocode} +\do\thesendersignature +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thesenderlocation} +% The room number, etc., of the sender: +% \begin{macrocode} +\do\thesenderlocation +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thesenderphone} +% The phone number of the sender: +% \begin{macrocode} +\do\thesenderphone +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theaddresseeaddress} +% The complete address of the addressee, \emph{including her/his +% name, title, etc.}: +% \begin{macrocode} +\do\theaddresseeaddress +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theaddresseename} +% The name of the addressee (used in page headings): +% \begin{macrocode} +\do\theaddresseename +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thesubject} +% The subject of the letter: +% \begin{macrocode} +\do\thesubject +% \end{macrocode} +% \end{macro} +% +% There are also some internal macros that need to be initialized to +% "\@empty". +% \begin{macro}{\@subject@style} +% The subject can be typeset either in medium weight or in +% boldface. This is achieved by inserting the "\@subject@style" +% token in front of it: its default definition given here makes +% this token a no-op (no font attributes are changed), but the code +% that implements options like \opz{mediumsubject} or +% \opz{boldsubject} can "\let" this token be equal to, say, +% "\mdseries" or "\bfseries", to obtain the desired changes in the +% font attributes. If more than one attribute needed to be +% changed (\emph{e.g.}, if somebody wanted to define a +% \opz{bolditalicsubject} option), then "\def" should be used +% instead of "\let"; for instance, one would write +% \begin{verbatim}\def\@subject@style{\bfseries\itshape}\end{verbatim} +% We don't make "\@subject@style" a token register because the +% ``"\let" case'' is the most common. +% \begin{macrocode} +\do\@subject@style +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@signature@style} +% This is analogous to "\@subject@style", but for the signature. +% The code for the \opz{uprightsignature} option "\let"s it equal to +% "\upshape", and the code for the \opz{italicsignature} option to +% "\itshape". +% \begin{macrocode} +\do\@signature@style +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@place} +% The place where the letter is written: starting from version~0.34, +% this macro is used as the default value for the optional argument of +% "\@makeopening", "\makedate", etc. It is logically and functionally +% analogous to "\@date". +% \begin{macrocode} +\do\@place +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@cdp@begin@letter@hook} +% \changes{0.36d}{2018 Feb 08}{Name has been changed (it used to be +% \texttt{\protect\bslash @begin@letter@hook}) to avoid clash with +% a macro built by the \protect\packlass{etoolbox} package.}^^A +% This hook is executed when a letter starts, at the very end of the setup of +% the ``letter-making'' environment, just after the declarations stored in +% "\@lett@decl". It may prove useful in packages and derived classes, and in +% fact it is used by the \packlass{articoletteracdp} class. It is not a +% token register because it is envisioned that many independent segments of +% code will want to store tokens in it, and this can easily be achieved with +% the "\g@addto@macro" function, which requires that its argument be a macro, +% not a token register. In vers.~0.36d, the names of this hook and of the +% following one were changed to avoid a conflict with the \packlass{etoolbox} +% package.. +% \begin{macrocode} +\do\@cdp@begin@letter@hook +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@cdp@end@letter@hook} +% \changes{0.36d}{2018 Feb 08}{Same as +% \texttt{\protect\bslash @cdp@begin@letter@hook}.}^^A +% This is analogous to "\@cdp@begin@letter@hook", but is executed at the +% end of every ``letter-making'' environment, after its last page has +% been finished off and ejected, but before writing to the +% \filedir{.aux} file the information for the associated address labels. +% Note that there is another hook, called "\stopletter" and described +% later, which is executed \emph{before} ejecting the last page of +% the letter. +% \begin{macrocode} +\do\@cdp@end@letter@hook +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@begin@block@or@and@hook} +% Vers.~0.36: new hook used in "\@block@everypar" to support signature +% rules. +% \begin{macrocode} +\do\@begin@block@or@and@hook +% \end{macrocode} +% \end{macro} +% +% The following macros are defined only inside a \env{subject} +% environment. We want that they cause an error if used outside of that +% environment, but we also want to be sure that their names are not +% already defined. We achieve this by calling "\@ifdefinable", and +% then "\let"ting the relevant token be "\@undefined". +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\let#1\@undefined}} +\do\presubject +\do\registered +\do\registeredRR +% \end{macrocode} +% +% The following are integer (numeric) style parameters: they are +% initialized later, and contain several penalty values used to assist +% \TeX\ in choosing sightful and meaningful page breaks, and also for +% other purposes that will be explained later. For now we content +% ourselves with the simple allocation with "\newcount". +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\newcount#1}} +% \end{macrocode} +% The first five parameters are actually ``constants'' analogous to +% "\@lowpenalty", "\@medpenalty", and "\@highpenalty"; they are +% typically assigned very high penalty values, and their names all +% begin with "\@fold@" because they are used in connection with the +% algorithm that takes care of ``folded presentations'' (explained +% later). +% \begin{macrocode} +\do\@fold@basepenalty +\do\@fold@lowpenalty +\do\@fold@medpenalty +\do\@fold@highpenalty +\do\@fold@toppenalty +% \end{macrocode} +% The real style parameters begin here. Their values are assigned +% later, in various spots of the code; indeed, the values assigned +% vary according to certain circumstances, for example, they are +% changed from the default when a ``presentation'' is entered. +% We'll discuss all this later on. +% \begin{macro}{\@b@frompenalty} +% This is the penalty inserted at the beginning of a \env{sender} +% environment---the environment used to typeset the sender address. +% \begin{macrocode} +\do\@b@frompenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@i@frompenalty} +% This is the penalty inserted before additional sender addresses +% separated with "\and". +% \begin{macrocode} +\do\@i@frompenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@e@frompenalty} +% This is the penalty inserted at the end of a \env{sender} +% environment. +% \begin{macrocode} +\do\@e@frompenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@b@topenalty} +% This is the penalty inserted at the beginning of an +% \env{addressee} environment---the environment used to typeset the +% addressee address. +% \begin{macrocode} +\do\@b@topenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@i@topenalty} +% This is the penalty inserted before additional addressee addresses +% separated with "\and" or "\andcc". +% \begin{macrocode} +\do\@i@topenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@e@topenalty} +% This is the penalty inserted at the end of an \env{addressee} +% environment. +% \begin{macrocode} +\do\@e@topenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@b@subjpenalty} +% This is the penalty inserted at the beginning of a \env{subject} +% environment---the environment used to typeset the subject. +% \begin{macrocode} +\do\@b@subjpenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@e@subjpenalty} +% This is the penalty inserted at the end of a \env{subject} +% environment. +% \begin{macrocode} +\do\@e@subjpenalty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@e@prespenalty} +% This is the penalty inserted at the end of a presentation as a +% whole. +% \begin{macrocode} +\do\@e@prespenalty +% \end{macrocode} +% \end{macro} +% The following are two internal registers, used to pass penalty +% values back and forth between macros. +% \begin{macrocode} +\do\@i@penalty +\do\@e@penalty +% \end{macrocode} +% \begin{macro}{\@cdp@gencount} +% We also take the opportunity to define a general-purpose numeric +% register, used for short-term storage when needed. This ends the +% block of count registers. +% \begin{macrocode} +\do\@cdp@gencount +% \end{macrocode} +% \end{macro} +% +% Six internal switches are defined next. +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\newif#1}} +% \end{macrocode} +% \begin{macro}{\if@use@eepic@} +% The user can request, through the \opz{usePS} option, that the +% \packlass{eepic} package be used to trace the lines that make up the CDP\ +% seal, for better graphical result; the user's indication, however, will be +% honored only if the \packlass{eepic} package is available on the system (of +% course!). This switch is set to ``true'' if the \packlass{eepic} package +% is present and should be used. +% \begin{macrocode} +\do\if@use@eepic@ +% \end{macrocode} +% \end{macro} +% \begin{macro}{\if@do@fold@} +% This switch is ``true'' when folded letters are allowed, and +% ``false'' when they are shunned; the setting is made by the +% "\checkfoldedheight" command, and also at +% ``"\begin{document}"-time''. +% \begin{macrocode} +\do\if@do@fold@ +% \end{macrocode} +% \end{macro} +% \begin{macro}{\if@making@labels@} +% Prior to version~0.36, the code for generating the address labels (that +% had been copied from the standard \packlass{letter} class) wrote to the +% \filedir{.aux} file the data concerning the addresses even when no labels +% were being produced. This is totally useless. Starting from +% version~0.36, the following conditional has been introduced in order to +% avoid this. +% \begin{macrocode} +\do\if@making@labels@ +% \end{macrocode} +% \end{macro} +% \begin{macro}{\if@signature@rule@} +% True if a typeset signature should be surmounted by a ``signature rule'' +% intended to guide the signer's hand. New in vers.~0.36 (2015 Feb~08). +% \begin{macrocode} +\do\if@signature@rule@ +% \end{macrocode} +% \end{macro} +% The other two switches cannot be explained here. They are defined +% differently, without using "\newif", so that they are always changed +% "\global"ly. +% \begin{macrocode} +\@ifdefinable\if@new@block@{ + \def\@new@block@true {\global\let\if@new@block@\iftrue } + \def\@new@block@false{\global\let\if@new@block@\iffalse} +} +\@ifdefinable\if@empty@and@{ + \def\@empty@and@true {\global\let\if@empty@and@\iftrue } + \def\@empty@and@false{\global\let\if@empty@and@\iffalse} +} +% \end{macrocode} +% +% We need the following box registers to hold precompiled parts of +% the letterhead and of the footer. +% \begin{macro}{\@logo@box@base} +% This holds the main part of the CDP\ seal; more precisely, that part that +% appears both in the \ldots\sty{letterhead} and in the \sty{logo}\ldots page +% styles. +% \begin{macrocode} +\newsavebox\@logo@box@base +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@logo@box@addS} +% This holds the part of the CDP\ seal that should be added to the part +% contained in "\@logo@box@base" to obtain the seal as it appears in the +% \sty{logo}\ldots page styles. +% \begin{macrocode} +\newsavebox\@logo@box@addS +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@logo@box@addL} +% This holds the part of the CDP\ seal that should be added to the part +% contained in "\@logo@box@base" to obtain the seal embedded in the +% \ldots\sty{letterhead} page styles. +% \begin{macrocode} +\newsavebox\@logo@box@addL +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@oordinamento@box} +% This holds the writing ``oordinamento dei Dottorandi di Padova'' +% that appears in the letterhead, with the initial~``C'' being +% supplied by the seal. +% \begin{macrocode} +\newsavebox\@oordinamento@box +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@name@and@WWW@box} +% This holds the footer used in the \sty{firstletterhead} and +% \sty{foldedletterhead} page styles, which contains the full name of +% the \emph{Coordinamento} and its web address. This ends the block +% of box registers, too. +% \begin{macrocode} +\newsavebox\@name@and@WWW@box +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\and} +% It is possible to specify several addresses (both for the sender +% and the addressee) as well as several signatures; the various parts +% are separated by "\and" commands. Strictly speaking, it is an error +% to expand the token "\and" anywhere but inside the \env{sender}, +% \env{addressee}, and \env{signatureenv} environments (the +% environments used to produce the sender address, the addressee +% address, and the signature, repectively); hence, the correct thing +% to do here would be to initialize "\and" to produce an error +% message, and then redefine it in the various environments, as +% required in each case. But alas, the code for \packlass{\letteracdp} +% is still incomplete, and this is one of the things I still have to +% finish: I don't know exactly how to handle a misplaced "\and", so, +% for now, I simply decide to ignore it. +% \begin{macrocode} +\let\and\relax +% \end{macrocode} +% Of course, this definition will be changed inside the +% abovementioned environments, where "\and" must have a special +% meaning. +% \end{macro} +% \begin{macro}{\andcc} +% Only inside an \env{addressee} environment, the token "\andcc" may +% be used in place of "\and" to separate addresses of persons to which +% the letter is sent as a carbon copy. Its default definition, +% however, is to act as "\and". +% \begin{macrocode} +\@ifdefinable\andcc{\def\andcc{\and}} +% \end{macrocode} +% \end{macro} +% +% We need to save the definitions, as initialized by the \LaTeX\ +% kernel, of a couple of macros. +% \begin{macro}{\m@kel@bel} +% Saved definition of "\makelabel". +% \begin{macrocode} +\@ifdefinable\m@kel@bel{\let\m@kel@bel\makelabel} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@vspace} +% Saved definition of "\vspace". +% \begin{macrocode} +\@ifdefinable\@@vspace{\let\@@vspace\vspace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@indent@pref} +% This is a multi-way switch used to implement the \opz{indent}, +% \opz{noindent}, etc.\ options, which govern the way in which +% paragraphs of letters (except~P.S.) are indented. The code associated +% with the various options "\let"s this token equal to one of the +% following keys, which will be interpreted later as specified: +% \begin{description} +% \item[F (for ``fixed indent'').] +% Set "\parindent" to one tenth of "\textwidth", with a threshold +% value of 2~pica (that is, "\parindent" will be at least 2~pica, even +% if this is more than one tenth of "\textwidth"). +% \item[N (for ``no ident'').] +% Set "\parindent" to 0~points. +% \item[L (for ``leave indent'').] +% The value of "\parindent" that was in effect outside of the +% current \ldots\env{letter}\ldots\ environment is retained. +% \item[O (sorry, I don't remember for what).] +% Set "\parindent" to the width of the last line of the salutation +% (\emph{i.e.}, the argument of "\opening" or "\makeopening"); if the +% salutation is not given, this is the same as~``F''. +% +% 2015 Feb~08 (v.~0.36): I~have conjectured that the choice of the +% letter~``O'' for this key could have been suggested by the initial of +% ``opening'', meaning, as it were, ``indent by the extent of the +% opening''; but I~cannot remember of having thought of that. +% \end{description} +% The default setting is the same as the one implied by the +% \opz{indent} option. +% \begin{macrocode} +\@ifdefinable\@indent@pref{\let\@indent@pref F} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\voidisOK} +% Sometimes, in a letter, you want to omit the sender or the +% addressee address, or the signature, and it is annoying to see a +% warning about an ``empty something'' that you left empty +% deliberately. For this reason, inside the environments that produce +% the addresses and the signature you are allowed to use the command +% "\voidisOK" to disable such warnings. The idea is that you say +% something like +%\begin{verbatim} +%\address{\voidisOK} +%\end{verbatim} +% when you want to declare that the address has intentionally be +% left void; when the address is actually typeset (and this happens +% inside an \env{addressee} environment), the command "\voidisOK" will +% be expanded, causing the warning to be suppressed. As for the +% command "\and", the right thing to do would be to define this +% command only inside the environments in which it can be used; but +% there are complications arising from the fact that the text +% specified inside an "\address" declaration can be expanded also at +% other times, for instance when typesetting the address labels. For +% this reason, we take the shortcut of "\let"ting this command equal +% to "\@empty", so that it will be ignored when it occurs out of place. +% (We do not "\let" it equal to "\relax" because the latter could +% confuse an "\ignorespaces"; on the contrary, "\@empty" disappears +% upon "\write" and "\mark" operations, and this is quite OK\@.) Where +% appropriate, "\voidisOK" will be redefined to achieve the desired +% effect. +% \begin{macrocode} +\@ifdefinable\voidisOK{\let\voidisOK\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subjectnamegap} +% If present, the subject of a letter is typeset with hanging +% indentation, preceded by the text contained in the command +% "\subjectname" and separated from it by a certain amount of +% horizontal white space: the width of this white space is specified +% by the "\subjectnamegap" macro. This is a macro and not a +% \textoken{dimen} register to allow the length to be specified in +% terms of the font-dependent units like ``em''. Of course, the +% hanging indentation includes this horizontal space; note, +% however, that if "\subjectname" is empty than the +% "\subjectnamegap" space is not taken into account. +% \begin{macrocode} +\newcommand*\subjectnamegap{.5em} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\closingindentation} +% As for the way of typesetting addresses, different countries have +% different uses about how to indent the closing of the letter: for +% instance, in Italy the closing is indented like any other, ordinary +% paragraph, whilst in anglo-saxon letters it is indented by the same +% amount by which the sender address is indented. To cope with this, +% the "\closingindentation" command is introduced, to hold the amount +% of indentation for the closing: its default definition is +% "\parindent", so that the closing is indented like an ordinary +% paragraph, but a ``letter-making'' environment can redefine it, +% if necessary. It is a command and not a length, because the +% value of "\parindent" can change, and actually does change, in +% the sequel. +% \begin{macrocode} +\newcommand*\closingindentation{\parindent} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\signaturealignment} +% Different countries have different conventions also about how the +% signature should be aligned; for instance, in the U.S. the +% signature is set ragged right, but with a hanging indentation equal +% to the hanging indentation of the sender address, which in the U.S. +% is printed on the right-hand half of the paper; in Italy, the +% signature is more or less centered between the margins, and if it +% contains more than one line, the lines are aligned at their +% midpoint. In order to accomodate the various conventions, the token +% "\signaturealignment" is inserted at the beginning of the +% \env{signatureenv} environment (the environment one uses to typeset +% the signature); it is the responsability of the surrounding +% \ldots\env{letter}\ldots\ environment to "\let" this token equal to +% "\raggedright", "\centering", etc., as required by the particular +% letter being produced. This makes it easy, for instance, to define +% an \env{asletter} (anglo-saxon letter) environment that prints +% letters that obey the U.S. conventions. The default setting given +% here has no special meaning: it just sets the signature ragged +% right. +% \begin{macrocode} +\newcommand*\signaturealignment{\raggedright} +% \end{macrocode} +% \end{macro} +% +% \subsection{Declaration of options} +% +% As a general rule, options pertaining to the same functional group +% are declared in reverse order of desirability, the default option of +% the group being declared last. This ensures that if more than +% one option of the same group is erroneously asked for by the +% user, the ``most desirable'' one (whatever this means) is +% executed last, thereby remaining in effect. +% +% We begin with the options that support the usual page formats. +% For each such option, the associated code sets appropriate values +% for the "\paperheight" and "\paperwidth" parameters. The code also +% sets the "\foldedheight" parameter, which, as explained above, +% contains the height at which the sheets of paper should be folded in +% order to put them into an envelope; this parameter is set to more or +% less one third of "\paperheight". For some paper formats, folding +% is not adequate: for them, folded letters are disabled by setting +% "\foldedheight" to $-"\maxdimen"$. +% \begin{macrocode} +\DeclareOption{executivepaper} + {\setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}% + \setlength\foldedheight{3.5in}} +\DeclareOption{legalpaper} + {\setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}% + \setlength\foldedheight{4.7in}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}% + \setlength\foldedheight{3.7in}} +\DeclareOption{b5paper} + {\setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}% + \setlength\foldedheight{-\maxdimen}} +\DeclareOption{a5paper} + {\setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}% + \setlength\foldedheight{-\maxdimen}} +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}% + \setlength\foldedheight{100mm}} +% \end{macrocode} +% +% The \opz{landscape} option is implemented as usual, by +% exchanging the values of "\paperheight" and "\paperwidth" (note that +% this option is executed after any one of the options that sets the +% paper dimensions); but we also disable folded letters by setting +% "\foldedheight" to $-"\maxdimen"$, because usually one does not want +% to fold a letter set in landscape orientation! +% \begin{macrocode} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}% + \setlength\foldedheight{-\maxdimen}} +% \end{macrocode} +% +% These are the usual options for setting the main font size: they are +% copied from the standard \LaTeX\ classes. See, \emph{e.g.}, the +% documentation of the standard \packlass{letter} class for +% explanations. +% \begin{macrocode} +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +% \end{macrocode} +% +% The way of implementing the \opz{oneside}\slash\opz{twoside} +% options is again copied from the \packlass{letter} standard \LaTeX\ +% class. +% \begin{macrocode} +\if@compatibility + \DeclareOption{twoside}{% + \@latexerr{No `twoside' layout for letters}\@eha + } +\else + \DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\fi +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +% \end{macrocode} +% +% The \opz{onecolumn}\slash\opz{twocolumn} options are not +% declared in the \packlass{letter} standard \LaTeX\ class, but I prefer +% to declare them. The \opz{twocolumn} options causes an error, +% because I have never seen letters typeset in two columns mode! +% \begin{macrocode} +\DeclareOption{twocolumn}{% + \@latexerr{No `twocolumn' layout for letters}\@eha +} +% \end{macrocode} +% The \opz{onecolumn} option is simply ignored, but it is +% declared, so that it is removed from the list of unused options. +% \begin{macrocode} +\DeclareOption{onecolumn}{} +% \end{macrocode} +% +% More options copied from the standard \LaTeX\ classes. +% \begin{macrocode} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{leqno}{\input{leqno.clo}} +\DeclareOption{fleqn}{\input{fleqn.clo}} +% \end{macrocode} +% +% Now we have four options for setting the way in which the subject +% of a letter (if present) and the signature are printed. As +% explained above, the setting is done by "\let"ting a conventional +% token equal to one of the usual NFSS commands used to set individual +% font attributes; if more than one attribute needed to be changed, +% "\def" would be used instead of "\let", but fortunately this is not +% necessary. +% +% Options for the subject: it can be set in boldface type\ldots +% \begin{macrocode} +\DeclareOption{boldsubject}{\let\@subject@style\bfseries} +% \end{macrocode} +% \ldots or in medium weight. +% \begin{macrocode} +\DeclareOption{mediumsubject}{\let\@subject@style\mdseries} +% \end{macrocode} +% +% Options for the signature: it can be set in italic shape\ldots +% \begin{macrocode} +\DeclareOption{italicsignature}{\let\@signature@style\itshape} +% \end{macrocode} +% \ldots or in upright (normal) shape. +% \begin{macrocode} +\DeclareOption{uprightsignature}{\let\@signature@style\upshape} +% \end{macrocode} +% +% Vers.~0.36 (2015 Feb~08): new option \opz{signaturerule} requests that +% each typeset signature be surmounted by a ``signature rule'' intended to +% guide the signer's hand. This, however, should not affect at all +% signatures contained in a \env{signatureenv*} environment, the variant of +% the \env{signatureenv} environment meant for situations in which the +% letter is not going to be signed by hand. +% \begin{macrocode} +\DeclareOption{signaturerule}{\@signature@rule@true} +% \end{macrocode} +% The \opz{nosignaturerule} option (also new in vers.~0.36) is the opposite +% of the above, and is the default. +% \begin{macrocode} +\DeclareOption{nosignaturerule}{\@signature@rule@false} +% \end{macrocode} +% \emph{Remark:} the ability to draw a rule for handwritten signatures has +% been explicitly requested by some users of the \Bundle, but I~deem the use +% of such feature questionable, since only pupils in primary school need +% rules to guide their writing. Nevertheless, this practice is admittedly +% ^^A ( paren match +% fairly common in the business world~:-), so it has now been supported. +% +% Next, we have the options used to tell whether PostScript commands, +% inserted by means of the \packlass{eepic} package, should be used, or not, +% to draw the CDP\ seal. Here we simply set the internal switch according to +% the user's request; if we later find that the \packlass{eepic} package is +% not available, we shall force the switch to false. +% \begin{macrocode} +\DeclareOption{usePS}{\@use@eepic@true} +\DeclareOption{noPS}{\@use@eepic@false} +% \end{macrocode} +% (These mean ``use PostScript'' and ``don't use PostScript'', +% respectively.) +% +% Cheer up! We are almost over! (Just with the options, of +% course!) We are now to the options for the paragraph +% indentation within letters. They are implemented by setting an +% internal multi-value switch to a conventional key; the meaning of +% the keys has already been explained above. +% \begin{macrocode} +\DeclareOption{smartindent}{\let\@indent@pref O} +\DeclareOption{shortindent}{\let\@indent@pref L} +\DeclareOption{noindent}{\let\@indent@pref N} +\DeclareOption{indent}{\let\@indent@pref F} +% \end{macrocode} +% +% The last three options deal with the format of the address +% labels. As already said, the format is specified by +% initializing a number of \textoken{dimen} parameters which +% specify the ``geometry'' of the sheet of address labels. Many +% of these parameters have a default value of 0~points: when this +% default is appropriate, the parameter is not re-initialized in +% the code given below. +% +% We support the Avery 5352 address labels only for compatibility +% with the standard \packlass{letter} class. I have never seen a sheet +% of these labels, and the code for the \opz{Avery5352labels} +% option simply assigns values to the parameters in a way that tries to +% imitate the geometry described by the code found in the +% \packlass{letter} class. +% \begin{macrocode} +\DeclareOption{Avery5352labels}{% +% \end{macrocode} +% We have 5~rows of labels. +% \begin{macrocode} + \setcounter{addrlabelrows}{5}% +% \end{macrocode} +% Each row contains 2~labels, \emph{i.e.}, we have two columns of +% labels. +% \begin{macrocode} + \setcounter{addrlabelcolumns}{\tw@}% +% \end{macrocode} +% The left edge of the leftmost column is 35~points to the left of +% the \TeX\ origin, which in turn is 1~inch from the left edge of +% the paper. +% \begin{macrocode} + \setlength\addrlabelsleftmargin{-35\p@}% + \addtolength\addrlabelsleftmargin{1in}% +% \end{macrocode} +% The top edge of the topmost row is 50~points above +% the \TeX\ origin, which in turn is 1~inch from the top edge of +% the paper. +% \begin{macrocode} + \setlength\addrlabelstopmargin{-50\p@}% + \addtolength\addrlabelstopmargin{1in}% +% \end{macrocode} +% The two columns are separated by 26~points. +% \begin{macrocode} + \setlength\addrlabelshsep{26\p@}% +% \end{macrocode} +% Labels are 262~points wide by 2~inches high. +% \begin{macrocode} + \setlength\addrlabelwidth{262\p@}% + \setlength\addrlabelheight{2in}% +} +% \end{macrocode} +% +% The code for the labels I had the opportunity to actually see and +% measure is more elegant, and fits more naturally into the scheme. +% The following is the setting for the 70\,$\times$\,37 labels (the +% dimensions are given in~mm). +% \begin{macrocode} +\DeclareOption{70x37labels}{% +% \end{macrocode} +% 8~rows of labels. +% \begin{macrocode} + \setcounter{addrlabelrows}{8}% +% \end{macrocode} +% 3~columns, \emph{i.e.}, 3~labels in each row. +% \begin{macrocode} + \setcounter{addrlabelcolumns}{\thr@@}% +% \end{macrocode} +% Labels are 70\,mm wide by 37\,mm high. +% \begin{macrocode} + \setlength\addrlabelwidth{70mm}% + \setlength\addrlabelheight{37mm}% +% \end{macrocode} +% We leave 6\,mm of margin between the border of the labels and the +% actual printing. +% \begin{macrocode} + \setlength\addrlabelborder{6mm}% +} +% \end{macrocode} +% The setting for the 105\,$\times$\,37 labels (the default) is +% similar. +% \begin{macrocode} +\DeclareOption{105x37labels}{% + \setcounter{addrlabelrows}{8}% + \setcounter{addrlabelcolumns}{\tw@}% + \setlength\addrlabelwidth{105mm}% + \setlength\addrlabelheight{37mm}% + \setlength\addrlabelborder{6mm}% +} +% \end{macrocode} +% +% \subsection{Option processing} +% +% Nothing special to note here. +% +% \emph{Begin to think (v.~0.34):} should I change the defaults as +% follows: \opz{boldsubject} in place of \opz{mediumsubject}, +% \opz{italicsignature} in place of \opz{uprightsignature}, +% \opz{shortindent} in place of \opz{indent}? +% +% Ver.~0.36 (2015 Feb~08): not yet determined to change the default options. +% Added \opz{nosignaturerule}. +% \begin{macrocode} +\ExecuteOptions{% + a4paper,10pt,oneside,onecolumn,final,% + mediumsubject,uprightsignature,nosignaturerule,noPS,indent,% + 105x37labels% +} +\ProcessOptions\relax +% \end{macrocode} +% +% \subsection{Package loading} +% +% In this version of the \Bundle, all the original code is +% put in the file \filedir{\letteracdp.cls}, so in the normal operating +% mode no packages need to be loaded. This will change in future +% releases: the code will be split among several packages, to allow +% the final user to request only some features and not the others; +% when this happens, this section will become much longer, in order to +% load all those packages. However, even now it could be necessary to +% require the \packlass{eepic} package, if the user specified the +% \opz{usePS} option. At this stage, the presence of this option can +% be tested for by means of the "\if@use@eepic@" switch. +% \begin{macrocode} +\if@use@eepic@ +% \end{macrocode} +% If the \packlass{eepic} package is not available, force the switch +% to false and warn the user. +% \begin{macrocode} + \IfFileExists{eepic.sty}{% + \RequirePackage{eepic}% + }{% + \@use@eepic@false + \ClassWarningNoLine{\@letteracdp}{% + Can't find the eepic package;\MessageBreak + option usePS ignored (converted to noPS)% + }% + }% +\fi +% \end{macrocode} +% +% \subsection{Main code} +% +% ^^A ( paren match +% OK, boys, until now we have just set up a few things; now the real +% fun begins.~\mbox{:-)} Oh, well, actually it will begin in a few lines: +% for now we have to do a little more bit of tedious work.~\mbox{:-(} +% ^^A ) paren match +% +% \subsubsection{More initializations} +% +% Some of the following initializations could have been put in the +% \emph{Initial code} section, but some others require that the code +% for the options have already been executed. +% +% \begin{macro}{\date} +% We redefine "\date" in order to make the changes to the date local +% instead of global: this is useful if one of the letters has a date +% which is different from the other ones. Since "\date" is a kernel +% command, an explicative comment is left in % the code too. +% \begin{macrocode} +%% Command \date redefined to make changes to date local. +\def\date#1{\def\@date{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\place} +% This command records the place where the letter is written (added +% in version~0.34): it is analogous to "\date". Starting from +% version~0.34, this should be used instead of the optional argument +% of "\opening", "\makedate", etc.\ (however, the optional argument of +% those commands may still be used, for compatibility). Note that the +% comma is added automatically, but only if the argument of "\place" +% is nonempty. +% \begin{macrocode} +\newcommand*\place[1]{% + \ifx \@empty #1\@empty % if #1 is empty + \let\@place\@empty + \else + \def\@place{#1,}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% Usual loading of the suitable \filedir{.clo} file; see the +% documentation of, \emph{e.g.}, the standard \packlass{letter} +% class for explanations about the following three lines of code. +% \begin{macrocode} +\input{size1\@ptsize.clo} +\setlength\lineskip{\p@} +\setlength\normallineskip{\p@} +% \end{macrocode} +% \begin{macro}{\baselinestretch} +% This command can be redefined by the final user to obtain +% double-spaced, triple-spaced, etc.\ output. See the +% \textsl{\LaTeX book} \cite[Subsection~C.3.2]{LaTeXbook}. +% \begin{macrocode} +\renewcommand*\baselinestretch{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\thelabel} +% The printed form of the \cnt{label} counter is changed to include +% also the number of the letter it refers to. Note that we do not +% change "\p@label" (the prefix used only when printing +% \emph{references} to the counter), but actually the command used to +% print the counter itself. +% \begin{macrocode} +\renewcommand*\thelabel{\theletter\@alph\c@label} +% \end{macrocode} +% \end{macro} +% +% The following are the usual constants used to represent typical +% penalty values; again, see the documentation of the standard +% classes. +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% We need five more constants of the same type, but with much +% higher penalty values. They are used in the algorithm that takes +% care of folded letters. +% \begin{macrocode} +\@fold@basepenalty 9000 +\@fold@lowpenalty 9101 +\@fold@medpenalty 9202 +\@fold@highpenalty 9303 +\@fold@toppenalty 9500 +% \end{macrocode} +% +% We now initialize the style parameters that contain the penalties +% inserted around the address blocks and the subject. This values +% will never be used in practice, because usually the address blocks +% and the subject are wrapped up in a \ldots\env{presentation} +% environment, and these environments completely redefine the values +% of these style parameters. The values given here will be used only +% when a \env{sender}, \env{addressee}, or \env{subject} environment +% is used without being wrapped in a presentation. These values allow +% a page break without penalty before each of the blocks and at the +% end of the subject, mildly discourage a break after the address +% blocks, and discourage rather strongly a break at an "\and" or +% "\andcc" token. +% \begin{macrocode} +\@b@frompenalty\z@ +\@i@frompenalty\@highpenalty +\@e@frompenalty\@lowpenalty +\@b@topenalty\z@ +\@i@topenalty\@highpenalty +\@e@topenalty\@lowpenalty +\@b@subjpenalty\z@ +\@e@subjpenalty\z@ +% \end{macrocode} +% Unlike the preceding ones, the following style parameter is not +% redefined elsewhere. It is the penalty inserted after +% presentations, and since a presentation typically ends with the +% subject, the following initialization seems quite natural. +% \begin{macrocode} +\@e@prespenalty\@e@subjpenalty +% \end{macrocode} +% +% \subsubsection{Page layout} +% +% The first thing one could begin to find interesting is the code +% for setting up the page layout. To help the reader to understand +% what is going on, fig.~\ref{fig:plo} summarizes the basic page +% layout parameters we are going to speak about.\footnote{If you are +% reading directly the comments in the \filedir{.dtx} file, instead of +% typesetting it with \LaTeX, you might find it difficult to follow +% the forthcoming discussion.} This figure shows the parameters used +% in the case of an A5~sheet of paper: this allows to fit the entire +% figure on the page without having to scale it. +% +% \begin{figure}[tbp] +% \centering +% \setlength{\unitlength}{1mm} +% \begin{picture}(108,200)(-10,0) +% \thinlines +% \put(-20,0) {\line(1,0){148}} +% \put(-20,210){\line(1,0){148}} +% \put(-20,0) {\line(0,1){210}} +% \put(128,0) {\line(0,1){210}} +% \put(10,185){\makebox(88,10)[bl]{\makebox[88mm][s]{^^A +% \kern -1cm +% \setlength\unitlength{.625mm}^^A +% \begin{picture}(32,16)(-3,7.87) +% \thinlines +% \put(8,16){\oval(10,10)[l]} +% \put(8,11){\line(0,1){10}} +% \put(9,11){\framebox(3,20){}} +% \put(18,16){\oval(10,10)[r]} +% \put(18,11){\line(0,1){10}} +% \put(14,1){\framebox(3,20){}} +% \thicklines +% \put(8,16){\oval(16,16)[l]} +% \put(8,8){\line(1,0){5}} +% \put(13,24){\line(1,0){10}} +% \put(8,16){\oval(14,14)[l]} +% \put(8,9){\line(1,0){5}} +% \put(13,23){\line(1,0){10}} +% \put(18,8){\line(1,0){10}} +% \put(18,9){\line(1,0){10}} +% \end{picture}^^A +% \fontencoding{OT1}\selectfont +% \lhnss oordinamento dei {\lhbss D}\kern-.033333em ottorandi di +% {\lhbss P}\kern-.1em adova\enspace\hrulefill\kern-1cm +% }}} +% \put(10,40){\makebox(88,130)[tl]{\begin{minipage}[t]{88mm} +% \vrule height 10pt depth 0pt width 0pt \relax +% Text text text text text text text text text text text text +% text text text text text text text text text text text text. +% \end{minipage}}} +% \put(10,25){\makebox(88,3.514598035146)[tl]{\parbox[t]{88mm}{^^A +% \setlength{\parfillskip}{0pt} +% \noindent\rule{0pt}{10pt}\kern-1cm\hrulefill\kern-1cm\par +% \setlength{\baselineskip}{11pt} +% \fontencoding{OT1}\selectfont +% \hbox to \hsize{\hss\lhrm +% Coordinamento dei Dottorandi e dei Dottori di Ricerca +% dell'Universit\`{a} di Padova^^A +% \hss} +% \hbox to \hsize{\hss +% \lhit World Wide Web:\/ +% \lhtt http://www.dei.unipd.it/\string~assdott/^^A +% \hss} +% }}} +% \linethickness{0.1pt} +% \put(-27,210){\line(1,0){17}} +% \put(-27,195){\line(1,0){125}} +% \put(-27,185){\line(1,0){142}} +% \put(-27,170){\line(1,0){142}} +% \put(-27,40) {\line(1,0){142}} +% \put(-27,25) {\line(1,0){142}} +% \put(10,25) {\line(0,1){192}} +% \put(98,25) {\line(0,1){192}} +% \put(20,185){\line(0,1){37}} +% \put(5,215) {\vector(1,0){5}} +% \put(10,215){\line(1,0){10}} +% \put(55,215){\vector(-1,0){35}} +% \put(55,215){\makebox(0,35)[br]{\strut\ttfamily\bslash @lh@left@margin}} +% \put(63,215) {\vector(1,0){35}} +% \put(63,215){\makebox(0,35)[bl]{\strut\ttfamily\bslash @lh@right@margin}} +% \put(98,215){\line(1,0){10}} +% \put(113,215){\vector(-1,0){5}} +% \put(108,25){\line(0,1){197}} +% \put(0,25) {\line(0,1){12}} +% \put(-5,30){\vector(1,0){5}} +% \put(0,30) {\line(1,0){10}} +% \put(45,30){\vector(-1,0){35}} +% \put(45,30){\makebox(0,35)[br]{\strut\ttfamily\bslash @lh@right@margin}} +% \put(-15,35){\vector(1,0) {15}} +% \put(-5,35) {\vector(-1,0){15}} +% \put(-10,35){\makebox(0,0)[b]{\strut $2\,\mbox{cm}$}} +% \put(-20,200){\line(0,1){22}} +% \put(-10,220){\vector(1,0) {30}} +% \put(10,220) {\vector(-1,0){30}} +% \put(0,220){\makebox(0,0)[b]{\strut $4\,\mbox{cm}$}} +% \put(128,200){\line(0,1){22}} +% \put(113,220){\vector(1,0) {15}} +% \put(123,220){\vector(-1,0){15}} +% \put(118,220){\makebox(0,0)[b]{\strut $2\,\mbox{cm}$}} +% \put(113,195){\vector(0,1) {15}} +% \put(113,200){\vector(0,-1){15}} +% \put(113,197.5){\makebox(0,0)[l]{ $2.5\,\mbox{cm}$}} +% \put(113,175){\vector(0,1) {10}} +% \put(113,180){\vector(0,-1){10}} +% \put(113,177.5){\makebox(0,0)[l]{ $1.5\,\mbox{cm}$}} +% \put(113,30){\vector(0,1) {10}} +% \put(113,35){\vector(0,-1){10}} +% \put(113,32.5){\makebox(0,0)[l]{${}\ge1.5\,\mbox{cm}$}} +% \put(113,10){\vector(0,1) {15}} +% \put(113,15){\vector(0,-1){15}} +% \put(113,12.5){\makebox(0,0)[l]{ $2.5\,\mbox{cm}$}} +% \put(-25,200){\vector(0,1) {10}} +% \put(-25,205){\vector(0,-1){10}} +% \put(-25,202.5){\makebox(0,0)[r]{$\mbox{\ttfamily\bslash topmargin}+1\,\mbox{in}$ }} +% \put(-25,189){\vector(0,1) {6}} +% \put(-25,191){\vector(0,-1){6}} +% \put(-25,190){\makebox(0,0)[r]{{\ttfamily\bslash headheight} }} +% \put(-25,175){\vector(0,1) {10}} +% \put(-25,180){\vector(0,-1){10}} +% \put(-25,177.5){\makebox(0,0)[r]{{\ttfamily\bslash headsep} }} +% \put(-25,100){\vector(0,1) {70}} +% \put(-25,110){\vector(0,-1){70}} +% \put(-25,105){\makebox(0,0)[r]{{\ttfamily\bslash textheight} }} +% \put(-25,30){\vector(0,1) {10}} +% \put(-25,35){\vector(0,-1){10}} +% \put(-25,32.5){\makebox(0,0)[r]{{\ttfamily\bslash footskip} }} +% \put(-10,100){\vector(1,0) {20}} +% \put(0,100) {\vector(-1,0){20}} +% \put(-5,100) {\makebox(0,0)[b]{\parbox[b]{4cm}{\centering +% \strut\texttt{\bslash oddsidemargin}\\ +% or\\ +% \texttt{\bslash evensidemargin}\\ +% ${}+1\,\mbox{in}$\strut +% }}} +% \put(48,100){\vector(1,0) {50}} +% \put(60,100){\vector(-1,0){50}} +% \put(54,100){\makebox(0,0)[b]{\strut\ttfamily\bslash textwidth}} +% \end{picture} +% \caption{Basic page layout parameters} +% \label{fig:plo} +% \end{figure} +% +% Before discussing the page layout parameters, let us make a brief +% digression to illustrate what we are trying to achieve and what +% difficulties we need to solve. We would like that the seal and +% certain other details of the letterhead and the footer appeared in +% fixed positions with respect to the physical edges of the sheet: +% fig.~\ref{fig:plo} shows these fixed distances, explicitly given in +% centimeters, among the others, indicated by their symbolic name. +% This rises a little problem: we want to typeset the letterhead and +% the footer as standard \LaTeX\ headers and footers, but the +% subroutine for the header or the footer installed with a +% "\ps@"\ldots\ declaration is called inside a box of width +% "\textwidth" and aligned with the main body of text. In other +% words, when typesetting the header, or the footer, one has no direct +% means to refer to the page boundaries: the only available reference +% points are the margins of the main body of text. For this reason, +% it is necessary to precompute the offset from the text margins of +% the various points that we want to appear in fixed positions. For +% instance, looking at fig.~\ref{fig:plo}: if we know that the left +% margin of the text runs exactly at \( 3\,\mbox{cm} \) from the left +% border of the sheet, and we want the left edge of the writing +% ``oordinamento dei Dottorandi di Padova'' to lie at exactly \( +% 4\,\mbox{cm} \) from this border, we need to set the +% "\@lh@left@margin" parameter to \( 1\,\mbox{cm} \), to indicate that +% the left edge of the writing should lie \( 1\,\mbox{cm} \) to the +% right of the left text margin. +% +% But this is only half of the story; the other half is best +% illustrated with an example. Suppose you are typesetting on A4~paper, +% using 10 points fonts (these are precisely the settings chosen by +% default). If you calculate the text margins and the text width +% following the recommendations given by the authors of \LaTeX\ for +% this particular combination of paper and font sizes, you will +% discover that the left margin of the main text runs at, say, \( +% 4.2\,\mbox{cm} \) from the left border of the sheet. (I~don't want +% to compute the exact value just now, since this is only an example, +% but I know that the actual value is very close to this, so the +% example is meaningful.) If, according to what we have just said, you +% set "\@lh@left@margin" to \( -0.2\,\mbox{cm} \), you will end with +% the writing ``oordinamento\ldots'' that fails to be aligned with the +% main text by just \( 2\,\mbox{mm} \)---which is awful to see. +% Clearly, in a case like this it is better to foresee that +% "\@lh@left@margin" is going to receive a small value, and to adjust +% the left margin of the main body of text to \( 4\,\mbox{cm} \), so +% that "\@lh@left@margin" can be set to \( 0\,\mbox{pt} \). This is +% just what the class does, and the final visual effect is, let +% me say, pretty good indeed\ldots +% +% To sum up, the strategy for setting the page layout parameters is +% the following: +% +% \begin{enumerate} +% +% \item\label{plostep1} +% Compute the main text width and margins according to usual \LaTeX\ +% recommendations. +% +% \item\label{plostep2} +% Figure out whether the margins computed in step~\ref{plostep1} fall +% too close to some of the points of the letterhead that we want to +% stay in fixed position, and, if it is so, adjust them so that they +% are exactly aligned with those positions. +% +% \item\label{plostep3} +% Allow the user to change the values computed in step~\ref{plostep2}, +% in case (s)he needs to set the margins to some special value. +% +% \item\label{plostep4} +% Compute the offset of those fixed points from one of the text +% margin (\emph{e.g.}, "\@lh@left@margin" in the example above), using +% whatever values for the margins are in effect after +% step~\ref{plostep3}, in such a way to be able to correctly position +% the abovementioned points using only the text margins as a reference. +% +% \end{enumerate} +% +% Of course, step~\ref{plostep3} occurs in the preamble; this means +% that step~\ref{plostep4} must be performed during the +% "\AtBeginDocument" hook. +% +% As already said, the fixed distances of the layout design are all +% shown in fig.~\ref{fig:plo}; from this distances, from the relations +% shown in the figure, and from the additional information that the +% main body of text should be horizontally centered between the edges +% of the sheet, it is possible to deduce the values of almost all the +% basic page layout parameters once the value for "\textwidth" has +% been (cleverly) chosen. Some of these parameters are readily +% readable: for instance, fig.~\ref{fig:plo} clearly states that +% "\headsep" should be equal to \( 1.5\,\mbox{cm} \); other parameters +% may require some computations, and may even not be completely +% determined: for instance, from the figure you see that \( +% "\topmargin"+"\headheight" = 2.5\,\mbox{cm}-1\,\mbox{in} \), but you +% cannot tell what the single values of "\topmargin" and "\headheight" +% are. In the last case, the inherent uncertainty does no harm, +% because the "\headheight" parameter is not used to position any +% graphical element of the letterhead: it suffices to ensure that it +% allows enough room for the other, ordinary running heads; in +% practice, that there is room for a line of text in the largest +% supported font size (\emph{i.e.}, 12~points). Setting "\headheight" +% to \( 1\,\mbox{cm} \) definitely satisfies this requisite, and has the +% nice additional aesthetic advantage that the virtual lines delimiting the +% head run exactly along the outer strokes of the ``C'' in the seal. +% (Note that decreasing or increasing the value of "\headheight" does +% not alter the dimensions of the seal: the dimensions of the seal are +% fixed, and the seal appears as a box of null width and height.) +% +% We shall now discuss the parameters shown in fig.~\ref{fig:plo} +% one by one. Of course, many of them are standard \LaTeX\ page +% layout parameters, and do not require particular explanations. +% +% The first decision I took was to locate the lower right corner of +% the seal in a fixed position \( 4\,\mbox{cm} \) across and \( +% 2.5\,\mbox{cm} \) down from the upper left corner of the page. The +% value of \( 4\,\mbox{cm} \) was chosen because it was twice the +% design width of the seal; $2.5$~is the golden section of~$4$. I then +% placed the upper margin of the main body of text \( 4\,\mbox{cm} +% \) from the upper edge of the paper. Also, the rule found to the +% right of the letterhead extends up to a distance of \( 2\,\mbox{cm} +% \) from the right edge of the paper; the rule of the footer is +% aligned with that of the letterhead on the right, and on the left it +% extends to a symmetric distance. From these fixed setting, one +% deduces the other parameters: let us see how. +% +% \begin{description} +% +% \renewcommand*\makelabel[1]{\hspace\labelsep\normalfont +% \texttt{\bslash #1}.} +% +% \item[textwidth] +% This parameter is first of all initialized in the standard +% \filedir{.clo} files: this ensures that the standard \LaTeX\ initial +% value is used (cf.~step~\ref{plostep1} above). Nevertheless, the +% value can be subsequently adjusted as explained in +% step~\ref{plostep2}, to achieve a better alignment with some points +% of the letterhead. +% +% \item[oddsidemargin] +% This is set to \( \frac{1}{2}("\paperwidth"-"\textwidth") - +% 1\,\mbox{in} \), to ensure that the main body of text is +% horizontally centered on the page. Note that \LaTeX\ measures +% "\oddsidemargin" from the \TeX\ origin, and not from the left edge +% of the paper. +% +% \item[evensidemargin] +% This is set equal to "\oddsidemargin". +% +% \item[@lh@left@margin] +% This is set to \( 4\,\mbox{cm}-"\oddsidemargin"-1\,\mbox{in} \); +% this setting is done at ``"\begin{document}"-time'' +% (cf.~step~\ref{plostep4} above), to allow the user to change +% "\oddsidemargin" in the preamble (cf.~step~\ref{plostep3} above). +% It can be useful to remark that the amount shown in +% fig.~\ref{fig:plo} is positive when measured according to the +% sign convention used internally by the code. +% +% \item[@lh@right@margin] +% This is set to \( 2\,\mbox{cm}-"\oddsidemargin"-1\,\mbox{in} \); +% this setting is done at ``"\begin{document}"-time'' +% (cf.~step~\ref{plostep4} above), to allow the user to change +% "\oddsidemargin" in the preamble (cf.~step~\ref{plostep3} above). +% It can be useful to remark that the amounts shown in +% fig.~\ref{fig:plo} are negative when measured according to the sign +% convention used internally by the code. +% +% \item[topmargin] +% This is set to \( 2.5\,\mbox{cm}-1\,\mbox{in} \) (because \LaTeX\ +% measures "\topmargin" from the \TeX\ origin, and not from the +% upper edge of the paper). +% +% \item[headheight] +% This is set to \( 1\,\mbox{cm} \). +% +% \item[headsep] +% This is set to \( 1.5\,\mbox{cm} \). +% +% \item[textheight] +% To avoid underfull "\vbox"es when typesetting pages that contain +% no glue besides the "\baselineskip" glue (that usually has no +% ability to stretch or shrink), it is highly recommendable to +% set "\textheight" to an integer number of text lines, that is, +% to set it to \( "\topskip" + n\cdot"\baselineskip" \), where +% $n$~is a natural number. We do this, choosing $n$ to be the +% largest natural number such that +% \begin{equation} +% "\topskip" + n\cdot"\baselineskip" \le "\paperheight"-8\,\mbox{cm} +% \mbox{.} +% \label{eq:textheight} +% \end{equation} +% +% \item[footskip] +% This is set to \( "\paperheight" - "\textheight" - +% 6.5\,\mbox{cm} \): this ensures that the baseline of the footer +% (along which the rule is traced) runs at \( 2.5\,\mbox{cm} \) +% from the bottom edge of the paper. +% +% \end{description} +% +% In the case of "\footskip", note that the baseline of the footer +% actually means\ldots\ the baseline of the footer! I mean, normal +% footers (like, for instance, page numbers) are typeset with the +% baseline at exactly \( 2.5\,\mbox{cm} \) from the bottom edge of the +% paper; but the footer containing the address of the +% \emph{Coordinamento} is treated differently, in that it is the +% horizontal rule which is aligned with the baseline. +% +% OK, after all this preliminary blather, we are now ready to return +% to the code. Since we have already given many explanations, the +% following comments will be rather terse. +% +% We begin to perform some of the initialization described above. +% \begin{macrocode} +\setlength\headheight{1cm} +\setlength\topmargin{1.5cm} +\addtolength\topmargin{-1in} +\setlength\headsep{1.5cm} +% \end{macrocode} +% The following settings pertaining to marginal notes and footnotes +% are simply copied from the standard \packlass{letter} class: we have +% no reason to change them. +% \begin{macrocode} +\setlength\marginparsep {11\p@} +\setlength\marginparpush{5\p@} +\setlength\footnotesep{12\p@} +\setlength{\skip\footins}{10\p@ plus 2\p@ minus 4\p@} +% \end{macrocode} +% +% Everything we have been saying above was for \LaTeXe\footnote{This +% term should no longer be used, however: what was once known as +% \LaTeXe\ has now become \LaTeX\ \emph{tout-court}.}. No attempt is +% made to support any users who happened to be still using the +% Palaeolithic \LaTeX~2.09: we simply honor the standard convention +% according to which certain basic page layout parameters must be set to +% fixed values in compatibility mode. Note that the alignment of +% those certain special points of the letterhead to fixed positions +% will still work even in this case, but the placement of the main +% body of text will be awful, in the best hypothesis. Note also that, +% in general, "\textheight" will not at all be of the form \( +% "\topskip" + n\cdot "\baselineskip" \). +% \begin{macrocode} +\if@compatibility + \setlength\oddsidemargin{53pt} + \setlength\evensidemargin{53pt} + \setlength\marginparwidth{90pt} + \setlength\textwidth{365\p@} + \setlength\textheight{505\p@} + \setlength\footskip{25\p@} +\else +% \end{macrocode} +% +% Very well, now that the have get rid of that bothersome +% parenthesis of compatibility mode, we can go on with our +% initialization code. We now take care of "\textwidth" and +% "\oddsidemargin". These parameters have already been initialized in +% a \filedir{.clo} file---and this was step~\ref{plostep1}, see above. +% Now we take care of step~\ref{plostep2}. Put +% \[ +% "\@tempdima" = \textit{total\_left\_margin} := +% {"\paperwidth"-"\textwidth"\over 2} +% \mbox{.} +% \] +% \begin{macrocode} + \setlength\@tempdima{\paperwidth} + \addtolength\@tempdima{-\textwidth} + \setlength\@tempdima{.5\@tempdima} +% \end{macrocode} +% If \( \textit{total\_left\_margin} < 3.25\,\mbox{cm} \), that is, +% if the left margin measured from the paper edge is too narrow, then +% we set "\oddsidemargin" to \( 3\,\mbox{cm} \), thereby aligning the +% left margin with the centre of the seal. +% \begin{macrocode} + \ifdim\@tempdima < 3.25cm % align to centre of logo + \setlength\oddsidemargin{3cm} +% \end{macrocode} +% If \( 3.25\,\mbox{cm} \le \textit{total\_left\_margin} < +% 4.5\,\mbox{cm} \), that is, if the left margin measured from the paper +% edge is sufficiently close to the predetermined position of the right +% edge of the seal, then we align the former to the latter, by +% setting "\oddsidemargin" to~\( 4\,\mbox{cm} \). +% \begin{macrocode} + \else\ifdim\@tempdima < 4.5cm % align to right edge of logo + \setlength\oddsidemargin{4cm} +% \end{macrocode} +% In all other cases, we set "\oddsidemargin" to the computed +% $\textit{total\_left\_margin}$. +% \begin{macrocode} + \else % keep the computed margin + \setlength\oddsidemargin{\@tempdima} + \fi\fi +% \end{macrocode} +% Whatever value we have set "\oddsidemargin" to, we reset +% "\textwidth" according to it. +% \begin{macrocode} + \setlength\textwidth{\paperwidth} + \addtolength\textwidth{-2\oddsidemargin} +% \end{macrocode} +% Of course, we must not forget to subtract \( 1\,\mbox{in} \) from +% "\oddsidemargin": we shall do this later. +% +% The following segment of code sets the width of marginal +% paragraphs (marginal notes). We first try to use up all the +% margin, leaving only a gap of "\marginparsep" (already +% initialized above) on the text side, and of \( 7\,\mbox{mm} \) +% from the paper edge. The latter should suffice with modern laser +% printers, but other printers might have more restrictive +% mechanical constraints that can affect their ability to print so +% close to the paper edge: let's hope everything works\ldots +% \begin{macrocode} + \setlength\marginparwidth{\oddsidemargin} + \addtolength\marginparwidth{-\marginparsep} + \addtolength\marginparwidth{-7mm} +% \end{macrocode} +% However, with some paper formats (\emph{e.g.}, with landscape +% orientation) the above setting may yield very wide marginal notes, +% which is undesirable. Therefore, if the value just set exceeds one +% third of "\textwidth", we cut it down to this value, provided that +% the latter is at least \( 90\,\mbox{pt} \). +% \begin{macrocode} + \setlength\@tempdima{.33333\textwidth} + \ifdim\marginparwidth > \@tempdima + \ifdim\@tempdima < 90pt\else + \setlength\marginparwidth{\@tempdima} + \fi + \fi +% \end{macrocode} +% +% All the main horizontal page layout parameters have been set. We +% can now convert "\oddsidemargin" into \TeX's coordinate system: we +% did not do this before to ease other computations. We also set +% "\evensidemargin". +% \begin{macrocode} + \addtolength\oddsidemargin{-1in} + \setlength\evensidemargin{\oddsidemargin} +% \end{macrocode} +% +% We turn now to vertical parameters. We set "\textheight" +% according to~\eqref{eq:textheight} and "\footskip" as stated above. +% First step: +% \[ +% "\@tempdima" = \textit{max\_desired\_text\_height} +% := "\paperheight"-8\,\mbox{cm} +% \mbox{.} +% \] +% \begin{macrocode} + \setlength\@tempdima{\paperheight} + \addtolength\@tempdima{-8cm} + \setlength\footskip{\@tempdima} +% \end{macrocode} +% Remove the first line, which is only "\topskip" high: +% \begin{macrocode} + \addtolength\@tempdima{-\topskip} +% \end{macrocode} +% Set "\textheight" to the largest possible integer multiple of +% "\baselineskip": +% \begin{macrocode} + \divide\@tempdima\baselineskip + \@tempcnta=\@tempdima + \setlength\textheight{\@tempcnta\baselineskip} +% \end{macrocode} +% Put in again the first line: +% \begin{macrocode} + \addtolength\textheight{\topskip} +% \end{macrocode} +% "\footskip" is still equal to \( "\paperheight"-8\,\mbox{cm} \); +% finish its initialization (cf.~above): +% \begin{macrocode} + \addtolength\footskip{-\textheight} + \addtolength\footskip{1.5cm} +% \end{macrocode} +% +% The following "\fi" goes with "\if@compatibility": +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macro}{\computelongindentation} +% As explained above, "\longindentation" is a parameter that should +% set to roughly half the value of "\textwidth", with optional +% fine-tuning for better graphical results. The setting is made +% by the "\computelongindentation" macro, which is available also +% to the final user: if (s)he alters the value of "\textwidth", +% then (s)he should also call this macro to update the value of +% "\longindentation". The macro takes care of all the necessary +% fine-tuning. +% \begin{macrocode} +\newcommand*\computelongindentation{% +% \end{macrocode} +% More precisely, "\longindentation" is set as follows: the first +% attempt is to set it equal to the width of the writing +% ``oordinamento dei Dottorandi di Padova'' ("\@oordinamento@box" +% is initialized below), because this makes for a great visual +% effect\ldots +% \begin{macrocode} + \setlength\@tempdima{\wd\@oordinamento@box}% + \setlength\longindentation{\@tempdima}% +% \end{macrocode} +% \ldots but this ideal value will only be retained if it falls within +% the closed range \( [\frac{1}{2}"\textwidth"-2.5\,\mbox{mm}, +% \frac{1}{2}"\textwidth"+12.5\,\mbox{mm}] \), that is, sufficiently +% close to \( \frac{1}{2}"\textwidth" \) (which is the case for the +% most common page formats, like \opz{a4paper}); otherwise, \( +% \frac{1}{2}"\textwidth" \) will be used. +% \begin{macrocode} + \addtolength\@tempdima{2.5mm}% + \ifdim\@tempdima<.5\textwidth + \setlength\longindentation{.5\textwidth}% + \else + \addtolength\@tempdima{-12.5mm}% + \ifdim\@tempdima>.5\textwidth + \setlength\longindentation{.5\textwidth}% + \fi + \fi +% \end{macrocode} +% A final check is also made to ensure that "\longindentation" falls +% within the closed range \( [\frac{4}{10}"\textwidth", +% \frac{6}{10}"\textwidth"] \). +% \begin{macrocode} + \ifdim\longindentation<.4\textwidth + \setlength\longindentation{.5\textwidth}% + \else\ifdim\longindentation>.6\textwidth + \setlength\longindentation{.5\textwidth}% + \fi\fi +} +% \end{macrocode} +% \end{macro} +% +% The following part of the code deals with initializations the have to be +% deferred until the "\begin{document}" hook. The most complex of these is +% the check about the "\foldedheight" parameter. Recall that this parameter, +% which is initialized to a default value by the code which handles the +% \ldots\opz{paper} options, can be altered by the user at any time, but has +% to be converted in an internal form afterwards; before making the +% conversion, we need to check that the value lies in the prescribed range. +% If this is not the case, we issue a warning and set the "\if@do@fold@" +% switch false: the "\@checkfoldedheight" macro, which will be defined below, +% takes care of this, and relies on the following two macros to provide two +% different types of warning. They take two arguments, used to customize the +% message that the user will see: argument "#1" should be either the word +% ``short'' or the word ``tall'', argument "#2" should contain text giving +% further help. +% +% In addition, the user can ``validate'' a new value assigned to +% "\foldedheight" at any point in the document, by means of the +% "\checkfoldedheight" command: this commands issues a warning also when the +% check is successful. +% +% \begin{macro}{\@folding@ht@warn} +% This macro is invoked when the value of "\foldedheight" is found +% to be wrong in the check that is made during the "\AtBeginDocument" +% hook. +% \begin{macrocode} +\@ifdefinable\@folding@ht@warn{\def\@folding@ht@warn#1#2{% + \ClassWarningNoLine{\@letteracdp}{% + \protect\foldedheight\space ignored: + it is too #1!\MessageBreak + (#2.)\MessageBreak + Folded letters will be shunned% + }% + \@do@fold@false +}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@folding@ht@NO} +% This macro is invoked when the value of "\foldedheight" is found to be +% wrong in a check being made by the "\checkfoldedheight" command. +% \begin{macrocode} +\@ifdefinable\@folding@ht@NO{\def\@folding@ht@NO#1#2{% + \ClassWarning{\@letteracdp}{% + Bad value of \protect\foldedheight: it is too #1!\MessageBreak + (#2.)\MessageBreak + Therefore, at present folded letters are _shunned_;\MessageBreak + warning issued% + }% + \@do@fold@false +}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@folding@ht@OK} +% The following, instead, is the macro used to inform the user that +% the value of "\foldedheight" is correct. It sets the "\if@do@fold@" +% switch to true, too. +% \begin{macrocode} +\@ifdefinable\@folding@ht@OK{\def\@folding@ht@OK{% + \ClassWarning{\@letteracdp}{% + Checked \protect\foldedheight, + current value is acceptable.\MessageBreak + Therefore, at present folded letters are _allowed_;\MessageBreak + warning issued% + }% + \@do@fold@true +}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@checkfoldedheight} +% This is the internal version of the macro that checks the value of +% "\foldedheight"; it is invoked both by the "\checkfoldedheight" command and +% by the check that is made during the "\AtBeginDocument" hook. The +% arguments have the following meaning: +% \begin{paramlist} +% \param +% command to execute if the value is bad (see below);\\ +% \param +% command to execute if the value is OK\ (takes no arguments). +% \end{paramlist} +% The command passed in~\#1 must take two arguments, as follow: +% \begin{paramlist} +% \param +% either the word ``short'' or the word ``tall'';\\ +% \param +% message giving additional information. +% \end{paramlist} +% Note that both "\@folding@ht@warn" and "\@folding@ht@NO" conform to this +% calling protocol. +% \begin{macrocode} +\@ifdefinable\@checkfoldedheight{\def\@checkfoldedheight#1#2{% +% \end{macrocode} +% To begin with, the value of "\foldedheight" must be positive in order for +% folded letters to be allowed. +% \begin{macrocode} + \ifdim\foldedheight>\z@ +% \end{macrocode} +% Values greater than \( \frac{6}{10}"\paperheight" \) are rejected as too +% large. +% \begin{macrocode} + \ifdim\foldedheight>.6\paperheight + #1{tall}{% + It must not exceed 0.6\protect\paperheight + }% +% \end{macrocode} +% "\@folding@ht" holds the height of the folded flap measured from the top +% margin \emph{of the text}. +% \begin{macrocode} + \else + \setlength\@folding@ht{\foldedheight}% + \addtolength\@folding@ht{-1in}% + \addtolength\@folding@ht{-\topmargin}% + \addtolength\@folding@ht{-\headheight}% + \setlength\@lh@folding@ht{-\@folding@ht}% + \addtolength\@folding@ht{-\headsep}% +% \end{macrocode} +% If the height of the folded flap measured from the top margin of the text +% is less than $2.5\,\mbox{cm}$, it is rejected as well as too small. +% \begin{macrocode} + \ifdim\@folding@ht<2.5cm + #1{short}{% + At least 2cm _of_text_ and 0.5cm of margin\MessageBreak + must be allowed above the folding% + }% +% \end{macrocode} +% Otherwise, the value of "\foldedheight" is acceptable. +% \begin{macrocode} + \else + \setlength\@above@folding@margin{1cm}% + \setlength\@above@folding@shrink{5mm}% + \setlength\@below@folding@skip{5mm}% + \dimen4 .5\baselineskip + \dimen@ \@folding@ht + \advance\dimen@ \@below@folding@skip + \advance\dimen@ -\topskip + \dimen@ii -\dimen@ + \divide\dimen@ \dimen4 + \count@ \dimen@ + \advance\dimen@ii \count@\dimen4% + \addtolength\@below@folding@skip{\dimen@ii}% + \addtolength\@folding@ht{-\@above@folding@margin}% +% \end{macrocode} +% Note that the command passed in~\#2 \emph{must} take care of setting the +% "\if@do@fold@" switch to ``true''. +% \begin{macrocode} + #2% +% \end{macrocode} +% End of "\ifdim\@folding@ht<2.5cm": +% \begin{macrocode} + \fi +% \end{macrocode} +% End of "\ifdim\foldedheight>.6\paperheight": +% \begin{macrocode} + \fi +% \end{macrocode} +% When \( "\foldedheight" \le 0 \), folded letters are silently shunned: +% \begin{macrocode} + \else + \@do@fold@false + \fi +}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\checkfoldedheight} +% This is the user-level command, for checking the value of "\foldedheight" +% at the user's request (as opposed to checking it at the "\AtBeginDocument" +% hook). +% \begin{macrocode} +\newcommand*\checkfoldedheight{% + \@checkfoldedheight\@folding@ht@NO\@folding@ht@OK +} +% \end{macrocode} +% \end{macro} +% +% Now we perform step~\ref*{plostep4} (see \hyperref[plostep4]{above}) of +% our ``strategy for setting the page layout parameters'': +% \begin{macrocode} +\AtBeginDocument{% + \setlength\@lh@left@margin{4cm}% + \addtolength\@lh@left@margin{-1in}% + \addtolength\@lh@left@margin{-\oddsidemargin}% + \setlength\@lh@right@margin{\@lh@left@margin}% + \addtolength\@lh@right@margin{-2cm}% +% \end{macrocode} +% This is the ``"\begin{document}"'' check for the value of "\foldedheight": +% it calls "\@folding@ht@warn" if the current value is bad, and simply sets +% the "\if@do@fold@" switch to ``true'' (without giving any warning) if it +% is~OK\@. +% \begin{macrocode} + \@checkfoldedheight\@folding@ht@warn\@do@fold@true + \let\@folding@ht@warn\@undefined +} +% \end{macrocode} +% +% \begin{macro}{\@oordinamento@box} +% \changes{0.36d}{2018 Feb 08}{Added selection of the OT1 font encoding to +% the code that presets the b/w version.}^^A +% The reason for typesetting this box here was (in 1999) to save compilation +% time. In version 0.36d, "\fontencoding{OT1}\selectfont" has been added. +% \begin{macrocode} +\sbox\@oordinamento@box{% + \fontencoding{OT1}\selectfont\@lh@nss + oordinamento dei {\@lh@bss D}\kern-.033333em ottorandi di + {\@lh@bss P}\kern-.1em adova\enspace +} +% \end{macrocode} +% \end{macro} +% Now that we know the width of "\@oordinamento@box", we can now compute the +% value of "\longindentation": +% \begin{macrocode} +\computelongindentation +% \end{macrocode} +% +% Uncommented code starts here. +% \begin{macrocode} +\newcommand*\standardvertspaces{% + \setlength\aboveaddressvspace {\medskipamount}% + \@msetlength\andaddressvspace {2}{\medskipamount}% + \@msetlength\belowaddressvspace {3}{\medskipamount}% + \setlength\abovesubjectvspace {\medskipamount}% + \setlength\presubjectvspace {\medskipamount}% + \@msetlength\belowsubjectvspace {3}{\medskipamount}% + \@msetlength\abovesignaturevspace {6}{\medskipamount}% + \setlength\abovesignatureshortvspace{\bigskipamount}% + \setlength\belowsignaturevspace {\bigskipamount}% + \@msetlength\belowpresentationvspace{3}{\medskipamount}% +} +\setlength\senderindentation {\z@} +\setlength\senderwidth {\textwidth} +\setlength\addresseeindentation{\z@} +\setlength\addresseewidth {\textwidth} +\setlength\signatureindentation{\z@} +\setlength\signaturewidth {\textwidth} +\standardvertspaces +% \end{macrocode} +% +% \subsubsection{Page styles} +% +% \begin{macrocode} +\newcommand*{\automark}{\let\@mkboth\markboth} +\newcommand*{\usermark}{\let\@mkboth\@gobbletwo} +\automark % default is to put page no. and addressee in the header +%% We need to change even the definition of the standard page styles. +\def\ps@empty{% + \let\@oddhead\@empty + \let\@evenhead\@empty + \let\@oddfoot\@empty + \let\@evenfoot\@empty +} +\def\ps@plain{% + \let\@oddhead\@empty + \let\@evenhead\@empty + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@firstpage{% + \let\@oddhead\@empty + \let\@evenhead\@empty + \let\@oddfoot\@first@foot + \let\@evenfoot\@centred@folio +} +\def\ps@foldedpage{% + \def\@oddhead{\hfill\@folding@tag}% + \let\@evenhead\@empty + \let\@oddfoot\@first@foot + \let\@evenfoot\@centred@folio +} +\def\ps@letterhead{% + \let\@oddhead\@cdp@head + \let\@evenhead\@empty + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@firstletterhead{% + \let\@oddhead\@cdp@head + \let\@evenhead\@empty + \let\@oddfoot\@cdp@foot + \let\@evenfoot\@centred@folio +} +\def\ps@foldedletterhead{% + \def\@oddhead{\@cdp@head\@folding@tag}% + \let\@evenhead\@empty + \let\@oddfoot\@cdp@foot + \let\@evenfoot\@centred@folio +} +\def\ps@logo{% + \def\@oddhead{\@cdp@logo\hfill}% + \let\@evenhead\@empty + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@headings{% + \automark + \let\@oddhead\@r@head + \let\@evenhead\@l@head + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@logoheadings{% + \automark + \def\@oddhead{\@cdp@logo\@r@head}% + \let\@evenhead\@l@head + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@myheadings{% + \usermark + \let\@oddhead\@r@head + \let\@evenhead\@l@head + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@logomyheadings{% + \usermark + \def\@oddhead{\@cdp@logo\@r@head}% + \let\@evenhead\@l@head + \let\@oddfoot\@centred@folio + \let\@evenfoot\@centred@folio +} +\def\ps@letterheadnpn{% + \let\@oddhead\@cdp@head + \let\@evenhead\@empty + \let\@oddfoot\@empty + \let\@evenfoot\@empty +} +\def\ps@logonpn{% + \def\@oddhead{\@cdp@logo\hfill}% + \let\@evenhead\@empty + \let\@oddfoot\@empty + \let\@evenfoot\@empty +} +\@ifdefinable\@centred@folio{\def\@centred@folio{% + \reset@font\hfil\thepage\hfil +}} +\@ifdefinable\@l@head{\def\@l@head{% + \reset@font\slshape\hfil\ignorespaces\leftmark\unskip\/\hfil +}} +\@ifdefinable\@r@head{\def\@r@head{% + \reset@font\slshape\hfil\ignorespaces\rightmark\unskip\/\hfil +}} +\@ifdefinable\@first@foot{\def\@first@foot{% + \reset@font + \raisebox{-24\p@}[\z@]{% + \hb@xt@\textwidth{% + \ifcase \@ptsize\relax + \normalsize + \or + \small + \or + \footnotesize + \fi + \thesenderlocation \hfill \thesenderphone + }% + }\hss +}} +% \end{macrocode} +% +% \begin{macro}{\@folding@tag} +% Invoked by the macros that implement the ``folded'' page styles, +% more precisely by those which draw the header, to draw the small sign +% that marks the point where the sheet should be folded. +% \begin{macrocode} +\@ifdefinable\@folding@tag{\def\@folding@tag{% + \if@do@fold@ + \raisebox{\@lh@folding@ht}[\z@][\z@]{% + \makebox[\z@][l]{% +% \end{macrocode} +% Vers.~0.36: new and more robust way of computing the horizontal position. +% \begin{macrocode} + \dimen@ \paperwidth + \advance \dimen@ -1in% + \advance \dimen@ -\oddsidemargin + \advance \dimen@ -\textwidth + \advance\dimen@ -1cm% +% \end{macrocode} +% End of change. +% \begin{macrocode} + \kern\dimen@ \vbox{% +% \end{macrocode} +% Vers.~0.36: change to support the new "\foldingtagrule" user-level command +% and the use of color. +% \begin{macrocode} + \color@begingroup + \foldingtagrule + \color@endgroup +% \end{macrocode} +% End of change. +% \begin{macrocode} + }% + }% + }% + \fi +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\foldingtagrule} +% Vers.~0.36 (2015 Feb~08): new command, redefinable by the user, +% to draw the tag. It permits customization of the latter. +% It should take up no vertical space in total +% (\emph{i.e.}, it should backspace). +% \begin{macrocode} +\newcommand*\foldingtagrule{% + \kern -.1\p@ + \hrule \@height .1\p@ \@depth .1\p@ \@width 5mm% + \kern -.1\p@ +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CDPFactoryFoldingTagRule} +% Back up of the above. Should \emph{not} be redefined! +% \begin{macrocode} +\@ifdefinable\CDPFactoryFoldingTagRule{ + \let \CDPFactoryFoldingTagRule = \foldingtagrule +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Macros for drawing the CDP\ seal} +% +% There are essentially two reasons for which I~cannot get rid of these: +% \begin{enumerate} +% \renewcommand*{\theenumi}{{\normalfont (\textit{\roman{enumi}})}} +% \renewcommand*{\labelenumi}{\theenumi} +% \item +% sentimental reasons; +% \item +% we must ensure that it is still possible to typeset the legacy +% documentation, which uses the letterhead of the \emph{Coordinamento}. +% \end{enumerate} +% In 1999, people of the \emph{Coordinamento} used the \Bundle\ on a variety +% of personal computers (mostly Macintoshes) that were often connected to +% printers lacking a PostScript interpreter; it was therefore essential that +% the CDP\ seal could be drawn relying exclusively on those capabilities of +% the \env{picture} environment that are implemented without having recourse +% to any particular driver (\emph{e.g.}, \texttt{dvips}). This had indeed +% been a fundamental principle in the design of the logotype. +% +% \begin{macro}{\@logo@box@base} +% This holds the main part of the CDP\ seal; more precisely, that part that +% appears both in the \ldots\sty{letterhead} and in the \sty{logo}\ldots page +% styles. +% \begin{macrocode} +\savebox\@logo@box@base[\z@][r]{\setlength\unitlength{.625mm}% + \begin{picture}(32,16)(-3,7.87)% + \put(8,16){\oval(10,10)[l]}% + \put(8,11){\line(0,1){10}}% + \put(9,11){\framebox(3,20){}}% + \put(18,16){\oval(10,10)[r]}% + \put(18,11){\line(0,1){10}}% + \put(14,1){\framebox(3,20){}}% + \thicklines + \put(8,16){\oval(16,16)[l]}% + \put(8,8){\line(1,0){5}}% + \put(13,24){\line(1,0){10}}% + \put(8,16){\oval(14,14)[l]}% + \put(8,9){\line(1,0){5}}% + \put(13,23){\line(1,0){10}}% + \end{picture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@logo@box@addS} +% This holds the part of the CDP\ seal that should be added to the part +% contained in "\@logo@box@base" to obtain the seal as it appears in the +% \sty{logo}\ldots page styles. +% \begin{macrocode} +\savebox\@logo@box@addS[\z@][r]{\setlength\unitlength{.625mm}% + \begin{picture}(32,16)(-3,7.87)% + \thicklines + \put(18,8){\line(1,0){8}}% + \put(18,9){\line(1,0){8}}% + \end{picture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@logo@box@addL} +% This holds the part of the CDP\ seal that should be added to the part +% contained in "\@logo@box@base" to obtain the seal embedded in the +% \ldots\sty{letterhead} page styles. +% \begin{macrocode} +\savebox\@logo@box@addL[\z@][r]{\setlength\unitlength{.625mm}% + \begin{picture}(32,16)(-3,7.87)% + \thicklines + \put(18,8){\line(1,0){10}}% + \put(18,9){\line(1,0){10}}% + \end{picture}% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@logo@overlay} +% Utility macro, that typesets the part of the logo that is common to the +% letterhead too. Note the final "\copy" primitive, that lacks its argument. +% \begin{macrocode} +\@ifdefinable\@logo@overlay{\def\@logo@overlay{% + \kern\@lh@left@margin + \copy\@logo@box@base \copy +}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@cdp@logo} +% This macro is invoked by "\ps@"\ldots\ macros to typeset the seal. +% \begin{macrocode} +\@ifdefinable\@cdp@logo{\def\@cdp@logo{% + \@logo@overlay\@logo@box@addS +}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@cdp@head} +% This macro is invoked by "\ps@"\ldots\ macros to typeset the letterhead. +% Note that it fills up the current horizontal box. +% \begin{macrocode} +\@ifdefinable\@cdp@head{\def\@cdp@head{% + \@logo@overlay\@logo@box@addL + \copy\@oordinamento@box \hrulefill \kern\@lh@right@margin +}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@name@and@WWW@box} +% This holds the footer used in the \sty{firstletterhead} and +% \sty{foldedletterhead} page styles, which contains the full name of +% the \emph{Coordinamento} and its web address. +% \changes{0.36d}{2018 Feb 08}{Added selection of the OT1 font encoding to +% the code that presets the b/w version.}^^A +% Vers.~0.36d: added "\fontencoding{OT1}\selectfont". +% \begin{macrocode} +\setbox\@name@and@WWW@box = \vtop{% + \baselineskip 11\p@ + \fontencoding{OT1}\selectfont + \hb@xt@\z@{\hss \@lh@rm\Coordinamento \hss}% + \hb@xt@\z@{% + \hss + \@lh@it World Wide Web:\/ + \@lh@tt \CoordinamentoWWW + \hss + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@cdp@foot} +% This macro is invoked by "\ps@"\ldots\ macros to typeset the footer +% associated with the letterhead. It draws a horizontal rule that runs along +% the baseline of the footer (the same baseline on which page numbers would +% lie) starting from a distance of $-"\@lh@right@margin"$ into the left +% margin and stopping at an equal distance into the right margin, and then +% appends under this rule the saved contents of "\@name@and@WWW@box", +% horizontally centered with "\hfil". +% \begin{macrocode} +\@ifdefinable\@cdp@foot{\def\@cdp@foot{% + \reset@font + \setlength\@tempdima{\textwidth}% + \addtolength\@tempdima{-2\@lh@right@margin}% + \hss\parbox[t]{\@tempdima}{% + \parfillskip\z@skip + \noindent\hrulefill\@@par + \baselineskip 11\p@ + \hb@xt@\hsize{\hfil\copy\@name@and@WWW@box\hfil}% + }\hss +}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{\textquotedblleft Letter-making\textquotedblright\ environments} +% +% We start with the commands that set the sender's data. +% +% \begin{macro}{\name} +% The sender's name (\emph{e.g.}, "\name{R.~J.~Drofnats}"). +% \begin{macrocode} +\newcommand*\name [1]{\def\thesendername{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\signature} +% The sender's signature (\emph{e.g.}, +% "\signature{R.~J.~Drofnats\\Professor}"). +% \begin{macrocode} +\newcommand \signature[1]{\def\thesendersignature{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\address} +% The sender's address, \emph{including} the name. +% \begin{macrocode} +\newcommand \address [1]{\def\thesenderaddress{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\location} +% The sender's location (\emph{e.g.}, floor, room number\ldots). +% \begin{macrocode} +\newcommand \location [1]{\def\thesenderlocation{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\telephone} +% The sender's telephone number. +% \begin{macrocode} +\newcommand*\telephone[1]{\def\thesenderphone{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makelabels} +% \changes{0.36}{2015 Feb 08}{Added new instruction +% \texttt{\protect\bslash @making@labels@true}.}^^A +% The "\makelabels" command now sets the "\if@making@labels@" switch. +% \begin{macrocode} +\newcommand*\makelabels{% + \@making@labels@true + \AtBeginDocument{% + \def\@beginlabels{\begin{labels}}% + \def\@beginlabelgroup{\begin{labelgroup}}% + \let\@mlabel\basemlabel + \def\@endlabelgroup{\end{labelgroup}}% + \def\@endlabels{\end{labels}}% + \if@filesw + \immediate\write\@mainaux{\string\@beginlabels}\fi}% + \AtEndDocument{% + \if@filesw\immediate\write\@mainaux{\string\@endlabels}\fi}} +\@onlypreamble\makelabels +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cleardoubleemptypage} +% Similar to "\cleardoublepage", but inserts pages with \sty{empty} page +% style. +% \begin{macrocode} +\newcommand*\cleardoubleemptypage{\par + \onecolumn + \if@twoside \ifodd\c@page \else + \thispagestyle{empty}\null\newpage + \fi\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@safe@space} +% This macro inserts \#1 in the current horizontal lists; if it contributes +% a (strictly) positive width, it also inserts~\#2. Usually \#1 is a +% certain string, and \#2 is a spacing command that one wants to emit (if +% and) only if the string is nonempty. +% \begin{macrocode} +\@ifdefinable\@safe@space{\def\@safe@space#1#2{% + \setbox\z@\hbox{\ignorespaces #1\unskip}% + \ifdim\wd\z@>\z@ + \unhbox\z@ #2% + \else + \unhbox\z@ + \fi +}} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{baseletter} +% \changes{0.31}{2001 Dec 01}{Reintroduced the first mandatory argument +% to hold local initializations.}^^A +% All the ``letter-making'' environments are based upon this one, which is +% the lowest-level one. Its purpose is to take the basic actions that are +% needed to begin and end every kind of letter. In this version of the code +% it takes two arguments (this has changed several times among different +% releases), which are meant to contain code that performs any custom +% initialization required by the higher-level environments (or by the user, +% if this environment is called directly by the user). The code passed +% in~"#1" is executed before the core initializations provided by +% "baseletter", but inside the group implied by this environment; the code +% passed in~"#2" is executed as the last thing (just before +% "\@cdp@begin@letter@hook"). Other arguments will be picked up by the +% "\x@baseletter" or "\y@baseletter" macro. +% \begin{macrocode} +\newenvironment{baseletter}[2]{% + #1% +% \end{macrocode} +% Save~"#2" in a token register for later execution: +% \begin{macrocode} + \@lett@decl{#2}% +% \end{macrocode} +% Obvious initializations; note that "\cleardoubleemptypage" calls +% "\onecolumn". +% \changes{0.36d}{2018 Feb 08}{Added \texttt{\protect\bslash global} before +% \texttt{\protect\bslash c@page\protect\bslash @ne}.}^^A +% Vers.~0.36d: added "\global" in front of "\c@page\@ne". +% \begin{macrocode} + \cleardoubleemptypage + \global\c@page\@ne + \refstepcounter{letter}% + \typeout{\lettername \space \number\c@letter}% + \interlinepenalty 200 % smaller than the TeXbook value + \parskip\medskipamount +% \end{macrocode} +% Set "\parindent" according to the option specified by the user. +% \begin{macrocode} + \ifx\@indent@pref L\else + \ifx\@indent@pref N% + \setlength\parindent{\z@}% + \else + \ifdim .1\textwidth>2pc + \setlength\parindent{.1\textwidth}% + \else + \setlength\parindent{2pc}% + \fi + \fi + \fi +% \end{macrocode} +% Continue initialization in two different ways, according to the +% presence or not of the first optional argument. +% \begin{macrocode} + \@ifnextchar[\x@baseletter\y@baseletter % ] bracket matching +}{% +% \end{macrocode} +% Code for ending letters. "\stopletter" is a hook reserved to the +% user; it is executed \emph{before} the last page of the letter is +% finished off. +% \begin{macrocode} + \stopletter +% \end{macrocode} +% Now ensure vertical mode and add a zero-cost page break \emph{above} +% the vertical glue (possibly) present at the end of the page: this +% allows to discard the glue after the signature if this is needed to +% fit the letter in the page, even if "\stopbreaks" is in effect after +% the signature. Should this be a ``"-\@M"''-cost page break instead? +% +% (2015 Feb~08, vers.~0.36: definitely \emph{no}, since that would stretch +% out the last page of the letter! It was fortunate we didn't dare change +% it in previous releases!) +% \begin{macrocode} + \@@par\addpenalty\z@ + \clearpage +% \end{macrocode} +% The following is a hook reserved to extensions of the +% \packlass{letteracdp} class; it is used, for instance, by +% \packlass{articoletteracdp}. Note that it is executed \emph{after} +% ejecting the last page of the letter. +% \changes{0.36d}{2018 Feb 08}{Changed the name of the (former) +% \texttt{\protect\bslash @end@letter@hook} hook to +% \texttt{\protect\bslash @cdp@end@letter@hook}.}^^A +% (Vers.~0.36d: changed name, added \texttt{@cdp} prefix.) +% \begin{macrocode} + \@cdp@end@letter@hook +% \end{macrocode} +% Write to the \filedir{.aux} file the data for the address labels. +% This is rather tricky because we can have multiple addressees +% \emph{and} multiple senders +% \changes{0.36}{2015 Feb 08}{Added check for the +% \texttt{\protect\bslash if@making@labels@} switch before writing to the +% \protect\filedir{.aux} file unneeded information for generating the +% address labels.}^^A +% (v.~0.36: note the new check for "\if@making@labels@", in order to write +% to the \filedir{.aux} file the information about the address labels +% only when it is actually needed). +% \begin{macrocode} + \if@filesw \if@making@labels@ + \begingroup +% \end{macrocode} +% Ensure that "\\", "~" and "\protect"'ed tokens are written literally +% instead of being expanded: +% \begin{macrocode} + \let\\\relax + \let ~\relax + \let\protect\@unexpandable@protect +% \end{macrocode} +% ^^A { brace match +% The following hack causes "\and" (and "\andcc") to expand into +% ``"}\@gobble{"''. +% ^^A } brace match +% \begin{macrocode} + \def\and{% + \iffalse{\fi}\expandafter\@gobble\expandafter{\iffalse}\fi + }% + \let\andcc\and +% \end{macrocode} +% "\returnaddress" contains the addresses of the senders, separated by +% "\and"; thanks to the above hack, only the first is saved into +% "\@cdp@reserved", and the others are "\@gobble"'d. +% \begin{macrocode} + \edef\@cdp@reserved{{\returnaddress}}% +% \end{macrocode} +% We now cope with "\and"'s and "\andcc"'s inside "\theaddresseeaddress": +% we write them to the \filedir{.aux} file as +% ^^A { brace match +% ``"}"\,\meta{LF}\,"\@mlabel{"^^A +% \( \langle\mbox{\itshape expansion of\/ } "\@cdp@reserved"\,\rangle \)^^A +% "}{"'', +% ^^A } brace match +% \emph{i.e.}, for what we have just said, as +% ^^A { brace match +% ``"}"\,\meta{LF}\,"\@mlabel{"\meta{address of 1st~sender}"}{"''. +% ^^A } brace match +% \begin{macrocode} + \def\and{% + \iffalse{\fi}^^J% + \string\@mlabel{\@cdp@reserved}{\iffalse}\fi + }% + \let\andcc\and +% \end{macrocode} +% We are now ready to write out the correct sequence of commands, +% \emph{e.g.}: +% \begingroup +% \fontsize{9}{11}\selectfont +% \zerolistvertspaces +% \begin{flushleft} +% "\@beginlabelgroup"\\ +% "\@mlabel{"\meta{1st sender}"}{"\meta{1st addressee}"}"\\ +% "\@mlabel{"\meta{1st sender}"}{"\meta{2nd addressee}"}"\\ +% "\@mlabel{"\meta{1st sender}"}{"\meta{3rd addressee}"}"\\ +% \ldots\\ +% "\@endlabelgroup"\\ +% \end{flushleft} +% \endgroup +% \begin{macrocode} + \immediate\write\@auxout{% + \string\@beginlabelgroup ^^J% + \string\@mlabel + {\@cdp@reserved}{\theaddresseeaddress}^^J% + \string\@endlabelgroup + }% + \endgroup +% \end{macrocode} +% Vers.~0.36: note the additional "\fi" to go with the new +% "\if@making@labels@". +% \begin{macrocode} + \fi \fi +} +% \end{macrocode} +% \end{environment} +% +% Back to uncommented code. +% \begin{macrocode} +\@ifdefinable\x@baseletter{\long\def\x@baseletter[#1]#2{% + \def\theaddresseename{#1}% + \def\theaddresseeaddress{#2}% + \@baseletter +}} +\@ifdefinable\y@baseletter{\long\def\y@baseletter#1{% + \@cut@andcc #1\andcc\@@@ + \def\theaddresseeaddress{#1}% + \@baseletter +}} +\newcommand\@baseletter[1][]{% + \def\thesubject{#1}% + \if@twoside + \@mkboth{% + \noexpand\@safe@space\noexpand\headtoname\noexpand\enspace + \ignorespaces\theaddresseename\unskip \hfill \noexpand\@date + }{% + \noexpand\@date \hfill + \noexpand\@safe@space\noexpand\headtoname\noexpand\enspace + \ignorespaces\theaddresseename % \unskip put by \@?@head + }% + \else + \@mkboth{}{% + \noexpand\@safe@space\noexpand\headtoname\noexpand\enspace + \ignorespaces\theaddresseename\unskip \hfill \noexpand\@date + }% + \fi + \the\@lett@decl + \@cdp@begin@letter@hook +} +\@ifdefinable\@cut@andcc{\long\def\@cut@andcc#1\andcc#2\@@@{% + \@cut@and #1\and\@@@% +}} +\@ifdefinable\@cut@and{\long\def\@cut@and#1\and#2\@@@{% + \@cut@nl #1\\\@@@% +}} +\@ifdefinable\@cut@nl{\long\def\@cut@nl#1\\#2\@@@{% + \@cut@par #1\par\@@@% +}} +\@ifdefinable\@cut@par{\long\def\@cut@par#1\par#2\@@@{% + \def\theaddresseename{#1}% +}} +\newcommand*\stopbreaks{% + \interlinepenalty\@M + \def\par{\ifvmode\else\@@par\nobreak\fi}% + \let\\\@nobreakcr + \let\vspace\@nobreakvspace +} +\DeclareRobustCommand\@nobreakvspace + {\@ifstar\@vspacer\@nobreakvspacex} +\@ifdefinable\@nobreakvspacex{\def\@nobreakvspacex#1{% + \ifvmode + \nobreak + \vskip #1% + \vskip\z@skip + \else + \@bsphack + \vadjust{\@restorepar + \nobreak + \vskip #1% + \vskip\z@skip + }% + \@esphack + \fi +}} +\@ifdefinable\@nobreakcr{\def\@nobreakcr{% + \@ifstar{\@normalcr*}{\@normalcr*}% +}} +\newcommand*\startbreaks{% + \interlinepenalty 200% + \let\par\@@par + \let\\\@normalcr + \let\vspace\@@vspace +} +\@ifdefinable\@par@stopbreaks{\def\@par@stopbreaks{% + \par\nobreak\stopbreaks +}} +\@ifdefinable\@@letter{\def\@@letter#1#2#3{% + \ifx#2N% + \renewcommand*\makepresentation{\makenormalpresentation}% + \renewenvironment*{presentation}{% + \normalpresentation + }{% + \endnormalpresentation + }% + \else\ifx#2F% + \renewcommand*\makepresentation{\makefoldedpresentation}% + \renewenvironment*{presentation}{% + \foldedpresentation + }{% + \endfoldedpresentation + }% + \fi\fi + \setlength\senderindentation {\z@}% + \setlength\senderwidth {#3}% + \setlength\addresseeindentation{#3}% + \setlength\addresseewidth {\textwidth}% + \addtolength\addresseewidth{-\addresseeindentation}% + \setlength\signatureindentation{.3\textwidth}% + \setlength\signaturewidth {.6\textwidth}% + \renewcommand*\closingindentation{\parindent} + \renewcommand*\signaturealignment{\centering}% + \standardvertspaces + \baseletter{}{% + #1% + }% +}} +\@ifdefinable\@letter{\def\@letter#1{% + \@@letter{\thispagestyle{#1}}% +}} +\newenvironment*{customletter}{% + \@@letter{}L% +}{\endbaseletter} +\newenvironment*{letter}{% + \@letter{firstpage}N{.5\textwidth}% +}{\endbaseletter} +\newenvironment*{foldedletter}{% + \@letter{foldedpage}F{.5\textwidth}% +}{\endbaseletter} +\newenvironment*{letter*}{% + \@letter{firstpage}N\longindentation +}{\endbaseletter} +\newenvironment*{foldedletter*}{% + \@letter{foldedpage}F\longindentation +}{\endbaseletter} +\newenvironment*{letterhead}{% + \@letter{firstletterhead}N\longindentation +}{\endbaseletter} +\newenvironment*{foldedletterhead}{% + \@letter{foldedletterhead}F\longindentation +}{\endbaseletter} +% \end{macrocode} +% +% \subsubsection{Addresses and subject} +% +% The addresses and the subject are not composed inside inner boxes: +% instead, they are constructed from ``blocks'' of lines, conveniently +% indented, that are contributed directly to the main vertical list. +% The correct indentation is achieved by a clever combination of "\parshape" +% and "\everypar". +% This unusual scheme was chosen with the intent of maintaining full control +% over the interline glue, but other, and simpler, ways to accomplish this +% are actually available (\emph{if} the interline glue is \emph{rigid}). +% +% \begin{macro}{\@block@parshape} +% This macro, invoked at every par., is responsible for setting the +% indentation. +% \begin{macrocode} +\@ifdefinable\@block@parshape{\def\@block@parshape{% + \parshape \@ne\@block@inden\@block@width +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@block@@everypar} +% The part of "\@block@everypar" that "\y@custom@block" uses directly. +% \begin{macrocode} +\@ifdefinable\@block@@everypar{\def\@block@@everypar{% + \parskip\z@skip + \@nobreakfalse \@minipagefalse % these are already \global + \@new@block@false \@empty@and@false % these too + \everypar{\@block@parshape}% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@block@everypar} +% Code executed when a block or an ``"\and"-section'' begins. +% \changes{0.36}{2015 Feb 08}{Added a hook, \texttt{\protect\bslash +% @begin@block@or@and@hook}.}^^A +% 2015 Feb~08 (v.~0.36): "\@begin@block@or@and@hook" added. +% \begin{macrocode} +\@ifdefinable\@block@everypar{\def\@block@everypar{% + \@block@parshape + \@block@@everypar + \@begin@block@or@and@hook +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@custom@block} +% General utility macro for generating blocks that, like address blocks, +% haven't got a label, but for which, in exchange, the indentation and the +% width can be set independently of one another. Parameters: +% \begin{paramlist} +% \param +% switch: \( \mbox{Y} = \mbox{add} \) space above and below, +% \( \mbox{N} = \mbox{don't} \) add it;\\ +% \param +% block indentation from left margin (\textoken{dimen});\\ +% \param +% block width (\textoken{dimen});\\ +% \param +% vertical space above block (\textoken{glue});\\ +% \param +% vertical space between ``"\and"-sections'' (\textoken{glue});\\ +% \param +% vertical space below block (\textoken{glue});\\ +% \param +% penalty for breaking before block;\\ +% \param +% penalty for breaking between ``"\and"-sections'';\\ +% \param +% penalty for breaking after block. +% \end{paramlist} +% \begin{macrocode} +\@ifdefinable\x@custom@block{\def\x@custom@block#1#2#3#4#5#6#7#8#9{% + \@custom@block#1#4#5#6#8#9% + \@block@inden #2% + \@block@width #3% + \def\voidisOK{\global\let\@empty@block\@empty}% + \everypar{\@block@everypar}% + \@@custom@block #7% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\y@custom@block} +% General utility macro for generating blocks that, just like the block of +% the subject, do have a label, but for which, in exchange, both the +% indentation and the width are deduced from the width of the label itself. +% \changes{0.36}{2015 Feb 08}{Added parameter for space after label.}^^A +% 2015 Feb~08 (v.~0.36): added new parameter for the amount of +% horizontal space after the label. Parameters now are: +% \begin{paramlist} +% \param +% switch: \( \mbox{Y} = \mbox{add} \) space above and below, +% \( \mbox{N} = \mbox{don't} \) add it;\\ +% \param +% label;\\ +% \param +% horizontal space after label (\textoken{dimen});\\ +% \param +% vertical space above block (\textoken{glue});\\ +% \param +% vertical space between ``"\and"-sections'' (\textoken{glue});\\ +% \param +% vertical space below block (\textoken{glue});\\ +% \param +% penalty for breaking before block;\\ +% \param +% penalty for breaking between ``"\and"-sections'';\\ +% \param +% penalty for breaking after block. +% \end{paramlist} +% \begin{macrocode} +\@ifdefinable\y@custom@block{\def\y@custom@block#1#2#3#4#5#6#7#8#9{% + \@custom@block#1#4#5#6#8#9% + \sbox\@labels{\normalfont\ignorespaces #2\unskip}% + % We use \@labels to save a box register. + \@block@inden\wd\@labels + \ifdim\@block@inden>\z@ + \advance \@block@inden #3\relax + \wd\@labels\@block@inden + \fi + \@block@width\textwidth \advance\@block@width -\@block@inden + \everypar{% + \parshape \tw@ \z@\textwidth \@block@inden\@block@width + \box\@labels + \@block@@everypar + }% + \@@custom@block #7% +}} +% \end{macrocode} +% \end{macro} +% +% Uncommented code. +% \begin{macrocode} +\@ifdefinable\@custom@block{\def\@custom@block#1#2#3#4#5#6{% + \if@inlabel \indent \fi + \let\par\@@par \par + \if@newlist \@noitemerr \fi + \let\makelabel\m@kel@bel + \@nobreakfalse + \@noskipsecfalse + \@totalleftmargin\z@ + \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip + \parfillskip\@flushglue + \ifx#1Y% + \parskip #2\relax + \ifdim\lastskip>\parskip + \parskip\z@skip + \else + \advance\parskip -\lastskip + \fi + \else + \parskip\z@skip + \fi + \parindent\z@ + \linewidth\textwidth + \hsize\textwidth + \@block@space #4% + \@block@andspace #3% + \@i@penalty #5% + \@e@penalty #6% + \stopbreaks + \@new@block@true \@empty@and@true +}} +\@ifdefinable\@@custom@block{\def\@@custom@block#1{% + \addpenalty #1% + \color@begingroup +}} +\def\end@custom@block#1{\par + \color@endgroup + \if@new@block@ + \@empty@block + \else + \if@empty@and@ + \@empty@and + \fi + \ifx#1Y% + \addpenalty\@e@penalty + \addvspace\@block@space + \fi + \fi + \everypar{}% +} +\newcommand*\makeandvspace{% + \addpenalty\@i@penalty + \addvspace\@block@andspace +} +\newcommand*\makeandcclabel[1][\andccname]{% + \makebox[\z@][r]{\normalfont\@safe@space{#1}\quad}% + \ignorespaces +} +\@ifdefinable\@block@nd{\def\@block@nd{\par + \if@empty@and@ + \@empty@and + \else + \makeandvspace + \fi + \@empty@and@true + \everypar{\@block@everypar}% +}} +\@ifdefinable\@empty@and{\def\@empty@and{% + \ClassWarning{\@letteracdp}{% + \protect\and\space with nothing inside% + }% +}} +\@ifdefinable\@empty@sender{\def\@empty@sender{% + \ClassWarning{\@letteracdp}{% + Empty sender address% + }% +}} +\@ifdefinable\@sender{\def\@sender#1{% + \let\@empty@block\@empty@sender + \let\and\@block@nd + \x@custom@block #1% + \senderindentation\senderwidth + \aboveaddressvspace\andaddressvspace\belowaddressvspace + \@b@frompenalty\@i@frompenalty\@e@frompenalty + \raggedright +}} +\newenvironment*{sender} {\@sender Y}{\end@custom@block Y} +\newenvironment*{sender*}{\@sender N}{\end@custom@block N} +\@ifdefinable\@empty@addressee{\def\@empty@addressee{% + \ClassWarning{\@letteracdp}{% + Empty addressee address% + }% +}} +\@ifdefinable\@addressee{\def\@addressee#1{% + \let\@empty@block\@empty@addressee + \let\and\@block@nd + \def\andcc{\@block@nd + \everypar\expandafter{\the\everypar + \makeandcclabel\relax + }% + }% + \x@custom@block #1% + \addresseeindentation\addresseewidth + \aboveaddressvspace\andaddressvspace\belowaddressvspace + \@b@topenalty\@i@topenalty\@e@topenalty + \raggedright +}} +\newenvironment*{addressee} {\@addressee Y}{\end@custom@block Y} +\newenvironment*{addressee*}{\@addressee N}{\end@custom@block N} +\@ifdefinable\@good@prsbj{\def\@good@prsbj#1{% + \@new@block@false \@empty@and@false + \let\presubject\@bad@prsbj + \vskip\parskip + \leftline{\normalfont\ignorespaces #1\unskip}% + \nobreak + \parskip\presubjectvspace +}} +\@ifdefinable\@bad@prsbj{\def\@bad@prsbj#1{% + \ClassError{\@letteracdp}{% + Misused \protect\presubject% + }{% + At the beginning of the subject of a letter + you can write something like\MessageBreak + \protect\presubject{A short phrase...} + in order to typeset "A short phrase..."\MessageBreak + just above the subject; but the \protect\presubject\space + command must come before\MessageBreak + any other text in the subject, + and it cannot be used twice.\MessageBreak + (If you are wondering where you used the + \protect\presubject\space command,\MessageBreak + recall that both \protect\registered\space and + \protect\registeredRR\space invoke + \protect\presubject.)\MessageBreak + The offending command will be ignored: + try to type \space <return> \space to proceed.% + }% +}} +% \end{macrocode} +% +% \begin{macro}{\@subject} +% Inner implementation of \env{subject}\slash\env{subject*} environments. +% \changes{0.36}{2015 Feb 08}{Now this macro passes +% \texttt{\protect\bslash subjectnamegap} as parameter~\#3 to +% \texttt{\protect\bslash y@custom@block}.}^^A +% 2015 Feb~08 (v.~0.36): now passes the "\subjectnamegap" macro +% as parameter~\#3 to "\y@custom@block", parameter added in this same +% version. +% \begin{macrocode} +\@ifdefinable\@subject{\def\@subject#1#2{% + \let\@empty@block\@empty + \y@custom@block #1% + {#2}\subjectnamegap + \abovesubjectvspace\z@skip\belowsubjectvspace + \@b@subjpenalty\@M\@e@subjpenalty + \let\presubject\@good@prsbj + \def\registered {\presubject{\registeredname}}% + \def\registeredRR{\presubject{\registeredRRname}}% + \everypar\expandafter{\the\everypar + \let\presubject\@bad@prsbj + }% + \@subject@style +}} +% \end{macrocode} +% \end{macro} +% +% Uncommented code. +% \begin{macrocode} +\newenvironment*{subject} [1][\subjectname] + {\@subject Y{#1}}{\end@custom@block Y} +\newenvironment*{subject*}[1][\subjectname] + {\@subject N{#1}}{\end@custom@block N} +\newcommand*\ifemptyblock{% + \if@new@block@ + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\@ifdefinable\@makesender{\def\@makesender#1{% + \begin{sender#1}\thesenderaddress\end{sender#1}% +}} +\newcommand*\makesender{% + \@ifstar{\@makesender *}{\@makesender {}}% +} +\@ifdefinable\@makeaddressee{\def\@makeaddressee#1{% + \begin{addressee#1}\theaddresseeaddress\end{addressee#1}% +}} +\newcommand*\makeaddressee{% + \@ifstar{\@makeaddressee *}{\@makeaddressee {}}% +} +\newcommand*\x@makesubject[1][\subjectname]{% + \begin{subject}[#1]\thesubject\end{subject}% +} +\newcommand*\y@makesubject[1][\subjectname]{% + \begin{subject*}[#1]\thesubject\end{subject*}% +} +\newcommand*\makesubject{\@ifstar\y@makesubject\x@makesubject} +% \end{macrocode} +% +% \subsubsection{Presentations} +% +% With this funny term we denote the initial part of a letter +% (addresses and the like). +% +% \begin{macro}{\@setup@pres} +% Code for setting up style parameters. +% \begin{macrocode} +\@ifdefinable\@setup@pres{\def\@setup@pres{% + \global\@topnum\z@ % prevents figures from going at top of page + \parskip\z@skip + \parindent\z@ + \@b@frompenalty \@M + \@i@frompenalty \@fold@toppenalty + \@e@frompenalty \@M + \@b@topenalty \@fold@toppenalty + \@i@topenalty \@fold@toppenalty + \@e@topenalty \@M + \@b@subjpenalty \@fold@toppenalty + \@e@subjpenalty \@M + \interlinepenalty\@M + \def\par{\ifvmode\else\@@par\penalty\@fold@toppenalty\fi}% + \let\\\@nobreakcr + \let\vspace\@nobreakvspace +}} +\newenvironment*{presentation}{% + \normalpresentation +}{% + \endnormalpresentation +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{normalpresentation} +% The environment for making a normal presentation: +% \begin{macrocode} +\newenvironment*{normalpresentation}{% + \cleardoublepage + \@setup@pres +}{% +% \end{macrocode} +% \changes{0.34}{2006 Jan 01}{At the end of the environment, changed +% \texttt{\protect\bslash par} into \texttt{\protect\bslash @@par}.}^^A +% Changed the following line from "\par" to "\@@par" (v.~0.34): +% \begin{macrocode} + \@@par + \addpenalty\@e@prespenalty + \addvspace\belowpresentationvspace +} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@nofoldwarning} +% Warning issued when folded presentations are not allowed: +% \begin{macrocode} +\@ifdefinable\@nofoldwarning{\def\@nofoldwarning{% + \ClassWarning{\@letteracdp}{% + The paper format you chose does not allow\MessageBreak + folded letters; making normal presentation.\MessageBreak + (Modify \protect\foldedheight\space in the preamble\MessageBreak + if you want to alter the default behavior.)\MessageBreak + Warning issued% + }% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{foldedpresentation} +% The environment for making a folded presentation, possibly +% splitting it into two parts: the part the actually fits in the folded +% flap, and the other, which is merged with the text below the +% folding. I~think it's better to include some comments here. +% \begin{macrocode} +\newenvironment*{foldedpresentation}{% +% \end{macrocode} +% Are folded letters currently allowed? +% \begin{macrocode} + \if@do@fold@ +% \end{macrocode} +% \emph{Yes.} First, ensure that we are at the beginning of a page; +% note that \emph{numbered} pages, here, are inserted if there is a gap +% to be filled. +% \begin{macrocode} + \cleardoublepage +% \end{macrocode} +% The contents of the presentation will be saved in "\box0": set up +% parameters, color support\ldots +% \begin{macrocode} + \setbox\z@\vbox\bgroup + \@setup@pres +% \end{macrocode} +% \changes{0.34}{2006 Jan 01}{Added setting of +% \texttt{\protect\bslash boxmaxdepth} at the beginning of the +% environment.}^^A +% Added the following line (v.~0.34), even if the depth of "\box0" +% will be checked later: +% \begin{macrocode} + \boxmaxdepth\maxdepth +% \end{macrocode} +% \ldots color support, we were saying\ldots +% \begin{macrocode} + \color@begingroup +% \end{macrocode} +% The reason for this "\penalty" will be explained later~($*$): +% \begin{macrocode} + \penalty-\@M +% \end{macrocode} +% \changes{0.34}{2006 Jan 01}{Removed a superfluous setting of +% \texttt{\protect\bslash prevdepth} from the beginning of the +% environment.}^^A +% Removed the following line (v.~0.34): we have no need to insert +% interline glue here, and it is even wrong to do it; we will insert the +% "\topskip" glue below with a trick (which, in any case, would remove +% the---incorrect---interline glue inserted here). Why did I include +% this redundant statement? +%\begin{verbatim} +%\prevdepth\z@ +%\end{verbatim} +% \begin{macrocode} + \else +% \end{macrocode} +% \emph{No.} Inform the user and substitute a normal presentation. +% \begin{macrocode} + \@nofoldwarning + \normalpresentation + \fi +}{% +% \end{macrocode} +% +% When the presentation ends, if we were making a folded +% presentation\ldots +% \begin{macrocode} + \if@do@fold@ +% \end{macrocode} +% \ldots finish off the box\ldots +% \begin{macrocode} + \@@par + \color@endgroup +% \end{macrocode} +% \ldots and save its "\prevdepth" for later. +% \begin{macrocode} + \global\dimen@i\prevdepth +% \end{macrocode} +% Insert the equivalent of "\foldingfilbreak[0]": if possible, the +% "\vsplit" that will later split the presentation should try to split +% it here (\emph{i.e.}, not to split it at all). +% \begin{macrocode} + \@f@ldingfilbreak\@fold@basepenalty +% \end{macrocode} +% But "\vsplit" might prefer to split the box at the implicit +% "\penalty-10000" inserted at its end; avoid this, since it would +% defeat the "\vfil" of "\@f@ldingfilbreak":\nobreak\space($**$) +% \begin{macrocode} + \vskip\maxdimen % "discourage" the break at the \penalty-10000 +% \end{macrocode} +% End of "\vbox". +% \begin{macrocode} + \egroup +% \end{macrocode} +% Now "\box0" contains the presentation, but it lacks the due +% "\topskip" glue atop. Of course, we could have inserted the +% equivalent (in normal circumstances) of the "\topskip" glue by +% setting \[ "\prevdepth" := "\topskip"-"\baselineskip" \] at the +% beginning of "\box0", but this does not work always, since it could +% insert the "\lineskip" glue instead. We are admittedly whimsical +% here, but, in order to achieve exactly the same result yielded by +% the "\topskip" glue machinery operated in the main vertical list, we +% use the following trick of "\vsplit"'ting "\box0" to \texttt{0pt}. +% A legal breakpoint exists for this: it is the "\penalty-10000" +% inserted above in~($*$)! This breakpoint comes first in "\box0" and +% it is mandatory, so the "\vsplit" operation will stop immediately +% (without consuming time); nothing will be actually split off, +% everything will remain in "\box0", but with "\splittopskip" glue +% added at the top! Moreover, although we set "\boxmaxdepth" inside +% "\box0", we check again for possible excess depth (can't figure out +% how it could creep in, however). So: +% \begin{macrocode} + \splitmaxdepth\maxdepth + \splittopskip\topskip + \setbox\tw@\vsplit\z@ to\z@ +% \end{macrocode} +% The real splitting of the presentation is done by the following +% "\vsplit": the baseline of the first line possibly remaining in +% "\box0" after the "\vsplit" must be at a distance of +% "\@below@folding@skip" from the folding, plus the "\parskip" glue +% and, of course, the normal interline glue (we are in mid-page now). +% \begin{macrocode} + \splittopskip\baselineskip + \advance\splittopskip\@below@folding@skip + \advance\splittopskip\parskip + \setbox\tw@\vsplit\z@ to\@folding@ht +% \end{macrocode} +% Now "\box2" contains the part of the presentation that does fit in the +% folded flap; we append this box to the page (actually, it is the first +% thing contributed since the "\cleardoublepage"). Since this box already +% includes "\topskip" glue at the top, we take redundant precautions to +% ensure that no such glue is added again here. +% \begin{macrocode} + {\topskip\z@skip \box\tw@ +% \end{macrocode} +% Thanks to the above setting of "\splitmaxdepth", we are sure that +% the depth of the previous box is small; so the following line will +% take us exactly on the edge of the fold, with null depth\ldots +% \begin{macrocode} + \baselineskip\@above@folding@margin \nobreak\null}% +% \end{macrocode} +% \ldots where we insert a costly, yet feasible breakpoint. +% \begin{macrocode} + \penalty\@highpenalty +% \end{macrocode} +% If everything fitted in the folded flap, nothing remained in +% "\box0". +% \begin{macrocode} + \ifvoid\z@ +% \end{macrocode} +% In that case, just leave appropriate blank space (the "\prevdepth" +% is already zero, so the interline glue of the following line will be +% correct). +% \begin{macrocode} + \vskip\@below@folding@skip +% \end{macrocode} +% Otherwise, take the part that did not fit out of "\box0"\ldots +% \begin{macrocode} + \else + \unvbox\z@ +% \end{macrocode} +% \ldots so it is now in the list of ``recent contributions'' +% ("\unvbox" does not exercise the page builder); remove the +% "\vskip\maxdimen" added in~($**$) just to fool "\vsplit", as well as +% the items added by the virtual "\foldingfilbreak[0]". +% \begin{macrocode} + \unskip % remove "\vskip\maxdimen" + \unpenalty % remove "\penalty\@fold@basepenalty" + \unskip % remove "\vskip \dimen@ plus 1fil minus ..." + \unskip % remove "\vskip -\skip@" + \unpenalty % remove "\penalty 10000" +% \end{macrocode} +% Now the list of ``recent contributions'' contains exactly what the +% user put in the presentation (and did not fit in the folded flap). +% Restore "\prevdepth" and conclude as if it were a normal +% presentation: this makes a perfectly seamless join with the +% following material, as if the folded presentation had been a normal +% one, extending down to this spot in the page. ^^A ( paren match +% Not bad, uhu?~:-) +% \begin{macrocode} + \prevdepth\dimen@i + \addpenalty\@e@prespenalty + \addvspace\belowpresentationvspace +% \end{macrocode} +% Ah, yes, also inform the user of what happened: +% \begin{macrocode} + \ClassWarning{\@letteracdp}{% + Some text that did not fit into the folded flap\MessageBreak + was moved into the main text below the folding;\MessageBreak + warning issued% + }% + \fi +% \end{macrocode} +% If we were not making a folded presentation, then conclude a +% normal one. +% \begin{macrocode} + \else + \endnormalpresentation + \fi +} +% \end{macrocode} +% \end{environment} +% +% Back to uncommented code. +% \begin{macrocode} +\newcommand*\iffoldedallowed{% + \if@do@fold@ + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} +\newcommand*\makepresentation{\makenormalpresentation} +\newcommand*\makenormalpresentation{% + \begin{normalpresentation}% + \makesender\relax + \makeaddressee\relax + \makesubject\relax + \end{normalpresentation}% +} +% \end{macrocode} +% +% \begin{macro}{\@f@ldingfilbreak} +% The ``upper half'' of "\@foldingfilbreak". +% \begin{macrocode} +\@ifdefinable\@f@ldingfilbreak{\def\@f@ldingfilbreak#1{% + \ifdim\prevdepth<\maxdepth + \dimen@ -\prevdepth + \else + \dimen@ -\maxdepth + \fi + \skip@ \lastskip + \nobreak + \vskip -\skip@ + \vskip \dimen@ \@plus 1fil\@minus \@above@folding@shrink + \penalty #1% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\@ifdefinable\@foldingfilbreak{\def\@foldingfilbreak#1#2{\par + \@f@ldingfilbreak#1% + \vskip -\dimen@ \@plus -1fil\@minus -\@above@folding@shrink + \vskip \skip@ + \addvspace{#2}% +}} +\@ifdefinable\@fold@getpen{\def\@fold@getpen#1{% + \ifcase #1 \@fold@basepenalty \or \@fold@lowpenalty + \or \@fold@medpenalty \or \@fold@highpenalty + \else \@fold@toppenalty \fi +}} +\newcommand*\foldingbreak[1][\z@]{% + \ifvmode + \penalty\@fold@getpen{#1}% + \else + \@bsphack + \vadjust{\penalty\@fold@getpen{#1}}% + \@esphack + \fi +} +\newcommand*\foldingfilbreak[1][\z@]{% + \@foldingfilbreak{\@fold@getpen{#1}}% +} +\newcommand*\makefoldedpresentation{% + \if@do@fold@ + \begin{foldedpresentation}% + \renewcommand*\makeandvspace{% + \@foldingfilbreak\@fold@medpenalty\andaddressvspace + }% + \makesender\relax + \@foldingfilbreak\@fold@medpenalty\z@skip + \if@new@block@ + \aboveaddressvspace \z@\@plus1fil\relax + \nointerlineskip\null\nobreak + \fi + \makeaddressee\relax + \@foldingfilbreak\@fold@lowpenalty\z@skip + \makesubject\relax + \end{foldedpresentation}% + \else + \@nofoldwarning + \makenormalpresentation + \fi +} +% \end{macrocode} +% +% \subsubsection{Date, salutation, signature, enclosures\ldots} +% +% This section should be reorganized, with commands listed in a more +% logical order: at present, they are rather mixed up. +% +% First comes the date. +% \begin{macrocode} +\@ifdefinable\@make@date{\def\@make@date#1#2#3{\par + \ifx#2Y% + \nobreak\medskip + \fi + \noindent\@safe@space{#1}\space\@date\par + \ifx#3Y% + \nobreak\medskip + \fi +}} +\newcommand*\makedate [1][\@place]{\@make@date{#1}NN} +\newcommand*\maketopdate [1][\@place]{\@make@date{#1}NY} +\newcommand*\makebottomdate[1][\@place]{\@make@date{#1}YN} +\@ifdefinable\@empty@signature{\def\@empty@signature{% + \ClassWarning{\@letteracdp}{% + Empty signature% + }% +}} +% \end{macrocode} +% +% Then, heaven knows why, the signature. +% +% \begin{macro}{\@signatureenv} +% Inner implementation of the \env{signatureenv}\slash\env{signatureenv*} +% environments. +% \changes{0.36}{2015 Feb 08}{Added support for \protect\opz{signaturerule} +% option.}^^A +% Added support for the \opz{signaturerule} option (vers.~0.36), exploiting +% the new ``hook'' "\@begin@block@or@and@hook", the gets executed whenever a +% signature is typeset. +% \begin{macrocode} +\@ifdefinable\@signatureenv{\def\@signatureenv#1{\par + \let\@empty@block\@empty@signature + \let\and\@block@nd + \if@signature@rule@ + \let \@begin@block@or@and@hook \@make@signature@rule + \fi + \x@custom@block Y% + \signatureindentation\signaturewidth + #1#1\z@skip + \@M\@M\@M + \signaturealignment\@signature@style +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@signatureenv} +% Ends a \env{signatureenv}\slash\env{signatureenv*} environment. +% \begin{macrocode} +\def\end@signatureenv{% + \end@custom@block N% not "Y" for efficiency +% \end{macrocode} +% The following line (also added, of course, in vers.~0.36) is not actually necessary ("\@begin@block@or@and@hook" +% has been set by "\@signatureenv" inside a group), but redundancy does not +% hurt. +% \begin{macrocode} + \let \@begin@block@or@and@hook \@empty + \addvspace\belowsignaturevspace +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{signatureenv} +% For signatures that include vertical space for handwriting. +% \begin{macrocode} +\newenvironment*{signatureenv}{% + \@signatureenv\abovesignaturevspace +}{% + \end@signatureenv +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{signatureenv*} +% For signatures that do \emph{not} include vertical space for handwriting; +% these should \emph{never} display a rule, and for this reason\ldots +% \begin{macrocode} +\newenvironment*{signatureenv*}{% +% \end{macrocode} +% \changes{0.36}{2015 Feb 08}{Taken care of always suppressing rules +% here.}^^A +% \ldots~we add the following line in vers.~0.36 (note that we are inside a +% group). +% \begin{macrocode} + \@signature@rule@false + \@signatureenv\abovesignatureshortvspace +}{% + \end@signatureenv +} +% \end{macrocode} +% \end{environment} +% +% Uncommented code. +% \begin{macrocode} +\@ifdefinable\x@msignature{\def\x@msignature#1{% + \begin{signatureenv#1}% + \ifx\thesendersignature\@empty + \thesendername + \else + \thesendersignature + \fi + \end{signatureenv#1}% +}} +\@ifdefinable\y@msignature{\def\y@msignature{% + \begin{signatureenv}% + \vskip\parskip \vskip\z@skip + \the\everypar + \end{signatureenv}% +}} +\newcommand*\makesignature{\@par@stopbreaks + \@ifstar{% + \x@msignature *% + }{% + \@ifnextchar -{% + \@firstoftwo\y@msignature + }{% + \x@msignature {}% + }% + }% +} +% \end{macrocode} +% +% \begin{macro}{\@make@signature@rule} +% Generate a fake, raised line, containing the rule. Added in vers.~0.36. +% \begin{macrocode} +\@ifdefinable\@make@signature@rule{\def\@make@signature@rule{% + \raisebox{\baselineskip}[0pt][0pt]{% + \signaturerule + }\\*[-\baselineskip]% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\signaturerule} +% User command to allow customization of the signature rule. +% Added in vers.~0.36. +% \begin{macrocode} +\newcommand*\signaturerule{% + \makebox[\signaturerulewidth]{% + \leaders \hrule \@height .1\p@ \@depth .1\p@ \hfill + }% +} +% \end{macrocode} +% \end{macro} +% +% Now it is the turn of the salutation (I~said the order isn't logical!). +% +% \begin{macro}{\makeopening} +% This command generates the sheer salutation. It comes in two flavors: +% \begin{description} +% \item[normal form:] +% "\makeopening{"\meta{text}"}"\\* +% typeset the \meta{text} as the salutation; +% \item[$+$-form:] +% "\makeopening+"\\* +% leave space for a handwritten salutation. +% \end{description} +% \begin{macrocode} +\newcommand*\makeopening{\par + \@ifnextchar +{\@firstoftwo\y@mopening}\x@mopening +} +% \end{macrocode} +% \end{macro} +% +% Uncommented code. +% \begin{macrocode} +\@ifdefinable\x@mopening{\def\x@mopening#1{% + \ifx\@indent@pref O% + \dimen@\prevdepth + \setbox\z@\vbox{\color@begingroup + \null + \prevdepth\dimen@ + \noindent\null\ignorespaces #1\par + \global\dimen@i\prevdepth + \color@endgroup}% + \setbox\tw@\vbox{% + \unvcopy\z@ + \setbox\z@\lastbox + \global\setbox\@ne\hbox{\unhbox\z@}% + }% + \ifdim\wd\@ne<2pc + \parindent 2pc\relax + \else\ifdim\wd\@ne>.4\textwidth + \parindent .1\textwidth\relax + \else + \parindent \wd\@ne + \fi\fi + \unvbox\z@ + \prevdepth\dimen@i + \else + \noindent\null\ignorespaces #1\par + \fi + \nobreak +}} +\@ifdefinable\y@mopening{\def\y@mopening{% + \@handwr@box\z@ \nobreak +}} +% \end{macrocode} +% +% \begin{macro}{\opening} +% Well-known command for opening a letter. In vers.~0.35, it, +% and related macros, have been completely reimplemented to support the +% "\OpeningSequence" feature. +% \begin{macrocode} +\newcommand*\opening{\par + \@ifnextchar +{\@firstoftwo\y@opening}\x@opening +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\y@opening} +% Implements the ``\mbox{$+$-form}'' of the "\opening" command (salutation +% written by hand): "\ChosenMakeOpening" should expand to ``"\y@mopening"''. +% \begin{macrocode} +\newcommand*\y@opening[1][\@place]{% + \@opening \y@mopening {#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@opening} +% Implements the normal form of the "\opening" command (with typeset +% salutation): "\ChosenMakeOpening" should expand to +% ``"\x@mopening{"\meta{contents of~\#2}"}"''. +% \begin{macrocode} +\newcommand*\x@opening[2][\@place]{% + \@opening{\x@mopening{#2}}{#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@opening} +% Prepare call to "\OpeningSequence", then call it. Parameters: +% \begin{paramlist} +% \param +% intended meaning of "\ChosenMakeOpening";\\ +% \param +% contents of optional argument of "\opening" (defaults to "\@place"). +% \end{paramlist} +% \begin{macrocode} +\@ifdefinable\@opening{\def\@opening#1#2{% +% \end{macrocode} +% Keep definition of "\ChosenMakeOpening" local. +% \begin{macrocode} + \begingroup + \def\ChosenMakeOpening{#1}% +% \end{macrocode} +% Invoke user-customizable opening sequence. +% \begin{macrocode} + \OpeningSequence{#2}% +% \end{macrocode} +% If the \opz{smartindent} option is in force, "\parindent" might have just +% been changed: this change must be ``lifted'' out of the group. +% \begin{macrocode} + \global\dimen@i\parindent + \endgroup + \parindent\dimen@i +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\OpeningSequence} +% This command defines the ``opening sequence'', that is, the sequence of +% commands that should be executed when the user-level "\opening" command +% is given. Provided in vers.~0.35 to allow customization. The optional +% argument of "\opening" is passed in the---mandatory!---argument of this +% command; the mandatory argument of "\opening", if present (\emph{i.e.}, +% if not ``\mbox{$+$-form}'') is embodied in "\ChosenMakeOpening". +% Factory definition: +% \begin{macrocode} +\newcommand*\OpeningSequence[1]{% + \makepresentation + \maketopdate[#1]% + \ChosenMakeOpening +} +% \end{macrocode} +% \end{macro} +% +% A little bit of uncommented code. +% \begin{macrocode} +\newcommand*\makeclosing{\@par@stopbreaks + \@ifnextchar +{\@firstoftwo\y@mclosing}\x@mclosing +} +\@ifdefinable\x@mclosing{\def\x@mclosing#1{% + \noindent\hspace*{\closingindentation}\ignorespaces #1\par +}} +\@ifdefinable\y@mclosing{\def\y@mclosing{% + \@handwr@box\closingindentation +}} +% \end{macrocode} +% +% \begin{macro}{\closing} +% Well-known command for closing a letter. In vers.~0.35, it, +% and related macros, have been completely reimplemented to support the +% "\ClosingSequence" feature. The present implementation support exactly +% the same modifiers as the former one (cf.~\cite{nts}), \emph{i.e.}: +% \begin{description} +% \item[normal form:] +% "\closing{"\meta{text}"}"\\* +% typeset the \meta{text} as the closing sentence, +% using the internal equivalent of "\makeclosing{"\meta{text}"}"; +% an ordinary signature (the internal equivalent of "\makesignature") +% follows; +% \item[$*$-form:] +% "\closing*{"\meta{text}"}"\\* +% typeset the \meta{text} as the closing sentence, +% using the internal equivalent of "\makeclosing{"\meta{text}"}"; +% a compressed signature (the internal equivalent of +% "\makesignature*") follows; +% \item[$+$-form:] +% "\closing+"\\* +% leave space for a handwritten closing sentence (as "\makeclosing+" +% would do), +% followed by another space for an equally handwritten signature +% (like the one produced by "\makesignature-"); +% \item[$-$-form:] +% "\closing-{"\meta{text}"}"\\* +% typeset the \meta{text} as the closing sentence, +% using the internal equivalent of "\makeclosing{"\meta{text}"}", +% followed by the space for a handwritten signature +% (like the one produced by "\makesignature-"). +% \end{description} +% \begin{macrocode} +\newcommand*\closing{\@par@stopbreaks + \@ifstar{% + \@closing{\x@msignature *}% + }{% + \@ifnextchar +{\@firstoftwo{% + \@@closing \y@mclosing \y@msignature + }}{% + \@ifnextchar -{\@firstoftwo{% + \@closing \y@msignature + }}{% + \@closing{\x@msignature {}}% + }% + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@closing} +% The sole purpose of this macro is to absorb the argument destined for the +% "\closing" command (which is absent in the ``\mbox{$+$-form}, though), +% which becomes argument~\#2; argument~\#1 is the token sequence that should +% be used to generate the signature. +% \begin{macrocode} +\@ifdefinable\@closing{\def\@closing#1#2{% + \@@closing{\x@mclosing{#2}}{#1}% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@closing} +% Prepare call to "\ClosingSequence", then call it. Parameters: +% \begin{paramlist} +% \param +% intended meaning of "\ChosenMakeClosing";\\ +% \param +% intended meaning of "\ChosenMakeSignature". +% \end{paramlist} +% \begin{macrocode} +\@ifdefinable\@@closing{\def\@@closing#1#2{% +% \end{macrocode} +% Keep definitions local. +% \begin{macrocode} + \begingroup + \def\ChosenMakeClosing{#1}% + \def\ChosenMakeSignature{#2}% +% \end{macrocode} +% Invoke user-customizable closing sequence. +% \begin{macrocode} + \ClosingSequence + \endgroup +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ClosingSequence} +% This command defines the ``closing sequence'', that is, the sequence of +% commands that should be executed when the user-level "\closing" command +% is given. Provided in vers.~0.35 to allow customization. +% Factory definition: +% \begin{macrocode} +\newcommand*\ClosingSequence{% + \ChosenMakeClosing + \ChosenMakeSignature +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@handwr@box} +% Draws an almost imperceptible sign that marks the spot where a handwritten +% salutation, or closing sentence, should start. \#1~is the amount of +% indentation. +% \begin{macrocode} +\@ifdefinable\@handwr@box{\def\@handwr@box#1{% + \vskip .5\baselineskip + \setbox\z@\vbox{% + \hrule\@height .1\p@ \@depth .1\p@ \@width 3\p@ + }% + \wd\z@\z@ \ht\z@\z@ \dp\z@\z@ \noindent\hspace*{#1}\box\z@\par + \vskip .5\baselineskip\vskip\z@skip +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cc@encl} +% Inner implementation for both "\cc" and "\encl". +% \changes{0.36}{2015 Feb 08}{Fully reimplemented by means of +% ``blocks''.}^^A +% Wholly rewritten in vers.~0.36, now uses ``blocks'' (like addresses and +% subject). This, among other things, ensures coherent treatment of the +% interline glue. +% \begin{macrocode} +\@ifdefinable\@cc@encl{\long\def\@cc@encl#1#2{\par + \begingroup + \let\@empty@block\@empty + \y@custom@block N{#1}{.5em}% + \z@skip\z@skip\z@skip + \@M\z@\z@ + \ignorespaces #2% + \end@custom@block N% + \endgroup +}} +% \end{macrocode} +% \end{macro} +% +% Uncommented code. +% \begin{macrocode} +\newcommand*\cc [1][\ccname] {\@cc@encl{#1}} +\newcommand*\encl[1][\enclname]{\@cc@encl{#1}} +\newenvironment{enclosures}[1][\enclname]{% + \baseenclosures[#1]{}% +}{% + \endbaseenclosures +} +\newenvironment{baseenclosures}[2][\enclname]{\par + \addpenalty{-\@lowpenalty}% + \addvspace{\bigskipamount}% + \startbreaks + \parskip\z@skip + {\parindent\z@ #1\par}% + \list{\labelenumi}{% + \usecounter{enumi}% + \@beginparpenalty\@M + \@itempenalty-\@lowpenalty + \@endparpenalty-\@medpenalty +%% ( paren match + \renewcommand*\labelenumi{\theenumi)}% + #2% + }% +}{% + \endlist + \aftergroup\startbreaks +} +\newcommand*\ps{\par\startbreaks\parindent\z@} +\newcommand*\@PS@rigid [1][\PSname]{% + {\normalfont\@safe@space{#1}\enspace}\ignorespaces +} +\newcommand*\@PS@rubber[1][\PSname]{% + \@safe@space{#1}{\nobreak\space}\ignorespaces +} +\newcommand*\PS{% + \ps\@ifstar{\@PS@rubber}{\@PS@rigid}% +} +% \end{macrocode} +% +% \begin{macro}{\stopletter} +% User-level hook invoked (before anything else) when a letter ends. +% \begin{macrocode} +\newcommand*\stopletter{} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Address labels} +% +% This part of the code should probably be detached and put in a +% separate file to be loaded on demand. +% +% The general idea is the following: +% \begin{itemize} +% \item +% a \env{labels} (or \env{baselabels}, see below) environment +% produces one or more sheets of address labels; +% \item +% inside \env{labels}, several \env{labelgroup} environments wrap up +% the address labels pertaining to each letter (a letter may have +% several address labels associated with it, if it has several +% addressees); +% \item +% inside each \env{labelgroup} environment, individual labels are +% produced with the "\basemlabel" command. +% \end{itemize} +% The \env{labels} environment takes care of such things like jumping +% to a new page, etc.; the \env{labelgroup} environment merely changes +% the way address labels are numbered, but does not otherwise affect +% the printout. +% +% The user may either: +% \begin{enumerate} +% \renewcommand*{\theenumi}{(\Alph{enumi})} +% \renewcommand*{\labelenumi}{\theenumi} +% \item\label{autolabels} +% include a "\makelabels" declaration in the preamble, to have +% address labels generated automatically via the \filedir{.aux} +% file; in this case, appropriate commands are written in the +% \filedir{.aux} file by each +% \env{baseletter} environment, which, when the \filedir{.aux} file +% is re-read at the "\end{document}", automatically generate the +% required environments and commands (\env{labels}, +% \env{labelgroup}, etc.); \emph{or} +% \item\label{handlabels} +% produce the address labels ``by hand'', including directly in the +% source file, where (s)he want the address label sheets to appear, a +% \env{labels} environment, containing the appropriate +% \env{labelgroup} environments, containing, in turn, the individual +% "\basemlabel" commands. +% \end{enumerate} +% In principle, it is also possible to mix \ref{autolabels} +% and~\ref{handlabels} (and to have several \env{labels} +% environments, too), but this has no practical utility. +% +% \begin{macrocode} +\newcommand*\returnaddress{\thesenderaddress} +\@ifdefinable\@emptyaddrlabels@err{\def\@emptyaddrlabels@err{% + \advance \@cdp@gencount \m@ne + \ClassError{\@letteracdp}{% + Counter emptyaddrlabels out of range% + }{% + The counter emptyaddrlabels holds + the number of labels\MessageBreak + to leave blank when starting to print + the address labels\MessageBreak + (e.g., because some labels + have already been peeled off).\MessageBreak + For the label format you chose, + it must lie in the range\MessageBreak + 0..\number\@cdp@gencount\space (inclusive), + but presently its value is \number\c@emptyaddrlabels.\MessageBreak + It will therefore be ignored; + type \space <return> \space to proceed.% + }% +}} +\newcommand*\skipemptylabels{% + \@cdp@gencount \c@addrlabelrows + \multiply \@cdp@gencount \c@addrlabelcolumns + \ifnum\c@emptyaddrlabels<\z@ + \@emptyaddrlabels@err + \else\ifnum\c@emptyaddrlabels<\@cdp@gencount + \begingroup + \let\ifactuallabel\@secondoftwo + \@whilenum\c@totallabel<\c@emptyaddrlabels\do{\basemlabel{}{}}% + \endgroup + \else + \@emptyaddrlabels@err + \fi\fi +} +% \end{macrocode} +% +% \begin{environment}{baselabels} +% This is the actual environment for producing sheets of address labels: the +% \env{labels} environment (see below) is simply a wrapper that offers the +% user the chance of making some changes after calling \env{baselabels}. +% \changes{0.36d}{2018 Feb 08}{Added \texttt{\protect\bslash global} before +% \texttt{\protect\bslash c@page\protect\bslash @ne}.}^^A +% V.~0.36d: "\global\c@page\@ne". +% \begin{macrocode} +\newenvironment*{baselabels}{% + \cleardoubleemptypage + \global\c@page\@ne + \typeout{Address Labels}% + \pagestyle{empty}% + \textwidth \c@addrlabelcolumns\addrlabelwidth + \count@ \c@addrlabelcolumns + \advance \count@ \m@ne + \ifnum\count@>\z@ + \advance \textwidth \count@\addrlabelshsep + \fi + \linewidth\textwidth \hsize\textwidth + \oddsidemargin -1in% + \advance \oddsidemargin \addrlabelsleftmargin + \evensidemargin \oddsidemargin + \@totalleftmargin\z@ + \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip + \parfillskip\@flushglue + \textheight \c@addrlabelrows\addrlabelheight + \count@ \c@addrlabelrows + \advance \count@ \m@ne + \ifnum\count@>\z@ + \advance \textheight \count@\addrlabelsvsep + \fi + \@colht\textheight \@colroom\textheight \vsize\textheight + \headsep \z@ + \headheight \z@ + \footskip \z@ + \topmargin -1in% + \advance \topmargin \addrlabelstopmargin + \ifcase \@ptsize\relax + \normalsize + \or + \small + \or + \footnotesize + \fi + \parindent \z@ + \baselineskip \z@skip + \lineskip \z@skip + \boxmaxdepth \z@ + \raggedright + \fboxrule \z@ + \fboxsep \addrlabelborder + \addrlabeltrimwidth \addrlabelwidth + \advance \addrlabeltrimwidth -2\addrlabelborder + \addrlabeltrimheight \addrlabelheight + \advance \addrlabeltrimheight -2\addrlabelborder + \setcounter{totallabel}{\z@}% + \setcounter{label}{\z@}% + \setcounter{letter}{\z@}% + \noindent + \skipemptylabels +}{% + \@killglue\clearpage +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{labels} +% It is the user-level environment for producing one or more sheets of +% address labels. +% Its default definition simply invokes \env{baselables}, but the +% user may redefine it to set some style parameters. For example: +%\begin{verbatim} +%\renewenvironment{labels}{% +% \baselabels +% \setlength\fboxrule{.2pt}% +% \addtolength\fboxsep{-2\fboxrule}% +%}{\endbaselabels} +%\end{verbatim} +% will draw a thin border around each address label. +% \begin{macrocode} +\newenvironment*{labels}{\baselabels}{\endbaselabels} +% \end{macrocode} +% \end{environment} +% +% Back to uncommented code. +% \begin{macrocode} +\let\@beginlabels=\relax +\let\@endlabels=\relax +\newenvironment*{labelgroup}{\stepcounter{letter}}{} +\let\@beginlabelgroup=\relax +\let\@endlabelgroup=\relax +\newcommand*\labeltab{\@killglue + \ifnum\c@totallabel>\z@ + \count@ \c@totallabel + \divide \count@ \c@addrlabelcolumns + \multiply \count@ -\c@addrlabelcolumns + \advance \count@ \c@totallabel + \ifnum\count@=\z@ + \par\vskip\addrlabelsvsep\noindent + \else + \hskip\addrlabelshsep + \fi + \fi + \stepcounter{totallabel}% + \stepcounter{label}% +} +% \end{macrocode} +% +% \begin{macro}{\ifactuallabel} +% Macro for the user: "\ifactuallabel{"\meta{FOO}"}{"\meta{BAR}"}" +% executes \meta{FOO} if the label is not being skipped, \meta{BAR} +% otherwise. +% \begin{macrocode} +\let\ifactuallabel\@firstoftwo +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\newcommand\basemlabel[2]{% + \begingroup + \def\startaddrlabel{\par + \noindent \vrule\@height\topskip \@depth\z@ \@width\z@ \par + \vskip-\baselineskip \vskip\z@skip + }% + \def\stopaddrlabel{\par + \ifnum\prevdepth>\z@ + \kern -\prevdepth + \prevdepth\z@ + \fi + }% + \labeltab\mlabel{\ignorespaces #1}{\ignorespaces #2}% + \endgroup +} +\newcommand\mlabel[2]{% + \fbox{% + \parbox[c][\addrlabeltrimheight]{\addrlabeltrimwidth}{% + \raggedright\startaddrlabel #2\stopaddrlabel + }% + }% +} +\let\@mlabel=\@gobbletwo +% \end{macrocode} +% +% \subsubsection{Lists and other similar environments} +% +% \begin{macrocode} +\normalfont \normalsize +\setlength\leftmargini {2em} +\setlength\leftmarginii {2em} +\setlength\leftmarginiii{2em} +\setlength\leftmarginiv {1.75em} +\setlength\leftmarginv {1.5em} +\setlength\leftmarginvi {1.5em} +\setlength\leftmargin {\leftmargini} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\setlength\partopsep{\z@skip} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\def\@listI{\leftmargin\leftmargini + \parsep \smallskipamount + \topsep \medskipamount + \itemsep\smallskipamount} +\let\@listi\@listI +\@listi +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \topsep\smallskipamount + \parsep\z@skip} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +\renewcommand*\theenumi{\@arabic\c@enumi} +\renewcommand*\theenumii{\@alph\c@enumii} +\renewcommand*\theenumiii{\@roman\c@enumiii} +\renewcommand*\theenumiv{\@Alph\c@enumiv} +\newcommand*\labelenumi{\theenumi.} +\newcommand*\labelenumii{(\theenumii)} +\newcommand*\labelenumiii{\theenumiii.} +\newcommand*\labelenumiv{\theenumiv.} +\renewcommand*\p@enumii{\theenumi} +\renewcommand*\p@enumiii{\theenumi(\theenumii)} +\renewcommand*\p@enumiv{\p@enumiii\theenumiii} +\newcommand*\labelitemi{\textbullet} +\newcommand*\labelitemii{\normalfont\bfseries \textendash} +\newcommand*\labelitemiii{\textasteriskcentered} +\newcommand*\labelitemiv{\textperiodcentered} +\newenvironment*{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} +\newenvironment*{verse} + {\let\\\@centercr + \list{}{\setlength\itemsep{\z@skip}% + \setlength\itemindent{-15\p@}% + \setlength\listparindent{\itemindent}% + \setlength\rightmargin{\leftmargin}% + \addtolength\leftmargin{15\p@}}% + \item[]} + {\endlist} +\newenvironment*{quotation} + {\list{}{\setlength\listparindent{1.5em}% + \setlength\itemindent{\listparindent}% + \setlength\rightmargin{\leftmargin}}% + \item[]} + {\endlist} +\newenvironment*{quote} + {\list{}{\setlength\rightmargin{\leftmargin}}% + \item[]} + {\endlist} +% \end{macrocode} +% +% \subsubsection{Miscellanea} +% +% \begin{macrocode} +\setlength\parindent{2em} +\setlength\parskip{\z@ plus \p@} +\setlength\columnsep{10\p@} +\setlength\columnseprule{\z@} +\setlength\arraycolsep{5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\renewcommand*\theequation{\@arabic\c@equation} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\relax} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\relax} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +\renewcommand*\footnoterule{% + \kern-\p@ + \hrule \@width .4\columnwidth + \kern .6\p@} +\long\def\@makefntext#1{% + \noindent + \hangindent 5\p@ + \hb@xt@5\p@{\hss\@makefnmark}#1} +% \end{macrocode} +% +% \subsubsection{Names and final setup} +% +% \begin{macrocode} +\newcommand*\subjectname {Oggetto:} +\newcommand*\registeredname {Raccomandata} +\newcommand*\registeredRRname{\registeredname~A.R.} +\newcommand*\andccname {e~p.~c.} +\newcommand*\ccname {P.~c.:} +\newcommand*\enclname {Allegati:} +\newcommand*\PSname {P.S.:} +\newcommand*\headtoname {A:} +\newcommand*\lettername {Lettera} +\newcommand*\today{\number\day~\ifcase\month\or + gennaio\or febbraio\or marzo\or aprile\or maggio\or giugno\or + luglio\or agosto\or settembre\or ottobre\or novembre\or dicembre\fi + \space\number\year} +\let\do\@undefined +\pagestyle{plain} +\pagenumbering{arabic} +\raggedbottom +\onecolumn +% \end{macrocode} +% +% End of the module for the \packlass{\letteracdp} class. +% \begin{macrocode} +%</letter> +% \end{macrocode} +% \noindent\null\par +% +% \section{The code for the \protect\packlass{\articoletteracdp} class} +% +% This part of the file goes into \filedir{\articoletteracdp.cls}. +% \begin{macrocode} +%<*artico> +% \end{macrocode} +% +% \subsection{Identification} +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1996/06/01] % LaTeX2e is required! +\ProvidesClass{articoletteracdp} + [2018/02/08 v0.36d (development)] +% \end{macrocode} +% +% \subsection{Initial code} +% +% We check that some names are not already taken. +% \begin{macrocode} +\@ifdefinable\@out@table@list{} +\@ifdefinable\@in@table@list{} +\@ifdefinable\@do@tf{} +\@ifdefinable\@sec@head@size{} +% \end{macrocode} +% +% Definition of two switches that support the options about what to +% include in the table of contents. +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\newif#1}} +\do\if@toc@in@toc@ +\do\if@loX@in@toc@ +% \end{macrocode} +% +% \begin{macro}{\@letter@bookmark} +% Support for pdf\TeX\slash\packlass{\HyperRef}. If pdf\TeX\ is +% being used to typeset the document, if the \packlass{\HyperRef} +% package is loaded, and if the user doesn't ask us to avoid doing so, +% we shall generate a ``level~0'' bookmark for each letter we shall +% typeset (sections are of level~1, so they will be bookmarked under +% letters). This command serves this purpose: it is defined either +% as "\@gobbletwo", if such bookmarks are \emph{not} being generated, +% or as a suitable invocation of "\pdfbookmark" if they are. To begin +% with, we set the former alternative, which makes it act as a no-op. +% \begin{macrocode} +\@ifdefinable\@letter@bookmark{\let\@letter@bookmark\@gobbletwo} +% \end{macrocode} +% \end{macro} +% +% Space above and below captions for figures and tables. +% \begin{macrocode} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +% \end{macrocode} +% +% \subsection{Declaration of options} +% +% \begin{macrocode} +\DeclareOption{titlepage}{% + \@latexerr{No title page for letters}\@eha +} +\DeclareOption{notitlepage}{} +\DeclareOption{loXintoc}{% + \@toc@in@toc@false + \@loX@in@toc@true +} +\DeclareOption{tocintoc}{% + \@toc@in@toc@true + \@loX@in@toc@true +} +\DeclareOption{Hofstadter}{% + \ExecuteOptions{tocintoc}% +} +\DeclareOption{plaintoc}{% + \@toc@in@toc@false + \@loX@in@toc@false +} +% \end{macrocode} +% The option \opz{letterbookmarks} causes the bookmarks for letters to +% be generated. Upon expansion, the 2~arguments of +% "\@letter@bookmark" will become arguments of "\pdfbookmark". We +% also need to ask the \packlass{\HyperRef} package to generate closed +% bookmarks. Note that the user can later overwrite this setting; +% note also that nothing will happen if \packlass{\HyperRef} is not +% loaded later. +% \begin{macrocode} +\DeclareOption{letterbookmarks}{% + \def\@letter@bookmark{\pdfbookmark[0]}% + \PassOptionsToPackage{bookmarksopen=false}{hyperref}% +} +% \end{macrocode} +% The option \opz{noletterbookmarks} supresses the bookmarks for +% letters. +% \begin{macrocode} +\DeclareOption{noletterbookmarks}{% + \let\@letter@bookmark\@gobbletwo +} +% \end{macrocode} +% The option \opz{openletterbookmarks} causes the bookmarks for +% letters to be generated and to be presented open to the reader. We +% ask the \packlass{\HyperRef} package to generate open bookmarks, but +% only one level deep. Note that the user can later overwrite this +% setting. This is made the default option, below. +% \begin{macrocode} +\DeclareOption{openletterbookmarks}{% + \def\@letter@bookmark{\pdfbookmark[0]}% + \PassOptionsToPackage{bookmarksopen,bookmarksopenlevel=1}{hyperref}% +} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{letteracdp}} +% \end{macrocode} +% +% \subsection{Option processing} +% +% \begin{macrocode} +\ExecuteOptions{plaintoc,openletterbookmarks} +\ProcessOptions\relax +% \end{macrocode} +% +% \subsection{Class loading} +% +% \begin{macrocode} +\LoadClass{letteracdp}[2018/02/08] +% \end{macrocode} +% +% \subsection{Main code} +% +% Unfortunately, most of the code is not commented (yet). +% +% \subsubsection{More initializations} +% +% \begin{macrocode} +\newcounter{section}[letter] +\newcounter{paragraph}[section] +\newcounter{figure}[letter] +\newcounter{table}[letter] +% \end{macrocode} +% +% Stuff for dealing with the \packlass{\HyperRef} package. The problem is +% our non-standard hierarchy of sectioning commands, with paragraphs placed +% directly below sections. In this version (0.34) we choose a different +% approach than the one we adopted in version 0.33, redefining +% "\theHparagraph"; of course, this must be done \emph{after} +% \packlass{\HyperRef} has been loaded, and we could not find any better +% place for this than the "\AtBeginDocument" hook. Within the same hook, we +% also redefine "\theHsection" (the counter used by \packlass{\HyperRef} to +% generate hyperlinks to sections) so that sections with the same number, but +% included in different letters, will have different anchors; we fix the +% bookmark level for paragraphs, too. +% \begin{macrocode} +\AtBeginDocument{% + \def\theHletter{\arabic{letter}}% + \@ifpackageloaded{hyperref}{% + \def\theHparagraph{\theHsection.\arabic{paragraph}}% + \def\theHsection{\theHletter.\arabic{section}}% + \def\toclevel@paragraph{2}% + }{% +% \end{macrocode} +% If the \packlass{\HyperRef} package is not loaded, we ensure that +% "\@letter@bookmarks" acts as a no-op: +% \begin{macrocode} + \let\@letter@bookmark\@gobbletwo + }% +} +% \end{macrocode} +% +% \begin{macro}{\hyper@last} +% The following line is to deactivate the check that +% \packlass{\HyperRef} makes against old files; this is necessary +% because otherwise, on the first \LaTeX\ run, it would overwrite our +% redefinition of "\@starttoc", possibly writing unwanted +% \filedir{.toc}, \filedir{.lof}, and \filedir{.lot} files, and (much +% worse) causing trouble if the letter happens to contain more than one +% "\tableofcontents", "\listoffigures", or "\listoftables". Of +% course, this means that the user must be informed that (s)he has to +% delete the old files by hand.~\mbox{:-(}^^A ) paren match +% \closeofsentencespace Note, anyway, that the automatic check +% made by \packlass{\HyperRef} would not work with the \Bundle\ +% in any case (because it looks for \filedir{.toc}, \filedir{.lof}, +% etc.\ files, not for, say, \filedir{.toc1}, etc.), so\ldots +% \begin{macrocode} +\@ifdefinable\hyper@last{\let\hyper@last\relax} +% \end{macrocode} +% \end{macro} +% +% Back to uncommented code. +% +% \begin{macrocode} +%% Command \title and \author redefined to make changes local. +\def\title#1{\def\@title{#1}} +\def\author#1{\def\@author{#1}} +% \end{macrocode} +% +% \subsubsection{Managing the \protect\filedir{.toc}, +% \protect\filedir{.lof}, and \protect\filedir{.lot} files} +% +% \begin{macrocode} +%% Inner command \@starttoc redefined to make table of contents, etc. +%% local to letters (this is tricky!). +\def\@starttoc#1{% + \begingroup + \vskip\parskip + \parskip\z@skip + \makeatletter + \@input{\jobname.#1\number\c@letter}% + \if@filesw + \@ifundefined{tf@@#1}{% + \expandafter\newwrite\csname tf@@#1\endcsname + }\relax + \immediate\write\@out@table@list{\string\@do@tf{#1}}% + \fi + \@nobreakfalse + \endgroup +} +% \end{macrocode} +% +% The "\@cdp@begin@letter@hook" (new name in vers.~0.36d) macro is invoked +% whenever a letter starts; we want (possibly, see above) a bookmark to be +% generated for the letter. Note that we use "\theletter" for the letter +% number presented to the user, and "\theHletter" for the number used to +% generate the anchor. +% \begin{macrocode} +\g@addto@macro\@cdp@begin@letter@hook{% + \edef\@cdp@reserved{% + \noexpand\@letter@bookmark + {\lettername\space\theletter}{letter.\theHletter}% + }% + \@cdp@reserved +% \end{macrocode} +% +% Actions for closing a set of toc/lof/lot file and opening another: +% \begin{macrocode} + \if@filesw + {\escapechar\m@ne + \immediate\write\@out@table@list{\string\}^^J\string\{}% + }% + \immediate\write\@auxout + {\string\@deferred@clopen{\number\c@letter}}% + \fi +} +% \end{macrocode} +% +% Uncommented code. +% \begin{macrocode} +\@ifdefinable\@deferred@open {\let\@deferred@open \@gobble} +\@ifdefinable\@deferred@close {\let\@deferred@close \@empty} +\@ifdefinable\@deferred@clopen{\let\@deferred@clopen\@gobble} +\newwrite\@out@table@list +\newread\@in@table@list +\AtBeginDocument{% + \if@filesw + \immediate\openout\@out@table@list = \jobname.summ\relax + {\escapechar\m@ne + \immediate\write\@out@table@list{\string\{}% + }% + \immediate\write\@auxout{\string\@deferred@open{0}}% + \def\@deferred@close{% + \def\@do@tf##1{% + \@restore@tf{##1}% + \immediate\closeout \csname tf@##1\endcsname + \global\expandafter\let\csname tf@##1\endcsname\@undefined + }% + \@temp@table@list + }% + \def\@deferred@open#1{% + \ifeof\@in@table@list\else + \read\@in@table@list to\@temp@table@list + \def\@do@tf##1{% + \@restore@tf{##1}% + \immediate\openout + \csname tf@##1\endcsname = \jobname.##1#1\relax + }% + \@temp@table@list + \fi + }% + \def\@deferred@clopen#1{% + \@deferred@close + \@deferred@open{#1}% + }% + \fi +} +\AtEndDocument{% + \if@filesw + {\escapechar\m@ne + \immediate\write\@out@table@list{\string\}}% + }% + \immediate\closeout\@out@table@list + \clearpage + \immediate\write\@auxout{\string\@deferred@close}% + \openin\@in@table@list = \jobname.summ\relax + \fi +} +\@ifdefinable\@restore@tf{\def\@restore@tf#1{% + \edef\@tempa{% + \let\csname tf@#1\endcsname\csname tf@@#1\endcsname + }% + \global\@tempa +}} +\@ifdefinable\@temp@table@list{\let\@temp@table@list\@empty} +% \end{macrocode} +% +% \subsubsection{Adding punctuation to titles} +% +% \begin{macrocode} +\@ifdefinable\@addfullstop{\long\def\@addfullstop#1{% + {\nonfrenchspacing\ignorespaces#1\unskip + \ifnum \spacefactor>\@m \else.\fi \/}% +}} +\newcommand*\nopunct{\spacefactor 1001\relax} +% \end{macrocode} +% +% \subsubsection{Floats} +% +% \changes{0.36d}{2018 Feb 08}{The assignment of \texttt{\protect\bslash +% c@topnumber} to \texttt{\protect\bslash c@dbltopnumber} has been made +% \texttt{\protect\bslash global}.}^^A +% \begin{macrocode} +\setcounter{topnumber}{\tw@} +\renewcommand\topfraction{.7} +\setcounter{bottomnumber}{\@ne} +\renewcommand\bottomfraction{.3} +\setcounter{totalnumber}{\thr@@} +\renewcommand\textfraction{.2} +\renewcommand\floatpagefraction{.5} +\global\c@dbltopnumber\c@topnumber +\let\dbltopfraction\topfraction +\let\dblfloatpagefraction\floatpagefraction +\setlength \floatsep {\bigskipamount} +\@msetlength\textfloatsep {2}{\bigskipamount} +\setlength \intextsep {\bigskipamount} +\setlength \dblfloatsep {\bigskipamount} +\@msetlength\dbltextfloatsep {2}{\bigskipamount} +\setlength \@fptop {\z@ plus 1 fil} +\setlength \@fpsep {1\bigskipamount plus 2 fil} +\setlength \@fpbot {\z@ plus 1 fil} +\setlength \@dblfptop {\@fptop} +\setlength \@dblfpsep {\@fpsep} +\setlength \@dblfpbot {\@fpbot} +\setlength\abovecaptionskip{\medskipamount} +\setlength\belowcaptionskip{\z@skip} +% \end{macrocode} +% +% \subsubsection{Title, section heads, figures, bibliography\ldots} +% +% \begin{macro}{\maketitle} +% Without the \packlass{\HyperRef} package, the "\maketitle" command can take +% the same optional argument as "\maketopdate", for specifying a short string +% to be prepended to the date; and in this case, the new "\place" declaration +% will be automatically honored. But the former feature will break if +% \packlass{\HyperRef} is loaded, and no remedy seems feasible for this, +% since \packlass{\HyperRef} assumes that "\maketitle" hasn't got any +% arguments. Note also that a period is automatically added to the title. +% \begin{macrocode} +\newcommand*\maketitle{% + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\thesenderaddress{\@author}% + \def\thesubject{\leavevmode\@addfullstop\@title}% + \let\@empty@sender\@empty + \let\@thanks\@empty + \makepresentation + \@thanks + \endgroup + \setcounter{footnote}{\z@}% + \maketopdate +} +% \end{macrocode} +% \end{macro} +% +% Uncommented code. +% \begin{macrocode} +\setcounter{secnumdepth}{\tw@} +\def\@seccntformat#1{\csname the#1\endcsname .\enspace} +\ifcase \@ptsize\relax + \def\@sec@head@size{\@setfontsize\@sec@head@size\@xiipt{15}} +\or + \def\@sec@head@size{\@setfontsize\@sec@head@size\@xiipt{17.4}} +\or + \def\@sec@head@size{\@setfontsize\@sec@head@size\@xivpt{18.75}} +\fi +\newcommand*\section{\@startsection {section}{\@ne}% + {\z@}% + {-\bigskipamount}% + {\smallskipamount}% + {% + \normalfont + \noindent\null\@@par\nobreak\vskip-\baselineskip + \parskip\z@skip + \@sec@head@size\bfseries + }% +} +\newcommand*\paragraph{\@startsection{paragraph}{\tw@}% + {\z@}% + {-\medskipamount}% + {-.66667em}% + {\normalfont\normalsize\itshape\@addfullstop}% +} +\newcommand*\epilogue{% + \if@noskipsec \leavevmode \fi + \par + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\bigskipamount + \fi +} +\renewcommand*\thesection{\@arabic\c@section} +\renewcommand*\theparagraph{\thesection.\@arabic\c@paragraph} +\renewcommand*\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{\@ne} +\def\ext@figure{lof} +\def\fnum@figure{\figurename~\thefigure} +\newenvironment*{figure} + {\@float{figure}} + {\end@float} +\newenvironment*{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\renewcommand*\thetable{\@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{\tw@} +\def\ext@table{lot} +\def\fnum@table{\tablename~\thetable} +\newenvironment*{table} + {\@float{table}} + {\end@float} +\newenvironment*{table*} + {\@dblfloat{table}} + {\end@dblfloat} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{\itshape \@addfullstop{#1: #2}}% + \ifdim \wd\@tempboxa >\hsize + \unhbox\@tempboxa\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip +} +\newcommand*\@pnumwidth{1.55em} +\newcommand*\@tocrmarg{2.55em} +\newcommand*\@dotsep{4.5} +\setcounter{tocdepth}{\@ne} +\newcommand*\tableofcontents{% + \section*{\contentsname \sectionmark\contentsname} + \if@toc@in@toc@ + \addcontentsline{toc}{section}{\protect\contentsname}% + \fi + \@starttoc{toc}% +} +\newcommand*\l@section{\@dottedtocline{\@ne}{\z@}{2em}} +\newcommand*\l@paragraph[2]{% + \@dottedtocline{\tw@}{2em}{2.5em}{\small #1}{\small #2}% +} +\newcommand*\listoffigures{% + \section*{\listfigurename \sectionmark\listfigurename}% + \if@loX@in@toc@ + \addcontentsline{toc}{section}{\protect\listfigurename}% + \fi + \@starttoc{lof}% +} +\def\l@figure{\@dottedtocline{\@ne}{\z@}{2em}} +\newcommand*\listoftables{% + \section*{\listtablename \sectionmark\listtablename}% + \if@loX@in@toc@ + \addcontentsline{toc}{section}{\protect\listtablename}% + \fi + \@starttoc{lot}% +} +\let\l@table\l@figure +\newenvironment*{thebibliography}[1]{% + \startbreaks + \section*{\refname \sectionmark\refname}% + \addcontentsline{toc}{section}{\protect\refname}% + \vskip\parskip + \parskip\z@skip + \parindent\z@ + \list{\@biblabel{\@arabic\c@enumiv}}{% + \settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}% + }% + \sloppy + \clubpenalty 4000 \@clubpenalty \clubpenalty + \widowpenalty 4000 + \sfcode`\.\@m +}{% + \def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist +} +\newcommand*\newblock{\hskip .11em\@plus.33em\@minus.07em} +\newcommand*\bysame{\leavevmode\hbox to3em{\hrulefill}\thinspace} +% \end{macrocode} +% +% \subsubsection{Names} +% +% \begin{macrocode} +\newcommand*\contentsname {Sommario} +\newcommand*\listfigurename{Indice delle figure} +\newcommand*\listtablename {Indice delle tabelle} +\newcommand*\refname {Testi citati} +\newcommand*\indexname {Indice analitico} +\newcommand*\figurename {Figura} +\newcommand*\tablename {Tabella} +% \end{macrocode} +% +% End of the module for the \packlass{\articoletteracdp} class. +% \begin{macrocode} +%</artico> +% \end{macrocode} +% \noindent\null\par +% +% \section{The code for the \protect\packlass{\cdpaddon} package} +% +% This part of the file goes into \filedir{\cdpaddon.sty}. +% \begin{macrocode} +%<*addon> +% \end{macrocode} +% +% \subsection{Identification} +% +% Why did I ask for the June 1998 release of \LaTeX? I don't remember! +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1998/06/01] % LaTeX2e is required! +\ProvidesPackage{cdpaddon} + [2018/02/08 v0.36d (development)] +\@ifdefinable\@cdpaddon{\def\@cdpaddon{cdpaddon}} +% \end{macrocode} +% +% \subsection{Initial code} +% +% Switches; "\if@custom@lh@" added in vers.~0.36 (2015 Feb~08). +% \begin{macrocode} +\def\do#1{\@ifdefinable#1{\newif#1}} +\do\if@using@cdp@ +\do\if@use@color@ +\do\if@use@hyper@ +\do\if@custom@lh@ +% \end{macrocode} +% +% \begin{macro}{\@cdpaddon@printer} +% Below, we shall store in this macro the name (without the extension +% \filedir{.def}) of the definition file from which to read the +% definitions of the colors for the C.D.P. seal. +% If it is empty, the emergency colors will be used: +% we make this the default. +% \begin{macrocode} +\@ifdefinable\@cdpaddon@printer{\let\@cdpaddon@printer\@empty} +% \end{macrocode} +% \end{macro} +% +% ``Scratch'' macros, will be re-used in the sequel. +% \begin{macrocode} +\@ifdefinable\@temp@cdpaddon@a{} +\@ifdefinable\@temp@cdpaddon@b{} +% \end{macrocode} +% +% Here is a first use of those ``scratch'' macros. +% \begin{macrocode} +\def\@temp@cdpaddon@a{% + \@using@cdp@false + \PackageWarningNoLine{\@cdpaddon}{% + It seems that you are not using the letteracdp\MessageBreak + document class; therefore no attempt will be made\MessageBreak + to modify letterheads and similar things% + }% +} +\def\@temp@cdpaddon@b{letteracdp} +% \end{macrocode} +% Double check to be absolutely sure that the \packlass{\letteracdp} +% class is loaded. +% \begin{macrocode} +\@ifclassloaded{\@temp@cdpaddon@b}{% + \ifx\@letteracdp\@temp@cdpaddon@b + \@using@cdp@true + \else + \@temp@cdpaddon@a + \fi +}{% + \@temp@cdpaddon@a +} +% \end{macrocode} +% +% \subsection{Declaration of options} +% +% The following macro is needed to strip the prefix \opz{printer:}\ +% from the option that selects which color definition file to load. +% Again, we use one of the ``scratch'' macro to save memory (the other +% ``scratch'' macro is used as well inside). +% \begin{macrocode} +\def\@temp@cdpaddon@a#1printer:#2,#3\@@@{% + \def\@temp@cdpaddon@b{#1}% + \ifx\@temp@cdpaddon@b\@empty + \def\@cdpaddon@printer{#2}% + \else + \@unknownoptionerror + \fi +} +% \end{macrocode} +% Vers.~0.36 (2015 Feb~08): modified the existing option so that they also +% deal with the new "\if@custom@lh@" switch\ldots +% \begin{macrocode} +\DeclareOption{bw}{\@use@color@false\@custom@lh@false} +\DeclareOption{color}{\@use@color@true\@custom@lh@false} +\DeclareOption{hypertext}{\@use@hyper@true\@custom@lh@false} +\DeclareOption{plaintext}{\@use@hyper@false\@custom@lh@false} +% \end{macrocode} +% \ldots~and added new \opz{customletterhead} option. +% \begin{macrocode} +\DeclareOption{customletterhead}{% + \@use@color@false + \@use@hyper@false + \@custom@lh@true +} +% \end{macrocode} +% Otherwise, we can have a \opz{printer:}\ldots\ option requesting a color +% definition file. +% \begin{macrocode} +\DeclareOption*{% + \expandafter\@temp@cdpaddon@a\CurrentOption,printer:,\@@@% +} +% \end{macrocode} +% +% \subsection{Option processing} +% +% \begin{macrocode} +\ExecuteOptions{color,plaintext} +\ProcessOptions\relax +% \end{macrocode} +% If the \opz{printer:Default} option has been specified, we want +% the same behavior as if no \opz{printer:}\ldots\ option had been +% specified at all. +% \begin{macrocode} +\def\@temp@cdpaddon@a{Default} +\ifx\@cdpaddon@printer\@temp@cdpaddon@a + \let\@cdpaddon@printer\@empty +\fi +% \end{macrocode} +% +% \subsection{Package loading} +% +% \changes{0.34a}{2010 Jun 01}{Fixed up the use of dvips names in the +% \protect\packlass{\protect\cdpaddon} package (bug reported by Tommaso +% Gordini).}^^A +% V.~0.34a: fixed up the use of dvips names +% (bug reported by Tommaso Gordini). +% V.~0.36: also removed the ridiculous check for the presence of standard +% packages on the system! +% \begin{macrocode} +\if@use@color@ + \RequirePackage[dvipsnames]{color} +\fi +\if@use@hyper@ + \RequirePackage{hyperref} +\fi +% \end{macrocode} +% +% \subsection{Main code} +% +% Unfortunately, the code is only sparsely commented (at the moment). +% +% \subsubsection{Redefinition of the seal, etc.} +% +% Vers.~0.36 (2015 Feb~08): removed the "\@back@folding@tag" macro, +% now become unnecessary because of the introduction of the +% "\foldingtagrule" user command. +% We leave the code in place, but commented out, for documentation purposes. +%\begin{verbatim} +%\@ifdefinable\@back@folding@tag{\def\@back@folding@tag{% +% \if@do@fold@ +% \raisebox{\@lh@folding@ht}[\z@][\z@]{% +% \makebox[\z@][l]{% +% \color{strong@col}% +% \dimen@ -\@lh@right@margin +% \advance\dimen@ 1cm% +% \kern\dimen@ \vbox{% +% \kern -.1\p@ +% \hrule \@height .1\p@ \@depth .1\p@ \@width 5mm% +% \kern -.1\p@ +% }% +% }% +% }% +% \fi +%}} +%\end{verbatim} +% +% If the \packlass{\letteracdp} class is loaded\ldots +% \begin{macrocode} +\if@using@cdp@ +% \end{macrocode} +% \ldots then we can try to replace the macros that draw the seal, +% etc.; but we want to perform the redefinition (if and) only if the +% macro is already defined, and rise an error otherwise. To ease this +% task, we define the ``scratch'' macro "\@temp@cdpaddon@a" in such a +% way that "\@temp@cdpaddon@a{"\meta{name}"}{"\meta{code}"}" rises an +% error if \meta{name} is undefined, and executes \meta{code} +% otherwise. It is intended that \meta{code} is the code that does the +% actual redefinition. Note that \meta{name} must be indicated +% \emph{without} the backslash. Note also that it is not necessary +% a second parameter for \meta{code}: "{"\meta{code}"}" becomes the +% third parameter of "\@ifundefined". +% \begin{macrocode} + \def\@temp@cdpaddon@a#1{% + \@ifundefined{#1}{% + \PackageError\@cdpaddon{% + Internal command \@backslashchar#1 undefined% + }{% + The internal command \@backslashchar#1, + that should have been defined\MessageBreak + by the \@letteracdp\space document class, + is actually undefined.\MessageBreak + Probably, you are using an old or modified version + of that class.\MessageBreak +% \end{macrocode} +% Vers.~0.36 (2015 Feb~08): modified the following line: +% \begin{macrocode} + Proceed, but keep your fingers crossed!% + }% + }% + } +% \end{macrocode} +% +% We first take care of color. Did the user request colors? +% \begin{macrocode} + \if@use@color@ +% \end{macrocode} +% Yes? Well, in that case, we try to load the file that defines +% the hues. First of all, see whether the user selected a color +% definition file. +% \begin{macrocode} + \ifx\@cdpaddon@printer\@empty +% \end{macrocode} +% If not (\("\@cdpaddon@printer"="\@empty"\)), then we must read the +% config.\ file. Before doing this, we define the "\DeclareCDPSealHuesDefault" +% command, in a somewhat tricky way: we begin a group, thereby making +% a local definition, but we put the "\endgroup" in the replacement text +% of the macro itself. This is quite OK, because once the macro has +% been expanded, we no longer need its definition! We must foresee +% the case in which the configuration file does not contain any +% "\DeclareCDPSealHuesDefault" command at all. For this, we use +% another hack: we "\let" "\@temp@cdpaddon@b" equal to "\endgroup" +% \emph{inside} the group, but to "\@empty" outside of it. Then we call it: +% if the group has already ended, nothing happens, otherwise the group +% is ended now. +% \begin{macrocode} + \let\@temp@cdpaddon@b\@empty + \begingroup % \endgroup put in by \@temp@cdpaddon@b + \let\@temp@cdpaddon@b\endgroup + \InputIfFileExists{cdpshues.cfg}{% + \PackageInfo{\@cdpaddon}{% + Reading config. file% + }% +% \end{macrocode} +% \begin{macro}{\DeclareCDPSealHuesDefault} +% This command is defined in such a way that it not only ends the group, +% but also stops reading from the file. +% \begin{macrocode} + \def\DeclareCDPSealHuesDefault{% + \@temp@cdpaddon@b % ends group + \endinput +% \end{macrocode} +% \end{macro} +% The argument to "\DeclareCDPSealHuesDefault" will become the +% replacement text of the following "\def". +% \begin{macrocode} + \def\@cdpaddon@printer + }% + }{% + \PackageWarningNoLine{\@cdpaddon}{% + Could not find config. file for default printer% + }% + }% +% \end{macrocode} +% The following is part of the hack to end the group if it has not +% already ended. +% \begin{macrocode} + \@temp@cdpaddon@b +% \end{macrocode} +% We now check if the user specified the \opz{printer:None} option; +% if so, we take the same action that would result from an empty +% configuration file. +% \begin{macrocode} + \else + \def\@temp@cdpaddon@b{None}% + \ifx\@cdpaddon@printer\@temp@cdpaddon@b + \let\@cdpaddon@printer\@empty + \fi +% \end{macrocode} +% End of things to do when no \opz{printer:}\ldots\ option has been +% specified. +% \begin{macrocode} + \fi +% \end{macrocode} +% OK, now we have the name of the color definition file in +% "\@cdpaddon@printer", and we have to load it. The following are the +% actions to take when the file cannot be found or when +% "\@cdpaddon@printer" is still empty (\emph{e.g.,} because no +% config.\ file was found, or because it was void): use emergency +% definitions and issue a warning. We save them in a ``scratch'' +% macro because we need them twice~(!). +% \begin{macrocode} + \def\@temp@cdpaddon@b{% + \definecolor{slight@col}{named}{SpringGreen} + \definecolor{strong@col}{named}{OliveGreen} + \PackageInfo{\@cdpaddon}{% + Color hues defined internally% + }% + \typeout{% + *Package cdpaddon using built-in colors for the C.D.P. seal.*% + }% + } +% \end{macrocode} +% We finally try to load the color definition file. +% \begin{macrocode} + \ifx\@cdpaddon@printer\@empty + \@temp@cdpaddon@b + \else + \InputIfFileExists{\@cdpaddon@printer.def}{% + \PackageInfo{\@cdpaddon}{% + Color hues defined by def. file\MessageBreak + \@cdpaddon@printer.def% + }% + }{% + \PackageWarningNoLine{\@cdpaddon}{% + Could not find def. file \@cdpaddon@printer.def% + }% + \@temp@cdpaddon@b + }% + \fi +% \end{macrocode} +% +% We define another handy subroutine. Given the name \meta{boxname} +% of an hbox, "\@temp@cdpaddon@b{"\meta{boxname}"}" causes a +% "\color{strong@col}" declaration to be added at the beginning of +% "\"\meta{boxname}, properly contained in a group to ensure that the +% "\special" for restoring the previous colors is included in the box too. +% We use this method of setting and resetting the color inside the +% individual boxes because the one used in the previous versions, of +% setting the color once for all at the beginning of "\@cdp@head", did +% not seem to work properly with pdf\TeX. +% \begin{macrocode} + \def\@temp@cdpaddon@b#1{% + \@temp@cdpaddon@a{#1}{% + \setbox\z@\box\@nameuse{#1}% + \sbox{\@nameuse{#1}}{{\color{strong@col}\unhbox\z@}}% + }% + } +% \end{macrocode} +% +% Actual redefinition of macros begins here. +% +% Vers.~0.36 (2015 Feb~08): no need, now, to redefine the "\@folding@tag" +% macro: just redefine the user-level command "\foldingtagrule" +% (much neater!). +% \begin{macrocode} + \renewcommand*\foldingtagrule{% + \color{strong@col}% + \CDPFactoryFoldingTagRule + } +% \end{macrocode} +% +% \begin{macro}{\@logo@box@base} +% \changes{0.32}{2002 Jul 01}{Eliminated an awful bug introduced with +% version 0.31 (a conditional that could not appear at this spot).}^^A +% Color the main part of the seal. +% \begin{macrocode} + \@temp@cdpaddon@a{@logo@box@base}{% + \savebox\@logo@box@base[\z@][r]{\setlength\unitlength{.625mm}% + \begin{picture}(32,16)(-3,7.87)% +% \end{macrocode} +% I don't remember exactly what this group was for. Eliminate? +% \begin{macrocode} + \begingroup +% \end{macrocode} +% Draw the inner of the~``D'' and of the~``P'', in the slight color. +% \begin{macrocode} + \color{slight@col}% +% \end{macrocode} +% Try to draw two filled circles of the right size to fill up the +% inner of the two letters. If the target system happens to have +% sufficiently large filled circles, this will suffice. +% \begin{macrocode} + \put(8,16){\circle*{10}}% + \put(18,16){\circle*{10}}% +% \end{macrocode} +% With the standard set of fonts, however, the above request can not +% be honored, and the two circles we have just obtained are a little +% too small; so, we finish them by adding arcs of circumference of +% increasing size, drawn in thick lines. +% \begin{macrocode} + \thicklines + \put(8,16){\oval(8.2,8.2)[l]}% + \put(8,16){\oval(8.6,8.6)[l]}% + \put(8,16){\oval(9,9)[l]}% + \put(8,16){\oval(9.4,9.4)[l]}% + \put(8,16){\oval(9.8,9.8)[l]}% + \put(18,16){\oval(8.2,8.2)[r]}% + \put(18,16){\oval(8.6,8.6)[r]}% + \put(18,16){\oval(9,9)[r]}% + \put(18,16){\oval(9.4,9.4)[r]}% + \put(18,16){\oval(9.8,9.8)[r]}% +% \end{macrocode} +% Now erase the inner half of the two circles. +% \begin{macrocode} + \put(13,16){\makebox(0,0){\color{white}% + \vrule height 6.25mm depth 0mm width 6.25mm + }}% +% \end{macrocode} +% Draw the vertical part of the two letters. +% \begin{macrocode} + \put(9,11){\makebox(0,0)[bl]{% + \vrule height 12.5mm depth 0mm width 1.875mm + }}% + \put(14,1){\makebox(0,0)[bl]{% + \vrule height 12.5mm depth 0mm width 1.875mm + }}% + \endgroup +% \end{macrocode} +% Now redraw the outer strokes of the~``D'' and of the~``P'' in the +% strong color. +% \begin{macrocode} + \color{strong@col}% + \put(8,16){\oval(10,10)[l]}% + \put(8,11){\line(0,1){10}}% + \put(9,11){\framebox(3,20){}}% + \put(18,16){\oval(10,10)[r]}% + \put(18,11){\line(0,1){10}}% + \put(14,1){\framebox(3,20){}}% +% \end{macrocode} +% The strokes of the~``C'' are thick. +% \begin{macrocode} + \thicklines + \put(8,16){\oval(16,16)[l]}% + \put(8,8){\line(1,0){5}}% + \put(13,24){\line(1,0){10}}% + \put(8,16){\oval(14,14)[l]}% + \put(8,9){\line(1,0){5}}% + \put(13,23){\line(1,0){10}}% + \end{picture}% + }% + } +% \end{macrocode} +% \end{macro} +% Coloring the other parts of the seal is easier: just add the color +% declaration to the various boxes, to the rule in the head, and to the +% whole footer. +% \begin{macrocode} + \@temp@cdpaddon@b{@logo@box@addS} + \@temp@cdpaddon@b{@logo@box@addL} + \@temp@cdpaddon@b{@oordinamento@box} + \@temp@cdpaddon@a{@cdp@head}{\def\@cdp@head{% + \@logo@overlay\@logo@box@addL + \copy\@oordinamento@box + {\color{strong@col}\hrulefill}\kern\@lh@right@margin + }} + \@temp@cdpaddon@a{@cdp@foot}{\def\@cdp@foot{% + \color{strong@col}% + \reset@font + \setlength\@tempdima{\textwidth}% + \addtolength\@tempdima{-2\@lh@right@margin}% + \hss\parbox[t]{\@tempdima}{% + \parfillskip\z@skip + \noindent\hrulefill\@@par + \baselineskip 11\p@ + \hb@xt@\hsize{\hfil\copy\@name@and@WWW@box\hfil}% + }\hss + }} + \fi +% \end{macrocode} +% +% Support for user-defined letterheads added in vers.~0.36 (2015 Feb~08). +% Support for custom logo (cf.~\sty{logo} pagestyle and its relatives) +% still kept hidden. +% +% First, define storage boxes to hold custom head, foot, and logo. +% \begin{macrocode} + \newsavebox\@cdp@custom@lhead@box + \newsavebox\@cdp@custom@lfoot@box + \newsavebox\@cdp@custom@llogo@box +% \end{macrocode} +% +% \begin{environment}{customletterhead} +% \begin{environment}{customletterfoot} +% \begin{environment}{customletterlogo} +% These three environments are defined similarly, so we use one of the +% ``scratch'' macros to perform their definition +% The parameters are: +% \begin{paramlist} +% \param +% \( \texttt{head} \mathbin{|} \texttt{foot} \mathbin{|} +% \texttt{logo} \);\\ +% \param +% intended alignment of the \env{minipage} +% (\( \texttt{b} \mathbin{|} \texttt{t} \));\\ +% \param +% either "\vss" or nothing;\\ +% \param +% either "\vss" or nothing. +% \end{paramlist} +% \begin{macrocode} + \def\@temp@cdpaddon@b#1#2#3#4{% + \newenvironment*{customletter#1}[1]{% +% \end{macrocode} +% Save in the appropriate box, pretending that they have zero height and +% depth\ldots +% \begin{macrocode} + \setbox\@nameuse{@cdp@custom@l#1@box}\vbox to\z@ \bgroup + \hsize ##1\relax + \parskip \z@skip + #3% either \vss or nothing +% \end{macrocode} +% \ldots~the contents of a temporary \env{minipage}; note that we need to +% disable the ``"Missing \begin{document}"'' error, which is triggered by +% "\everypar". +% \begin{macrocode} + \everypar{}% + \noindent\minipage[#2]{##1}% + \null + }{% +% \end{macrocode} +% Code for ending the \env{minipage}: note that we smash to zero the +% possible depth of the contents. +% \begin{macrocode} + \par + \vskip -\baselineskip + \null + \endminipage + #4% either \vss or nothing + \egroup +% \end{macrocode} +% ``Lift'' the definition out of the group implied by the environment. +% We have used the outer boxes, above, because we prefer not to keep around +% any ``scratch'' boxes (\emph{e.g.}, "\box1") when we must pass control to +% the final user. +% \begin{macrocode} + \global \setbox \@ne \box \@nameuse{@cdp@custom@l#1@box}% + \xdef\@cdp@reserved{% + \setbox \@nameuse{@cdp@custom@l#1@box}\box \@ne + }% + \aftergroup \@cdp@reserved + }% + }% +% \end{macrocode} +% Perform definitions of the three abovementioned environments. +% \begin{macrocode} + \@temp@cdpaddon@b{head}{b}{\vss}{} + \@temp@cdpaddon@b{foot}{t}{}{\vss} + \@temp@cdpaddon@b{logo}{b}{\vss}{} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% +% \begin{macro}{\ruleacrossheadorfoot} +% Draw a rule across head or foot. Synopsis: +% \begin{flushleft} +% "\ruleacrossheadorfoot["\meta{wdth\_l}"]["\meta{wdth\_r}"]" +% \end{flushleft} +% \meta{wdth\_l} is the inset from the left margin (defaults to zero), +% a negative inset causes the rule to protrude into the margin itself; +% \meta{wdth\_r} is the inset from the right margin (defaults to +% \meta{wdth\_l}). Both \meta{wdth\_l} and \meta{wdth\_r} must be +% rigid lengths. \emph{Note:} "\@tempdima" and "\@tempdimb" are used here. +% \begin{macrocode} + \newcommand*\ruleacrossheadorfoot[1][\z@]{\par + \setlength\@tempdima{#1}% + \@ifnextchar [% ] bracket matching + \@cdp@rule@across@x + {% + \@tempdimb \@tempdima + \@cdp@rule@across + }% + } +% \end{macrocode} +% \end{macro} +% +% Inner implementation. +% \begin{macrocode} + \@ifdefinable\@cdp@rule@across@x{\def\@cdp@rule@across@x[#1]{% + \setlength\@tempdimb{#1}% + \@cdp@rule@across + }} + \@ifdefinable\@cdp@rule@across{\def\@cdp@rule@across{ + \nobreak + \vskip -\baselineskip + \hb@xt@ \hsize {% + \kern \@tempdima \hrulefill \kern \@tempdimb + }% + }} +% \end{macrocode} +% +% If the \opz{customletterhead} option is in force, install custom +% head\slash foot\slash logo. +% \begin{macrocode} + \if@custom@lh@ + \@temp@cdpaddon@a{@cdp@head}{\def\@cdp@head{% + \hss\copy\@cdp@custom@lhead@box\hss + }} + \@temp@cdpaddon@a{@cdp@foot}{\def\@cdp@foot{% + \hss\copy\@cdp@custom@lfoot@box\hss + }} +% \end{macrocode} +% \changes{0.36d}{2018 Feb 08}{Changed \texttt{\protect\bslash hb@xt@ +% \protect\bslash z@\protect\symbol{`\{}\protect\bslash +% hss}\,\ldots\texttt{\protect\symbol{`\}}} to \texttt{\protect\bslash +% llap\protect\symbol{`\{}}\,\ldots\texttt{\protect\symbol{`\}}} in the +% code that typesets the custom logo.}^^A +% The logo is assumed to protrude to the left of the header +% ("\llap" used in v.~0.36d). +% \begin{macrocode} + \@temp@cdpaddon@a{@cdp@logo}{\def\@cdp@logo{% + \llap{\copy\@cdp@custom@llogo@box}% + }} +% \end{macrocode} +% Do not forget to reset "\longindentation"! +% \begin{macrocode} + \setlength\longindentation{.5\textwidth} + \fi +% \end{macrocode} +% +% We now deal with hyperlinks. If the user requested them\ldots +% \begin{macrocode} + \if@use@hyper@ +% \end{macrocode} +% \ldots well, we take care of them. The precompilation of the footer must +% be deferred until the "\begin{document}" hook, because the macros of the +% \packlass{\HyperRef} package are not available for actual typesetting until +% that moment. Note that here we only add the "\href" command: the +% color-switching has already been taken care of inside the "\@cdp@foot" box +% (the use of color is independent of the use of hyperlinks). +% \changes{0.36d}{2018 Feb 08}{Added selection of OT1 font encoding to the +% code that presets the ``hyperlink'' version of +% \texttt{\protect\bslash @name@and@WWW@box}.}^^A +% Vers.~0.36d: added "\fontencoding{OT1}\selectfont". +% \begin{macrocode} + \AtBeginDocument{% + \@temp@cdpaddon@a{@name@and@WWW@box}{% + \setbox\@name@and@WWW@box = \vtop{% + \baselineskip 11\p@ + \fontencoding{OT1}\selectfont + \hb@xt@\z@{\hss \@lh@rm\Coordinamento \hss}% + \hb@xt@\z@{% + \hss + \@lh@it World Wide Web:\/ + \href{\CoordinamentoWWW}{\@lh@tt \CoordinamentoWWW}% + \hss + }% + }% + }% +% \end{macrocode} +% In this case we must defer releasing "\@temp@cdpaddon@a" until +% "\begin{document}". +% \begin{macrocode} + \let\@temp@cdpaddon@a\@undefined + } +% \end{macrocode} +% The following line has been removed from the code, since the +% bookmark level for paragraphs is now fixed in the file +% \filedir{\articoletteracdp.cls} (v.~0.34). +%\begin{verbatim} +%\def\toclevel@paragraph{2} +%\end{verbatim} +% If hyperlinks are not requested, we can release "\@temp@cdpaddon@a" +% right now. +% \begin{macrocode} + \else + \let\@temp@cdpaddon@a\@undefined + \fi +% \end{macrocode} +% +% We can do the same thing if the \packlass{\letteracdp} class is +% not loaded. +% \begin{macrocode} +\else + \let\@temp@cdpaddon@a\@undefined +\fi +% \end{macrocode} +% +% The memory taken by the following ``scratch'' macros can be freed +% in any case. +% \begin{macrocode} +\let\if@using@cdp@\@undefined +\let\@using@cdp@true\@undefined +\let\@using@cdp@false\@undefined +\let\if@use@color@\@undefined +\let\@use@color@true\@undefined +\let\@use@color@false\@undefined +\let\if@use@hyper@\@undefined +\let\@use@hyper@true\@undefined +\let\@use@hyper@false\@undefined +% \end{macrocode} +% Vers.~0.36 (2015 Feb~08): added the following three lines\ldots +% \begin{macrocode} +\let\if@custom@lh@\@undefined +\let\@custom@lh@true\@undefined +\let\@custom@lh@false\@undefined +% \end{macrocode} +% \ldots~and removed the following one: +%\begin{verbatim} +%\let\@back@folding@tag\@undefined +%\end{verbatim} +% \begin{macrocode} +\let\@cdpaddon@printer\@undefined +\let\@temp@cdpaddon@b\@undefined +% \end{macrocode} +% +% \subsubsection{Smiling faces} +% +% \begin{macro}{\facesmile} +% \begin{macro}{\facefrown} +% These commands produce happy or sad ``faces''. They are made +% ``transparent'' to the "\spacefactor", just like parentheses +% (the "\spacefactor" is saved in "\count@"). +% \begin{macrocode} +\DeclareRobustCommand*\facesmile{\@face\smile} +\DeclareRobustCommand*\facefrown{\@face\frown} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@face} +% The low-level command that draws the face ("\bigcirc"), the eyes, +% and the mouth: the latter is passed as an argument, so it can be +% either a "\smile" or a "\frown". +% \begin{macrocode} +\@ifdefinable\@face{\def\@face#1{% + \leavevmode + \count@\spacefactor + \hb@xt@ 1em{\hfil$% + \hb@xt@\z@ {\hss$\bigcirc$\hss}% + \lower .2ex \hb@xt@\z@ {\hss$\scriptscriptstyle #1$\hss}% + \raise .3ex \hb@xt@\z@ {\hss${\cdot}\mkern 2mu{\cdot}$\hss}% + $\hfil}% + \spacefactor\count@ +}} +% \end{macrocode} +% \end{macro} +% +% End of the module for the \packlass{\cdpaddon} package. +% \begin{macrocode} +%</addon> +% \end{macrocode} +% \noindent\null\par +% +% \section{The code for the \protect\packlass{\cdpbabel} package} +% +% This part of the file goes into \filedir{\cdpbabel.sty}. +% \begin{macrocode} +%<*babel> +% \end{macrocode} +% +% \subsection{Identification} +% +% As usual, the reason for requesting this specific version of \LaTeXe\ is +% shrouded in mystery\ldots +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1998/09/02] % LaTeX2e is required! +\ProvidesPackage{cdpbabel} + [2018/02/08 v0.36d (development)] +\@ifdefinable\@cdpbabel{\def\@cdpbabel{cdpbabel}} +% \end{macrocode} +% +% \subsection{Initial code} +% +% Usual check for availability of names. +% \begin{macrocode} +\def\do#1{\@ifdefinable #1{\let #1\@empty}} +\do\@cdpbabel@perform@redefinitions +\do\@cdpbabel@letter@names +\do\@cdpbabel@artlet@names +% \end{macrocode} +% +% \subsection{Declaration of options} +% +% Options specify which languages should be activated. A language option is +% both passed on to the \packlass{\babel} package and used to select and +% load a ``C.D.P. language definition file''. +% \begin{macrocode} +\DeclareOption*{% + \IfFileExists{cdpnames\CurrentOption.ldf}{% + \input{cdpnames\CurrentOption.ldf}% +% \end{macrocode} +% If \( "\CurrentOption" = \mbox{\opz{italian}} \), say, +% then the following amounts to +%\begin{verbatim} +%\def\do#1{\g@addto@macro\@cdpbabel@perform@redefinitions{% +% \addto\captionsitalian{#1}% +%}} +%\end{verbatim} +% which is used just below with parameter~\#1 set equal to +% \emph{the expansion of} either "\@cdpbabel@letter@names" or +% "\@cdpbabel@artlet@names". +% \begin{macrocode} + \edef\do##1{% + \noexpand\g@addto@macro + \noexpand\@cdpbabel@perform@redefinitions + {% + \noexpand\addto \csname captions\CurrentOption \endcsname + {##1}% + }% + }% + \@ifclassloaded{letteracdp}{% + \expandafter\do \expandafter{\@cdpbabel@letter@names}% + }{}% + \@ifclassloaded{articoletteracdp}{% + \expandafter\do \expandafter{\@cdpbabel@artlet@names}% + }{}% + \PackageInfo{\@cdpbabel}{% + Redefined the names of "C.D.P. Bundle" captions\MessageBreak + for the language `\CurrentOption'% + }% + }{% + \PackageError{\@cdpbabel}{% + Name def. file `cdpnames\CurrentOption.ldf' not found% + }{% + Files of the form `cdpnames<language>.ldf' are meant + to define the names\MessageBreak + in the language <language> of some captions used by + the "C.D.P. Bundle".\MessageBreak + You requested\MessageBreak + \space\space<language> = `\CurrentOption',\MessageBreak + but the corresponding file is missing; therefore, + probably some of these\MessageBreak + captions will not be printed as intended.\MessageBreak + This error affects only the \@cdpbabel\space package, + but not the babel package.\MessageBreak + You may continue: + type \space <return> \space to proceed.% + }% + }% + \PassOptionsToPackage{\CurrentOption}{babel}% +} +% \end{macrocode} +% +% \subsection{Option processing} +% +% \mbox{$*$-form} of "\ProcessOptions" required here. +% \begin{macrocode} +\ProcessOptions* +% \end{macrocode} +% Now, the following are no longer needed. +% \begin{macrocode} +\let \do = \@undefined +\let \@cdpbabel@letter@names = \@undefined +\let \@cdpbabel@artlet@names = \@undefined +% \end{macrocode} +% +% \subsection{Package loading} +% +% Note that the \packlass{\cdpbabel} package is loaded \emph{instead} of +% \packlass{\babel}. +% \begin{macrocode} +\RequirePackage{babel} +% \end{macrocode} +% +% \subsection{Main code} +% +% At this point, "\@cdpbabel@perform@redefinitions" contains exactly the +% set of "\addto\captions"\meta{language}"{"\ldots"}" commands that need +% to be executed for the languages that have been specified in the options. +% So, execute them. +% \begin{macrocode} +\@cdpbabel@perform@redefinitions +% \end{macrocode} +% After that, "\@cdpbabel@perform@redefinitions" is no longer needed. +% \begin{macrocode} +\let \@cdpbabel@perform@redefinitions = \@undefined +% \end{macrocode} +% +% End of the module for the \packlass{\cdpbabel} package. +% \begin{macrocode} +%</babel> +% \end{macrocode} +% \noindent\null\par +% +% \section{Definition and configuration files} +% +% This section contains the ancillary files (definition and +% configuration files) used by the \packlass{\cdpaddon} and +% the \packlass{\cdpbabel} packages. +% +% \subsection{The \protect\filedir{\example} file} +% +% This part of the file goes into the prototype definition file +% \filedir{\example}. All comments are left in the code because this +% file is intended as an example of how to write color definition files +% for the \packlass{\cdpaddon} package. +% \begin{macrocode} +%<*example> +%%% +%%% The "\ProvidesFile" command allows LaTeX to check the name and +%%% the release date of the file; if either differs from what the +%%% user requested, a warning is issued when the file is loaded. +%%% This helps to pinpoint old files as well as files which have been +%%% installed incorrectly. It is not mandatory to include this +%%% command in a file, and you can omit it from your definition files +%%% if you want (but including it is more elegant); however, if you do +%%% leave this command in your definition files, you should modify +%%% both its mandatory and its optional argument so that they reflect +%%% the name and the release date, respectively, of your file. +%%% Note that the extension ".def" must be included in the file name, +%%% and that the date is in the format YYYY/MM/DD. +\ProvidesFile{cdpshues-example.def}[2018/02/08 Printer-dependent file] +%%% +%%% Define here the colors to use to draw the C.D.P. seal; +%%% "slight@col" is the color used to paint the inner of the D and +%%% of the P, "strong@col" is the color used to draw the lines. +%%% The colors are defined by means of the usual "\definecolor" +%%% command, which is part of the standard color package. The colors +%%% defined here, of course, are just a silly example. +\definecolor{slight@col}{named}{SpringGreen} +\definecolor{strong@col}{named}{OliveGreen} +%</example> +% \end{macrocode} +% +% \subsection{The \protect\filedir{\epson} file} +% +% This part of the file goes into the definition file +% \filedir{\epson}. +% \begin{macrocode} +%<*epson> +\ProvidesFile{epson-stylus-740.def}[2018/02/08 Printer-dependent file] +\definecolor{slight@col}{rgb}{.8,1,.8} +\definecolor{strong@col}{rgb}{0,.266667,0} +%</epson> +% \end{macrocode} +% +% \subsection{The \protect\filedir{\hplj} file} +% +% This part of the file goes into the definition file \filedir{\hplj}. +% \begin{macrocode} +%<*hplj> +\ProvidesFile{hp-laserjet-4500.def}[2018/02/08 Printer-dependent file] +\definecolor{slight@col}{cmyk}{.1,0,.1,0} +\definecolor{strong@col}{cmyk}{.5,0,.5,.5} +%</hplj> +% \end{macrocode} +% +% \subsection{The \protect\filedir{\cdpshues} file} +% +% This part of the file goes into the configuration file +% \filedir{\cdpshues}. Again, we leave all comments in the generated +% file because they are meant to help the final user to modify the file. +% \begin{macrocode} +%<*config> +%%% +%%% The argument of the "\DeclareCDPSealHuesDefault" command contains +%%% the name (w/o extension) of the default color definition file: +\DeclareCDPSealHuesDefault{cdpshues} + +==================== +EXPLANATORY COMMENTS +==================== + +This file is special in that the cdpaddon package stops reading it as +soon as it encounters the first "\DeclareCDPSealHuesDefault" command: +all subsequent lines are ignored, and can hence contain explanatory +comments, just like these. To save disk space (although, in this era +of terabytes, this is not a compelling issue!), you can, if you want, +delete all lines in this file except the one which contains the first +occurrence of a "\DeclareCDPSealHuesDefault" command (12 lines above); +but if you do so, please be sure to read them before deleting them! +(Anyway, I think it is a good idea to leave the comments in place.) + +The "\DeclareCDPSealHuesDefault" command has one argument, in which +you should put the name of a default file from which the definitions +of the hues for the C.D.P. seal are read when no other file has been +indicated in the options passed to the cdpaddon package. Note that +the extension ".def" is automatically added to the name; therefore, +you **must** leave it out in the name given as the argument of the +"\DeclareCDPSealHuesDefault" command. + +The C.D.P. Bundle comes with some definition files already included; +their names are listed below, without the extension ".def" (each one +is packaged in a "\DeclareCDPSealHuesDefault" command): + +\DeclareCDPSealHuesDefault{cdpshues-example} +\DeclareCDPSealHuesDefault{epson-stylus-740} +\DeclareCDPSealHuesDefault{hp-laserjet-4500} + +To make one of these files the default one, copy (or move) the line +containing its name to the top of the file, so that its becomes the +first line (yes, even above the opening comments, those four dozens +lines starting with "%%": let us keep things easy!). + +If you write a new definition file, you can make it the default by +writing a similar "\DeclareCDPSealHuesDefault" command and putting it +in the first line of this file (above the opening comments, why not). +Remember that only the first such command appearing in this file is +taken into consideration: all subsequent lines are ignored. + +%</config> +% \end{macrocode} +% +% \subsection{The \protect\filedir{\cdpnamesenglish} file} +% +% This part of the file goes into the language definition file +% \filedir{\cdpnamesenglish}. +% \begin{macrocode} +%<*lang-en> +\ProvidesFile{cdpnamesenglish.ldf}[2018/02/08] +\def\@cdpbabel@letter@names{% + \def\subjectname {Subject:}% + \def\registeredname {Registered}% + \def\registeredRRname {\registeredname~R.R.}% + \def\andccname {cc}% + \def\ccname {cc:}% + \def\enclname {Encl:}% + \def\PSname {P.S.:}% + \def\headtoname {To:}% + \def\lettername {Letter}% +} +\def\@cdpbabel@artlet@names{% + \def\contentsname {Contents}% + \def\listfigurename {List of figures}% + \def\listtablename {List of tables}% +%% \def\refname {References}% +%% \def\indexname {Index}% +%% \def\figurename {Figure}% +%% \def\tablename {Table}% +} +%</lang-en> +% \end{macrocode} +% +% \subsection{The \protect\filedir{\cdpnamesitalian} file} +% +% This part of the file goes into the language definition file +% \filedir{\cdpnamesitalian}. +% \begin{macrocode} +%<*lang-it> +\ProvidesFile{cdpnamesitalian.ldf}[2018/02/08] +\def\@cdpbabel@letter@names{% + \def\subjectname {Oggetto:}% + \def\registeredname {Raccomandata}% + \def\registeredRRname {\registeredname~A.R.}% + \def\andccname {e~p.~c.}% + \def\ccname {P.~c.:}% + \def\enclname {Allegati:}% + \def\PSname {P.S.:}% + \def\headtoname {A:}% + \def\lettername {Lettera}% +} +\def\@cdpbabel@artlet@names{% + \def\contentsname {Sommario}% + \def\listfigurename {Indice delle figure}% + \def\listtablename {Indice delle tabelle}% + \def\refname {Testi citati}% +%% \def\indexname {Indice analitico}% +%% \def\figurename {Figura}% +%% \def\tablename {Tabella}% +} +%</lang-it> +% \end{macrocode} +% +% \section{End of input} +% +% The usual "\endinput" which prevents the \DS\ program from putting +% garbage into the generated files. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \Finale +% diff --git a/macros/latex/contrib/cdpbundl/cdpbundl.ins b/macros/latex/contrib/cdpbundl/cdpbundl.ins new file mode 100644 index 0000000000..40cff0bd27 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/cdpbundl.ins @@ -0,0 +1,193 @@ +% +% This is file `cdpbundl.ins'. +% +% This file is part of a work named "C.D.P. Bundle". +% +% Copyright (C) 1999-2018 by Gustavo MEZZETTI +% <gustavo.mezzetti@istruzione.it>. +% +% The C.D.P. Bundle may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% The C.D.P. Bundle has the LPPL maintenance status +% "author-maintained". +% +% The file `manifest.txt' that comes along with this file specifies +% what the C.D.P. Bundle consists of; more precisely, it explains how +% the locutions "Work" and "Compiled Work", used in the LaTeX Project +% Public License, are to be interpreted in the case of this work. +% +% Note that the distribution of this file alone is "distribution of +% only part of the Work" in the sense of the LaTeX Project Public +% License, and should be avoided. +% +% February 8, 2018 (vers. 0.36d) +% +\input docstrip + +\def\filename{cdpbundl.dtx} + +\newif\ifWritingToDirectoryOfTDS +\WritingToDirectoryOfTDSfalse + +\edef\WriteToDir{\WriteToDir} +\def\TryToUseMyDir{% + \usedir{tex/latex/cdpbundl} + \ifx \destdir\WriteToDir \else + \WritingToDirectoryOfTDStrue + \fi +} +\def\Y{Y} + + + +\Msg{----------------------------------------------------------------} +\Msg{} +\Msg{Unpacking the C.D.P. Bundle.} +\Msg{} +\Msg{The macro files contained in the C.D.P. Bundle are now standard,} +\Msg{so it now makes sense to try to install the generated files into} +\Msg{their own TeX directory, using the \string\usedir\space facility of DocStrip;} +\Msg{if that fails, they will be just saved in the current directory.} +\Msg{In this case, in order to finish the installation, you will have} +\Msg{to move them into a directory where LaTeX can find them: see the} +\Msg{documentation specific to your TeX implementation to learn where} +\Msg{such directories are located on your system.} +\Msg{} + +\catcode`\@ = 11 + +\ifx \usedir\alt@usedir + +\Msg{On your system, the name of the installation directory should be} +\Msg{} +\Msg{\space\space\space\space\showdirectory{tex/latex/cdpbundl}} +\Msg{} +\Msg{Please make sure that the above directory exists on your system,} +\Msg{and that you have permission to create or overwrite files in it;} +\Msg{if so, you may choose to put the generated files directly there.} +\Msg{} +\Msg{----------------------------------------------------------------} +\Msg{} +\Msg{Put files directly in suggested directory} +\Msg{\space\space\space\space\showdirectory{tex/latex/cdpbundl}} +\Ask\answer{or not? [y/n]} + +\ifx \answer\yes + \TryToUseMyDir +\else \ifx \answer\y + \TryToUseMyDir +\else \ifx \answer\Y + \TryToUseMyDir +\fi \fi \fi + +\else % of \ifx \usedir\alt@usedir + +\Msg{It seems that the configuration of your system does not allow us} +\Msg{to use the \string\usedir\space facility: writing files to current directory.} + +\fi % of \ifx \usedir\alt@usedir + +\Msg{} + +\ifWritingToDirectoryOfTDS + +\Msg{Trying to install files directly in the proposed directory.} +\Msg{} + +\else + +\Msg{Either you chose NOT to install files in the proposed directory,} +\Msg{or, despite your choice, your system is not configured to permit} +\Msg{you to do so. \space Therefore all files will be placed in the current} +\Msg{directory and you will have to move them to a suitable directory} +\Msg{by hand. \space At the end of this run, you will be presented with the} +\Msg{complete list of the files you need to move.} +\Msg{} +\Ask\answer{Press \space <return> \space to continue + (your \string\answer\space will be ignored).} + +\fi + +\preamble + +This is a generated file. +It is part of a work named "C.D.P. Bundle". + +Copyright (C) 1999-2018 by Gustavo MEZZETTI + <gustavo.mezzetti@istruzione.it>. + +The C.D.P. Bundle may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +The C.D.P. Bundle has the LPPL maintenance status + "author-maintained". + +The file `manifest.txt' that comes along with this file specifies +what the C.D.P. Bundle consists of; more precisely, it explains how +the locutions "Work" and "Compiled Work", used in the LaTeX Project +Public License, are to be interpreted in the case of this work. + +Note that the distribution of this file alone is "distribution of +only part of the Work" in the sense of the LaTeX Project Public +License, and should be avoided. + +February 8, 2018 (vers. 0.36d) + +\endpreamble + +\askonceonly + +\generate{ + \file{letteracdp.cls} {\from{\filename}{letter}} + \file{articoletteracdp.cls}{\from{\filename}{artico}} + \file{cdpaddon.sty} {\from{\filename}{addon}} + \file{cdpbabel.sty} {\from{\filename}{babel}} + \file{cdpshues-example.def}{\from{\filename}{example}} + \file{epson-stylus-740.def}{\from{\filename}{epson}} + \file{hp-laserjet-4500.def}{\from{\filename}{hplj}} + \file{cdpshues.cfg} {\from{\filename}{config}} + \file{cdpnamesenglish.ldf} {\from{\filename}{lang-en}} + \file{cdpnamesitalian.ldf} {\from{\filename}{lang-it}} +} + +\Msg{} + +\ifWritingToDirectoryOfTDS + +\Msg{Installation finished. \space Check that the proposed directory} +\Msg{\space\space\space\space\showdirectory{tex/latex/cdpbundl}} +\Msg{has been correctly updated.} + +\else + +\Msg{To finish the installation, please move the following files into} +\Msg{a directory where LaTeX looks for inputs files:} +\Msg{} +\Msg{\space\space\space\space articoletteracdp.cls} +\Msg{\space\space\space\space cdpaddon.sty} +\Msg{\space\space\space\space cdpbabel.sty} +\Msg{\space\space\space\space cdpnamesenglish.ldf} +\Msg{\space\space\space\space cdpnamesitalian.ldf} +\Msg{\space\space\space\space cdpshues-example.def} +\Msg{\space\space\space\space cdpshues.cfg} +\Msg{\space\space\space\space epson-stylus-740.def} +\Msg{\space\space\space\space hp-laserjet-4500.def} +\Msg{\space\space\space\space letteracdp.cls} + +\fi + +\Msg{} +\Msg{Happy TeXing!} + +\endbatchfile diff --git a/macros/latex/contrib/cdpbundl/manifest.txt b/macros/latex/contrib/cdpbundl/manifest.txt new file mode 100644 index 0000000000..8983828df0 --- /dev/null +++ b/macros/latex/contrib/cdpbundl/manifest.txt @@ -0,0 +1,108 @@ + +This is file `manifest.txt'. + +This file is part of a work named "C.D.P. Bundle". + +Copyright (C) 1999-2018 by Gustavo MEZZETTI + <gustavo.mezzetti@istruzione.it>. + +The C.D.P. Bundle may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3 +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +The C.D.P. Bundle has the LPPL maintenance status + "author-maintained". + +This file specifies what the C.D.P. Bundle consists of; more +precisely, it explains how the locutions "Work" and "Compiled Work", +used in the LaTeX Project Public License, are to be interpreted +in the case of this work. + +February 8, 2018 (vers. 0.36d) + + + +MEANING OF THE TERM "Work" +========================== + +In the case of the C.D.P. Bundle, the "Work" is the collection of the +following 4 files: + +00readme.txt -- start by reading this file +manifest.txt -- the file you are reading now +cdpbundl.dtx -- main source file +cdpbundl.ins -- installation script + +If you have received the 4 files listed above, you possess an integral copy +of the C.D.P. Bundle. + + + +MEANING OF THE TERM "Compiled Work" +=================================== + +In the case of the C.D.P. Bundle, a "Compiled Work" is the collection of: + +a) the following 2 files that are also part of the "Work" (see above): + +00readme.txt +manifest.txt + +AND +b) the following 11 files: + +letteracdp.cls -- the letteracdp LaTeX document class +articoletteracdp.cls -- the articoletteracdp LaTeX document class +cdpaddon.sty -- the cdpaddon LaTeX package +cdpbabel.sty -- the cdpbabel LaTeX package +cdpnamesenglish.ldf -- language-dependent definitions of the captions +cdpnamesitalian.ldf / +cdpshues-example.def -- prototype color definition file +epson-stylus-740.def -- other example color definition files +hp-laserjet-4500.def / +cdpshues.cfg -- configuration file for the cdpaddon package +cdpbundl.dvi -- full documentation in DVI format + +You may, at your option, substitute the file `cdpbundl.dvi' with either +one (or both) of the following two files: + +cdpbundl.pdf -- full documentation in PDF +cdpbundl-doc.pdf -- overview of the C.D.P. Bundle (PDF) + +but at least one among the files `cdpbundl.dvi', `cdpbundl.pdf', and +`cdpbundl-doc.pdf' must be included in a "Compiled Work" that you intend +to distribute. The file `cdpbundl.pdf' is obtained by submitting to the +program pdflatex the file `cdpbundl.dtx', following the same steps as +those explained in `00readme.txt' under the title "How to generate the +documentation". + + + +ANCILLARY FILES +=============== + +The package of files distributed through the Comprehensive TeX Archive +Network (CTAN) includes also the following five files: + +README -- guide to directory contents +cdpbundl-doc.pdf -- overview of the C.D.P. Bundle (PDF) +cdp-ver-0-36.pdf -- instructions specific to version 0.36 (PDF) +cdp-ver-0-36.tex -- LaTeX source of the preceding item +Makefile -- Makefile to generate code and/or documentation + +These five files are included only for convenience's sake and are _not_ a +required part of the C.D.P. Bundle (of course you may, if you wish, include +them in your distribution too). + + + +COMMENT +======= + +Please remember that, in order to distribute a LPPL-compliant copy of the +C.D.P. Bundle, it suffices to distribute only the 4 files that constitute +the "Work". |