
\chapter{Outillage nécessaire}
\label{chap-outillage}

\begin{epigraphe}{Le Cantique des cantiques Ct \textbf{7} 7}
Que tu es belle, que tu es agréable,\\
Ô mon amour, au milieu des délices !\\
Ta taille ressemble au palmier, \\
Et tes seins à des grappes.  
 \end{epigraphe}


 \begin{introchap}{Dans ce chapitre} nous présentons les outils
   pré requis permettant de créer des commandes et des environnements
   plus complexes que ceux exposés au chapitre~\ref{chap-wizard}. Nous
   profitons d'ailleurs de cette introduction pour dire que le
   chapitre~\ref{chap-wizard} auquel nous faisons référence ici doit
   être correctement digéré pour commencer la lecture de cette partie.
   Quelques mécanismes autour des fontes sont également présentés
   ainsi que quelques pistes pour fouiller dans les sources de
   \LaTeX{}.
 \end{introchap}
 
\section{Hercule Poirot}
\label{sec-hercule-poirot}

\subsection{Fouiller dans les fichiers}

Tout d'abord, pour personnaliser un document écrit avec \LaTeX{}, il
est nécessaire de con\-naître la manière dont sont organisés les
fichiers qui composent la distribution du système \TeX{}/\LaTeX{} que
vous utilisez. Votre serviteur utilise la distribution \TeX{}Live pour
\unix{} (\url{http://www.tug.org/texlive}).  Dans cette distribution on
pourra dans un premier temps compulser les documentations des packages
se trouvant dans le répertoire :
\begin{verbatim}
   /usr/share/texmf-texlive/doc/latex/
\end{verbatim}
Ce répertoire contient d'autres sous-répertoires, généralement un par
package, dont la documentation est sous la forme d'un fichier dvi
ou PostScript.  Dans certaines situations, il est nécessaire d'aller
scruter le source des packages. Dans la distribution te\TeX{} ces
sources se trouvent dans :
\begin{verbatim}
  /usr/share/texmf-texlive/tex/latex
\end{verbatim}
et là aussi, on trouvera généralement un répertoire par package,
contenant les sources dans un fichier au format texte, portant l'extension
\texttt{.sty} et éventuellement des fichiers connexes.
Enfin, pour comprendre le comportement par défaut de \LaTeX{},
indépendamment des packages que l'on peut inclure, on pourra avoir
recours au source de \LaTeX{} dans :
\begin{verbatim}
  /usr/share/texmf-texlive/tex/latex/base/latex.ltx
\end{verbatim}
et aux sources des classes de documents dans :
\begin{verbatim}
  /usr/share/texmf-texlive/tex/latex/base/book.cls
\end{verbatim}
pour la classe \ltxcls{book}.

\subsection{Examiner les macros}

Un moyen pratique de trouver la définition d'une commande consiste à
le demander à \LaTeX{} lors d'une session interactive. On lance
directement dans un terminal de commande du système d'exploitation :
\begin{unixcom}
  latex
\end{unixcom}
Mon système me répond froidement :
\begin{monverbatim}
  This is e-TeXk, Version 3.14159-2.1 (Web2C 7.4.5)
   %&-line parsing enabled.
  **
\end{monverbatim}
À l'invite de ce prompt spartiate (\texttt{**}) qui est le cri du «
\TeX{} tout nu », je réponds bravement \verb+&latex+ pour demander à
charger le format \LaTeX{}. La réponse ne tarde pas :
\begin{monverbatim}
  **&latex
  entering extended mode
  LaTeX2e <2001/06/01>
  Babel <v3.7h> and hyphenation patterns for american, 
  french loaded.
  *
\end{monverbatim}
Notez que le prompt a perdu une étoile. À partir de maintenant on peut
écrire un document \LaTeX{} interactivement. Ce qui a certes peu
d'intérêt dans l'absolu, mais peut s'avérer très utile pour obtenir la
définition d'une commande avec la syntaxe. On pourra par exemple taper :
\begin{monverbatim}
  *\show¢marg«commande»
\end{monverbatim}
pour avoir la définition de \marg{commande}. Par exemple :
\begin{monverbatim}
  *\show\mbox
  > \mbox=\long macro:
  #1->\leavevmode \hbox {#1}. ¢ccomment«c'est la définition»
  <*> \show\mbox
\end{monverbatim}
nous montre la définition de la commande \ltxcom{mbox}. On remarque
que cette commande lorsqu'elle est appelée, se transforme en un appel à
\ltxcom{leavevmode} et \ltxcom{hbox}. Notre esprit de curiosité nous
pousse donc à écrire :
\begin{monverbatim}
  *\show\hbox
  > \hbox=\hbox. ¢ccomment«c'est une primitive»
  <*> \show\hbox
\end{monverbatim}
On constate ici que \ltxcom{hbox} n'est pas définie à partir d'une
autre commande. Il s'agit donc de ce que \TeX{} appelle une
primitive. L'exploration peut être poursuivie :
\begin{monverbatim}
  *\show\leavevmode
  > \leavevmode=macro:
  ->\unhbox \voidb@x . ¢ccomment«définition de ¢ltxcom«leavevmode»»
  <*> \show\leavevmode
\end{monverbatim}
et ainsi de suite...

\section{Outils de bas niveaux}

% \subsection{\TeX{} et l'expansion de commande}

% \begin{verbatim}
% \verb \protect \expandafter \relax \csname
% \end{verbatim}


\subsection{Pour qui sont ces pourcents ?}
\label{sec-outillage-pourcents}

Vous avez peut-être déjà remarqué que le code \LaTeX{} contient
parfois le caractère \% en fin de ligne. La présence de ce \%
s'explique par le fait qu'un saut de ligne dans le code insère un
espace dans le texte. Ainsi la commande :
\begin{ltxcode}
  \newcommand{\beurk}{bidule}
\end{ltxcode}
peut s'écrire pour des raisons de lisibilité :
\begin{ltxexemple}
  \newcommand{\beurk}{
    bidule
  }  
  ==(\beurk)==
\end{ltxexemple}
On constate donc qu'il y a deux espaces non désirés autour du mot
« bidule ». On peut éviter cela en écrivant :
\begin{ltxexemple}
  \newcommand{\ahhh}{%
    bidule%
  }
  ==(\ahhh)==  
\end{ltxexemple}


Il existe une autre situation où les espaces peuvent s'immiscer
pernicieusement dans le texte. Définissons un environnement :
\begin{ltxcode}
  \newenvironment{hyperimportant}{%
    \bfseries\itshape}{%
    \upshape\mdseries}
\end{ltxcode}
\newenvironment{hyperimportant}{\bfseries\itshape}{\upshape\mdseries}
\begin{ltxexemple}
  Il est impératif
  \begin{hyperimportant}
    de multiplier les sauvegardes
  \end{hyperimportant}
  de vos documents personnels
\end{ltxexemple}
Si vous regardez attentivement le texte produit, vous noterez qu'il y
a deux espaces de chaque côté de la séquence mise en italique gras  «
\textbf{\itshape de ...  sauvegardes} » :
\begin{itemize}
\item deux espaces avant « \textbf{\itshape de} » introduits par le
  saut de ligne à la fin de « \texttt{est impératif} » et celui à la
  fin de la clause de début \verb+\begin{hyperimportant}+ ;
  \item deux espaces après « \textbf{\itshape sauvegardes} » induits
    par le saut de ligne à la fin de « \texttt{sauvegardes} » et par celui
    à la fin de \verb+\end{hyperimportant}+.
\end{itemize}
La preuve, si on supprime ces sauts de ligne :
\begin{ltxexemple}
  Il est impératif\begin{hyperimportant} de 
  multiplier  les 
  sauvegardes\end{hyperimportant} de vos 
  documents personnels
\end{ltxexemple}
Pour éviter d'avoir à se soucier de ce genre de problème on a
généralement recours à deux commandes permettant de supprimer ces
espaces doubles. On fait appel, pour éliminer ceux situés \emph{avant}
la séquence à \ltxcom{ignorespaces} et pour ceux situés \emph{après},
à la commande \ltxcom{unskip}.

\subsubsection{La commande \ltxcom{ignorespaces}}
\label{sec-outillage-pourcents-ignorespaces}

Cette commande procède à l'expansion des commandes qui la suivent 
en ignorant tous les espaces qui la suivent :
\begin{ltxexemple}
  \newcommand{\truc}{ }
  \newcommand{\bidule}{ }

  a\truc\bidule b\par
  a\ignorespaces\truc\bidule b
\end{ltxexemple}
Dans l'exemple ci-dessus, les commandes \ltxcom{truc} et
\ltxcom{bidule} ont pour seul but de produire un espace lorsqu'elles
seront appelées. Par conséquent, la ligne :
\begin{ltxcode}
  a\truc\bidule b
\end{ltxcode}
produira '\verb*+a { }b+' c'est-à-dire les deux lettres a et b séparées par
deux espaces. L'appel avec la commande \ltxcom{ignorespaces}
ignore ---~comme son nom l'indique~--- les deux espaces produits par les
commandes \ltxcom{truc} et \ltxcom{bidule}. On peut donc utiliser cette
commande dans notre exemple précédent :
\begin{ltxcode}
  \newenvironment{hyperimportant}{%
    \bfseries\itshape\ignorespaces}{\upshape\mdseries}
\end{ltxcode}
qui devrait supprimer un espace :
\renewenvironment{hyperimportant}{%
  \bfseries\itshape\ignorespaces}{\upshape\mdseries}
\begin{ltxexemple}
  Il est impératif
  \begin{hyperimportant}
    de multiplier les sauvegardes
  \end{hyperimportant}
  de vos documents personnels. 
\end{ltxexemple}


\subsubsection{La commande \ltxcom{unskip}}
\label{sec-outillage-pourcents-unskip}

Si vous êtes attentif, vous noterez que deux espaces  entre 
{\itshape\bfseries sauvegardes}  et « de » résistent à nos assauts.
C'est là qu'intervient la primitive \TeX{} \ltxcom{unskip} qui enlève
le dernier espace inséré :\sautdepage
\begin{ltxexemple}
  \newcommand{\truc}{ }
  \newcommand{\bidule}{ }
  
  a\truc\bidule b\par
  a\truc\bidule\unskip b
\end{ltxexemple}
Finalement la définition « correcte » de notre environnement est la
suivante :
\begin{ltxcode}
  \newenvironment{hyperimportant}{%
    \bfseries\itshape\ignorespaces}{\unskip\upshape\mdseries}
\end{ltxcode}
qui devrait supprimer tous les  espaces indésirables :
\renewenvironment{hyperimportant}{%
  \bfseries\itshape\ignorespaces}{\unskip\upshape\mdseries}
\begin{ltxexemple}
     Il est impératif
     \begin{hyperimportant}
       de multiplier les sauvegardes
     \end{hyperimportant}
     de vos documents personnels.
\end{ltxexemple}


\subsection{Le caractère @}
\label{sec-at}
\index{"@} \index{caractère "@} \index{bidouillage} Lorsque vous vous
lancerez dans l'exploration des sources des packages vous remarquerez
que le nom d'une grande partie des commandes qui y sont définies
contient le caractère \verb+@+. Or dans un document \texttt{.tex}, il
n'est pas autorisé d'exécuter une commande dont le nom contient ce
dernier. Ceci permet de protéger ou de limiter la portée des commandes
des packages. Par exemple la commande \verb+\cb@defpoint+, définie
dans le package \ltxpack{changebar}, ne peut pas être appelée par un
utilisateur du package.  Pour redéfinir ces commandes
internes, il est nécessaire d'effectuer la petite manipulation
suivante :
\begin{verbatim}
   \makeatletter
   % ici on peut bidouiller
   \renewcommand{\@ttention}{oulala...}
   \makeatother
   % ici on ne peut plus
\end{verbatim}
La commande hypothétique \verb+\@ttention+ peut uniquement être
manipulée si le caractère \verb+@+ est une lettre. C'est le rôle de
\ltxcom{makeatletter} qui transforme le caractère \verb+@+ en une
lettre comme les autres, tandis que la commande \ltxcom{makeatother}
lui réaffecte sa fonction spéciale.
\begin{nota}
  Cette manipulation n'est pas nécessaire dans les fichiers de styles
  inclus avec la commande \ltxcom{usepackage} pour lesquels la lettre
  \verb+@+ peut être utilisée comme un caractère.
\end{nota}
La manière dont \TeX{} peut changer la catégorie des caractères est
expliquée au chapitre suivant au
paragraphe~\vref{sec-cosmetique-digression-catcode}.

\subsection{Le \ltxcom{let} de \TeX}
\label{sec-outillage-let}
Il est parfois utile de modifier une commande interne de \LaTeX{} 
pour ajouter une fonctionnalité à son comportement par défaut. Par
exemple pour modifier la commande interne
\ltxcom{bidule}\footnote{Oui oui ça n'est pas une commande interne,
  mais un exemple idiot de nom de commande qui n'existe pas...}, on
peut procéder comme suit :
\begin{enumerate}
\item sauvegarder la commande grâce à l'instruction \ltxcom{let} de \TeX{} :
\begin{ltxcode}
  \let\biduleORIG\bidule
\end{ltxcode}
\item redéfinir la commande \ltxcom{bidule} en se basant sur la
  définition intiale :
\begin{ltxcode}
  \renewcommand{\bidule}{%
    quelque chose en plus\biduleORIG}
\end{ltxcode}
\item si nécessaire, revenir à la définition initiale grâce à : 
\begin{ltxcode}
  \let\bidule\biduleORIG
\end{ltxcode}
\end{enumerate}

\section{Structures de contrôle et tests}
\label{sec-outillage-structure-de-controle}

Les structures introduites par le package \ltxpack{ifthen} suivent la
syntaxe :
\begin{ltxcode}
  \ifthenelse{  ø\marg{expression booléenne}ø }
  { ... code LaTeX si vrai ...  }
  { ... code LaTeX si faux ...  }
\end{ltxcode}
et :
\begin{ltxcode}
  \whiledo{ ø\marg{expression booléenne}ø }
  { ... code LaTeX tant que c'est vrai ...  }
\end{ltxcode} 
L'\marg{expression booléenne} peut être constituée selon le contexte
de différentes commandes du package \ltxpack{ifthen}, et parmi elles :
\begin{itemize}
\item les expressions \marg[1]{nombre}\verb+>+\marg[2]{nombre},
  \marg[1]{nombre}\verb+<+\marg[2]{nombre} ainsi que l'expression
  \marg[1]{nombre}\verb+=+\marg[2]{nombre} permettant chacune d'elles
  de comparer la valeur \marg[1]{nombre} et la valeur \marg[2]{nombre} ;
\item \ltxcom{equal}\verb+{+\marg[1]{C}\verb+}{+\marg[2]{C}\verb+}+
  qui renvoie vrai ou faux selon que la chaîne de caractère~\marg[1]{C}
  est égale à la chaîne~\marg[2]{C} ;
\item \ltxcom{isodd}\verb+{+\marg{nombre}\verb+}+ qui renvoie vrai si
  le \marg{nombre} est impair, faux sinon ;
\item \ltxcom{value}\verb+{+\marg{compteur}\verb+}+ qui renvoie la valeur
  d'un \marg{compteur} sous la forme d'un nombre exploitable dans les
  conditions booléennes ;
\item \ltxcom{lengthtest}\verb+{+\marg{test longueur}\verb+}+ qui
  renvoie le résultat de l'expression \marg{test longueur}, test contenant les
  opérateurs \verb+<+, \verb+>+ ou \verb+=+ et des longueurs \LaTeX{}
  comme opérandes.
\end{itemize}
On notera également qu'on pourra utiliser les connecteurs logiques
\ltxcom{OR}, \ltxcom{AND} et \ltxcom{NOT} qui jouent le rôle qu'on
attend d'eux dans une expression booléenne. On peut grouper des
expressions avec les opérateurs \ltxcom{(} et \ltxcom{)}.


\subsection{Booléens et opérateurs associés}
\label{outillage-sec-boolean}

Le package \ltxpack{ifthen} propose à ses vaillants utilisateurs la
possibilité de manipuler des booléens. On peut en déclarer un avec la
commande \ltxcom{newboolean} :
\begin{ltxcode}
  \newboolean{ø\marg{id booléen}ø}
\end{ltxcode}
qui définit une « variable » booléenne identifiée par \marg{id
  booléen}.  On pourra ensuite lui affecter la valeur \texttt{true} ou
\texttt{false} avec la commande \ltxcom{setboolean} :
\begin{ltxcode}
  \setboolean{ø\marg{id booléen}ø}{ø\marg{valeur}ø}
\end{ltxcode}
Et bien sûr on pourra utiliser le booléen ainsi créé avec les
\voir{sec-outillage-structure-de-controle}{structures de contrôle},
par exemple comme ceci :
\begin{ltxcode}
  \ifthenelse{\boolean{ø\marg{id booléen}ø}}
  {  code LaTeX si ø\marg{id booléen}ø vaut vrai }
  {  code LaTeX s'il vaut faux                   }
\end{ltxcode}
Il est bon de connaître la version \TeX{} de ce qui précède.  On
trouve en effet dans les packages \LaTeX{} du code écrit en \TeX{}, et
en particulier l'utilisation de la structure de contrôle « Si Alors
Sinon ». Voici un exemple pour  définir un nouveau booléen avec
monsieur \TeX{} :
\begin{ltxcode}
  \newif\ifimprimantecouleur
\end{ltxcode}
On le positionne à faux avec :
\begin{ltxcode}
  \imprimantecouleurfalse
\end{ltxcode}
et à vrai avec :
\begin{ltxcode}
  \imprimantecouleurtrue
\end{ltxcode}


On peut ensuite exploiter ce booléen dans une structure « Si Alors
Sinon » à la mode \TeX{} comme suit :
\begin{ltxcode}
  \ifimprimantecouleur
  ... % code si on a une imprimante couleur
  \else
  ... % code si c'est une imprimante noir et blanc
  \fi
\end{ltxcode}

\subsection{Exemples}

\newcommand{\itfactorielle}[1]{%
  \setcounter{cptfact}{#1}%
  \whiledo{\value{cptfact}>1}{%
    \thecptfact\times% 
    \addtocounter{cptfact}{-1}}% 
  1}% 
\newcommand{\recfactorielle}[1]{%
  \setcounter{cptfact}{#1}%
   \ifthenelse{#1>1}{%
     \thecptfact\times%
     \addtocounter{cptfact}{-1}%
     \recfactorielle{\thecptfact}}{1}}

On souhaite écrire une commande pour produire le développement de la
fonction factorielle\footnote{Y en a qui n'ont pas grand chose à
  faire de leur journée...} de manière à pouvoir écrire :
\begin{ltxexemple}
  On peut exprimer la factorielle de 9 
  comme suit :
  \begin{displaymath}
    9!=\itfactorielle{9}
  \end{displaymath}
\end{ltxexemple}
Une façon de résoudre le problème est d'écrire une commande contenant
une boucle \ltxcom{whiledo} :
\begin{ltxcode}
  \newcommand{\itfactorielle}[1]{%
    \setcounter{cptfact}{#1}% on stocke l'arg. dans un compteur
    \whiledo{\value{cptfact}>1}{% tant qu'il est > 1
      \thecptfact\times% on l'affiche avec un ø$\times$ø
      \addtocounter{cptfact}{-1}}% on décrémente le compteur
    1}% on affiche 1 à la fin
\end{ltxcode}
Il faudra bien sûr déclarer le compteur :
\begin{ltxcode}
  \newcounter{cptfact}
\end{ltxcode}
On notera que dans la condition booléenne de la boucle « TantQue », on
fait appel à la commande \ltxcom{value} pour comparer la valeur du
compteur avec la valeur~1. Un peu plus tordu : on peut implémenter
cette commande de manière récursive :
\begin{ltxcode}
  \newcommand{\recfactorielle}[1]{% version récursive :
  \setcounter{cptfact}{#1}% on affecte l'argument au compteur
   \ifthenelse{#1>1}{% si cette valeur est supérieure à 1
     \thecptfact\times% on l'affiche suivie de ø$\times$ø
     \addtocounter{cptfact}{-1}% on décrémente le compteur
     \recfactorielle{\thecptfact}}% on fait un appel récursif
   {1}}% sinon (valeur=1) on affiche 1
\end{ltxcode}
Cette commande produit évidemment le même résultat que la précédente.
On notera que dans la condition du \ltxcom{ifthenelse} on compare un
nombre (\verb+#1+) avec un autre~(1). Enfin on pourra remarquer que la
présence de la commande \ltxcom{times} impose le mode mathématique
pour exécuter ces commandes. On peut contourner le problème, si
nécessaire, avec la commande
\voir[\S]{wizard-commandes}{\ltxcom{ensuremath}.}


Le \ltxcom{whiledo} et le \ltxcom{ifthenelse} ont été utilisés dans le
document que vous avez sous les yeux pour générer les tableaux de
symboles à la page~\pageref{tab-pzd} et~\pageref{tab-psy}, ainsi que
les tableaux sur le codage à la page~\pageref{tab-codage} du chapitre
sur les documents en français. Nous avons tout d'abord créé une
commande permettant d'afficher un symbole :
\begin{ltxexemple}
  \affsymb{pzd}{249} \affsymb{pzd}{75} 
  \affsymb{pzd}{221} \affsymb{pzd}{88}
\end{ltxexemple}
Cette commande est la suivante :
\begin{ltxcode}
  \newcommand{\affsymb}[2]{%
    \framebox{% un cadre
      \parbox[][16pt][b]{1em}{% autour d'une boîte paragraphe
        \centering% de 16 pt de hauteur, 1em de large, 
        \Pisymbol{#1}{#2}\\% dont le contenu centré
        \tiny#2}}}% est composé du symbole et de son numéro
\end{ltxcode}
L'argument \verb+#1+ est le nom de la police (\texttt{pzd} ou
\texttt{psy}), et l'argument~\verb+#2+ est le numéro de
\voir{sec-mathsymb}{symbole}.  Sinon, rien de particulier dans cette
commande, si vous avez suivi jusqu'ici (notamment en lisant le
chapitre~\ref{chap-wizard} et plus particulièrement le
paragraphe~\vref{sec-wizard-boites})... Nous avons ensuite défini une
commande permettant d'afficher un série de symboles :
\begin{ltxexemple}
  Voici les symboles Zapf Dingbats, à 
  partir du \No 40,  sur 3 lignes et 
  6 colonnes :
  \begin{center}
    \symboles[40]{pzd}{3}{6}
  \end{center}
\end{ltxexemple}
Voici le code de la commande \ltxcom{symboles} :
\begin{ltxcode}
  \newcommand{\symboles}[4][0]{%
    \setcounter{clig}{0}% Mise à zéro des compteurs de ligne
    \setcounter{ccol}{0}% et de colonne
    \setcounter{cligmax}{#3}% arguments 3 et 4 pour fixer
    \setcounter{ccolmax}{#4}% le nbre max de colonnes et de lignes
    % Pour chaque ligne :
    \whiledo{\value{clig}<\value{cligmax}}{%
      \setcounter{ccol}{0}% remise à zéro du compteur de colonne
      % et pour chaque colonne :
      \whiledo{\value{ccol}<\value{ccolmax}}{%
        % on calcule le numéro du symbole
        \setcounter{csym}{%
          \value{clig}*\value{ccolmax}+\value{ccol}+#1}
        % si sa valeur est inférieure à 256 
        \ifthenelse{\value{csym}<256}{%
          \affsymb{#2}{\thecsym}}{% on l'affiche
          \mbox{}}% sinon on créé un boîte vide
        \stepcounter{ccol}}% on passe à la colonne suivante
      \stepcounter{clig}% on passe à la ligne suivante
      % on saute une ligne, sauf à la fin
      \ifthenelse{\value{clig}<\value{cligmax}}{\\}{}}}
\end{ltxcode}
Il faudra bien sûr déclarer les cinq compteurs avec la commande
\ltxcom{newcounter}.
\begin{ltxexemple}
  Et je sais que vous êtes tout 
  particulièrement  curieux de voir ce
  que fait cette commande  lorsque le 
  compteur  dépasse les bornes :
  \begin{center}
    \symboles[240]{psy}{3}{6}
  \end{center}
\end{ltxexemple}

\subsection{Tester la parité des pages}
\label{sec-outillage-parite-page}

C'est une pratique courante ---~on le verra par la suite~--- de créer
des commandes ayant un comportement différent selon la parité de la
page. À l'entrée « Finding if you're on an odd or an even page » de
la Faq anglaise~\cite{tex-faq}  est expliqué que le naïf :
\begin{ltxcode}
  \ifthenelse{\isodd{\value{page}}}
  { ... la page est impaire  ... }
  { ...  la page est paire   ... }
\end{ltxcode}
peut ne pas donner le résultat escompté. Le compteur de page lorsqu'il
est examiné \emph{à la frontière entre deux pages} peut ne pas être à
jour : le compteur de page s'il est interrogé au début d'une page
renverra le numéro de la page précédente... Ceci est dû à la manière
dont \TeX{} procède pour effectuer les sauts de page. Pour contourner
ce problème plusieurs solutions sont possibles. Celle adoptée dans ce
document consiste à utiliser le package \ltxpack{chngpage} qui insère
artificiellement un \ltxcom{label} à l'endroit où l'on veut tester la
parité de la page.

Par conséquent dans le cas où le test de parité à réaliser peut être
évalué à la frontière entre deux pages, il faudra écrire :
\begin{ltxcode}
  \checkoddpage%
  \ifcpoddpage
     ... la page est impaire ...
  \else
     ... la page est paire...
  \fi
\end{ltxcode}

\section{Fontes}
\label{sec-outillage-fontes}

\subsection{Le jeu des « trois » familles}
\label{sec-outillage-fontes-trois-famille}

Pour conserver une homogénéité dans l'allure des caractères dans un
document \LaTeX{}, sont définies trois familles :
\begin{enumerate}
\item la famille roman celle que vous êtes en train de lire ;
\item \textsf{la famille sans sérif que vous êtes également en train
    de lire à l'instant même} ;
\item et la famille machine à écrire, également appellée \emph{typewriter}
  lorsqu'on est anglophone, que ---~cela ne vous aura sans doute pas
  échappé~--- {\ttfamily vous êtes en train de lire}.
\end{enumerate}
Il est important de noter que ces trois familles de fontes sont par
défaut trois familles de la police baptisée par son auteur
(\textsc{Knuth} lui-même) « Computer Modern ». Elles sont conçues pour
s'harmoniser au sein d'un même document. Dans cet ordre d'idée, il
faudra toujours veiller à ce que ces trois familles (roman, sans
sérif, et machine à écrire) soient visuellement « compatibles » entre
elles. Les distributions de \LaTeX{} proposent généralement des
packages permettant d'utiliser les fontes \postscript{} dans un
document, avec notamment le célèbre\footnote{Mais obsolète.
  Aujourd'hui il est conseillé d'utiliser le package
  \ltxpack{mathptmx}} package \ltxpack{times} utilisant :
\begin{enumerate}
\item {\fontfamily{ptm}\selectfont Times pour la famille roman celle que vous êtes en train de lire };
\item {\fontfamily{phv}\selectfont Helvetica pour la famille sans
    sérif que vous êtes également en train de lire à l'instant même} ;
\item {\fontfamily{pcr}\selectfont Courrier pour la famille machine à
    écrire.}
\end{enumerate}
De même le package \ltxpack{newcent} utilise :
\begin{enumerate}
\item {\fontfamily{pnc}\selectfont NewCentury pour la famille roman
    celle que vous êtes en train de lire };
\item {\fontfamily{pag}\selectfont AvantGarde pour la famille sans
    sérif que vous êtes, si si, en train de lire à l'instant même} ;
\item {\fontfamily{pcr}\selectfont Courrier pour la famille machine à
    écrire.}
\end{enumerate}

\subsection{Désignation des fontes et de leurs attributs}
\label{sec-noms-fontes}

Une fonte\footnote{Terme faisant référence au plomb de
  l'imprimerie...} ou police de caractères est définie dans \LaTeX{}
par plusieurs caractéristiques dont il a été question au
paragraphe~\vref{savoir-mise-en-evidence}. De manière à désigner la
fonte à l'aide des commandes que nous allons découvrir dans ce
paragraphe, on utilisera :
\begin{itemize}
\item un codage qui sera à quelques exceptions près le codage T1 ;
\item une série de caractères identifiant la famille : \texttt{cmr}
  pour \emph{computer modern roman}, \texttt{ptm} pour
  \emph{PostScript times}, etc.
\item une série de caractères pour la « graisse » de la fonte :
  \texttt{m} pour « médium », \texttt{b} pour « bold » (gras),
  \texttt{bx} pour « bold extended » (gras étendu, c'est-à-dire gras
  avec des caractères plus larges), etc.
\item une série de caractères définissant l'allure (\anglais{shape} en
  anglais) de la fonte : \texttt{n} pour « normal », \texttt{it} pour
  « italique », \texttt{sl} pour « slanted » (penché), etc.
\end{itemize}
 

\subsubsection{Fontes « computer modern »}

Il s'agit d'un ensemble de fontes dessinées par Donald \textsc{Knuth}
et utilisées par défaut dans \LaTeX{}. Les commandes \ltxcom{emph},
\ltxcom{textbf}, etc. sélectionnent donc automatiquement ces polices.

\begin{decritfonte}{Computer Modern roman}{cmr}
  \descriptionfonte{cmr}{m}{n}{normal}
  \descriptionfonte{cmr}{m}{it}{italique}
  \descriptionfonte{cmr}{m}{sl}{penché}
  \descriptionfonte{cmr}{m}{sc}{petites capitales}
  \descriptionfonte{cmr}{bx}{n}{gras étendu normal}
  \descriptionfonte{cmr}{bx}{it}{gras étendu italique}
  \descriptionfonte{cmr}{bx}{sl}{gras étendu penché}
  \descriptionfonte{cmr}{b}{n}{gras normal}
\end{decritfonte}

\begin{decritfonte}{Computer Modern sans sérif}{cmss}
  \descriptionfonte{cmss}{m}{n}{normal}
  \descriptionfonte{cmss}{m}{sl}{penché}
  \descriptionfonte{cmss}{bx}{n}{gras étendu normal}
  \descriptionfonte{cmss}{sbc}{n}{semi gras condensé normal}
\end{decritfonte}

\begin{decritfonte}{Computer Modern typewriter}{cmtt}
  \descriptionfonte{cmtt}{m}{n}{normal}
  \descriptionfonte{cmtt}{m}{it}{italique}
  \descriptionfonte{cmtt}{m}{sl}{penché}
  \descriptionfonte{cmtt}{m}{sc}{petites capitales}
\end{decritfonte}

\begin{decritfonte}{Computer Modern fibonacci}{cmfib}
  \descriptionfonte{cmfib}{m}{n}{normal}
\end{decritfonte}

\begin{decritfonte}{Computer Modern funny roman}{cmfr}
  \descriptionfonte{cmfr}{m}{n}{normal}
  \descriptionfonte{cmfr}{m}{it}{italique}
\end{decritfonte}

\begin{decritfonte}{Computer Modern dunhil}{cmdh}
  \descriptionfonte{cmdh}{m}{n}{normal}
\end{decritfonte}


\subsubsection{Fontes en béton}


{\fontfamily{ccr}\selectfont Elles ont été dessinées par
  \textsc{Knuth} pour son ouvrage intitulé « Ma\-thé\-ma\-ti\-ques concrètes
  ». Le package \ltxpack{beton}\footnote{Notez ici le jeu de mots
    désopilant, \anglais{concrete} veut aussi dire « béton » en langue
    anglaise.}  permet de les charger dans un document.}
\begin{decritfonte}{Concrete fonts}{ccr}
  \descriptionfonte{ccr}{m}{n}{normal}
  \descriptionfonte{ccr}{m}{sc}{petites capitales}
  \descriptionfonte{ccr}{m}{sl}{penché}
  \descriptionfonte{ccr}{m}{it}{italique}
\end{decritfonte}

% \subsubsection{Pandora roman}
% \begin{decritfonte}
%   \descriptionfonte[OT1]{panr}{m}{n}{normal}
%   \descriptionfonte[OT1]{panr}{m}{sl}{penché}
%   \descriptionfonte[OT1]{panr}{b}{n}{gras}
% \end{decritfonte}

% \subsubsection{Pandora sans sérif}
% \begin{decritfonte}
%   \descriptionfonte[OT1]{pss}{m}{n}{normal}
%   \descriptionfonte[OT1]{pss}{m}{sl}{penché}
%   \descriptionfonte[OT1]{pss}{b}{n}{gras}
% \end{decritfonte}

\subsubsection{Fontes « gothiques »}

{\testefonte{U}{yswab}{m}{n}Les fontes ci-dessous sont dites de la
  famille gothique et ne sont à utiliser que dans un contexte bien
  précis faute de rendre le texte parfaitement illisible, comme celui
  que vous êtes en train de lire actuellement, d'ailleurs vous avez
  probablement déjà arrêté, donc je peux dire des gros mots : caca...}
\begin{decritfonte}[U]{Gothique}{ygoth}
  \descriptionfonte[U]{ygoth}{m}{n}{}
\end{decritfonte}
\begin{decritfonte}[U]{Fraktur}{yfrak}
  \descriptionfonte[U]{yfrak}{m}{n}{}
\end{decritfonte}
\begin{decritfonte}[U]{Schwabacher}{yswab}
  \descriptionfonte[U]{yswab}{m}{n}{}
\end{decritfonte}


\subsubsection{Fontes PostScript}

Les fontes ci-dessous sont généralement disponibles gratuitement et
résident la plupart du temps dans les imprimantes.

\framanouvellepage
\begin{decritfonte}{Times}{ptm}
  \descriptionfonte{ptm}{m}{n}{normal}
  \descriptionfonte{ptm}{m}{it}{italique}
  \descriptionfonte{ptm}{m}{sl}{penché}
  \descriptionfonte{ptm}{m}{sc}{petites capitales}
  \descriptionfonte{ptm}{b}{n}{gras}
\end{decritfonte}

\begin{decritfonte}{Palatino}{ppl}
  \descriptionfonte{ppl}{m}{n}{normal}
  \descriptionfonte{ppl}{m}{it}{italique}
  \descriptionfonte{ppl}{m}{sl}{penché}
  \descriptionfonte{ppl}{m}{sc}{petites capitales}
  \descriptionfonte{ppl}{b}{n}{gras}
\end{decritfonte}

\begin{decritfonte}{charter}{bch}
  \descriptionfonte{bch}{m}{n}{normal}
  \descriptionfonte{bch}{m}{it}{italique}
  \descriptionfonte{bch}{m}{sl}{penché}
  \descriptionfonte{bch}{m}{sc}{petites capitales}
  \descriptionfonte{bch}{b}{n}{gras}
\end{decritfonte}

\begin{decritfonte}{New century}{pnc}
  \descriptionfonte{pnc}{m}{n}{normal}
  \descriptionfonte{pnc}{m}{it}{italique}
  \descriptionfonte{pnc}{m}{sl}{penché}
  \descriptionfonte{pnc}{m}{sc}{petites capitales}
  \descriptionfonte{pnc}{b}{n}{gras} 
\end{decritfonte}

\begin{decritfonte}{Bookman}{pbk}
  \descriptionfonte{pbk}{m}{n}{normal}
  \descriptionfonte{pbk}{m}{it}{italique}
  \descriptionfonte{pbk}{m}{sl}{penché}
  \descriptionfonte{pbk}{m}{sc}{petites capitales}
  \descriptionfonte{pbk}{b}{n}{gras}
\end{decritfonte}

% \begin{decritfonte}{Utopia}{put}
%   \descriptionfonte{put}{m}{n}{normal}
%   \descriptionfonte{put}{m}{it}{italique}
%   \descriptionfonte{put}{m}{sl}{penché}
%   \descriptionfonte{put}{m}{sc}{petites capitales}
%   \descriptionfonte{put}{b}{n}{gras}
% \end{decritfonte}
\framanouvellepage

\begin{decritfonte}{Helvetica}{phv}
  \descriptionfonte{phv}{m}{n}{normal} 
  \descriptionfonte{phv}{m}{sl}{penché}
  \descriptionfonte{phv}{m}{sc}{petites capitales}
  \descriptionfonte{phv}{b}{n}{gras}
  \descriptionfonte{phv}{bc}{n}{gras condensé}
\end{decritfonte}

\begin{decritfonte}{Avantgarde}{pag}
  \descriptionfonte{pag}{m}{n}{normal}
  \descriptionfonte{pag}{m}{sl}{penché}
  \descriptionfonte{pag}{m}{sc}{petites capitales}
  \descriptionfonte{pag}{b}{n}{gras}
\end{decritfonte}

\begin{decritfonte}{Courier}{pcr}
  \descriptionfonte{pcr}{m}{n}{normal}
  \descriptionfonte{pcr}{m}{sl}{penché}
  \descriptionfonte{pcr}{m}{sc}{petites capitales}
  \descriptionfonte{pcr}{b}{n}{gras}
\end{decritfonte}

\begin{decritfonte}{Zapf Chancery}{pzc}
  \descriptionfonte{pzc}{m}{n}{normal}
\end{decritfonte}





\subsection{Changer de fontes}
\label{sec-outillage-fontes-changer}


\subsubsection{Globalement} On peut changer de police de caractères en
utilisant des packages plus ou moins standard de la distribution
\LaTeX{} :
\begin{packages}
\item[mathptmx] pour utiliser le « vilain » Times New Roman ;
\item[newcent] pour le New Century ;
\item[mathpazo] pour le Palatino ;
\item[...] et d'autres, n'avez qu'à fouiller votre distribution...
\end{packages}
Si l'on examine le contenu du fichier
\ltxfile{newcent.sty} on trouve simplement :
\begin{ltxcode}
  \renewcommand{\rmdefault}{pnc}
  \renewcommand{\sfdefault}{pag}
  \renewcommand{\ttdefault}{pcr}
\end{ltxcode}
ce qui signifie que ---~comme expliqué au
\S~\vref{sec-outillage-fontes-trois-famille}~--- on a redéfini les trois
familles « roman », « sans sérif » et « machine à écrire » en les
nommant par leur nom \LaTeX{} standardisé : \texttt{pcn} pour
\postscript{} NewCentruy, \texttt{pag} pour \postscript{} AvantGarde
etc. Les noms standardisés sont donnés dans les tableaux de la
section précédente.


\subsubsection{Localement} Il est toujours possible de changer localement
de fonte dans un texte en spécifiant les paramètres nécessaires :
\begin{ltxexemple}
  {\fontfamily{cmfr}\selectfont  On passe 
    en ``Funny Roman'' et même qu'on  peut 
    faire de l'\emph{italique}... c'est 
    dingue !} Et hop nous voila de nouveau  
    en \verb+\rmdefault+
\end{ltxexemple}
Les appels qu'il est possible de faire avant 
\ltxcom{selectfont} sont :
\begin{itemize}
\item \ltxcom{fontencoding} pour le codage ;
\item \ltxcom{fontfamily} avec comme argument la famille
  (\texttt{cmr} pour Computer Modern, \texttt{ptm} pour \postscript{}
  Times, etc.) ;
\item \ltxcom{fontseries} pour préciser la graisse (argument \texttt{b} pour
  gras, \texttt{m} pour la graisse moyenne, etc. ) ;
\item \ltxcom{fontshape} pour l'allure de la fonte (argument \texttt{n} pour
  normal, \texttt{sl} pour penché, etc.) ;
\item \ltxcom{fontsize} avec deux arguments : la taille des caractères
  et l'espace entre deux lignes consécutives.
\end{itemize}
Voici un autre exemple :
\begin{ltxexemple}
  {\fontfamily{ppl}\fontseries{b}%
    \fontsize{1.8cm}{2cm}\selectfont 
    Big!} 

  Et nous voila de nouveau en 
  \verb+\rmdefault+  
\end{ltxexemple}
\noindent%
Finalement, s'il on veut faire appel de manière répétée à une fonte
dont tous les attributs sont fixes, on pourra avoir recours à la
commande \ltxcom{DeclareFixedFont} prenant six arguments (nom, codage,
famille, graisse, allure, taille) et permettant d'être ensuite utilisée
comme une déclaration :
\begin{ltxexemple}
  \DeclareFixedFont{\toupiti}
  {T1}{pag}{m}{n}{3pt}
  Avant {\toupiti bon bé là à moins d'avoir
  une bonne loupe vous ne serez pas capable 
  de lire  ce texte} après.
\end{ltxexemple}


\section{Listes et nouveaux environnements}
\label{sec-outillage-list}

À plusieurs reprises dans ce document, nous avons eu recours à
l'environnement \ltxenv{list} permettant de créer des environnements
basés sur le principe des listes (numérotées, de descriptions,
etc.). Nous donnons ici les bases nécessaires pour pouvoir utiliser
cet environnement en s'appuyant sur des exemples.


\subsection{Principe}
\label{sec-outillage-list-principe}

Pour définir un environnement basé sur les listes, on utilisera la
syntaxe suivante :
\begin{ltxcode}
  \newenvironment{maliste}%
  {\begin{list}%
      { ... code pour l'item par défaut  ...  }
      { ... caractéristiques de la liste ...  }
  }%
  {\end{list}}
\end{ltxcode}
L'environnement \ltxenv{list} prend donc \emph{deux} arguments. Le premier
permet de définir l'allure de l'étiquette (ou item)
par défaut. Le second permet de définir la liste elle-même et en
particulier :
\begin{description}
\item[Sa géométrie] : les marges, les espaces entre les paragraphes
  composant la liste, les espaces entre la liste et l'environnement
  dans lequel elle est insérée, etc.
\item[la production de l'étiquette] : c'est-à-dire la manière dont on va
  effectivement produire le titre de chaque entrée de la liste.
\end{description}
%
\newenvironment{listetest}{\begin{list}{}{%
      \setlength{\labelwidth}{70pt}%
      \setlength{\labelsep}{30pt}%
      \setlength{\itemindent}{15pt}%
      \setlength{\leftmargin}{100pt}%
      \setlength{\rightmargin}{10pt}%
      \setlength{\listparindent}{20pt}%
      \renewcommand{\makelabel}[1]{\textsf{##1}:}
    }
  }
{\end{list}}
%
La liste suivante tente d'illustrer les différentes dimensions que
l'on peut modifier pour définir sa propre liste :
\newcommand{\prout}{%
  \raisebox{-11pt}[0pt][0pt]{%
    \makebox[0pt][l]{\dimension{\labelwidth}{(3)}}}\hfill}
\newcommand{\youpla}{%
  \makebox[0pt][r]{\dimension{\leftmargin}{(4)}\kern\listparindent}}

\newcommand{\dimension}[2]{%
  \parbox{#1}{%
    \mbox{}\hfill{\tiny #2}\hfill\mbox{}\\[-10pt]
    \rule[-3.5pt]{1pt}{8pt}%
    \kern-1pt\rule{#1}{1pt}\kern-1pt%
    \rule[-3.5pt]{1pt}{8pt}}}

\begin{listetest}
\item[\prout Horizontales]
  \makebox[0pt][r]{\dimension{\itemindent}{(1)}}la dimension
  \ltxlen{itemindent} (1) permet d'introduire une indentation pour le
  premier paragraphe d'une entrée de liste.

  \youpla \ltxlen{leftmargin}~(4) définie la marge de gauche et la
  dimension \ltxlen{rightmargin} celle de droite ;
\item[\prout Étiquette] \makebox[0pt][r]{\dimension{\labelsep}{(2)}}la
  dimension \ltxlen{labelsep} (2) détermine la dimension séparant
  l'étiquette du début du paragraphe. \ltxlen{labelwidth}~(3)
  définit quant à elle la largeur de la boîte contenant l'étiquette.

  \makebox[0pt][r]{\dimension{\listparindent}{(5)}}Si on commence un
  autre paragraphe dans une entrée de liste, ce paragraphe sera alors 
  indenté de~\ltxlen{listparindent}~(5) qui vaut 0 point par
  défaut.
\item[Remarque « assez » importante]
  \makebox[0pt][r]{\dimension{\labelsep}{(2)}}si la largeur de
  l'étiquet\-te est inférieure à  \ltxlen{labelwidth} alors
  ce texte est inséré dans une boîte de largeur \ltxlen{labelwidth}.
  Dans le cas contraire, com\-me c'est le cas ici, le texte de l'étiquette sera
  inséré dans une boîte de la largeur nécessaire et le paragraphe sera
  indenté en conséquence.
\end{listetest}

\begin{nota}
  \ltxcom{makelabel} qui attend un argument, permet de
  produire l'étiquette. Ainsi lorsqu'on entre 
  \verb+\item[+\marg{texte étiquette}\verb+]+, il est fait appel à la
  commande \verb+\makelabel{+\marg{texte étiquette}\verb+}+.
\end{nota}

\subsection{Réglage de l'étiquette}

Pour comprendre le fonctionnement de l'environnement \ltxenv{list} et
plus particulièrement le principe du positionnement relatif de
l'étiquette et du paragraphe adjacent, on peut imaginer que les
éléments sont positionnés dans l'ordre suivant :
\begin{enumerate}
\item le paragraphe est d'abord positionné par rapport à la marge de
  gauche à l'aide de la longueur \ltxlen{leftmargin} ;
\item la première ligne du paragraphe est ensuite indenté à l'aide de
  la longueur \ltxlen{itemindent} ;
\item puis l'étiquette est positionnée \emph{relativement} au début du
  paragraphe ainsi indenté à l'aide de la longueur \ltxlen{labelsep}.
\end{enumerate}
Il découle de ceci que l'entrée de liste (ou étiquette) peut être
produite dans la marge de gauche...  La
figure~\vref{fig-outillage-reglage-etiquette} illustre le
positionnement de l'entrée de liste par rapport au paragraphe dans les
deux situations suivantes :
\begin{figure}[tb]
  \centering
  \subfloat[Cas standard]{%
    \includegraphics[width=.47\textwidth]{liste-1}
    \label{fig-outillage-reglage-etiquette-cas-standard}}
  \subfloat[Largeur supérieure à \ltxlen{labelwidth}]{%
    \includegraphics[width=.47\textwidth]{liste-2}
    \label{fig-outillage-reglage-etiquette-cas-largeur}}
  \caption{Positionnement de l'entrée de liste}
  \label{fig-outillage-reglage-etiquette}
\end{figure}
\begin{itemize}
\item cas de la
  figure~\ref{fig-outillage-reglage-etiquette-cas-standard} où la
  largeur de l'entrée de liste est inférieure à la dimension
  \ltxlen{labelwidth}.  Dans ce cas l'entrée de liste est positionnée
  à une distance de \ltxlen{labelsep} du paragraphe, lui même étant
  indenté de \ltxlen{itemindent} et positionné par rapport à la marge
  gauche à l'aide de \ltxlen{leftmargin} ;
\item cas de la
  figure~\ref{fig-outillage-reglage-etiquette-cas-largeur} : la
  largeur de l'entrée de liste est supérieure à la dimension
  \ltxlen{labelwidth}. Dans ce cas l'entrée de liste est toujours
  positionnée à la distance \ltxlen{labelsep} du paragraphe, mais
  celui-ci est indenté d'une valeur supérieure à \ltxlen{itemindent}.
\end{itemize}


\subsection{Réglages verticaux}
\label{sec-outillage-liste}

On peut également régler les blancs verticaux dans l'environnement
\ltxenv{list}. Ces paramètres permettent notamment de définir les
espaces entre les paragraphes constituant les entrées de liste, mais
également les blancs que l'on veut insérer avant ou après la liste.
Il s'agit de :
\begin{itemize}
\item \ltxlen{itemsep} : l'espace entre chaque entrée de liste ;
\item \ltxlen{parsep} : l'espace entre deux paragraphes à l'intérieur
  d'une entrée de liste ;
\item \ltxlen{topsep} : le blanc inséré avant et après l'environnement
  créé, auquel est ajouté \ltxlen{partopsep} si celui-ci commence un
  nouveau paragraphe.
\end{itemize}


\subsection{Valeurs par défaut}
\label{sec-outillage-list-defaut}

Tous les paramètres de l'environnement \ltxenv{list} ont des valeurs
par défaut. Les longueurs pour les réglages horizontaux sont par défaut les
suivantes sur le système de votre serviteur :
\begin{center}
  \begin{tabular}{|l|c|}
    \hline
    dimension & valeur par défaut\\
    \hline
    \ltxlen{itemindent}    &0pt\\
    \ltxlen{listparindent} &0pt\\
    \ltxlen{rightmargin}   &0pt\\
    \ltxlen{leftmargin}    &25pt\\
    \ltxlen{labelwidth}    &20pt\\
    \ltxlen{labelsep}      &5pt\\
    \hline
  \end{tabular}
\end{center}
Et pour les réglages verticaux :
\begin{center}
  \begin{tabular}{|l|c|}
    \hline
    dimension & valeur par défaut\\
    \hline 
    \ltxlen{itemsep}       &4.0pt plus 2.0pt minus 1.0pt\\
    \ltxlen{parsep}        &4.0pt plus 2.0pt minus 1.0pt\\
    \ltxlen{topsep}        &8.0pt plus 2.0pt minus 4.0pt\\
    \ltxlen{partopsep}     &2.0pt plus 1.0pt minus 1.0pt\\
    \hline
  \end{tabular}
\end{center}
La commande \ltxcom{makelabel} est quant à elle définie par :
\begin{ltxcode}
  \hfil #1
\end{ltxcode}
par conséquent, dans la boîte de largeur \ltxlen{labelwidth}, le
contenu de l'étiquette est poussé à droite.  Ainsi si on définit une
liste simple avec :
\begin{ltxcode}
  \newenvironment{listebasique}
  {\begin{list}{}{}}
  {\end{list}}  
\end{ltxcode}
\newenvironment{listebasique}{\begin{list}{}{}}{\end{list}} On aura :
\begin{ltxexemple}
  Avant avant avant avant avant avant avant
  avant avant 
  \begin{listebasique}
    \item[X]  o o o o o o o o o o o o o o
      o o o o o o o o o o o o o o o o o o
      
      u u u u u u u u u u u u u u u u u u
    \item[Machin] v v v v v v v v v v v v
  \end{listebasique}
  Après après après après après après après 
  après après après
\end{ltxexemple}
\noindent%
avec des étiquettes, et sans étiquette :
\begin{ltxexemple}
  Avant avant avant avant avant avant avant
  avant avant avant avant avant avant avant
  \begin{listebasique}
    \item[] e e e e e e e e e e e e e e e e
      e e e e e e e e e e e e e e e e e e e
  \end{listebasique}
  Après après après après après après après 
  après après après après après après après 
\end{ltxexemple}

\subsection{Exemples}

La liste décrivant les fichiers auxiliaires de \LaTeX{} située à la
page~\pageref{annexe-aux} a été produite avec le code suivant :
\begin{ltxexemple}
  \begin{ficaux}
  \item[tex] fichier source \LaTeX{} ; bla
    blabla blabla blabla blabla blabla bla
    blabla blabla blabla blabla
  \item[aux] fichier auxiliaire ...
  \item[log] le fichier de trace ...
  \item[dvi]  fichier \emph{device
           independant},...
  \end{ficaux}
\end{ltxexemple}
L'environnement \ltxenv{ficaux} a lui été conçu comme suit :
\begin{ltxcode}
  \newenvironment{ficaux}{%
    \begin{list}{}{%
        % largeur de la boîte englobant le label :
       \setlength{\labelwidth}{1cm}
       % espace entre paragraphe et l'étiquette :
       \setlength{\labelsep}{8pt}
       % marge de gauche :
       \setlength{\leftmargin}{\labelwidth+\labelsep}
       \renewcommand{\makelabel}[1]{% production de l'étiquette :
         \framebox[\labelwidth]{\texttt{##1}}}}}{\end{list}}
\end{ltxcode}
Dans cet exemple la relation :
\begin{flushleft}
  \verb!\leftmargin=\labelwidth+\labelsep!
\end{flushleft}
permet de positionner l'entrée de liste comme indiqué à la
figure~\vref{fig-outillage-pos-ficaux}.
\begin{figure}[tb]
  \centering
  \subfloat[Liste « fichiers auxiliaires »]{%
    \includegraphics[width=.45\textwidth]{liste-ficaux}%
    \label{fig-outillage-pos-ficaux}}
  \subfloat[Liste « questions »]{%
    \includegraphics[width=.45\textwidth]{liste-question}%
    \label{fig-outillage-pos-question}}
  \caption{Positionnement des étiquettes dans les listes exemples.}
  \label{fig-outillage-pos-exemple}
\end{figure}

Un autre exemple  : la création d'un environnement de liste
numérotée pour produire des questions dans un énoncé de travaux
pratiques ou autre devoir surveillé...
\begin{ltxexemple}
  \begin{question}
  \item o o o o o o o o o o o o o o o o
    o o o o o o o o o o o o o o o o o o
  \item o o o o o o o o o o o o o o o o
    o o o o o o o o o o o o o o o o o o
    o o o o o o o o o o o o o o o o o o
  \item o o o o o o o o o o o o o o o o
    o o o o o o o o o o o o o o o o o o
  \end{question}
\end{ltxexemple}
Cet environnement a été produit par le code suivant :
\begin{ltxcode}
  \newenvironment{question}{\begin{list}{}{%
        \usecounter{cptquestion}%
        \setlength{\labelwidth}{2em}%
        \setlength{\labelsep}{1em}
        \setlength{\itemindent}{15pt}%
        \setlength{\leftmargin}{.8cm}
        \setlength{\rightmargin}{10pt}
        \renewcommand{\makelabel}[1]{%
          \etiquettequestion{##1}}}}
    {\end{list}}
\end{ltxcode}
Le positionnement correspondant est montré à la
figure~\vref{fig-outillage-pos-question}.  On notera que dans la
définition de la liste est fait usage de la commande
\ltxcom{usecounter} permettant de créer une liste numérotée et de
préciser quel compteur est utilisé. On devra donc déclarer le compteur
en question :
\begin{ltxcode}
  \newcounter{cptquestion}
\end{ltxcode}
Enfin, chaque entrée de liste composée du numéro de la question et d'un
« joli » crayon est produite par la commande :
\begin{ltxcode}
  \newcommand{\etiquettequestion}[1]{%
    \makebox[\labelwidth]{%
      \Pisymbol{pzd}{47}$_\thecptquestion$}}
\end{ltxcode}
Finalement la commande :
\begin{ltxcode}
  \renewcommand{\makelabel}[1]{\etiquettequestion{##1}}}}
\end{ltxcode}
redéfinit la commande \ltxcom{makelabel} comme faisant appel à notre «
joli » crayon. Le premier et unique argument est passé à la commande
\ltxcom{etiquettequestion} à l'aide de l'expression~\verb+##1+.
\verb+#1+ désignerait en effet, dans le contexte de la définition de
environnement \ltxenv{question}, le premier argument de celui-ci.

Dans ce manuel, on trouve dans le mémento une liste de packages
(page~\pageref{sec-packages}) produite par le code suivant :
\begin{ltxcode}
  \newenvironment{packages}{\begin{list}{}{%
        \setlength{\labelwidth}{2.5cm}%
        \setlength{\itemindent}{0pt}%
        \setlength{\leftmargin}{\labelwidth+\labelsep}%
        \renewcommand{\makelabel}[1]{%
          $\blacktriangle$ \ltxpack{##1} \hfil:}}}
        {\end{list}}
\end{ltxcode}
La commande \ltxcom{ltxpack} est définie au
paragraphe~\vref{sec-jouets-index}. Pour information,
l'environnement ci-dessus donne :
\begin{ltxexemple}
  \begin{packages}
    \item[bidule] cette extension permet 
      d'insérer des bidules dans son 
      document sans avoir à savoir s'il 
      s'agit de machin ou de truc.
  \end{packages}
\end{ltxexemple}

\subsection{Un exemple un peu plus tordu...}
\label{sec-outillage-liste-glossaire}

Nous allons détailler dans cette section la manière dont la liste
composant le glossaire de la page~\pageref{chap-glossaire} a été
générée. Cette liste dont l'allure est donnée ci-dessous exploite deux
idées :
\begin{madescription}
\item[1\iere{} idée] La longueur \ltxlen{labelsep} peut être négative
  ce qui permet de superposer l'entrée de liste avec le
  paragraphe. Ceci est illustré à la
  figure~\vref{fig-outillage-liste-glo-idee1} ;
\item[Deuxième idée] On peut créer une boîte paragraphe pour la boîte
  produisant l'étiquette. La boîte ainsi créée pourra donc être
  composée de deux lignes : celle du haut contenant le texte de
  l'étiquette, celle du dessous étant vide, se superpose avec le
  paragraphe (figure~\ref{fig-outillage-liste-glo-idee2}).
\end{madescription}
\begin{figure}[tb]
  \centering
  \subfloat[Utiliser un \ltxlen{labelsep} négatif.]{%
    \includegraphics[width=.45\textwidth]{liste-glo-1}%
    \label{fig-outillage-liste-glo-idee1}}
  \subfloat[Créer une boîte paragraphe pour superposer l'étiquette et
  le paragraphe.]{%
    \includegraphics[width=.45\textwidth]{liste-glo-2}%
    \label{fig-outillage-liste-glo-idee2}}
  \caption{Postionnement de l'étiquette dans la liste « glossaire ».}
  \label{fig-outillage-liste-glo}
\end{figure}
Le code permettant de générer la liste ci-dessus et celle du glossaire
de ce manuel est donc :
\begin{ltxcode}
  \newenvironment{glossaire}{\begin{list}{}{%
      \setlength{\labelwidth}{.5\textwidth}%
      \setlength{\labelsep}{-.8\labelwidth}%
      \setlength{\itemindent}{\parindent}%
      \setlength{\leftmargin}{25pt}%
      \setlength{\rightmargin}{0pt}%
      \setlength{\itemsep}{.8\baselineskip}%
      \renewcommand{\makelabel}[1]{%
        \boiteentreeglossaire{##1}}}}
{\end{list}}
\end{ltxcode}
La valeur \verb+.8\baselineskip+ pour \ltxlen{itemsep} permet d'aérer
le glossaire en insérant des blancs entre chaque entrée.  La commande
permettant de générer la boîte contenant l'entrée de liste à
superposer est :
\begin{ltxcode}
  \newcommand{\boiteentreeglossaire}[1]{%
    \parbox[b]{\labelwidth}{%
      \setlength{\fboxsep}{3pt}%
      \setlength{\fboxrule}{.4pt}%
      \shadowbox{\sffamily#1}\\\hfill\mbox{}}}
\end{ltxcode}
Pour comprendre comment est positionnée  cette boîte, nous avons
quelque peu modifié la commande précédente pour dessiner un cadre
autour :
\begin{ltxexemple}
   \begin{leglossaire}
     \renewcommand{\boiteentreeglossaire}{%
       \fboiteentreeglossaire}%
   \item[Bidule] o o o o o o o o o o o o
     o o o o o o o o o o o o o o o o o o
     o o o o o o o o o o o o o o o o o o
   \item[Truc muche] o o o o o o o o o o
     o o o o o o o o o o o o o o o o o o
     o o o o o o o o o o o o o o o o o o
    \end{leglossaire}
\end{ltxexemple}



%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "guide-local"
%%% End: 


\section{Des environnements qui mettent en boîte}
\label{sec-out-lrbox}
L'environnement \ltxenv{lrbox} qui fait l'objet de ce paragraphe
permet de stocker le « contenu » d'un environnement dans une boîte.
C'est un outil très pratique qui est souvent une solution adaptée à
des problèmes courants comme l'encadrement d'objets. Nous allons voir
sur un exemple comment on peut utiliser cette construction.

\subsection{Principe}

On déclare une boîte comme expliqué au paragraphe~\vref{sec-svgreutil}
:
\begin{ltxcode}
  \newsavebox{ø\marg{maboite}ø}
\end{ltxcode}
On peut ensuite écrire :
\begin{ltxcode}
  \begin{lrbox}{ø\marg{maboite}ø}...contenu...\end{lrbox}
\end{ltxcode}
qui est parfaitement équivalent à :
\begin{ltxcode}
  \savebox{ø\marg{maboite}ø}{...contenu...}
\end{ltxcode}
Bon mais alors si c'est la même chose, à quoi ça sert ?? Ça sert pour
la \emph{définition d'un environnement}. 

\subsection{Exemple}

Supposons, par exemple l'existence d'un environnement :
\begin{ltxcode}
  \newenvironment{remarque}{%
    % clause begin
    \begin{center}\begin{minipage}{.8\textwidth}}{%
    % clause end
    \end{minipage}\end{center}}
\end{ltxcode}
\newenvironment{remarque}{%
  % clause begin
  \begin{center}\begin{minipage}{.8\textwidth}}{%
      % clause end
    \end{minipage}\end{center}}
Et :
\begin{ltxexemple}
  On peut faire la remarque (édifiante) 
  suivante :
  \begin{remarque}
    Jazz is not dead. It just smells funny.
    \hfill Frank \textsc{Zappa}
  \end{remarque}
  Et on reprend notre propos.
\end{ltxexemple}
À la question : \emph{comment pourrait-on faire pour encadrer cette
  remarque ?} nous répondons sans hésiter : \emph{avec l'environnement
\ltxenv{lrbox}}. Dans la mesure où il n'y a pas de moyen avec
\LaTeX{} de commencer une \ltxcom{fbox} dans la clause \texttt{begin}
et de la finir dans la claude \texttt{end}, on utilisera le principe suivant :
\begin{enumerate}
\item stocker le contenu à encadrer à l'aide de l'environnement \ltxenv{lrbox}
\item l'encadrer en réutilisant la boîte ainsi construite.
\end{enumerate}
On aura donc :
\begin{ltxcode}
  \newsavebox{\boiteremarque}
  \newenvironment{remarque}{%
    % clause begin
    \begin{lrbox}{\boiteremarque}% début mise en boîte
    \begin{minipage}{.8\textwidth}}{%
    % clause end
    \end{minipage}
    \end{lrbox}% fin mise en boîte
    % production de la boîte encadrée
    \begin{center}
      \fbox{\usebox{\boiteremarque}}
    \end{center}}
\end{ltxcode}
\newsavebox{\boiteremarque}
  \renewenvironment{remarque}{%
    % clause begin
    \begin{lrbox}{\boiteremarque}
    \begin{minipage}{.8\textwidth}}{%
    % clause end
    \end{minipage}
    \end{lrbox}
    % production de la boîte encadrée
    \begin{center}
      \fbox{\usebox{\boiteremarque}}
    \end{center}}
\begin{ltxexemple}
  On peut faire la remarque (édifiante)
  suivante :
  \begin{remarque}
    Jazz is not dead. It just smells funny.
    \hfill Frank \textsc{Zappa}
  \end{remarque}
  Et on reprend notre propos.
\end{ltxexemple}
Cette idée est utilisée à plusieurs reprises dans les deux chapitres
qui suivent.
\begin{nota}
  Il faut noter que la boîte que définit l'environnement
  \ltxenv{lrbox} est une \voir{sec-boitesimple}{boîte simple} à
  l'instar des boîtes créées par les commandes de la famille
  \ltxcom{mbox} et par conséquent ne peut contenir de saut de
  paragraphe.
\end{nota}
\palironglet

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../framabook"
%%% End: 
