summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lettre/lettre.cls
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-04-13 03:03:00 +0000
committerNorbert Preining <norbert@preining.info>2020-04-13 03:03:00 +0000
commitc98e9ebef816f09dc54c52a01df4f978e1b210fc (patch)
tree0073017824e78ee91d2356f76d2b2944437da5d9 /macros/latex/contrib/lettre/lettre.cls
parentffcfe2bb60911db71a31e4c12541eae3e9df29f3 (diff)
CTAN sync 202004130303
Diffstat (limited to 'macros/latex/contrib/lettre/lettre.cls')
-rw-r--r--macros/latex/contrib/lettre/lettre.cls2575
1 files changed, 2575 insertions, 0 deletions
diff --git a/macros/latex/contrib/lettre/lettre.cls b/macros/latex/contrib/lettre/lettre.cls
new file mode 100644
index 0000000000..c4036646d9
--- /dev/null
+++ b/macros/latex/contrib/lettre/lettre.cls
@@ -0,0 +1,2575 @@
+%^^A file name : `lettre.cls'.
+%^^A package name: lettre
+%^^A maintenance : Vincent Belaïche (vincentb1@users.sourceforge.net)
+%^^A author : Denis Mégevand - Observatoire de Genève
+%^^A email : vincentb1@users.sourceforge.net
+%^^A version : v3.001
+%^^A date : 2020/04/11
+%^^A
+%^^A This file is part of the "lettre" package.
+%^^A This work may be distributed and/or modified under the conditions of the
+%^^A LaTeX Project Public License, either version 1.3 of this license or (at your
+%^^A option) any later version. The latest version of this license is in
+%^^A http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all
+%^^A distributions of LaTeX version 2005/12/01 or later.
+%^^A
+%^^A This work has the LPPL maintenance status `maintained'.
+%^^A
+%^^A The Current Maintainer of this work is Vincent Belaïche.
+%^^A
+%^^A This work consists of all files listed in file README
+%^^A
+%
+%\subsection{Préambule}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+% \end{macrocode}
+%\changes{2.354}{2014-09-19}{Ajout \texttt{etoolbox} requis: c'est pour avoir \cs{ifcsundef}}%
+% \begin{macrocode}
+\RequirePackage{etoolbox}
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{graphicx}
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesClass{lettre}[2020/04/11 v3.001]%
+\typeout{Copyleft Denis Megevand - Observatoire de Geneve}%
+% \end{macrocode}
+%\subsection{Déclaration des options de paquetage}
+%\subsubsection{Options pour la mise en forme}
+% \begin{macrocode}
+\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
+\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
+\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
+% \end{macrocode}
+% \changes{2.351}{2014-07-26}{Ajout option \texttt{a4paper}}%
+% \changes{2.354}{2014-10-02}{Ajout options \texttt{letterpaper},
+% \texttt{legalpaper}, \texttt{executivepaper}, \texttt{b5paper} et
+% \texttt{a5paper}, pour cela on définit les longueurs \cs{lettre@x@mm}
+% et \cs{lettre@y@mm}}%
+% La longueur \cs{lettre@x@mm} et \cs{lettre@y@mm} permettent de
+% ramener les longueurs données pour du format A4 dans le format
+% courant. C'est à dire que la longueur \cs{lettre@x@mm} est telle
+% que~:
+% \[\cs{lettre@x@mm} =
+% \frac{\cs{paperwidth}}{\SI{210}{\milli\metre}}\si{\milli\metre}\]
+% De même la longueur \cs{lettre@y@mm} est telle que~:
+% \[\cs{lettre@y@mm} =
+% \frac{\cs{paperheight}}{\SI{297}{\milli\metre}}\si{\milli\metre}\]
+% \begin{macrocode}
+\newlength\lettre@x@mm
+\setlength\lettre@x@mm{1mm}%
+\newlength\lettre@y@mm
+\setlength\lettre@y@mm{1mm}
+\if@compatibility\else
+\DeclareOption{a4paper}
+ {\setlength\paperheight {297mm}%
+ \setlength\paperwidth {210mm}%
+ \lettre@x@mm=1mm%
+ \lettre@y@mm=1mm%
+ }
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareOption{letterpaper}
+ {\setlength\paperheight {11.00in}%
+ \setlength\paperwidth {8.50in}%
+ \lettre@y@mm=0.94074074074mm%
+ \lettre@x@mm=1.0280952381mm%
+ }
+\DeclareOption{legalpaper}
+ {\setlength\paperheight {14.00in}%
+ \setlength\paperwidth {8.50in}%
+ \lettre@y@mm=1.19730639731mm%
+ \lettre@x@mm=1.0280952381mm%
+ }
+\DeclareOption{executivepaper}
+ {\setlength\paperheight {10.50in}%
+ \setlength\paperwidth {7.25in}%
+ \lettre@y@mm=0.897979797979mm%
+ \lettre@x@mm=0.876904761905mm%
+}
+\DeclareOption{b5paper}
+ {\setlength\paperheight {250.00mm}%
+ \setlength\paperwidth {176.00mm}%
+ \lettre@y@mm=0.841750841751mm%
+ \lettre@x@mm=0.838095238095mm%
+}
+\DeclareOption{a5paper}
+ {\setlength\paperheight {210.00mm}%
+ \setlength\paperwidth {148.00mm}%
+ \lettre@y@mm=0.707070707071mm%
+ \lettre@x@mm=0.704761904762mm%
+}
+\fi
+\if@compatibility
+ \DeclareOption{twoside}{\ClassError{lettre}{No `twoside' layout for letters}%
+ {LaTeX2e is running in compatibility mode, in this mode there is no `twoside'
+ layout for letters}}
+\else
+ \DeclareOption{twoside}{\@twosidetrue}
+\fi
+\DeclareOption{oneside}{\@twosidefalse}
+\DeclareOption{origdate}{\@origdatetrue\l@@info{Mode `origdate'}}
+\DeclareOption{draft}{\setlength\overfullrule{5pt}}
+\DeclareOption{final}{\setlength\overfullrule{0pt}}
+\DeclareOption{leqno}{\input{leqno.clo}}
+\DeclareOption{fleqn}{\input{fleqn.clo}}
+% \end{macrocode}
+%\changes{3.000}{2015-12-28}{Ajout option \texttt{keep envs}}%
+%\changes{3.001}{2019-07-23}{Refonte implémentation option \texttt{keep envs}, pour prendre en charge détection auto.}%
+% \begin{macrocode}
+\DeclareOption{keepenvs=true}{\lettre@keep@envs1}%
+\DeclareOption{keepenvs=false}{\lettre@keep@envs2}%
+\DeclareOption{keepenvs}{\ExecuteOptions{keepenvs=true}}%
+% \end{macrocode}
+%\subsubsection{Options pour la langue}
+% Tout d'abord on se fait un petit itérateur, histoire de gérer l'ensemble des langues de façon
+% programatique. Le principe c'est que si on appelle
+% \cs{lettre@iterate}\meta{liste}\texttt{,}\cs{@nil}\texttt{,}, alors \cs{lettre@iterate@body} est appelé sur
+% chaque élément de la liste \meta{liste} qui est une liste dont les items sont séparés par des virgules.
+% \begin{macrocode}
+\def\lettre@iterate#1,{%
+ {%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@nnil
+ \let\@tempa\@empty
+ \else
+ \def\@tempa{%
+ \lettre@iterate@body{#1}%
+ \lettre@iterate
+ }%
+ \fi
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+%\begin{macro}{\lettre@supported@language@list}
+% Liste des langues prises en charge par la classe \texttt{lettre}. C'est une liste dont les éléments sont
+% séparés par des virgules (sans espaces ni éléments vides). Chaque élément de la liste est un langage pour
+% lequel \texttt{lettre} a une option de langue et est capable de charger les définitions
+% correspondantes. La raison d'être de cette liste est de factoriser les itérations pour les cas suivants:
+% \begin{itemize}
+% \item charger les définitions lorsque le langage en question est utilisé par \texttt{babel} ou \texttt{mlp}~;
+% \item charger les définitions lorsque le langage est demandé par une option de classe.
+% \end{itemize}
+% \begin{macrocode}
+\newcommand*\lettre@supported@language@list{%
+ francais,french,frenchb,romand,%
+ allemand,german,germanb,ngerman,ngermanb,%
+ americain,american,USenglish,%
+ anglais,english,british,UKenglish%
+}%
+% \end{macrocode}
+%\end{macro}
+% Cependant, toutes les langues \meta{langue} dans \cs{lettre@supported@language@list} ne correspondent pas à
+% un fichier \texttt{lettre-}\meta{langue}\texttt{.ldf}, car certaines ne sont que des alias. Aussi on commence
+% par définir que par défaut une langue n'a pas d'alias (en d'autres termes elle est l'alias d'elle-même).
+% \begin{macrocode}
+\newcommand*\lettre@iterate@body[1]{%
+ \expandafter\def\csname lettre@#1@alias@of\endcsname{#1}}%
+\expandafter\lettre@iterate\lettre@supported@language@list,\@nil,%
+% \end{macrocode}
+% Ceci étant fait, on définit celles des langues qui sont des alias d'une autre langue~:
+% \begin{macrocode}
+\def\@tempa#1#2{\expandafter\def\csname lettre@#1@alias@of\endcsname{#2}}%
+\@tempa{frenchb}{french}
+\@tempa{francais}{french}
+\@tempa{allemand}{german}
+\@tempa{germanb}{german}
+\@tempa{ngermanb}{german}
+\@tempa{ngerman}{german}
+\@tempa{anglais}{english}
+\@tempa{british}{english}
+\@tempa{american}{USenglish}
+\@tempa{americain}{USenglish}
+% \end{macrocode}
+% \DescribeMacro{\lettre@languages} \cs{lettre@languages} contient la liste des langues pour lesquelles les
+% définitions ont été chargées. Le chargement ne se fait pas immédiatement, mais après le \cs{ProcessOption} de
+% sorte à rendre possible que dans le fichier de définitions il y ait un \cs{RequirePackage}. Cette
+% possibilité n'est pas utilisée actuellement.
+% \begin{macrocode}
+\newcommand*\lettre@languages{}%
+% \end{macrocode}
+% \DescribeMacro{\lettre@mainlang}\cs{lettre@mainlang} est la langue demandée par l'utilisateur. C'est
+% nécessairement un élément de la liste \cs{lettre@supported@language@list}.
+% \begin{macrocode}
+\newcommand*\lettre@mainlang{}%
+% \end{macrocode}
+% \DescribeMacro{\lettre@ldf@version} \cs{lettre@ldf@version}\marg{lang} est la version de chaque fichier
+% \texttt{lettre-}\meta{langue}\texttt{.ldf}
+% \begin{macrocode}
+\newcommand*\lettre@ldf@filename[1]{lettre-#1.ldf}%
+\newcommand*\lettre@ldf@version[1]{ver@\lettre@ldf@filename{#1}}%
+% \end{macrocode}
+% Toutes ces langues \meta{langue} n'ont pas leur propre fichier de définition
+% \texttt{lettre-\meta{langue}.ldf}, en effet certaines de ces langues ne sont juste que des alias.
+% \changes{3.000}{2015-12-20}{Listage des options de langue dans \cs{lettre@languages} dans l'ordre de
+% déclaration au sein de \cs{documentclass}}%
+%
+% Par contre pour chacune des ces \meta{langue} une option \meta{langue} est définie, c'est l'une des façons
+% dont l'utilisateur peut charger les définitions correspondant à cette langue. La dernière options passée
+% donne la langue par défaut au début du document.
+% \begin{macrocode}
+\def\lettre@iterate@body#1{%
+ \DeclareOption{#1}{%
+ \edef\@tempa{\csname lettre@#1@alias@of\endcsname}%
+ \ifcsundef{\lettre@ldf@version{\@tempa}}{%
+ \expandafter\def\csname \lettre@ldf@version{\@tempa}\endcsname{To be loaded}%
+ \ifx\lettre@languages\@empty
+ \def\lettre@languages{#1}%
+ \else
+ {%
+ \toks0{#1}%
+ \toks1\expandafter{\lettre@languages}%
+ \edef\@tempa{\noexpand\def\noexpand\lettre@languages{\the\toks0,\the\toks1}}%
+ \expandafter
+ }\@tempa
+ \fi
+ \def\lettre@mainlang{#1}%
+ }{%
+ \l@@info{Langage `#1' deja charge par option}%
+ }%
+ }%
+}%
+\expandafter\lettre@iterate\lettre@supported@language@list,\@nil,%
+% \end{macrocode}
+% \changes{3.000}{2015-12-20}{Ajout option \texttt{pass lang}}%
+% \begin{macrocode}
+\DeclareOption{passlang=true}{\lettre@pass@langtrue}%
+\DeclareOption{passlang=false}{\lettre@pass@langfalse}%
+\DeclareOption{passlang}{\ExecuteOptions{pass lang=true}}%
+% \end{macrocode}
+%\changes{2.354}{2014-10-04}{Ajout des options \texttt{noinfo}, \texttt{loghighlight}, et \texttt{strict}}%
+%\subsubsection{Options pour la gestion des relevés du journal de compliation}
+% Le journal de compilation est le fichier \meta{jobname}\texttt{.log} produit par la compilation. Il contient
+% des relevés de trois types : erreur, avertissement, et info.
+%
+% Suppression des relevés d'info dans le journal, on peut aussi faire ça avec la commande \cs{noinfo} mais dans
+% ce cas on aura quand même, s'il en est, les relevés d'info provoqués par le traitement des options.
+% \begin{macrocode}
+\DeclareOption{noinfo}{\c@infos=0}
+% \end{macrocode}
+% Désactive ou active les traces de type \texttt{LETTRE INFO ===} ou \texttt{LETTRE AVERTISSEMENT ===} placé au
+% début des relevés. Elles ne sont pas utiles dans un environnement de développement qui colorise le journal.
+%\changes{2.354}{2015-11-30}{Remplacement option `nologhighlight' par `loghighlight=false'}%
+% \begin{macrocode}
+\DeclareOption{loghighlight=false}{\lettre@loghighlightfalse}
+\DeclareOption{loghighlight=true}{\lettre@loghighlighttrue}
+\DeclareOption{loghighlight}{\ExecuteOptions{loghighlight=true}}
+% \end{macrocode}
+% Mue certains relevés d'avertissement en relevés d'erreur, rendant ainsi la classe moins permissive.
+%\changes{2.354}{2015-11-30}{Ajout options `strict=false' \& `strict=true'}%
+% \begin{macrocode}
+\DeclareOption{strict}{\ExecuteOptions{strict=true}}
+\DeclareOption{strict=true}{\lettre@stricttrue\l@@info{Mode `strict': traite certains avertissements comme des erreurs}}
+\DeclareOption{strict=false}{\lettre@strictfalse\l@@info{Mode `strict' desactive}}
+% \end{macrocode}
+%\subsubsection{Options par défaut}
+% \begin{macrocode}
+\if@compatibility\else
+ \DeclareOption*{\l@@warning{Option inconnue : `\CurrentOption', assurez-vous que
+ c'est une option globale passee aux paquetages utilises dans votre document}}
+\fi
+% \end{macrocode}
+%\subsection{Messages et avertissements}
+% Envoyés à la console et dans le fichier journal \meta{jobname}\texttt{.log}.
+%
+% On peut supprimer allumer ou éteindre en tout temps les
+% relevés d'informations par les commandes \cs{infos} et \cs{noinfos}.
+% Les avertissements ne peuvent être supprimés. L'option \texttt{strict} fait que les avertissements causent
+% une erreur en appelant \cs{ClassError} au lieu de \cs{ClassWarning}.
+%\changes{2.354}{2014-10-04}{Ajout des options \texttt{noinfo}, \texttt{nologhighlight}, et \texttt{strict}}%
+% \begin{macrocode}
+\def\l@@error#1{\ClassError{lettre}{#1}}%
+\def\infos{\c@infos=1\relax}
+\def\noinfos{\c@infos=0\relax}
+\def\l@@warning{%
+ \iflettre@loghighlight
+ \typeout{LETTRE AVERTISSEMENT ===============================================}%
+ \fi
+ \ClassWarning{lettre}%
+}
+\def\l@@warning@strictable#1{%
+ \iflettre@loghighlight
+ \typeout{LETTRE AVERTISSEMENT ===============================================}%
+ \fi
+ \iflettre@strict
+ \l@@error{#1}{#1\MessageBreak\space
+ Cette erreur est causee par un avertissement en mode strict}%
+ \else
+ \ClassWarning{lettre}{#1}%
+ \fi
+}
+\def\l@@info#1{%
+ \ifnum\c@infos=1 %
+ \iflettre@loghighlight
+ \typeout{LETTRE INFO ================================================}%
+ \fi
+ \GenericWarning{%
+ (lettre)\space\space\space\space
+ }{%
+ Class lettre Message: #1\@gobble}%
+ \fi}%
+% \end{macrocode}
+%\subsection{Macros utiles aux fichier de définitions de langue}
+% \DescribeMacro{\LettreProvidesLanguage}
+% \begin{macrocode}
+\newcommand*{\LettreProvidesLanguage}[1]{%
+ \ProvidesFile{lettre-#1.ldf}%
+}%
+% \end{macrocode}
+% \begin{macro}{\LettreDeclareLanguage}\cs{LettreDeclareLanguage}\marg{dialècte}\oarg{langue-de-base}\marg{définitions},
+% cette macro définit globalement soit une, soit deux macros~:
+% \begin{itemize}
+% \item La macro \cs{lettre@select@\meta{dialecte}@labels} est définie pour se développer en \meta{définitions}, et
+% \item La macro \cs{lettre@lmp@\meta{dialecte}@use} (où \og \texttt{lmp}\fg{} veut dire \og language for
+% multilang processor\fg) n'est définie que si l'argument optionnel \meta{langue-de-base} est fourni, et
+% auquel cas est définie pour se développer en \meta{langue-de-base}.
+% \end{itemize}
+% \begin{macrocode}
+\newcommand*{\LettreDeclareLanguage}[1]{%
+ \begingroup
+% \end{macrocode}
+% La première chose qu'on fait c'est de mettre \meta{dialecte} dans \cs{toks0}. Quant à \cs{toks2} il
+% contiendra le code définissant ou non la macro \cs{lettre@lmp@\meta{dialecte}@use}. La macro
+% \cs{lettre@declare@language@arg@ii} sert à récupérer l'argument \meta{langue-de-base} lorsqu'il est présent.
+% \begin{macrocode}
+ \toks0{#1}%
+ \@ifnextchar[\lettre@declare@language@arg@ii
+ {%
+% \end{macrocode}
+% En cas d'absence de l'argument optionnel \meta{langue-de-base} \cs{toks2} est donc vide, puisqu'on ne
+% définit pas \cs{lettre@lmp@\meta{dialecte}@use}~:
+% \begin{macrocode}
+ \toks2{}%
+% \end{macrocode}
+% La macro \cs{lettre@declare@language@arg@iii} sert à récupérer l'argument \meta{définitions}~:
+% \begin{macrocode}
+ \lettre@declare@language@arg@iii
+ }%
+}%
+\ifcsdef{lettre@declare@language@arg@ii}{%
+ \l@@error{Macro \protect\lettre@declare@language@arg@ii\space dej'a d'efinie}%
+}{}%
+\def\lettre@declare@language@arg@ii[#1]{%
+ \def\@tempa##1{%
+ \toks2{\gdef##1{#1}}
+ }%
+ \expandafter\@tempa\csname lettre@lmp@\the\toks0@use\endcsname
+ \lettre@declare@language@arg@iii}
+\newcommand*\lettre@declare@language@arg@iii[1]{%
+ \toks3{#1}%
+ \edef\@tempa{%
+ \noexpand\ifcsdef{lettre@select@\the\toks0 @labels}{%
+ \noexpand\l@@error{Macro `\string\lettre@select@\the\toks0 @labels\space
+ d'ej`a d'efinie}%
+ }{%
+ \noexpand\gdef
+ \expandafter\noexpand\csname lettre@select@\the\toks0@labels\endcsname{%
+ \the\toks3}%
+ \the\toks2 %
+ }%
+ }%
+ \expandafter\endgroup\@tempa
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%\subsection{Déclaration des sorties des options de paquetage, et exécutions des options}
+%\label{sec:sortie-opt-pako}
+% \begin{macrocode}
+\newcommand\@ptsize{}
+\newcount\c@infos\c@infos=1\relax
+\newif\if@origdate\@origdatefalse
+\newif\if@etiq\@etiqfalse
+% \end{macrocode}
+% \changes{3.000}{2015-12-20}{Ajout option \texttt{pass lang}}%
+% \begin{macrocode}
+\newif\iflettre@pass@lang\lettre@pass@langtrue
+% \end{macrocode}
+% \changes{3.001}{2019-07-23}{Option \texttt{keep envs} avec détection par défaut}%
+% L'option \texttt{keep envs} se traduit dans le compteur \cs{lettre@keep@envs} de la manière suivante~:\\
+% \begin{tabular}{>{\rrab}p{3cm}p{\dimexpr\linewidth-3cm-4\tabcolsep}}\toprule
+% \cs{lettre@keep@envs}&Signification\\\midrule
+% 0&Détection automatique du comportement \texttt{keep envs=true}, ou \texttt{keep envs=false}\\
+% 1&Correspond à \texttt{keep envs=true}, c.-à-d.\ que \texttt{lettre} ne redéfinit pas les
+% environnements \texttt{itemize} et consorts\\
+% 2&Correspond à \texttt{keep envs=false}, c.-à-d.\ que \texttt{lettre} redéfinit selon la langue les
+% environnements \texttt{itemize} et consorts\\\bottomrule
+% \end{tabular}
+% \begin{macrocode}
+\newcount\lettre@keep@envs
+\lettre@keep@envs0 %
+\newif\iflettre@strict\lettre@strictfalse
+\newif\iflettre@loghighlight\lettre@loghighlightfalse
+\ExecuteOptions{10pt,oneside,final}
+\ProcessOptions
+% \end{macrocode}
+% Chargement des définitions de langue. On fait un \cs{input} de tous les fichiers \meta{nomfic} dont la macro
+% version \cs{ver@}\meta{nomfic} a été durant le traitements des options configurée à \og To be loaded\fg.
+% \begin{macrocode}
+\def\lettre@iterate@body#1{%
+ \edef\@tempa{\csname lettre@#1@alias@of\endcsname}%
+ \def\@tempb{To be loaded}%
+ \edef\@tempc{\lettre@ldf@version{\@tempa}}%
+ \expandafter\ifx\csname\@tempc\endcsname\@tempb
+ \expandafter\let\csname\@tempc\endcsname\undefined
+ \input{\lettre@ldf@filename{\@tempa}}
+ \fi
+}%
+\expandafter\lettre@iterate\lettre@supported@language@list,\@nil,%
+% \end{macrocode}
+% Passage des options de langue au paquetages tels
+% \texttt{babel}.\newline\DescribeMacro{\lettre@languageable@packages}Tout d'abord on se fait une liste de
+% paquetages auxquels passer les options de langues. C'est à dire qu'on gère ces options comme si elles étaient
+% globales vis à vis de ces paquetages là seulement.
+% \begin{macrocode}
+\newcommand\lettre@languageable@packages{babel,fmtcount,mlp}%
+% \end{macrocode}
+% Maintenant on passe toutes les options stockées dans \cs{lettre@languages} à tous les paquetage listés dans
+% \cs{lettre@languageable@packages}.
+% \begin{macrocode}
+\ifx\lettre@languages\@empty\else
+% \end{macrocode}
+% \changes{3.000}{2015-12-20}{Ajout option \texttt{pass lang}}%
+% \begin{macrocode}
+ \iflettre@pass@lang
+ \def\lettre@iterate@body#1{%
+ \let\@tempb\lettre@iterate@body
+ \def\lettre@iterate@body##1{\PassOptionsToPackage{#1}{##1}%
+ \l@@info{Option `#1' pass'ee au paquetage `##1'}%
+ }%
+ \expandafter\lettre@iterate\lettre@languageable@packages,\@nil,%
+ \let\lettre@iterate@body\@tempb
+ }%
+ \expandafter\lettre@iterate\lettre@languages,\@nil,%
+ \fi
+\fi
+% \end{macrocode}
+%\subsection{Polices}
+% \begin{macrocode}
+\input{size1\@ptsize.clo}
+\DeclareOldFontCommand{\rm}{\rmfamily}{\mathrm}
+\DeclareOldFontCommand{\sl}{\slshape}{\@nomath\sl}
+\DeclareOldFontCommand{\it}{\itshape}{\mathit}
+\DeclareOldFontCommand{\sc}{\scshape}{\@nomath\sc}
+\DeclareOldFontCommand{\bf}{\bfseries}{\mathbf}
+\DeclareOldFontCommand{\sf}{\sffamily}{\mathsf}
+\DeclareOldFontCommand{\tt}{\ttfamily}{\mathtt}
+\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}}
+\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}}
+% \end{macrocode}
+%\subsubsection{Paramètres pour le contrôle des paragraphes}
+% \begin{macrocode}
+\lineskip 1pt%
+\normallineskip 1pt%
+\parskip .7em%
+\parindent 0pt%
+\topsep .2em%
+\partopsep 0pt%
+\itemsep .2em%
+\renewcommand\baselinestretch{1}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@lowpenalty 51\relax
+\@medpenalty 151\relax
+\@highpenalty 301\relax
+\@beginparpenalty -\@lowpenalty
+\@endparpenalty -\@lowpenalty
+\@itempenalty -\@lowpenalty
+% \end{macrocode}
+%\subsubsection{Paramètres pour le contrôle de la mise en page}
+%\changes{2.354}{2014-10-04}{Utilisation des longueurs \cs{lettre@x@mm} et \cs{lettre@y@mm} pour la prise en
+% charge des options \texttt{letterpaper}, \texttt{legalpaper}, \texttt{executivepaper}, \texttt{b5paper} et
+% \texttt{a5paper}.}%
+% Marge supérieure
+% \begin{macrocode}
+\topmargin 25\lettre@y@mm
+% \end{macrocode}
+% suppression de l'offset vertical
+% \begin{macrocode}
+\advance\topmargin by -1in
+% \end{macrocode}
+% Separation d'entête \SI{4}{\milli\metre}
+% \begin{macrocode}
+\headheight 0pt%
+\headsep 4\lettre@y@mm
+% \end{macrocode}
+% hauteur texte \SI{250}{\milli\metre}
+% \begin{macrocode}
+\textheight 250\lettre@y@mm
+% \end{macrocode}
+% sep d'embase \SI{9}{\milli\metre}
+% \begin{macrocode}
+\footskip 9\lettre@y@mm
+% \end{macrocode}
+% Total vertical \(25+4+250+9=\SI{288}{\milli\metre}\), reste \SI{9}{\milli\metre} sur A4 = 297 mm.
+% \begin{macrocode}
+\footnotesep 5\lettre@y@mm
+\marginparpush 1\lettre@x@mm
+% \end{macrocode}
+% marge gauche \SI{25}{\milli\metre}
+% \begin{macrocode}
+\oddsidemargin 25\lettre@x@mm
+\evensidemargin 25\lettre@x@mm
+% \end{macrocode}
+% suppression de l'offset horizontal
+% \begin{macrocode}
+\advance\oddsidemargin by -1in
+\advance\evensidemargin by -1in
+% \end{macrocode}
+% largeur texte 160mm
+% \begin{macrocode}
+\textwidth 160\lettre@x@mm
+% \end{macrocode}
+% sep. note lat. 4mm
+% \begin{macrocode}
+\marginparsep 4\lettre@x@mm
+% \end{macrocode}
+% larg. note lat 15mm
+% \begin{macrocode}
+\marginparwidth 15\lettre@x@mm
+% \end{macrocode}
+% Total horizontal \(25+160+4+15=\SI{204}{\milli\metre}\), reste \SI{6}{\milli\metre} sur A4 =
+% \SI{210}{\milli\metre}.
+% \begin{macrocode}
+\skip\footins 4mm plus 2pt minus 4pt%
+% \end{macrocode}
+%
+%\subsection{Le format lettre et fax de l'observatoire de Genève}
+%
+%\subsubsection{newcounts, newdimens, newifs, et newwrite}
+% Il y a aussi un \cs{newcount} dans la \S~\ref{sec:sortie-opt-pako}.
+% \begin{macrocode}
+\newcount\auxcount
+\newcount\c@labelstart
+\newcount\c@lettre
+\newcount\c@telefax
+\newcount\emailcount
+\newcount\faxpage
+\newcount\sigflag
+\newcount\signum
+%
+\newdimen\letterwidth
+\newdimen\openingspace
+\newdimen\openingindent
+\newdimen\lettermargin
+\newdimen\listmargin
+\newdimen\sigspace
+\newdimen\ssigindent
+\newdimen\ssigwidth
+\newdimen\msigwidth
+\newdimen\fromaddress@let@width
+\newdimen\fromlieu@let@width
+\newdimen\toaddress@let@width
+\newdimen\fromaddress@fax@width
+\newdimen\faxstring@width
+\newdimen\faxbox@width
+\newdimen\toaddress@fax@width
+\newdimen\fromname@fax@width
+% \end{macrocode}
+%\changes{2.354}{2014-10-21}{Ajout \cs{lettre@vref@width} et \cs{lettre@nref@width}}%
+% \begin{macrocode}
+\newlength\lettre@vref@width
+\newlength\lettre@nref@width
+% \end{macrocode}
+%Il y a aussi des \cs{newif} dans la \S~\ref{sec:sortie-opt-pako}.
+% \begin{macrocode}
+\newif\if@letter\@lettertrue
+\newif\if@detail\@detailfalse
+% \end{macrocode}
+% Fichiers auxiliaires
+% \begin{macrocode}
+\newwrite\@tensionaux
+\newwrite\@dateaux
+\newwrite\@etiqaux
+\newwrite\@faxaux
+% \end{macrocode}
+%\subsubsection{Macros internes}
+%\label{sec:macros-internes}
+% \begin{macrocode}
+\let\lettre@par\@par
+\@ifundefined{lettre@t}{}{\ClassError{lettre}{Definition en double}%
+ {Redefinition de la macro \protect\lettre@t}}
+\def\lettre@t#1#2{\begin{list}{#1}{\setlength{\labelsep}{10pt}%
+ \setlength{\labelwidth}{\listmargin}%
+ \setlength{\leftmargin}{\listmargin}%
+ \setlength{\listparindent}{0pt}}%
+ \item\relax #2%
+ \end{list}}
+\def\detailledaddress{\@detailtrue}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\stopletter{\vskip0ptplus1filll}%
+\def\stopfax{\vskip0ptplus1filll}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\resetopenenv{%
+ \faxpage=0\relax
+ \csuse{\lettre@mainlang}%
+ \def\concdecl{}%
+ \def\fromlocation{}%
+ }%
+\def\resetcloseenv{
+ \def\fromsig{}\def\fromssig{}\def\fromtsig{}
+ \ps@plain
+ \pagenumbering{arabic}
+ \onecolumn
+ \signum=0\relax
+ }
+\def\resetauxenv{
+ \def\auxflag{}
+ \auxcount=0\relax
+% \end{macrocode}
+% Les macro \cs{toref} et \cs{fromref} sont intialisé à \cs{space} de sorte à ce que par défaut la
+% configuration de l'une des deux références entraîne l'affichage des deux boîtes de référence, avec
+% éventuellement l'autre boîte à blanc (c.-à-d. contenant juste un espace).%
+% \changes{2.354}{2014-10-21}{Un argument vide à \cs{Vref} ou \cs{Nref} supprime la référence}%
+% \begin{macrocode}
+ \let\toref\space\let\fromref\space
+ \def\telexnum{}\def\ccpnum{}
+ }
+\def\resetemailenv{
+ \def\emailflag{}
+ \emailcount=0\relax
+ \def\@username{}
+ \def\ccittnum{}\def\internetnum{}\def\bitnetnum{}%
+ \def\telepacnum{}\def\decnetnum{}
+ }
+% \end{macrocode}
+% \DescribeMacro{\lettre@processto}\cs{lettre@processto} extrait \cs{toname} et \cs{toaddress} de l'argument
+% adresse passé aux environnements \texttt{letter} ou \texttt{telefax}.
+% \changes{3.001}{2017-08-10}{Renommage \cs{@processto}, \cs{@xproc} et \cs{yproc} pour préfixer par
+% \texttt{lettre} afin d'être à l'épreuve du temps contre des conflits de nommage potentiels. Utilisation
+% \cs{@nil} comme terminateur plutôt que \texttt{@@@} que l'utilisateur pourrait utiliser dans son adresse.}
+% \begin{macrocode}
+\long\def\lettre@processto#1{\lettre@xproc #1\\\@nil\ifx\toaddress\@empty
+ \else \lettre@yproc #1\@nil\fi}%
+\long\def\lettre@xproc #1\\#2\@nil{\def\toname{#1}\def\toaddress{#2}}%
+\long\def\lettre@yproc #1\\#2\@nil{\def\toaddress{#2}}%
+% \end{macrocode}
+% \DescribeMacro{\lettre@stopbreaks}La macro \cs{lettre@stopbreaks} fait rentrer dans un mode où l'on empèche
+% les sauts de ligne.
+% \changes{3.001}{2019-06-30}{Correction anomalie
+% \href{https://puszcza.gnu.org.ua/bugs/index.php?428}{\#428}. Les
+% \og\cs{def}\cs{par}\texttt{\{}\ldots\texttt{\}}\fg\ sont remplacés par des
+% \og\cs{@setpar}\texttt{\{}\ldots\texttt{\}}\fg}
+% \begin{macrocode}
+\def\lettre@stopbreaks{%
+ \interlinepenalty \@M
+ \@setpar{\@@par\nobreak\lettre@parshape}\let\\=\@nobreakcr
+ \let\vspace\@nobreakvspace}%
+\def\@nobreakvspace{\@ifstar{\@nobreakvspacex}{\@nobreakvspacex}}%
+\def\@nobreakvspacex#1{\ifvmode\nobreak\vskip #1\relax\else
+ \@bsphack\vadjust{\nobreak\vskip #1}\@esphack\fi}%
+\def\@nobreakcr{\vadjust{\penalty\@M}\@ifstar{\@xnewline}{\@xnewline}}%
+% \end{macrocode}
+% \DescribeMacro{\lettre@startbreaks}La macro \cs{lettre@startbreaks} fait rentrer dans un mode où l'on
+% autorise les sauts de ligne.
+% \begin{macrocode}
+\def\lettre@startbreaks{%
+ \let\\=\@normalcr
+ \interlinepenalty 200\relax
+ \@setpar{\@@par\penalty -100\relax
+ \lettre@parshape}}%
+% \end{macrocode}
+%\subsection{Étiquettes}
+% La commande \cs{startlabels} suivante définit des pages A4 de 2 colonnes d'étiquettes avec
+% \SI{15}{\milli\metre} de marges gauche et droite sur chaque étiquette. Si l'on change le nombre
+% d'étiquettes sur une page, il faut aussi modifier la macro \cs{@startlabels}.
+%\DescribeMacro{\startlabels}
+% \begin{macrocode}
+\def\startlabels{%
+\baselineskip=0pt\lineskip=0pt%
+\pagestyle{empty}%
+\let\@texttop=\relax
+\topmargin=0pt\headsep=0pt%
+\oddsidemargin=15mm\evensidemargin=15mm%
+% \end{macrocode}
+% modifications des dimensions de la page à faire ici
+% \begin{macrocode}
+\textheight=297mm\textwidth=180mm\columnsep=30mm%
+\@colht=\textheight\@colroom=\textheight\vsize=\textheight
+\small
+\baselineskip=0pt\lineskip=0pt%
+\boxmaxdepth=0pt%
+\twocolumn\relax}%
+% \end{macrocode}
+% La commande \cs{@startlabels} suivante définit la position de la
+% première étiquette sur la page, à partir de la valeur du
+% compteur \texttt{labelstart}.
+% \begin{macrocode}
+\def\@startlabels{%
+\l@@info{Position de la premiere etiquette: \the\c@labelstart}%
+\ifnum\c@labelstart>\z@
+ \ifnum\c@labelstart>16\relax
+ \l@@warning@strictable{Position de la premiere etiquette ignoree}%
+ \else
+ \@whilenum\c@labelstart>\@ne\do
+ {\immediate\write\@etiqaux{\string\mlabel{~\string\\~}}%
+ \advance\c@labelstart\m@ne}%
+ \fi%
+\else
+ \l@@warning@strictable{Position de la premiere etiquette ignoree}%
+\fi
+}%
+% \end{macrocode}
+% \DescribeMacro{\mlabel}La commande \cs{mlabel}\marg{l'étiquette} fabrique une étiquette de
+% \SI{37}{\milli\metre} de hauteur, la largeur étant définie dans \cs{startlabels}
+% (\(\SI{105}{\milli\metre}-\SI{30}{\milli\metre}\) de marges) chacune contenant \SI{70}{\milli\metre} de
+% texte \meta{l'étiquette} au centre de l'étiquette.
+% \begin{macrocode}
+\def\mlabel#1{\setbox0\vbox{\parbox[b]{70mm}{\rm\strut\ignorespaces #1}}%
+ \vbox to 37mm{\vskip5mmplus1fil \box0 \vskip5mmplus1fil}}%
+% \end{macrocode}
+% \DescribeMacro{\makelabels}\cs{makelabels}\oarg{num label} demande à \verb+\begin{document}+ d'imprimer
+% sur le fichier auxiliaire \verb+.etq+ l'ordre de préparer les étiquettes. Son argument optionnel
+% \meta{num label} est un numéro définissant quelle est la prochaine étiquette libre sur la page en
+% partant du numéro \(1\), de manière à utiliser des feuilles déjà partiellement utilisées. Dans ce cas,
+% \verb+\begin{document}+ imprime autant d'étiquettes vides que nécessaire.
+% \begin{macrocode}
+\def\makelabels{%
+ \@etiqtrue
+ \l@@info{On demande des etiquettes}%
+ \@ifnextchar [{\i@makelabels}{\i@makelabels[1]}}%
+\def\i@makelabels[#1]{\c@labelstart=#1}%
+% \end{macrocode}
+%\subsection{Interface utilisateur}
+%\subsubsection{Adaptations des paramètres par défaut}
+%\DescribeMacro{\institut}
+% \changes{3.000}{2015-10-21}{Nom fichier institut en \texttt{lettre-\meta{institut}.cfg}}
+% \begin{macrocode}
+\newcommand*\lettre@institut[1]{%
+ \l@@info{Fichier de defaut: #1}%
+ \def\lettre@input@institut{\makeatletter
+ \input{#1}%
+ \makeatother}}%
+% \end{macrocode}
+% On prend en compte le cas où l'utilisateur malicieux aurait mis un chemin à l'institut. C'est surtout pour
+% être rétro-compatible avec l'utilisation de l'extention \textsf{.ins} pour les fichiers instituts qu'on fait
+% ça. On utilise la macro \cs{filename@parse} du noyeau \LaTeX\ dont le résultat l'analyse va dans les macros
+% \cs{filename@area}, \cs{filename@base} et \cs{filename@ext}. On détourne \cs{filename@area} pour recevoir le
+% nom du fichier insititut en \texttt{.cfg}.
+% \begin{macrocode}
+\newcommand*\lettre@institut@parse[1]{%
+ \filename@parse{#1}%
+ \edef\filename@area{\filename@area lettre-\filename@base
+ \unless\ifx\filename@ext\relax.\filename@ext\fi.cfg}%
+}%
+% \end{macrocode}
+% Avec l'option \texttt{strict} le fichier institut doit se nommer que \texttt{lettre-\meta{institut}.cfg}.
+% \begin{macrocode}
+\iflettre@strict
+\newcommand*\institut[1]{%
+ \lettre@institut@parse{#1}%
+ \expandafter\lettre@institut\expandafter{\filename@area}}%
+\else
+% \end{macrocode}
+% Sans l'option \texttt{strict} le fichier institut peut se nommer soit \texttt{lettre-\meta{institut}.cfg},
+% soit \texttt{\meta{institut}.ins}, on teste la première possibilité en premier.
+% \begin{macrocode}
+\newcommand*\institut[1]{%
+ \lettre@institut@parse{#1}%
+ \IfFileExists{\filename@area}{%
+ \expandafter\lettre@institut\expandafter{\filename@area}}{%
+ \l@@warning{Le nommage des fichiers instituts en `<institut>.ins' est obsolete,
+ veuillez les nommer en `lettre-<institut>.cfg'}%
+ \lettre@institut{#1.ins}}%
+}
+\fi
+% \end{macrocode}
+%
+%\subsubsection{Environnements letter et fax}
+%
+%\DescribeEnv{letter} L'environnement \cs{begin\{letter\}}\marg{adresse}\ldots\cs{end\{letter\}} définit une
+% lettre
+% \changes{2.354}{2014-09-19}{Utilisation de \protect\ifcsundef\space pour tester \protect\csname
+% letter\protect\the\expandafter\protect\csname c@lettre\endcsname\protect\endcsname}
+% \begin{macrocode}
+\long\def\letter#1{%
+ \global\let\lettre@tns@vspace\lettre@letter@tns@vspace
+ \rm
+ \global\advance\c@lettre\@ne
+ \l@@info{Lettre \the\c@lettre}%
+ \ifcsundef{newletter\the\c@lettre}{%
+ \expandafter\def\csname letter\the\c@lettre\endcsname{2}%
+ }{%
+ \expandafter\def\csname letter\the\c@lettre\endcsname{%
+ \csname newletter\the\c@lettre\endcsname}%
+ }%
+ \ifodd\c@page%
+ \else
+ \if@twoside
+ \l@@info{Saut de page force pour commencer la lettre sur une page impaire.}%
+ \thispagestyle{empty}
+ \hbox{}\penalty-10000\relax
+ \fi
+ \fi
+ \c@page\@ne
+% \end{macrocode}
+% \changes{2.354}{2014-10-22}{Correction bug \href{https://gna.org/bugs/?23959}{\#23959}~: \og\cs{c@footnote}
+% n'est pas re-initialisé au début de chaque lettre\fg}
+% \begin{macrocode}
+ \c@footnote0 %
+ \resetopenenv\resetcloseenv\resetauxenv\resetemailenv
+ \@lettertrue
+ \lettre@input@institut
+ \let\opening=\letteropening
+ \interlinepenalty=200\relax
+ \lettre@processto{#1}
+}%
+% \end{macrocode}
+%\DescribeEnv{endletter}
+% \begin{macrocode}
+\def\endletter{\par
+ \ifdim\pagetotal < 50pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{-2}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 50pt\MessageBreak
+ tension de page modifiee a -2, veuillez recompiler}%
+ \else
+ \ifdim\pagetotal < 90pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{-4}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 90pt\MessageBreak
+ tension de page modifiee a -4, veuillez recompiler}%
+ \else
+ \ifdim\pagetotal < 130pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{-5}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 130pt\MessageBreak
+ tension de page modifiee a -5, veuillez recompiler}%
+ \else
+ \ifdim\pagetotal < 170pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{-6}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 170pt\MessageBreak
+ tension de page modifiee a -6, veuillez recompiler}%
+ \else
+ \ifdim\pagetotal < 210pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{4}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 210pt\MessageBreak
+ tension de page modifiee a 4, veuillez recompiler}%
+ \else
+ \ifdim\pagetotal < 250pt
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{6}}%
+ \l@@warning{Longueur de la derniere page : \the\pagetotal < 250pt\MessageBreak
+ tension de page modifiee a 6, veuillez recompiler}%
+ \else
+ \immediate\write\@tensionaux{%
+ \string\expandafter\string\def%
+ \string\csname\space newletter\the\c@lettre\string\endcsname{%
+ \csname letter\the\c@lettre\endcsname}}%
+ \l@@info{Longueur de la derniere page : \the\pagetotal >= 250pt}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \stopletter
+ \@@par\pagebreak\@@par
+ \if@etiq
+ \ifodd\c@page%
+ \else
+ \if@twoside
+ \l@@info{Saut de page force pour commencer les etiquettes sur une page impaire.}%
+ \thispagestyle{empty}
+ \hbox{}\penalty-10000\relax
+ \fi
+ \fi
+ \begingroup
+ \def\protect{\string}%
+ \let\\=\relax
+ \def\protect##1{\string##1\space}%
+ \immediate\write\@etiqaux{\string\mlabel{\toname
+ \\\toaddress}}%
+ \endgroup
+ \fi}%
+% \end{macrocode}
+% \DescribeEnv{telefax}L'environnement \texttt{telefax} permet de formater une télécopie. Liste des
+% arguments~:\newline
+% \begin{tabular}{@{\#}l@{ : }l@{}}
+% 1&Numéro du destinataire\\
+% 2&Nom+adresse du destinataire\\
+% \end{tabular}
+% \begin{macrocode}
+\long\def\telefax#1#2{%
+ \global\let\lettre@tns@vspace\@empty
+ \rm
+ \global\advance\c@telefax\@ne
+ \l@@info{Telefax \the\c@telefax}%
+ \ifnum\c@telefax=\@ne
+ \else
+ \l@@warning@strictable{Un seul telefax par fichier, s.v.p.,\MessageBreak
+ sinon le nombre de pages du fax est incorrect !}
+ \fi
+ \ifodd\c@page%
+ \else
+ \if@twoside
+ \l@@info{Saut de page force pour commencer le telefax sur une page impaire.}%
+ \thispagestyle{empty}
+ \hbox{}\penalty-10000\relax
+ \fi
+ \fi
+ \c@page\@ne
+ \resetopenenv\resetcloseenv\resetauxenv\resetemailenv
+ \@letterfalse
+ \lettre@input@institut
+ \def\tofaxnum{#1}%
+ \let\opening=\faxopening
+ \interlinepenalty=200\relax
+ \makeatletter
+ \@input{\jobname.fax}%
+ \l@@info{Lecture du fichier auxiliaire de fax: Nombre total de pages=\totalpages}%
+ \makeatother
+ \lettre@processto{#2}
+}%
+% \end{macrocode}
+% \DescribeMacro{\endtelefax}
+% \begin{macrocode}
+\def\endtelefax{%
+ \stopfax
+ \begingroup
+ \advance\faxpage by\c@page
+ \def\protect{\string}%
+ \let\\=\relax
+ \def\protect##1{\string##1\space}%
+ \immediate\openout\@faxaux=\jobname.fax%
+ \immediate\write\@faxaux{\string\def\string\totalpages{\the\faxpage}}%
+ \ifx\totalpages\@empty
+ \let\@tempa\@firstoftwo
+ \else\ifnum\totalpages=\the\faxpage
+ \let\@tempa\@firstoftwo
+ \else
+ \let\@tempa\@secondoftwo
+ \fi\fi
+ \@tempa
+ {}{\l@@warning{Le nombre de pages du fax a change, \MessageBreak
+ (ancien=\totalpages, nouveau=\the\faxpage) \MessageBreak
+ veuillez recompiler pour le corriger dans l'entete}}%
+ \endgroup
+ \@@par\pagebreak\@@par
+}%
+% \end{macrocode}
+%\subsubsection{Les commandes \cs{opening} et \cs{closing}}
+% \DescribeMacro{\lettre@write@pdate@to@dateaux}\cs{lettre@write@pdate@to@dateaux} permet d'écrire dans le
+% fichier \cs{jobname}\texttt{.odt} la date de première compilation en cas de mode \texttt{origdate}. Cette
+% action est effectuée au moment de la commande \cs{opening}.
+% \changes{2.352}{2014-08-02}{Création macro \cs{lettre@write@pdate@to@dateaux} pour correction \href{https://gna.org/bugs/index.php?22423}{bogue\#22423}}
+% \begin{macrocode}
+\def\lettre@write@pdate@to@dateaux{%
+ \l@@info{`\pdate' ecrit dans \jobname.odt}%
+ {%
+ \let\protect\string
+ \immediate\write\@dateaux{%
+ \string\expandafter\string\def%
+ \string\csname\space origdate\the\c@lettre
+ \string\endcsname{\pdate}}}}
+% \end{macrocode}
+% \DescribeMacro{\lettre@get@date}\cs{lettre@get@date} permet de relire la date à partir de
+% \cs{jobname}\texttt{.odt} lorsqu'elle y est disponible.
+% \changes{2.352}{2014-08-06}{Nouvelle macro \cs{lettre@get@date}}
+% \changes{2.354}{2014-09-19}{Utilisation de \protect\ifcsundef\space pour tester \protect\csname
+% origdate\protect\the\expandafter\protect\csname c@lettre\endcsname\protect\endcsname}
+% \begin{macrocode}
+\def\lettre@get@date{%
+ \if@origdate
+ \ifcsundef{origdate\the\c@lettre}{}{%
+ \l@@info{Date originale lue dans \jobname.odt}%
+ \def\pdate{\csname origdate\the\c@lettre\endcsname}%
+ }%
+% \end{macrocode}
+% On re-écrit systématiquement dans le fichier \cs{jobname}\texttt{.odt} même lorsque la date n'a pas changé,
+% ce qui fait que son horodate change à chaque compilation même si le contenu peut rester inchangé. La raison
+% c'est que~:
+% \begin{enumerate}
+% \item l'implémentation est plus simple (on ouvre systématiquement le \cs{write})
+% \item dans le cas où il y a plusieurs plusieurs lettres dans le même document, disons deux, il se peut que
+% la seconde soit ajoutée au document alors que la première y était déjà, dans ce cas il faut quand même
+% re-écrire \cs{pdate} dans le \cs{jobname}\texttt{.odt} pour la première lettre, même si c'est inchangé, à
+% cause de la nouvelle lettre.
+% \end{enumerate}
+% \changes{2.352}{2014-08-02}{Correction \href{https://gna.org/bugs/index.php?22423}{bug\#22423} avec macro
+% \cs{lettre@write@pdate@to@dateaux}}
+% \begin{macrocode}
+ \lettre@write@pdate@to@dateaux
+ \fi
+}
+% \end{macrocode}
+% \DescribeMacro{\lettre@put@fromlieu@date}La macro \cs{lettre@put@fromlieu@date} place \cs{fromlieu} et la
+% date \cs{pdate} séparés d'une virgule. La virgule n'est présente que si ni l'un ni l'autre n'est vide.
+% \changes{2.352}{2014-08-02}{Correction \href{https://gna.org/bugs/index.php?22383}{bug\#22383}, la virgule
+% après \cs{fromlieu} est rendue conditionnelle à ce que \cs{fromlieu} soit non-vide. Lorsqu'il n'y a pas de
+% date on ne met rien, et non plus un espace insécable}%
+% \begin{macrocode}
+\def\lettre@put@fromlieu@date{%
+ \ifx\@empty\fromlieu
+ \else
+ \fromlieu
+ \ifx\@empty\pdate\else, \fi
+ \fi
+ \ifx\@empty\pdate\else\pdate\fi}
+% \end{macrocode}
+%\paragraph{Dans le cas d'une lettre, \cs{opening}}
+%\label{sec:lettre-opening}
+%
+%\DescribeMacro{\letteropening}La macro \cs{opening} pointe par un \cs{let} sur \cs{letteropening} dans le cas
+% de l'environnement \texttt{letter}.
+% \begin{macrocode}
+\def\letteropening#1{%
+% \end{macrocode}
+% \changes{2.352}{2014-08-06}{Factorisation du code entre \cs{faxopening} et \cs{letteropening} avec la macro
+% \cs{lettre@get@date}}
+% \begin{macrocode}
+ \lettre@get@date
+ \hbadness=10000\relax
+ \thispagestyle{empty}%
+ \setlength{\unitlength}{1mm}%
+ \begin{picture}(\pict@let@width,\pict@let@height)%
+ (\pict@let@hoffset,\pict@let@voffset)%
+ \put(\rule@hpos,\rule@vpos){\line(1,0){\rule@length}}%
+ \put(\fromaddress@let@hpos,\fromaddress@let@vpos){\makebox(0,0)[tl]{%
+ \parbox[t]{\fromaddress@let@width}{%
+ \fromaddress\\[3mm]%
+ \ifx\@empty\fromlocation
+ \else \fromlocation \\%
+ \fi
+ \ifx\@empty\telephonenum
+ \else \tellabelname \telephonenum \\
+ \fi
+ \ifx\@empty\faxnum
+ \else \faxlabelname \faxnum \\
+ \fi
+ \ifx\@empty\emailnum
+ \else \mbox{\emaillabelname\ttfamily\emailnum} \\
+ \fi}}}
+ \put(\fromlieu@let@hpos,\fromlieu@let@vpos){\makebox(0,0)[bl]{%
+ \parbox[t]{\fromlieu@let@width}{%
+% \end{macrocode}
+% \changes{2.352}{2014-08-06}{Factorisation du code entre \cs{faxopening} et \cs{letteropening} avec la macro
+% \cs{lettre@put@fromlieu@date}}
+% \begin{macrocode}
+ \lettre@put@fromlieu@date
+ }}}%
+ \put(\toaddress@let@hpos,\toaddress@let@vpos){\makebox(0,0)[tl]{%
+ \parbox{\toaddress@let@width}{%
+ \toname\\\toaddress}}}%
+ \end{picture}%
+ \par
+% \end{macrocode}
+% Espacement vertical lu dans le fichier \texttt{.tns} destiné à optimiser la mise en page.
+% \begin{macrocode}
+ \lettre@letter@tns@vspace
+% \end{macrocode}
+% \changes{3.001}{2017-08-05}{Correction de l'anomalie \href{http://gna.org/bugs/?25373}{GNA\No 25373}; aka
+% \href{https://puszcza.gnu.org.ua/bugs/index.php?397}{\No 397}, on corrige la gestion de la marge}%
+% \begin{macrocode}
+ \lettre@adjust@margin
+% \end{macrocode}
+% Références, Télex, \& CCP de la lettre, s'il en est.
+% \begin{macrocode}
+ \ifx\@empty\auxflag
+ \vspace{2\openingspace}%
+ \else
+ \vspace{\openingspace}\auxline\vspace{\openingspace}%
+ \fi
+% \end{macrocode}
+% Espacement vertical lu dans le fichier \texttt{.tns} destiné à optimiser la mise en page.
+% \begin{macrocode}
+ \lettre@letter@tns@vspace
+% \end{macrocode}
+% Objet de la lettre, s'il en est, suivi de la formule de salutation.
+% \changes{3.001}{2017-11-28}{Factorisation de code entre \cs{faxopening} et \cs{letteropening} avec la macro
+% \cs{lettre@start@body}.}
+% \begin{macrocode}
+ \lettre@start@body{#1}%
+}%
+% \end{macrocode}
+%\paragraph{Dans le cas d'une télécopie, \cs{opening}}
+%\label{sec:fax-opening}
+%
+%\DescribeMacro{\faxopening}\cs{opening} pointe par un \cs{let} sur \cs{faxopening} dans le cas d'une
+% télécopie.
+% \begin{macrocode}
+\def\faxopening#1{%
+ \hbadness=10000\relax
+ \thispagestyle{empty}%
+ \setlength{\unitlength}{1mm}%
+ \begin{picture}(\pict@fax@width,\pict@fax@height)
+ (\pict@fax@hoffset,\pict@fax@voffset)%
+ \put(\fromaddress@fax@hpos,\fromaddress@fax@vpos){\makebox(0,0)[tl]{
+ \parbox[t]{\fromaddress@fax@width}{\fromaddress}}}%
+ \put(\faxstring@hpos,\faxstring@vpos){\makebox(0,0)[bl]{%
+ \parbox[t]{\faxstring@width}{\telefaxstring}}}
+ \end{picture}\par%
+ \par\vspace{5mm}%
+ \makebox[\faxbox@width]{\scriptsize\telephonelabelname\telephonenum
+ \hfill\telefaxlabelname\faxnum
+ \ifx\@empty\emailnum\else\hfill\emaillabelname{\ttfamily\emailnum}\fi
+ \ifx\@empty\telexnum\else\hfill\telexlabelname\telexnum\fi}%
+ \par
+ \begin{tabular*}{\faxbox@width}[t]{l@{\hspace{5mm}}p{70mm}@{\hfill}r}%
+ \hline
+ \multicolumn{3}{@{}c@{}}{\vrule height 0pt depth 0pt width \faxbox@width}\\
+ \headtoname
+ &\parbox[t]{\toaddress@fax@width}{\toname\\\toaddress}%
+ &\telefaxname\tofaxnum\\%
+ \\%
+ \headfromname
+ &\parbox[t]{\fromname@fax@width}{\ifx\@empty\fromlocation
+ \fromname
+ \else
+ \fromlocation
+ \fi}%
+ &\pagetotalname\totalpages\\%
+ \end{tabular*}\par%
+ \begin{tabular*}{\faxbox@width}[t]{@{\hfill}c@{\hfill}}%
+ \hline
+ \vrule height 3ex depth 7pt width 0pt\faxwarning\\%
+ \hline
+ \end{tabular*}\par%
+ \begin{tabular*}{\faxbox@width}[t]{@{}r@{}}%
+ \vrule height 0pt depth 0pt width \faxbox@width\\
+ \multicolumn{1}{r}{%
+% \end{macrocode}
+% \changes{2.352}{2014-08-06}{Factorisation du code entre \cs{faxopening} et \cs{letteropening} avec les macro
+% \cs{lettre@get@date} et \cs{lettre@put@fromlieu@date}}%
+% \begin{macrocode}
+ \lettre@get@date
+ \lettre@put@fromlieu@date
+ }\\%
+ \end{tabular*}%
+ \par
+ \vspace{\openingspace}%
+ \lettre@adjust@margin
+% \end{macrocode}
+% Objet du fax, s'il en est, suivi de la formule de salutation.
+% \changes{3.001}{2017-11-28}{Factorisation de code entre \cs{faxopening} et \cs{letteropening} avec la macro
+% \cs{lettre@start@body}.}
+% \begin{macrocode}
+ \lettre@start@body{#1}%
+}%
+% \end{macrocode}
+%\paragraph{\cs{closing}}
+%\label{sec:closing}
+%\DescribeMacro{\closing}
+% \begin{macrocode}
+\long\def\closing#1{%
+ \let\center=\normalcenter
+ \let\centering=\normalcentering
+ \let\flushleft=\normalflushleft
+ \let\raggedright=\normalraggedright
+ \par\lettre@stopbreaks
+% \end{macrocode}
+% Espacement vertical lu dans le fichier \texttt{.tns} destiné à optimiser la mise en page, seulement dans le
+% cas d'une lettre et non d'une télécopie.
+% \begin{macrocode}
+ \lettre@tns@vspace
+% \end{macrocode}
+% \strut
+% \begin{macrocode}
+ \par\vspace{2\parskip}%
+ \nobreak
+ \noindent
+ \l@@info{Signature \ifcase\signum manquante\or simple\or double\or triple\fi}%
+% \end{macrocode}
+% Dans le cas où \cs{signum} est nul, la signature est générée à partir de \cs{fromname}. Il est donc
+% nécessaire que \cs{name}\marg{Mon nom} ait été appelé dans le préambule ou indirectement via la commande
+% \cs{institut}.
+% \changes{3.000}{2016-02-26}{Message d'erreur explicite en cas d'absence de \cs{name}\marg{Mon nom}.}
+% \begin{macrocode}
+ \ifnum\signum=0\space\ifx\fromname\undefined
+ \l@@error{\protect\fromname\space non d'efini, vous avez sans
+ doute omis de sp'ecifier \protect\name\space ou
+ \protect\institut\space!}
+ \fi\fi
+% \end{macrocode}
+% Le compteur \cs{sigflag} permet de sélectionner une présentation de la signature en fonction de la locale.
+% \changes{3.001}{2017-08-05}{Factorisation de code dans \cs{closing} sur le \cs{ifcase}\cs{sigflag}.}
+% \begin{macrocode}
+ \ifcase\sigflag
+ \parbox[t]{\letterwidth}{#1}%
+ \par\vspace*{4\parskip}%
+ \vspace*{\sigspace}%
+ \ifcase\signum
+ \hspace*{\ssigindent}%
+ \noindent
+ \parbox[t]{\ssigwidth}{\centering \ignorespaces\fromname}%
+ \or
+ \hspace*{\ssigindent}%
+ \noindent
+ \parbox[t]{\ssigwidth}{\centering \ignorespaces\fromsig}%
+ \or
+ \msigwidth=\letterwidth
+ \divide\msigwidth by 2\relax
+ \advance\msigwidth -3pt%
+ \noindent
+ \mbox{\parbox[t]{\msigwidth}{\centering\ignorespaces\fromsig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromssig}}%
+ \or
+ \msigwidth=\letterwidth
+ \divide\msigwidth by 3\relax
+ \advance\msigwidth -3pt%
+ \noindent
+ \mbox{\parbox[t]{\msigwidth}{\centering\ignorespaces\fromsig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromssig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromtsig}}%
+ \fi
+ \or
+ \ifcase\signum
+ \hspace*{\ssigindent}%
+ \parbox[t]{\ssigwidth}%
+ {\centering \ignorespaces
+ #1%
+ \par\vspace*{4\parskip}%
+ \vspace*{\sigspace}%
+ \fromname}%
+ \or
+ \hspace*{\ssigindent}%
+ \parbox[t]{\ssigwidth}%
+ {\centering \ignorespaces
+ #1%
+ \par\vspace*{4\parskip}%
+ \vspace*{\sigspace}%
+ \fromsig}%
+ \or
+ \parbox[t]{\letterwidth}{#1}%
+ \par\vspace*{4\parskip}%
+ \vspace*{\sigspace}%
+ \msigwidth=\letterwidth
+ \divide\msigwidth by 2\relax
+ \advance\msigwidth -3pt%
+ \noindent
+ \mbox{\parbox[t]{\msigwidth}{\centering\ignorespaces\fromsig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromssig}}%
+ \or
+ \parbox[t]{\letterwidth}{#1}%
+ \par\vspace*{4\parskip}%
+ \vspace*{\sigspace}%
+ \msigwidth=\letterwidth
+ \divide\msigwidth by 3\relax
+ \advance\msigwidth -3pt%
+ \noindent
+ \mbox{\parbox[t]{\msigwidth}{\centering\ignorespaces\fromsig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromssig}%
+ \parbox[t]{\msigwidth}{\centering\ignorespaces\fromtsig}}%
+ \fi
+ \fi
+ \par\vfill
+% \end{macrocode}
+% Fin du corps de la lettre sous la marge définie par \cs{marge}.
+% \begin{macrocode}
+ \lettre@endadjust@margin
+ \lettre@startbreaks
+ \let\@par\lettre@par
+ \let\lettre@parshape\@empty
+% \end{macrocode}
+% Fin de la macro \cs{closing}.
+% \begin{macrocode}
+}%
+\newdimen\lettre@save@leftmargin
+\newdimen\lettre@save@leftskip
+\newdimen\lettre@leftmargin
+% \end{macrocode}
+% \DescribeMacro{\lettre@adjust@margin}Début du corps de lettre dans lequel la marge est réglée selon la
+% commande \cs{marge} qui a été passée avant le \cs{opening}.
+% \begin{macrocode}
+\newcommand*\lettre@adjust@margin{%
+ \@setpar{\@@par\lettre@parshape}%
+ \lettre@save@leftmargin\leftmargin
+ \lettre@leftmargin\lettermargin
+ \advance\@totalleftmargin by \lettre@leftmargin
+ \leftmargin\lettre@leftmargin
+ \advance\linewidth by -\lettre@leftmargin
+ \lettre@save@leftskip\leftskip
+ \def\lettre@parshape{\parshape \@ne\@totalleftmargin \linewidth}%
+ \lettre@parshape
+}
+% \end{macrocode}
+% \DescribeMacro{\lettre@endadjust@margin}Fin du corps de lettre. Après cette commande la marge n'est plus
+% contrôlée selon le réglage fait pas la commande \cs{marge}.
+% \begin{macrocode}
+\newcommand*\lettre@endadjust@margin{%
+ \advance\@totalleftmargin by -\lettre@leftmargin
+ \advance\linewidth by \lettre@leftmargin
+ \leftmargin\lettre@save@leftmargin
+ \leftskip\lettre@save@leftskip
+ }
+% \end{macrocode}
+% \DescribeMacro{\lettre@letter@tns@vspace}La macro \cs{lettre@letter@tns@vspace} insère l'espace vertical
+% utilisé pour optimiser la mise en page des lettres via le fichier \texttt{.tns}. Cette macro n'est utilisée
+% que dans le cas des lettres, et pas dans celui des télécopies.
+% \begin{macrocode}
+\newcommand*\lettre@letter@tns@vspace{%
+ \vskip\csname letter\the\c@lettre\endcsname mm}
+% \end{macrocode}
+% \DescribeMacro{\lettre@tns@vspace}La macro \cs{lettre@tns@vspace} pointe en fait sur
+% \cs{lettre@letter@tns@vspace} dans le cas des lettres, ou sur \cs{@empty} dans celui d'une télécopie. Elle
+% permet d'appeler l'une ou l'autre macro dans les parties communes aux deux types de missives, par ex.\ au
+% sein de \cs{closing} ou de \cs{lettre@start@body}.
+% \begin{macrocode}
+\newcommand*\lettre@tns@vspace{}
+% \end{macrocode}
+% \DescribeMacro{\lettre@start@body}La macro \cs{lettre@start@body} insère l'objet, s'il en est, suivi de la
+% formule de salutation, puis débute le corps de la lettre en terminant \cs{opening} par l'espacement
+% nécessaire et en redéfinissant les environnement \texttt{center} et consorts de manière adéquate.
+% \begin{macrocode}
+\newcommand*\lettre@start@body[1]{%
+ \ifx\@empty\concdecl
+ \vspace{\openingspace}%
+ \else
+ \concline\vspace{\openingspace}%
+ \fi
+ \lettre@tns@vspace
+ \hbadness=1000\relax
+ {\parindent=\openingindent
+ #1}\par\lettre@startbreaks\nobreak
+ \let\flushleft=\letterflushleft
+ \let\raggedright=\letterraggedright
+ \let\center=\lettercenter
+ \let\centering=\lettercentering
+}
+% \end{macrocode}
+% \DescribeMacro{\marge}La macro \cs{marge} règle la marge du corps de la lettre. Elle est à appelé entre le
+% \cs{begin\{letter\}} et le \cs{opening}.
+% \begin{macrocode}
+\def\marge#1{%
+ \lettermargin=#1%
+ \listmargin=#1%
+ \letterwidth=\textwidth
+ \advance\letterwidth by -\lettermargin
+}%
+% \end{macrocode}
+%\DescribeMacro{\basdepage}
+% \begin{macrocode}
+\def\basdepage#1{%
+ \def\bdp{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\tension}
+% \begin{macrocode}
+\def\tension#1{%
+ \if@letter
+ \expandafter\def\csname letter\the\c@lettre\endcsname{#1}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\addpages}
+% \begin{macrocode}
+\def\addpages#1{%
+ \l@@info{Pages additionnelles: #1}%
+ \advance\faxpage by #1}%
+% \end{macrocode}
+%\DescribeMacro{\name}
+% \begin{macrocode}
+\def\name#1{\def\fromname{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\signature}
+% \begin{macrocode}
+\def\signature#1{%
+ \ifnum\signum=0\relax
+ \def\fromsig{#1}\signum=1\relax
+ \else
+ \l@@warning@strictable{Signature deja definie}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\secondsignature}
+% \begin{macrocode}
+\def\secondsignature#1{%
+ \ifnum\signum=1\relax
+ \def\fromssig{#1}\signum=2\relax
+ \else
+ \l@@warning@strictable{Seconde signature illegale ou deja definie}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\thirdsignature}
+% \begin{macrocode}
+\def\thirdsignature#1{%
+ \ifnum\signum=2\relax
+ \def\fromtsig{#1}\signum=3\relax
+ \else
+ \l@@warning@strictable{Troisieme signature illegale ou deja definie}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\vref}
+% \begin{macrocode}
+\def\vref{\l@@warning@strictable{La commande \protect\Vref\space devrait etre
+ utilisee}\Vref}
+% \end{macrocode}
+%\DescribeMacro{\Vref}
+%\changes{2.354}{2014-10-21}{Ajout \cs{lettre@vref@width}}%
+%\changes{2.354}{2014-10-21}{Un argument vide à \cs{Vref} supprime la référence}%
+% \begin{macrocode}
+\def\Vref#1{%
+ \def\@tempa{#1}%
+ \ifx\@empty\@tempa
+ \let\toref\@empty
+ \else
+ \def\auxflag{.}%
+ \def\toref{\parbox[t]{\lettre@vref@width}{#1}}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\nref}
+% \begin{macrocode}
+\def\nref{\l@@warning@strictable{La commande \protect\Nref\space devrait etre
+ utilisee}\Nref}
+% \end{macrocode}
+%\DescribeMacro{\Nref}
+%\changes{2.354}{2014-10-21}{Ajout \cs{lettre@nref@width}}%
+%\changes{2.354}{2014-10-21}{Un argument vide à \cs{Nref} supprime la référence}%
+% \begin{macrocode}
+\def\Nref#1{%
+ \def\@tempa{#1}%
+ \ifx\@empty\@tempa
+ \let\fromref\@empty
+ \else
+ \def\auxflag{.}%
+ \def\fromref{\parbox[t]{\lettre@nref@width}{#1}}%
+ \fi
+}%
+% \end{macrocode}
+%\DescribeMacro{\concline}La macro \cs{concline} contient l'objet de la lettre ou du fax.
+% \begin{macrocode}
+\def\concline{%
+ \noindent\parbox[t]{\letterwidth}%
+ {\@hangfrom{\textrm{\concname}}\ignorespaces\concdecl\strut}%
+ \par}%
+% \end{macrocode}
+% \DescribeMacro{\auxline}La macro \cs{auxline} contient les références, ainsi que les numéro télex ou
+% \textsc{ccp}.
+% \begin{macrocode}
+\def\auxline{%
+ \l@@info{Ligne auxiliaire demandee}%
+ {\scriptsize
+ \ifx\@empty\toref\else
+ \vrefname
+ \ifx\space\toref
+ \hspace{\lettre@vref@width}%
+ \else
+ {\small\toref}%
+ \fi
+ \hfill
+ \fi
+ \ifx\@empty\fromref\else
+ \nrefname
+ \ifx\space\fromref
+ \hspace{\lettre@nref@width}%
+ \else
+ {\small\fromref}%
+ \fi
+ \hfill
+ \fi
+ \ifx\@empty \telexnum
+ \hfill
+ \else
+ T\'ELEX\ \telexnum
+ \hspace{5mm}%
+ \fi
+ \ifx\@empty \ccpnum
+ \hfill
+ \else
+ C.C.P.\ \ccpnum\hspace{5mm}%
+ \fi}\par}%
+% \end{macrocode}
+%\DescribeMacro{\emailine}
+% \begin{macrocode}
+\def\emailine{%
+ \l@@info{Ligne d'E-Mail demandee}%
+ {\scriptsize
+ \emaillabelname\hfill\ttfamily
+ \ifx\@empty \ccittnum
+ \else
+ \hfill \ccittnum\hfill
+ \fi
+ \ifx\@empty \internetnum
+ \else
+ \hfill \internetnum\hfill
+ \fi
+ \ifx\@empty \bitnetnum
+ \else
+ \hfill \bitnetnum\hfill
+ \fi
+ \ifx\@empty \telepacnum
+ \else
+ \hfill \telepacnum\hfill
+ \fi
+ \ifx\@empty \decnetnum
+ \else
+ \hfill \decnetnum\hfill
+ \fi
+ \ifnum\emailcount<3\relax
+ \hfill\mbox{}%
+ \fi}}%
+% \end{macrocode}
+%\DescribeMacro{\address}
+% \begin{macrocode}
+\long\def\address#1{\l@@info{Adresse precisee}\def\fromaddress{#1}}%
+%\long\def\address*#1{\if@letter
+% \l@@info{Adresse avec nom precisee}%
+% \def\fromaddress{\fromname\\#1}
+% \else
+% \l@@warning@strictable{Commande illegale dans un fax}
+% \fi}%
+% \end{macrocode}
+%\DescribeMacro{\nodate}
+% \begin{macrocode}
+\def\nodate{\l@@info{Date supprimee}\def\pdate{}}%
+\def\date#1{\l@@info{Date precisee}\def\pdate{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\nolieu}
+% \begin{macrocode}
+\def\nolieu{\l@@info{Lieu supprime}\def\fromlieu{}}%
+% \end{macrocode}
+%\DescribeMacro{\lieu}
+% \begin{macrocode}
+\def\lieu#1{\l@@info{Lieu precise}\def\fromlieu{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\conc}
+% \begin{macrocode}
+\def\conc#1{\l@@info{Champ d'objet defini}\def\concdecl{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\location}
+% \begin{macrocode}
+\def\location#1{\l@@info{Precision d'adresse definie}\def\fromlocation{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\notelephone}
+% \begin{macrocode}
+\def\notelephone{\l@@info{Numero de telephone supprime}\def\telephonenum{}}%
+% \end{macrocode}
+%\DescribeMacro{\telephone}
+% \begin{macrocode}
+\def\telephone#1{\l@@info{Numero de telephone precise}\def\telephonenum{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\nofax}
+% \begin{macrocode}
+\def\nofax{\l@@info{Numero de fax supprime}\def\faxnum{}}%
+% \end{macrocode}
+%\DescribeMacro{\fax}
+% \begin{macrocode}
+\def\fax#1{\l@@info{Numero de fax precise}\def\faxnum{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\email}
+% \begin{macrocode}
+\def\email#1{\l@@info{Numero d'E-Mail precise}\def\emailnum{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\username}
+% \begin{macrocode}
+\def\username#1{\def\@username{#1}}%
+% \end{macrocode}
+%\DescribeMacro{\ccitt}
+% \begin{macrocode}
+\def\ccitt#1{%
+ \ifnum\emailcount<3\relax
+ \def\emailflag{.}%
+ \advance\emailcount by 1\relax
+ \def\ccittnum{%
+ \ifx\@empty \@username
+ \l@@warning@strictable{<<username>> indefini}
+ #1%
+ \else
+ S=\@username;#1%
+ \fi}%
+ \else
+ \def\ccittnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\internet}
+% \begin{macrocode}
+\def\internet#1{%
+ \ifnum\emailcount<3\relax
+ \def\emailflag{.}%
+ \advance\emailcount by 1\relax
+ \def\internetnum{%
+ \ifx\@empty\@username
+ \l@@warning@strictable{<<username>> indefini}
+ #1\relax
+ \else
+ \@username @#1\relax
+ \fi}%
+ \else
+ \def\internetnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\bitnet}
+% \begin{macrocode}
+\def\bitnet#1{%
+ \ifnum\emailcount<3\relax
+ \def\emailflag{.}%
+ \advance\emailcount by 1\relax
+ \def\bitnetnum{%
+ \ifx\@empty \@username
+ \l@@warning@strictable{<<username>> indefini}
+ #1\relax
+ \else
+ \@username\ at #1\relax
+ \fi}%
+ \else
+ \def\bitnetnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\telepac}
+% \begin{macrocode}
+\def\telepac#1{%
+ \ifnum\emailcount<3\relax
+ \def\emailflag{.}%
+ \advance\emailcount by 1\relax
+ \def\telepacnum{%
+ \ifx\@empty \@username
+ \l@@warning@strictable{<<username>> indefini}
+ #1\relax
+ \else
+ #1::\@username
+ \fi}%
+ \else
+ \def\telepacnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\decnet}
+% \begin{macrocode}
+\def\decnet#1{%
+ \ifnum\emailcount<3\relax
+ \def\emailflag{.}%
+ \advance\emailcount by 1\relax
+ \def\decnetnum{%
+ \ifx\@empty \@username
+ \l@@warning@strictable{<<username>> indefini}
+ #1\relax
+ \else
+ #1::\@username
+ \fi}%
+ \else
+ \def\decnetnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\telex}
+% \begin{macrocode}
+\def\telex#1{\ifnum\auxcount<2\relax
+ \def\auxflag{.}%
+ \advance\auxcount by 1\relax
+ \def\telexnum{#1}%
+ \else
+ \def\telexnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\ccp}
+% \begin{macrocode}
+\def\ccp#1{\ifnum\auxcount<2\relax
+ \def\auxflag{.}%
+ \advance\auxcount by 1\relax
+ \def\ccpnum{#1}%
+ \else
+ \def\ccpnum{}%
+ \fi}%
+% \end{macrocode}
+%\DescribeMacro{\ps}
+% \begin{macrocode}
+\def\ps#1#2{\penalty100\relax
+ \lettre@tns@vspace
+ \l@@info{Post-scriptum defini}%
+ \noindent\lettre@t{#1}{#2\\}\vfill\penalty-100\relax}%
+% \end{macrocode}
+%\DescribeMacro{\cc}
+% \begin{macrocode}
+\def\cc#1{\penalty100\relax
+ \lettre@tns@vspace
+ \l@@info{Copies declarees}%
+ \noindent\lettre@t{\ccname}{#1\\}\vfill\penalty-100\relax}%
+% \end{macrocode}
+%\DescribeMacro{\encl}
+% \begin{macrocode}
+\def\encl#1{\penalty100\relax
+ \lettre@tns@vspace
+ \l@@info{Annexes declarees}%
+ \noindent\lettre@t{\enclname}{#1\\}\vfill\penalty-100\relax}%
+% \end{macrocode}
+%\DescribeMacro{\mencl}
+% \begin{macrocode}
+\def\mencl{\penalty100\relax
+ \lettre@tns@vspace
+ \l@@info{Annexes mentionnees}%
+ \noindent\lettre@t{\mentionname\\}{~}\vfill\penalty-100\relax}%
+% \end{macrocode}
+%
+%\subsubsection{Définitions dépendant du langage}
+%
+%\DescribeMacro{\lettrelmpselectlanguage}La macro \cs{lettrelmpselectlanguage} permet, lorsque une langue est
+% chargée dans dans un processeur multilingue (par ex.\ \texttt{babel}) de sélectionner cette langue et de
+% redéfinir les environnements de liste tels qu'\texttt{itemize} pour le français.
+% \begin{macrocode}
+\newcommand*{\lettrelmpselectlanguage}[1]{%
+% \end{macrocode}
+% Si l'utilisateur n'a pas chargé les définitions de cette langue, on essaie de le faire ici :
+% \begin{macrocode}
+ \lettreloadlang{#1}%
+% \end{macrocode}
+% Ensuite, en premier lieu on vérifie que la langue \texttt{\#1} est bien prise en charge.
+% \begin{macrocode}
+ {%
+ \ifcsundef{lettre@#1@alias@of}{%
+ \l@@warning@strictable{Langue #1 non ger'ee par lettre}%
+ \let\@tempa\@empty
+ }{%
+% \end{macrocode}
+% Ensuite, il s'agit d'appeler \cs{lettre@lmp@selectlanguage}. En fait si l'on pose que
+% \meta{lang}$=$\texttt{\#1}, alors on ne veut pas appeler
+% \cs{lettre@lmp@selectlanguage}\texttt{\{}\meta{lang}\texttt{\}} mais
+% \cs{lettre@lmp@selectlanguage}\texttt{\{}\meta{lang$^{\prime\prime}$}\texttt{\}}, où ci-après on déduit
+% \meta{lang$^{\prime}$} de \meta{lang}, puis \meta{lang$^{\prime\prime}$} de \meta{lang$^{\prime}$}. On
+% regarde donc d'abord de quoi \meta{lang}$=$\texttt{\#1} est l'alias, et on met le résultat dans
+% \meta{lang$^\prime$}$=$\cs{toks}$0$. Par ex.\ si \meta{lang}$=$\texttt{french}, alors on a aussi
+% \meta{lang$^\prime$}$=$\texttt{french}, parce que \texttt{french} est l'alias de lui-même (en d'autre terme ce
+% n'est pas un alias d'autre chose), mais si \meta{lang}$=$\texttt{francais}, alors on aura
+% \meta{lang$^\prime$}$=$\texttt{french}, parce que \texttt{francais} est un alias de \texttt{french}.
+% \begin{macrocode}
+ \toks0\expandafter\expandafter\expandafter
+ {\csname lettre@#1@alias@of\endcsname}%
+% \end{macrocode}
+% Puis, si pour cette langue \meta{lang$^\prime$}, par ex.\ \texttt{romand}, on a déclaré d'utiliser une autre
+% langue pour le gestionnaire de langue, par ex.\ \texttt{french}, on utilise celle-là au lieu de celle-ci, on
+% met le résultat dans \meta{lang$^{\prime\prime}$}$=$\cs{toks}$1$.
+% \begin{macrocode}
+ \ifcsundef{lettre@lmp@\the\toks0@use}{%
+ \toks1\toks0 %
+ }{%
+ \toks1\expandafter\expandafter\expandafter
+ {\csname lettre@lmp@\the\toks0@use\endcsname}%
+ }%
+% \end{macrocode}
+% En définitive, on va appeler \cs{lettre@lmp@selectlanguage}\texttt{\{}\meta
+% {lang$^{\prime\prime}$}\texttt{\}}, et cet appel est préparé dans \cs{toks}$4$. Mais pas tout à fait, on
+% gère en plus la modification par \texttt{lettre} des environnements de base (par ex.\ \texttt{itemize}) en
+% fonction de la langue, de sorte qu'en fin de compte c'est la séquence
+% \cs{the}\cs{toks}$3$\cs{the}\cs{toks}$4$\cs{the}\cs{toks}$5$ qui sera appelé.
+% \begin{macrocode}
+ \toks4\expandafter{%
+ \expandafter\lettre@lmp@selectlanguage\expandafter{%
+ \the\toks1}}%
+% \end{macrocode}
+% Il y a trois cas possibles. Le premier c'est que la gestion des environnements par \texttt{lettre} est
+% désactivée, ou en d'autres termes que le compteur \cs{lettre@keep@envs} est à 1. Dans ce cas on ne
+% fait rien de plus qu'appeler \cs{lettre@lmp@selectlanguage}\texttt{\{}\meta
+% {lang$^{\prime\prime}$}\texttt{\}}, c.-à-d.\ que \cs{toks}$3$ et \cs{toks}$5$ sont vide.
+% \begin{macrocode}
+ \ifnum\lettre@keep@envs=1 %
+ \toks3{}%
+ \toks5{}%
+ \else
+% \end{macrocode}
+% Dans le deuxième cas, la gestion des environnements par \texttt{lettre} est activée, mais il n'y a pas de
+% redéfinition d'environnements disponible pour la langue \meta{lang$^{\prime\prime}$}. Dans ce cas on
+% appelle \cs{lettre@restore@orig@envs} avant \cs{lettre@lmp@selectlanguage}\texttt{\{}\meta
+% {lang$^{\prime\prime}$}\texttt{\}}, et \cs{lettre@store@orig@envs}. Si \meta{lang$^{\prime\prime}$} est la
+% seule langue utilisée dans tout le document, cela ne sert à rien, mais au cas où le document contiendrait
+% avant la lettre utilisant \meta{lang$^{\prime\prime}$} une lettre qui aurait redéfini les environnements,
+% on a besoin du \cs{lettre@restore@orig@envs} pour ne pas perturber le paquetage de gestion de langue.
+% \begin{macrocode}
+ \toks3{\lettre@restore@orig@envs}%
+ \ifcsundef{lettre@set@\the\toks1@envs}{%
+ \toks5{\lettre@store@orig@envs}%
+ }{%
+% \end{macrocode}
+% Dans le troisième cas, une redéfinition d'environnements est disponible pour la langue
+% \meta{lang$^{\prime\prime}$}. Dans ce cas on fait la même chose que dans le deuxième cas, à ceci près
+% qu'on appelle en tout dernier lieu \cs{lettre@set@}\meta{lang$^{\prime\prime}$}\texttt{@envs}.
+% \begin{macrocode}
+ \toks5\expandafter{\expandafter\lettre@store@orig@envs
+ \csname lettre@set@\the\toks1 @envs\endcsname}%
+ }%
+ \fi
+% \end{macrocode}
+% Il ne reste plus qu'à appeler ce qu'on a préparé dans les \cs{toks} allant de $3$ à $5$.
+% \begin{macrocode}
+ \edef\@tempa{%
+ \the\toks3 %
+ \the\toks4 %
+ \the\toks5}%
+ }%
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+%\DescribeMacro{\FAXSTR}
+% \begin{macrocode}
+\def\FAXSTR{\fontfamily{cmdh}\fontseries{m}\fontshape{n}\selectfont}%
+% \end{macrocode}
+%\DescribeMacro{\lettre@lmp@selectlanguage}La macro \cs{lettrelmpselectlanguage} n'est en fait qu'un pointeur
+% qui appelle le \cs{selectlanguage} ou son équivalent selon le processeur multilingue utilisé (typiquement
+% \texttt{mlp}, \texttt{babel}, ou \texttt{polyglossia}). Ici on définit une implémentation par défaut qui ne
+% fait rien en attendant un \cs{let} vers la bonne macro.
+% \begin{macrocode}
+\newcommand*\lettre@lmp@selectlanguage[1]{%
+ \l@@warning{ `\string\lettre@lmp@selectlanguage{#1}' appel'e, mais ne
+ fait rien. Vous n'avez charg'e ni babel, ni mlp, ni polyglossia, ni
+ french}}
+% \end{macrocode}
+%\DescribeMacro{\lettrelabelselectlanguage}\cs{lettrelabelselectlanguage} change la langue des étiquettes de
+% la lettre, ainsi que la disposition de la signature.
+% \begin{macrocode}
+\newcommand*\lettrelabelselectlanguage[1]{%
+% \end{macrocode}
+% Si l'utilisateur n'a pas chargé les définitions de cette langue, on essaie de le faire ici :
+% \begin{macrocode}
+ \lettreloadlang{#1}%
+% \end{macrocode}
+% Et maintenant on sélectionne la langue \meta{langue}$=$\texttt{\#1}, ce qui correspond à appeler la macro
+% \cs{lettre@select@\meta{langue}@labels} avec quelques gardefous. Au-passage, si aucun des gardefous n'est
+% franchi, \cs{lettre@mainlang} est redéfini à \texttt{\#1}.
+% \begin{macrocode}
+ {%
+ \ifcsundef{lettre@#1@alias@of}{%
+ \l@@warning@strictable{La langue <<#1>> n'est pas prise en charge par lettre}%
+ \let\@tempa\@empty
+ }{%
+ \expandafter\let\expandafter\@tempa\csname lettre@#1@alias@of\endcsname
+ \ifcsundef{lettre@select@\@tempa @labels}{%
+ \l@@warning@strictable{Les d'efinitions de la langue <<\@tempa>> n'ont pas pu etre charg'ees}%
+ \let\@tempa\@empty
+ }{%
+ \expandafter\def\expandafter\@tempa\expandafter{%
+ \csname lettre@select@\@tempa @labels\endcsname
+ \def\lettre@mainlang{#1}}%
+ }%
+ }%
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+% \DescribeMacro{\lettreloadlang}La macro \cs{lettreloadlang}\marg{langue} charge les définitions pour la
+% langue \meta{langue}. Ceci revient à faire un \cs{input} du fichier nommé \texttt{lettre-\meta{langue}.ldf}.
+% \begin{macrocode}
+\newcommand*\lettreloadlang[1]{%
+% \end{macrocode}
+% On ouvre un groupe pour pouvoir y faire des définitions locales.
+% \begin{macrocode}
+ {%
+% \end{macrocode}
+% On vérifie tout d'abord si la langue \texttt{\#1} fait partie des langues prises en charge par
+% \texttt{lettre}. On met dans \cs{@tempa} la valeur \meta{lang$^{\prime}$} à laquelle \texttt{\#1} est égale,
+% ou en est l'alias. On met dans \cs{toks0} tout traitement éventuel de redéfinition de
+% \cs{lettre@\#1@alias@of}.
+% \begin{macrocode}
+ \newif\iflettre@lang@not@supported
+ \ifcsundef{lettre@#1@alias@of}{%
+ \lettre@lang@not@supportedtrue
+ \l@@warning@strictable{La langue <<#1>> ne fait pas partie des
+ langues prises en charge par lettre}%
+% \end{macrocode}
+% Le code suivant consiste à définir \cs{lettre@\#1@alias@of} comme \texttt{\#1}, de sorte que la langue
+% \texttt{\#1} soit dorénavant considérée comme prise en charge.
+% \begin{macrocode}
+ \def\@tempb##1{\toks0{\def##1{#1}}}%
+ \expandafter\@tempb\csname lettre@#1@alias@of\endcsname
+ \def\@tempa{#1}%
+ }{%
+ \lettre@lang@not@supportedfalse
+ \toks0{}%
+ \expandafter\let\expandafter\@tempa\csname lettre@#1@alias@of\endcsname
+ }%
+ \edef\@tempc{\lettre@ldf@filename{\@tempa}}%
+ \IfFileExists{\@tempc}{%
+ \iflettre@lang@not@supported
+ \l@@info{Un fichier `\@tempc' ne faisant pas partie de lettre a 'et'e
+ trouv'e, et va etre charg'e.}%
+ \fi
+ \ifcsundef{\lettre@ldf@version{\@tempa}}{%
+ \edef\@tempa{%
+ \noexpand\l@@info{Chargement du fichier de definition de langue `\@tempc'}%
+ \noexpand\input{\@tempc}%
+ \the\toks0
+ }}{\edef\@tempa{\the\toks0}}%
+ }{%
+ \let\@tempa\@empty
+ }
+ \expandafter
+ }\@tempa
+}%
+% \end{macrocode}
+% \DescribeMacro{\lettreselectlanguage} \cs{lettreselectlanguage} Sélectionne la langue à la fois pour le
+% paquetage de gestion de langue (césure, environnements liste, etc\ldots) en appelant
+% \cs{lettrelmpselectlanguage} et pour la présentation de la lettre (étiquettes, disposition signature) en
+% appelant \cs{lettrelabelselectlanguage}. L'ordre d'appel est important, parce que certains paquetages de
+% gestion de langue redéfinissent certaines des macros de l'environnement \texttt{letter}. Notamment pour le
+% romand avec le paquetage de gestion de langue \texttt{french}, ce dernier définit \cs{enclname} (l'étiquette
+% introduisant la pièce jointe) comme \texttt{P. j.~:}, c-à-d.\ à la française, au lieu de le définir comme
+% \texttt{Ann.~:}, c-à-d.\ à la romande, ce que fait \texttt{lettre}.
+% \begin{macrocode}
+\newcommand*\lettreselectlanguage[1]{%
+ \lettrelmpselectlanguage{#1}%
+ \lettrelabelselectlanguage{#1}%
+}%
+% \end{macrocode}
+% \begin{macro}{\lettre@babel@selectlanguage}La macro \cs{lettre@babel@selectlanguage} est une émulation de
+% la macro \cs{selectlanguage} quand le paquetage \texttt{babel} est chargé. Le but est de faire un
+% traitement particulier pour le cas \texttt{german}.
+% \begin{macrocode}
+\newcommand*\lettre@babel@selectlanguage[1]{%
+ \ifcsdef{lettre@babel@#1}{\csname lettre@babel@#1\endcsname}{\selectlanguage{#1}}%
+}%
+% \end{macrocode}
+% Le traitement particulier pour \texttt{german} est effectué par \cs{lettre@babel@german}, et c'est le
+% suivant :
+% \begin{itemize}
+% \item si \texttt{babel} a chargé \texttt{ngerman}, ce que l'on teste avec
+% \cs{ifcsdef}\texttt{\{ver@ngerman.ldf\}\ldots}, alors on appelle \cs{selectlanguage}\texttt{\{ngerman\}},
+% \item sinon, on appelle \cs{selectlanguage}\texttt{\{german\}}
+% \end{itemize}
+%
+% \begin{macrocode}
+\newcommand*\lettre@babel@german{%
+ \ifcsdef{ver@ngerman.ldf}{\selectlanguage{ngerman}}%
+ {\selectlanguage{german}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\lettre@efrench@selectlanguage} La macro \cs{lettre@efrench@selectlanguage} est une émulation de la
+% macro \cs{selectlanguage} quand le paquetage \texttt{french} est chargé.
+% \begin{macrocode}
+\newcommand*\lettre@efrench@selectlanguage[1]{%
+ \ifx\undefined\frenchname
+ \l@@warning@strictable{L'un des paquetages mlp ou french n'a pas 'et'e
+ charg'e correctement}%
+ \else
+% \end{macrocode}
+% Préparation d'un avertissement, au cas où \texttt{\#1} ne serait pas l'une des langues prises en charge par \texttt{mlp}.
+% \begin{macrocode}
+ \def\@tempb{\l@@warning@strictable{La langue `#1' n'est pas dans
+ \string{french, german, english\string} qui sont les trois seules
+ langues que lettre peut demander `a mlp}}%
+ \def\@tempc{#1}%
+ \def\lettre@iterate@body##1{%
+ \def\@tempd{##1}%
+ \ifx\@tempc\@tempd
+% \end{macrocode}
+% Suppression de l'avertissement, car \texttt{\#1} est bien l'une des langues prises en charge par \texttt{mlp}.
+% \begin{macrocode}
+ \let\@tempb\@empty
+% \end{macrocode}
+% Ici on sélectionne la langue avec une macro enveloppante de la commande correspondante de \texttt{mlp}.
+% \begin{macrocode}
+ \l@@info{Selection de la langue `#1' dans le paquetage french ou
+ mlp d'efrench}%
+ \csname lettre@efr@#1\endcsname
+% \end{macrocode}
+% Le \cs{@tempc} permet de casser la boucle en gobant le \cs{lettre@iterate} qui suit, ainsi que ses arguments restants.
+% \begin{macrocode}
+ \def\@tempc####1\@nil,{}%
+ \expandafter\@tempc
+ \fi
+ }%
+ \lettre@iterate french,english,german,\@nil,%
+ \@tempb
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+% Définition des macros enveloppantes des langues prises en charge par \texttt{mlp}.
+%
+% \DescribeMacro{\lettre@efr@german} Pour \texttt{german}, on fait en sorte que l'allemand moderne (le seul
+% utilisé par \texttt{babel}) l'emporte sur le vieil allemand.
+% \begin{macrocode}
+\newcommand*\lettre@efr@german{%
+ \ifx\undefined\ngermanTeXmods
+ \ifx\undefined\germanTeXmods
+ \l@@warning@strictable{Ni \protect\german\space ni \protect\ngerman\space
+ ne sont d'efinis !}
+ \else
+ \german
+ \fi
+ \else
+ \ngerman
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\lettre@efr@french}Pour \cs{french} il faut prendre deux précautions avant d'appeler la
+% macro.
+% \begin{itemize}
+% \item La première est qu'appeler \cs{french} alors qu'on est déjà en français cause une erreur. Pour
+% éviter cela, on fait le test \cs{ifFrench}.
+% \item La seconde est que si on appelle \cs{lettre@efr@french} dans le \cs{AtBeginDocument}, alors
+% \cs{french} ne sera pas encore défini. Donc on teste que \cs{french} est défini avant de rappeler
+% \cs{lettre@efr@french} avec une nouvelle définition <<\verb+\ifFrench\else\french\fi+>>.
+% \end{itemize}
+%
+% \begin{macrocode}
+\newcommand*\lettre@efr@french{\ifcsdef{french}{%
+ \def\lettre@efr@french{\ifFrench\else\french\fi}\lettre@efr@french
+ }{\l@@warning@strictable{La commande \protect\french\space n'est pas
+ d'efinie.}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\lettre@efr@english}Pour \cs{english}, le wrapper ne fait qu'appeler la macro \cs{english}
+% correspondante du paquetage \texttt{mlp} ou \texttt{french}.
+% \begin{macrocode}
+\newcommand*\lettre@efr@english{\english}
+% \end{macrocode}
+% \end{macro}
+% Définitions des macros telles que \cs{francais}, \cs{anglais}, etc\ldots
+% \begin{macrocode}
+\def\@tempa#1{%
+ \expandafter\newcommand\expandafter*\csname #1\endcsname{%
+ {%
+ \def\@tempa{#1}%
+ \ifx\lettre@mainlang\@tempa\else\l@@info{Langage modifie: #1}\fi
+ }%
+ \lettreselectlanguage{#1}%
+ }%
+}%
+\@tempa{romand}%
+\@tempa{francais}%
+\@tempa{allemand}%
+\@tempa{anglais}%
+\@tempa{americain}%
+% \end{macrocode}
+% Crochet \cs{begin\{document\}}~:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \makeatletter
+ \@input{\jobname.tns}%
+ \@input{\jobname.odt}%
+ \begingroup\@floatplacement\@dblfloatplacement
+ \immediate\openout\@tensionaux=\jobname.tns%
+ \if@origdate
+ \immediate\openout\@dateaux=\jobname.odt%
+ \fi
+ \endgroup
+% \end{macrocode}
+% Pour écrire \og\cs{startlabels}\fg\ sur le fichier \verb+.etq+ et exécuter \cs{@startlabels}.
+% \begin{macrocode}
+ \if@etiq
+ \immediate\openout\@etiqaux=\jobname.etq%
+ \immediate\write\@etiqaux{\string\startlabels}%
+ \@startlabels
+ \fi
+% \end{macrocode}
+% On ouvre un groupe pour pouvoir bidouiller des définitions locales comme \cs{toks0}, etc.
+% \begin{macrocode}
+ {%
+% \end{macrocode}
+% On met dans \cs{@tempa} un traitement systématique à faire pour tout paquetage de gestion de langue chargé. En
+% l'occurrence on désactive la rédéfinition des environnements \texttt{itemize} et consorts par
+% \texttt{lettre} si un tel paquetage est chargé et qu'on n'a pas explicitement \texttt{keep envs=false}.
+% \begin{macrocode}
+ \def\@tempa{%
+ \ifnum\lettre@keep@envs=0 %
+ \lettre@keep@envs=1 %
+ \fi
+ }%
+% \end{macrocode}
+% Maintenant, redéfinition de la macro \cs{lettre@lmp@selectlanguage} selon le paquetage de gestion de
+% langue\footnote{\emph{lmp} dans le nom de la macro veut dire \og Language Managagement Package\fg, c-à-d.\
+% \og Paquetage de Gestion de Lange\fg.} utilisé. On va faire une boucle qui va scruter une liste
+% d'association dont chaque élément sera de la forme \meta{paquetage}\texttt{:}\meta{cas}, où \meta{cas} est
+% un nombre.\newline Tout d'abord on définit le traitement à appliquer à chacun des cas et on le place dans le
+% registre \cs{toks}\meta{cas}. Premier cas possible, c.-à-d.\ $\meta{cas}=0$, c'est le cas par défaut où on
+% ne trouve aucun \meta{paquetage} de gestion de langue, alors on ne fait rien, c'est à dire qu'on reste sur
+% la définition par défaut de \cs{lettre@lmp@selectlanguage}.\\
+% Mais encore, toujours dans ce $\meta{cas}=0$, c'est à dire dans le cas où l'on n'a détecté le chargement
+% d'aucun paquetage de gestion de langue, si \cs{lettre@keep@envs} est à 0, c'est que de surcroît l'option
+% \texttt{keep envs=true} n'a pas été donnée, alors on fait comme si on avait eu l'option \texttt{keep
+% envs=false}, c'est à dire que \texttt{lettre} redéfinit les environnemnts \texttt{itemize} et consorts selon
+% la langue~:
+% \begin{macrocode}
+ \toks0{%
+ \ifnum\lettre@keep@envs=0 %
+ \lettre@keep@envs=2 %
+ \fi
+ }%
+% \end{macrocode}
+% Deuxième cas possible, c.-à-d.\ $\meta{cas}=1$, on trouve un paquetage de gestion de langue qui fournit la
+% macro \cs{selectlanguage}, alors \cs{lettre@lmp@selectlanguage} appelle \cs{selectlanguage} --- à noter que
+% dans chaque cas on développe le traitement par défaut défini dans \cs{@tempa}~:
+% \begin{macrocode}
+ \toks1\expandafter{\@tempa
+ \def\lettre@lmp@selectlanguage#1{\selectlanguage{#1}}}%
+% \end{macrocode}
+% Troisième cas possible, c.-à-d.\ $\meta{cas}=2$, le paquetage de gestion de langue fait partie
+% d'\texttt{e-french}, on utilise \cs{lettre@efrench@selectlanguage} qui fait les traitements ad-hoc pour ce
+% cas :
+% \begin{macrocode}
+ \toks2\expandafter{\@tempa
+ \let\lettre@lmp@selectlanguage\lettre@efrench@selectlanguage}%
+% \end{macrocode}
+% Quatrième cas possible, c.-à-d.\ $\meta{cas}=3$, le paquetage de gestion de langue fait partie
+% de \texttt{babel}, on utilise \cs{lettre@babel@selectlanguage} qui fait les traitements ad-hoc pour ce
+% cas :
+% \begin{macrocode}
+ \toks3\expandafter{\@tempa
+ \let\lettre@lmp@selectlanguage\lettre@babel@selectlanguage}%
+% \end{macrocode}
+% Le \meta{cas} sélectionné va être mis dans \cs{count}\texttt{0}, par défaut on initialise au premier cas :
+% \begin{macrocode}
+ \count0=0 %
+% \end{macrocode}
+% Et maintenant on se fait un macro \cs{@tempb} qui va analyser chaque élément de la liste d'association,
+% c'est à dire qui va pour chaque \meta{paquetage} \texttt{\#1} testé, si ce paquetage est chargé sélectionner
+% le bon \meta{cas} \texttt{\#2} :
+% \begin{macrocode}
+ \def\lettre@iterate@body#1{\@tempb#1\@nil}%
+ \def\@tempb#1:#2\@nil{%
+ \@ifpackageloaded{#1}{%
+ \l@@info{Le paquetage `#1' est charg'e}%
+ \count0=#2 %
+% \end{macrocode}
+% On redéfinit \cs{lettre@iterate} pour casser la boucle de scrutation de la liste d'association, de toute
+% façon on est au sein d'un groupe, donc l'effet de cette re-définition est local :
+% \begin{macrocode}
+ \def\lettre@iterate##1\@nil,{}%
+ }{%
+ \l@@info{Le paquetage `#1' n'est pas charg'e}%
+ }%
+ }%
+% \end{macrocode}
+% Et voici la boucle elle-même, avec pour chaque paquetage le cas correspondant :
+% \begin{macrocode}
+ \l@@info{Scrutation des paquetages de gestion de langue}%
+ \lettre@iterate%
+ babel:3,%
+ polyglossia:1,%
+ french:2,%
+ mlp:2,%
+ \@nil,%
+% \end{macrocode}
+% Il n'y a plus qu'à appliquer le traitement correspondant au cas sélectionné :
+% \begin{macrocode}
+ \expandafter
+ }\the\toks\count0 %
+ \makeatother
+% \end{macrocode}
+% Fin du \cs{AtBeginDocument}.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+% Crochet \cs{end\{document\}} pour sortir la page d'étiquettes, si nécessaire.
+% \begin{macrocode}
+\AtEndDocument{%
+ \l@@info{Nombre de lettres :\the\c@lettre}%
+ \l@@info{Nombre de telefax :\the\c@telefax}%
+ \newpage\begingroup
+ \immediate\closeout\@tensionaux%
+ \if@origdate
+ \immediate\closeout\@dateaux%
+ \fi
+ \if@letter
+ \if@etiq
+ \immediate\closeout\@etiqaux%
+ \makeatletter
+ \@input{\jobname.etq}%
+ \makeatother
+ \clearpage
+ \fi
+ \else
+ \immediate\closeout\@faxaux%
+ \fi
+ \endgroup
+}%
+% \end{macrocode}
+%
+%\subsubsection{Styles de page}
+%
+% \begin{macrocode}
+\def\@texttop{\ifnum\c@page=1\vskip 0pt plus .00001fil\relax\fi}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\if@twoside
+ \def\ps@headings{%
+ \headheight 12pt%
+ \headsep 25pt%
+ \def\@oddhead{{\hspace{15mm}\ifx\@empty\fromlieu\else\fromlieu , \fi
+ \pdate\hfill Page \thepage}}%
+ \def\@oddfoot{}%
+ \def\@evenhead{{Page \thepage\hfill\ifx\@empty\fromlieu\else\fromlieu , \fi
+ \pdate\hspace{15mm}}}%
+ \def\@evenfoot{}}%
+\else
+ \def\ps@headings{%
+ \headheight 12pt%
+ \headsep 25pt%
+ \def\@oddhead{{\hspace{15mm}\ifx\@empty\fromlieu\else\fromlieu , \fi
+ \pdate\hfill Page \thepage}}%
+ \def\@oddfoot{}%
+ \def\@evenhead{}%
+ \def\@evenfoot{}}%
+\fi
+% \end{macrocode}
+% \DescribeMacro{\ps@empty}
+% \begin{macrocode}
+\def\ps@empty{%
+ \headheight 0pt%
+ \headsep 9pt%
+ \def\@oddhead{}%
+ \def\@oddfoot{%
+ \ifnum\c@page=1\relax
+ \ifx\@empty\emailflag
+ \ifx\@empty\bdp
+ \else
+ \hbadness=10000\relax
+ \rlap{\parbox{\textwidth}{\mbox{}\\\rule{\textwidth}{.4pt}\\\bdp}}
+ ~\hfill~
+ \hbadness=1000\relax
+ \fi
+ \else
+ \hbadness=10000\relax
+ \rlap{\parbox{\textwidth}{\mbox{}\\\rule{\textwidth}{.4pt}\\\emailine}}%
+ ~\hfill~
+ \hbadness=1000\relax
+ \fi
+ \fi}%
+ \def\@evenhead{}%
+ \def\@evenfoot{}}%
+% \end{macrocode}
+% \DescribeMacro{\ps@firstpage}
+% \begin{macrocode}
+\def\ps@firstpage{%
+ \headheight 12pt%
+ \headsep 25pt%
+ \def\@oddhead{}%
+ \def\@oddfoot{}%
+ \def\@evenhead{}%
+ \def\@evenfoot{}}%
+% \end{macrocode}
+% \DescribeMacro{\ps@plain}
+% \begin{macrocode}
+\def\ps@plain{%
+ \headheight 0pt%
+ \headsep 9pt%
+ \def\@oddhead{}%
+ \def\@oddfoot{\textrm{\hfill\thepage\hfill}}%
+ \def\@evenhead{}%
+ \def\@evenfoot{\textrm{\hfill\thepage\hfill}}}%
+% \end{macrocode}
+%
+%\subsubsection{\texttt{center} et \texttt{flushleft}}
+%
+% \begin{macrocode}
+\def\normalcenter{\trivlist \normalcentering\item[]}%
+\def\lettercenter{\trivlist \lettercentering\item[]}%
+\def\normalcentering{\let\\=\@centercr\rightskip\@flushglue
+ \leftskip\@flushglue
+ \parindent\z@\parfillskip\z@}%
+\def\lettercentering{\let\\=\@centercr\rightskip\@flushglue
+ \leftskip\@flushglue
+ \parindent\z@\parfillskip\z@}%
+\let\endcenter=\endtrivlist
+% \end{macrocode}
+% \DescribeMacro{\normalflushleft}
+% \begin{macrocode}
+\def\normalflushleft{\trivlist \normalraggedright\item[]}%
+\def\letterflushleft{\trivlist \letterraggedright\item[]}%
+\def\normalraggedright{\let\\=\@centercr\leftskip\z@
+ \@rightskip\@flushglue\rightskip\@rightskip
+ \parindent\z@}%
+\def\letterraggedright{\let\\=\@centercr\leftskip\z@
+ \@rightskip\@flushglue\rightskip\@rightskip
+ \parindent\z@}%
+\let\endflushleft=\endtrivlist
+% \end{macrocode}
+%
+%\subsubsection{Listes}
+%
+% \DescribeMacro{\lettre@store@orig@envs}Tout d'abord on définit \cs{lettre@store@orig@envs} qui prend note de
+% l'environnement \texttt{itemize} d'origine fourni par \LaTeX, et qui sera appelé \cs{AtBeginDocument}, et
+% immédiatement après chaque changement de langue effectué par le paquetage de gestion de langue.
+% \begin{macrocode}
+\newcommand*{\lettre@store@orig@envs}{%
+\let\lettre@orig@itemize\itemize
+\let\lettre@orig@enditemize\enditemize
+}%
+\AtBeginDocument{\lettre@store@orig@envs}%
+% \end{macrocode}
+% \DescribeMacro{\lettre@restore@orig@envs}La macro \cs{lettre@restore@orig@envs} permet de restaurer les
+% environnments \LaTeX\ que \texttt{lettre} redéfinit selon la langue. Notamment l'environnement
+% \texttt{itemize} redéfini en français.
+% \begin{macrocode}
+\newcommand*{\lettre@restore@orig@envs}{%
+\let\itemize\lettre@orig@itemize
+\let\enditemize\lettre@orig@enditemize}%
+% \end{macrocode}
+% \DescribeMacro{\reset@frenchitemize}La macro \cs{reset@frenchitemize} est obsolète, appelez plutôt
+% \cs{lettre@set@french@envs} définie dans \texttt{lettre-french.ldf}.
+% \begin{macrocode}
+\newcommand*{\reset@frenchitemize}{\l@@warning@strictable
+ {\protect\reset@frenchitemize\space est obsolete, utilisez
+ plutot \protect\lettre@set@french@envs}\lettre@set@french@envs}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\rightmargin 25mm%
+\advance\rightmargin 5pt%
+\leftmargini 1.5em%
+\leftmarginii 2.2em%
+\leftmarginiii 1.87em%
+\leftmarginiv 1.7em%
+\leftmarginv 1em%
+\leftmarginvi 1em%
+\labelsep 5pt%
+\parsep 0pt%
+\def\@listi{\leftmargin\leftmargini\labelwidth\leftmargin
+ \advance\labelwidth-\labelsep}%
+\def\@listii{\leftmargin\leftmarginii
+ \labelwidth\leftmarginii\advance\labelwidth-\labelsep}%
+\def\@listiii{\leftmargin\leftmarginiii
+ \labelwidth\leftmarginiii\advance\labelwidth-\labelsep
+ \topsep .1em%
+ \itemsep \topsep}%
+\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}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\labelitemi{$\bullet$}%
+\def\labelitemii{\bfseries --}%
+\def\labelitemiii{$\ast$}%
+\def\labelitemiv{$\cdot$}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\labelenumi{\arabic{enumi}.}%
+\def\theenumi{\arabic{enumi}}%
+\def\labelenumii{(\alph{enumii})}%
+\def\theenumii{\alph{enumii}}%
+\def\p@enumii{\theenumi}%
+\def\labelenumiii{\roman{enumiii}.}%
+\def\theenumiii{\roman{enumiii}}%
+\def\p@enumiii{\theenumi(\theenumii)}%
+\def\labelenumiv{\Alph{enumiv}.}%
+\def\theenumiv{\Alph{enumiv}}%
+\def\p@enumiv{\p@enumiii\theenumiii}%
+% \end{macrocode}
+% \DescribeEnv{verse}
+% \begin{macrocode}
+\def\verse{\let\\=\@centercr
+ \list{}{\itemsep\z@ \itemindent -15pt\listparindent \itemindent
+ \rightmargin\leftmargin\advance\leftmargin 15pt}\item[]}%
+\let\endverse\endlist
+% \end{macrocode}
+% \DescribeEnv{quotation}
+% \begin{macrocode}
+\def\quotation{\list{}{\listparindent 1.5em%
+ \itemindent\listparindent
+ \rightmargin\leftmargin}\item[]}%
+\let\endquotation=\endlist
+% \end{macrocode}
+% \DescribeEnv{quote}
+% \begin{macrocode}
+\def\quote{\list{}{\rightmargin\leftmargin}\item[]}%
+\let\endquote=\endlist
+% \end{macrocode}
+% \DescribeMacro{\descriptionlabel}Format des étiquettes de listes de type \texttt{description}.
+% \changes{3.001}{2020-02-25}{Étiquettes de liste \texttt{description} en gras.}
+% \begin{macrocode}
+\def\descriptionlabel#1{\bfseries #1}%
+% \end{macrocode}
+% \DescribeEnv{description}
+% \begin{macrocode}
+\def\description{\list{}{\advance\leftmargin by 5.75em
+ \labelwidth\leftmargin \advance\labelwidth -\labelsep
+ \let\makelabel\descriptionlabel}}%
+\let\enddescription\endlist
+% \end{macrocode}
+%
+%\subsubsection{Divers}
+%
+% \begin{macrocode}
+\def\@begintheorem#1#2{\itshape \trivlist \item[\hskip \labelsep{\bfseries #1\ #2}]}%
+\def\@endtheorem{\endtrivlist}%
+% \end{macrocode}
+% \DescribeMacro{\theequation}
+% \begin{macrocode}
+\def\theequation{\arabic{equation}}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\arraycolsep 5pt%
+\tabcolsep 5pt%
+\arrayrulewidth .4pt%
+\doublerulesep 2pt%
+\tabbingsep\labelsep
+\skip\@mpfootins=\skip\footins
+% \end{macrocode}
+% Espace laissé entre la boîte et le texte par \cs{fbox} et \cs{framebox}.
+% \begin{macrocode}
+\fboxsep = 3pt
+% \end{macrocode}
+% Épaisseur des filets faits par \cs{fbox} et \cs{framebox}.
+% \begin{macrocode}
+\fboxrule = .4pt
+% \end{macrocode}
+%\changes{3.000}{2015-12-20}{Ajout \cs{today} nécessaire à \texttt{e-french}.}%
+% \begin{macrocode}
+\newcommand*\today{\cejour}
+% \end{macrocode}
+%
+%\subsubsection{Notes en bas de page}
+%
+% \begin{macrocode}
+\def\footnoterule{\kern-1\p@
+ \hrule width .4\columnwidth
+ \kern .6\p@}%
+% \end{macrocode}
+% \DescribeMacro{\@makefntext}
+% \begin{macrocode}
+\long\def\@makefntext#1{\parindent 1em\noindent
+ \hb@xt@1.8em{%
+ \hss\@textsuperscript{\normalfont\@thefnmark}}#1}%
+% \end{macrocode}
+%
+%\subsection{Initialisations}
+%\subsubsection{Initialisation des valeurs par défauts}
+%
+% \begin{macrocode}
+\def\pict@let@width{185}%
+\def\pict@let@height{65}%
+\def\pict@let@hoffset{0}%
+\def\pict@let@voffset{0}%
+\def\rule@hpos{-25}%
+\def\rule@vpos{-15}%
+\def\rule@length{10}%
+\def\fromaddress@let@hpos{-10}%
+\def\fromaddress@let@vpos{70}%
+\fromaddress@let@width=69mm
+\def\fromlieu@let@hpos{90}%
+\def\fromlieu@let@vpos{62}%
+\fromlieu@let@width=69mm
+\def\toaddress@let@hpos{90}%
+\def\toaddress@let@vpos{40}%
+\toaddress@let@width=80mm
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pict@fax@width{185}%
+\def\pict@fax@height{30}%
+\def\pict@fax@hoffset{0}%
+\def\pict@fax@voffset{0}%
+\def\fromaddress@fax@hpos{-10}%
+\def\fromaddress@fax@vpos{30}%
+\fromaddress@fax@width=69mm
+\def\faxstring@hpos{90}%
+\def\faxstring@vpos{20}%
+\faxstring@width=69mm%
+\faxbox@width=170mm%
+\toaddress@fax@width=69mm%
+\fromname@fax@width=69mm%
+% \end{macrocode}
+%\changes{2.354}{2014-10-21}{Ajout \cs{lettre@vref@width} et \cs{lettre@nref@width}}%
+% \begin{macrocode}
+\lettre@vref@width=21mm%
+\lettre@nref@width=21mm%
+% \end{macrocode}
+% \DescribeMacro{\lettre@input@institut}Définition par défaut de \cs{lettre@input@institut}, cette définition
+% peut être changée par l'appel à \cs{institut}.
+% \changes{3.000}{2015-10-30}{Nom fichier institut par défaut en
+% \texttt{lettre-default.cfg}}
+% \begin{macrocode}
+\def\lettre@input@institut{\makeatletter
+ \input{lettre-default.cfg}%
+ \makeatother}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\smallskipamount=.5\parskip
+\medskipamount=\parskip
+\bigskipamount=2\parskip
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ps@plain
+\pagenumbering{arabic}%
+\raggedbottom
+\onecolumn
+% \end{macrocode}
+% \subsubsection{Initialisations des variables de la lettre}
+% \begin{macrocode}
+\def\pdate{\cejour}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\emailnum{}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\fromlocation{}%
+\signum=0\relax
+\def\fromsig{}%
+\def\fromssig{}%
+\def\fromtsig{}%
+% \end{macrocode}
+% Langue française par défaut, si rien d'autre n'a été demandé.
+% \begin{macrocode}
+\ifx\lettre@mainlang\@empty
+ \def\lettre@mainlang{francais}%
+ \lettreloadlang{french}%
+\fi
+% \end{macrocode}
+% Sélection de la langue principale au début du document.
+% \begin{macrocode}
+{%
+ \edef\@tempa{%
+ \noexpand\AtBeginDocument{%
+ \noexpand\lettreselectlanguage{\lettre@mainlang}%
+ \noexpand\l@@info{Langage par defaut: \lettre@mainlang}}%
+ }%
+\expandafter}\@tempa
+% \end{macrocode}
+% \begin{macrocode}
+\def\concdecl{}%
+\marge{15mm}%
+\msigwidth=\letterwidth
+\ssigindent=0.5\letterwidth
+\ssigwidth=\letterwidth
+ \advance\ssigwidth by -\ssigindent
+ \advance\ssigwidth by -5pt
+\sigspace=1.5cm
+\openingspace=1cm
+\openingindent=0pt
+% \end{macrocode}
+% \begin{macrocode}
+\@lettertrue
+\faxpage=0\relax
+\def\totalpages{}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\auxflag{}%
+\auxcount=0\relax
+% \end{macrocode}
+% \changes{2.354}{2014-10-21}{Un argument vide à \cs{Vref} ou \cs{Nref} supprime la référence}%
+% \begin{macrocode}
+\let\toref\space
+\let\fromref\space
+\def\telexnum{}%
+\def\ccpnum{}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\emailflag{}%
+\emailcount=0\relax
+\def\@username{}%
+\def\ccittnum{}%
+\def\internetnum{}%
+\def\bitnetnum{}%
+\def\telepacnum{}%
+\def\decnetnum{}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\bdp{}%
+\endinput
+% \end{macrocode}
+%^^A End of file `lettre.cls'.
+\iffalse Local Variables: \fi
+\iffalse mode: DocTeX\fi
+\iffalse ispell-dictionary: "francais"\fi
+\iffalse End: \fi