\chapter{Un pas vers la sorcellerie}
\label{chap-wizard}
\begin{epigraphe}{L'Apocalypse Ap \textbf{8} 1}
  Et lorsque l'Agneau ouvrit le septième sceau\\
  il se fit un silence dans le ciel,\\
  environ une demi-heure...
\end{epigraphe}


\begin{introchap}{Avant de continuer} l'exploration de ce système monstrueux
et magnifique qu'est \LaTeX{}, il est nécessaire de faire une pause et
de prendre connaissance de quelques concepts importants. Il nous
semble en effet fondamental d'assimiler ces notions pour pouvoir jouer
les « Hercule Poirot » dans les nombreux fichiers qui forment le
système.  Nous présenterons dans ce chapitre les
compteurs, les longueurs, les espaces et les boîtes. Ces quatre
notions vous seront utiles pour utiliser \LaTeX{} autrement
qu'en acceptant docilement ce qu'il vous propose.
\begin{nota}
  Ce chapitre traite de concepts assez subtils à
  saisir\footnote{L'auteur n'est lui-même pas sûr d'avoir tout
    compris...} ; nous vous conseillons donc vivement
  d'\textbf{expérimenter} car les outils présentés ici sont ceux qui
  offrent le plus de satisfaction mais qui entraînent aussi les plus
  grandes pertes de cheveux (essentiellement par arrachage).
\end{nota}
\end{introchap}


\section{Compteurs}
\label{sec-wizard-compteurs}

\index{numérotation}
Toute partie d'un document faisant l'objet d'une numérotation est
gérée par un \emph{compteur}. Ces compteurs peuvent être incrémentés
ou décrémentés, remis à zéro, etc.  On peut aussi en créer pour un
usage personnel.

\subsection{Compteurs disponibles}
Les compteurs sont principalement liés aux titres, aux numéros de
pages, aux environnements flottants (environnements \texttt{figure} et
\texttt{table}), aux équations (environnement \texttt{equation}), aux
notes de bas de page et aux items d'énumération (environnement
\texttt{enumerate}).
\begin{table}[hpbt]
   \caption{Les compteurs de \LaTeX{}}\label{tab-ctr}
   \begin{center}
     \begin{tabular}{|>{\ttfamily}l|>{\ttfamily}l|>{\ttfamily}l|>{\ttfamily}l|}
       \hline
      part       & paragraph    & figure     & enumi\\
      chapter    & subparagraph & table      & enumii\\
      section    & page         & footnote   & enumiii\\
      subsection & equation     & mpfootnote & enumiv\\
      subsubsection &&&\\
      \hline
      \end{tabular}
   \end{center}
\end{table} 

Le tableau \vref{tab-ctr} vous donne le nom des principaux
compteurs de \LaTeX{}. Vous remarquerez qu'ils portent
généralement le nom des objets auxquels ils sont associés.
Les compteurs \texttt{enumi}, ..., \texttt{enumiv} sont associés aux
items de niveaux~1 à~4 de l'environnement \texttt{enumerate}.
Le compteur \texttt{mpfootnote} est le compteur de note de
bas de page de l'environnement \texttt{minipage} dont il
est question au paragraphe \ref{sec-boitepar} .


\subsection{Manipulation}
\index{compteur!manipulation} Nous vous donnons, dans les paragraphes
qui suivent, les outils de base pour manipuler les compteurs. Il est
important de noter que les compteurs sont des variables
\emph{globales}.  Ainsi les trois commandes décrites plus bas ont une
portée globale. Il est également utile de noter que ces variables sont
des \emph{entiers}.

\subsubsection{Création}
On peut \emph{créer} un nouveau compteur grâce à la commande :
\indexcom{newcounter}
\begin{ltxcode}
  \newcounter{ø\marg{cpteur}ø}[ø\marg{cpt\_maitre}]
\end{ltxcode}
qui crée un nouveau compteur \marg{cpteur}.  Si l'argument optionnel
\marg{cpt\_maitre} est présent, le compteur \marg{cpteur} est remis à
zéro à chaque fois que le compteur maître \marg{cpt\_maitre} est
incrémenté.

\subsubsection{Affectation}
On affecte une valeur à un compteur de la manière suivante :
\indexcom{setcounter}
\begin{ltxcode}
  \setcounter{ø\marg{compteur}ø}{ø\marg{valeur}ø}
\end{ltxcode}
où \marg{compteur} est le compteur que l'on veut modifier,
et \marg{valeur} la valeur que l'on veut lui affecter.

\subsubsection{Incrémentation}
On peut incrémenter ou décrémenter un compteur grâce
à la commande :
\indexcom{addtocounter}
\begin{ltxcode}
  \addtocounter{ø\marg{compteur}ø}{ø\marg{valeur}ø}
\end{ltxcode}
où \marg{valeur} est un nombre positif (resp. négatif) pour réaliser
une incrémentation (resp. décrémentation).  Illustrons l'utilisation
de cette commande en entrant la ligne suivante dans notre document :
\begin{ltxcode}
  \addtocounter{footnote}{357}
\end{ltxcode}\addtocounter{footnote}{357}
pour changer%
\footnote{Même si ce changement est un peu ridicule...} la
numérotation des notes de bas de page.  Pour que tout rentre dans
l'ordre, avec les notes de bas de page suivantes, nous avons préféré
entrer dans notre source, la commande :
\begin{ltxcode}
  \addtocounter{footnote}{-357}
\end{ltxcode}\addtocounter{footnote}{-357}
et normalement\footnote{On croise les doigts !}, nous
devrions avoir une numérotation correcte.

\subsection{Affichage}
\index{compteur!affichage}
Pour afficher un compteur on utilise la commande :
\indexcom{the}
\begin{ltxcode}
  \theø\marg{nom-du-compteur}ø
\end{ltxcode}
En fait, toute commande ou environnement qui donne lieu à l'affichage
d'un compteur fait appel à ce type de commande.  Ainsi, on a par
exemple :
\begin{itemize}
\item \ltxcom{thepage} produit : « \thepage{} » et est appelée notamment
  à chaque saut de page,
\item \ltxcom{thefootnote} produit : « \thefootnote{} » et est appelée
  par \ltxcom{footnote},
\item \ltxcom{thesubsection} produit : « \thesubsection{} » et est 
appelée par la commande  \ltxcom{subsection},
\item ...
\end{itemize}


Les commandes de la famille \ltxcom{the} sont généralement définies à
partir des commandes de formatage suivantes :
\begin{itemize}
\item \ltxcom{arabic}\verb+{+\marg{compteur}\verb+}+,
\item \ltxcom{roman}\verb+{+\marg{compteur}\verb+}+{} et
      \ltxcom{Roman}\verb+{+\marg{compteur}\verb+}+,
\item \ltxcom{alph}\verb+{+\marg{compteur}\verb+}+{} et 
      \ltxcom{Alph}\verb+{+\marg{compteur}\verb+}+
\end{itemize}
en voici quelques exemples :
\begin{itemize}
\item \ltxcom{arabic}\verb+{page}+ produit :  « \arabic{page} » ;
\item \ltxcom{alph}\verb+{footnote}+ produit : « \alph{footnote} » 
   et \ltxcom{Alph}\verb+{section}+ produit : « \Alph{section} » ;
\item \ltxcom{Roman}\verb+{subsection}+ produit : « \Roman{subsection} » 
   et \ltxcom{roman}\verb+{page}+ produit : « \roman{page} » ;
\item ...
\end{itemize}

Il est courant de redéfinir les commandes de la famille \ltxcom{the}
pour personnaliser un document. Par exemple, dans la classe de
document utilisée pour ce manuel, la commande \ltxcom{thefigure} est
définie comme suit :
\begin{ltxcode}
  \arabic{chapter}.\arabic{figure}
\end{ltxcode}
ce qui produit dans les légendes des figures une numérotation formée
par : 1)~le numéro du chapitre en chiffre arabe, 2)~un point, et 3)~le
numéro de la figure en chiffre arabe.  Il est possible de redéfinir
cet affichage en définissant la commande \ltxcom{thefigure} par
exemple comme suit :
\begin{ltxcode}
  (\Roman{chapter}):\arabic{section}.\arabic{figure}
\end{ltxcode}

\renewcommand{\thefigure}%
{(\Roman{chapter}):\arabic{section}.\arabic{figure}}

\begin{wrapfigure}{r}{5cm}
  \begin{center}
    \includegraphics{latex}
  \end{center}
  \caption{La légende}
\end{wrapfigure}
Ce qui permet d'obtenir un numéro de figure ---~relativement
immonde~--- dans les légendes quelque peu différent du style prédéfini.
Ici, on a donc redéfini la commande \ltxcom{thefigure} pour produire
une numérotation formée par le numéro du chapitre entre parenthèses et
en chiffres romains, suivi du numéro de section et du numéro de la
figure en chiffre arabe, séparés par un point. Le « \textsc{Fig.} » ainsi que le
tiret qui suit le numéro de la figure sont quant à eux définis au niveau
de la commande \ltxcom{caption}...

\renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}}





\section{Longueurs}
\label{sec-longueurs}
\index{longueurs}
Si les compteurs sont dédiés à la \emph{numérotation} des objets d'un
document, les longueurs définissent l'\emph{encombrement} d'une
entité. Il s'agit en quelque sorte, d'un type de donnée de \LaTeX{}
destiné à exprimer les dimensions d'un objet.

\subsection{Unités}
\index{unité des longueurs}
Toutes les dimensions doivent avoir une unité ; une dimension de type
\emph{rigide}\footnote{On verra plus loin qu'il existe des dimensions
  \emph{élastiques}.} a la forme suivante :
\begin{flushleft}
  \marg{nombre}\marg{unité}
\end{flushleft}
où \marg{nombre} est un nombre positif ou négatif avec éventuellement
une partie décimale, et \marg{unité} une unité de mesure reconnue par
\LaTeX.  Voici une liste non exhaustive des unités \emph{légales} :
\begin{description}
\item[cm] pour \emph{centimètre} ;
\item[mm] pour \emph{millimètre} ;
\item[in] pour les allerg\emph{inch} au système métrique (environ
  \texttt{2.54cm}) ;
\item[pt] pour \emph{point} : couramment utilisé en 
typographie : $\frac{1}{72.27}$ inch ;
\item[em] : la largeur de la lettre `M' de la fonte courante ;
\item[ex] : la hauteur de la lettre `x' de la fonte courante
\end{description}
Notez que les unités \texttt{em} (resp. \texttt{ex}) sont généralement
utilisées pour des dimensions horizontales (resp. verticales) et
permettent de manipuler des dimensions dépendantes de la taille de la
fonte courante.  Voici quelques exemples de dimensions :
\begin{tabbing}
\hspace{20pt}\=10ptxxx \=:xxx \=\longueur{10pt}\kill
\>\verb+1cm+  \>:\>\longueur{1cm}\\
\>\verb+1in+  \>:\>\longueur{1in}\\
\>\verb+3mm+  \>:\>\longueur{3mm}\\
\>\verb+2em+  \>:\>\longueur{2em}\\
\>\verb+10pt+ \>:\>\longueur{10pt}
\end{tabbing}


\subsection{Quelques longueurs de \LaTeX{}}
\index{longueurs!prédéfinies} Il existe dans \LaTeX{} et dans chaque
extension des longueurs prédéfinies. Ces longueurs déterminent en
général, les dimensions de certaines parties du document. Ainsi :
\begin{itemize}
\item \ltxcom{parindent} est la dimension de l'indentation en début de
  paragraphe. Cette dimension est prédéfinie à \verb+15pt+ ;
\item \ltxcom{textwidth} et \ltxcom{textheight} définissent la largeur
(resp. la hauteur) du texte ;
\item \ltxlen{baselineskip} représente la distance entre la base de la ligne
et la base de la ligne suivante (\texttt{10pt} dans ce document) ;
\item \ltxcom{parskip} la distance séparant deux paragraphes ; cette
  distance est initialisée à \verb+0pt plus 1pt+\footnote{Cf. les
    dimensions élastiques pour avoir la signification du
    \texttt{plus}.} ;
\item ...
\end{itemize}

Il est important de comprendre qu'il est possible d'exprimer une
dimension en fonction d'une de ces dimensions « internes ». Ainsi :
\begin{ltxcode}
  0.5\textwidth
\end{ltxcode}
représente la moitié de largeur de la page, et :
\begin{ltxcode}
  3\parindent
\end{ltxcode}
équivaut à trois fois l'indentation des paragraphes.  Notez aussi que
l'on peut écrire \verb+-\baselineskip+ pour : \verb+-1\baselineskip+



\subsection{Manipulation des longueurs}
\index{longueurs!manipulation}
Comme pour les compteurs, il existe quelques commandes permettant de
manipuler les dimensions.


\subsubsection{Création}
La commande suivante crée une nouvelle longueur :
\indexcom{newlength}
\begin{ltxcode}
  \newlength{ø\marg{dim}ø}
\end{ltxcode}
où \marg{dim} est le nom de la nouvelle dimension 
initialisée à \verb+0pt+ (cf. exemple\vpageref{malongueur}).
%D Ici, je donnerais un exemple ou bien je renverrai à l'exemple où il
%D est question de \newlength{\malongueur} (je ne sais pas dans quelle
%D mesure on peut étiqueter les ltxexemple pour s'y référer).
%D VL : cf fin du chapitre « de nouveaux joeuts »
\begin{nota}
  Attention, quel que soit l'endroit où intervient la commande
  \ltxcom{newlength}, la longueur définie est toujours
  \textbf{globale}.  De plus, déclarer deux fois la même longueur
  provoque une erreur. Par contre, la modification d'une longueur est
  locale au groupe (\verb+{...}+) où elle survient.
\end{nota}

\subsubsection{Affectation}
On peut affecter une valeur à une longueur avec la commande :
\indexcom{setlength}
\begin{ltxcode}
  \setlength{ø\marg{dim}ø}{ø\marg{val}ø}
\end{ltxcode}
qui affecte la valeur \marg{val} à la longueur \marg{dim}.

\subsubsection{Incrémentation}
On incrémente une longueur comme suit :
\indexcom{addtolength}
\begin{ltxcode}
  \addtolength{ø\marg{dim}ø}{ø\marg{val}ø}
\end{ltxcode}
qui a pour effet d'augmenter la longueur \marg{dim} de la valeur
\marg{val}.

\addtolength{\parindent}{30pt} Alors que vous lisez
fébrilement ce paragraphe, nous nous sommes permis d'augmenter la
longueur \ltxcom{parindent} de 30~points avec :
\begin{ltxcode}
  \addtolength{\parindent}{30pt} Alors que vous
  lisez fébrilement ce paragraphe...
  
\end{ltxcode}
pour illustrer l'utilisation de l'incrémentation
des longueurs. Après ce paragraphe, on a écrit :
\begin{ltxcode}
  \addtolength{\parindent}{-30pt}
\end{ltxcode}
pour que tout rentre dans l'ordre.

\addtolength{\parindent}{-30pt}



\subsubsection{Obtenir les dimensions d'un objet}
\index{dimension d'un objet} \index{boîte!dimensions} Comme il en a
été vaguement question \voir{sec-overunder}{précédemment}, au niveau
de \TeX{}, les différents objets qui composent le document sont
assemblés dans des \emph{boîtes}. Ces boîtes sont positionnées les
unes par rapport aux autres en alignant leur \emph{point de
  référence}. Ces points alignés forment une ligne imaginaire
confondue avec la base de la ligne.  Toute boîte est caractérisée par
trois dimensions :
\begin{itemize}
\item sa \emph{largeur} ;
\item sa \emph{hauteur} : du point de référence au haut de la 
boîte ;
\item sa \emph{profondeur} : du point de référence jusqu'au bas 
de la  boîte.
\end{itemize}

Voici par exemple comment sont assemblées les boîtes du mot
« Ingénierie » :
\begin{center}
\letterbox{\letterbox{I}%
\letterbox{n}%
\letterbox{g}%
\letterbox{é}%
\letterbox{n}%
\letterbox{i}%
\letterbox{e}%
\letterbox{r}%
\letterbox{i}%
\letterbox{e}}
\end{center}
les symboles « \refpoint{} » représentent les points de référence.
On voit ici que toutes les boîtes ont une profondeur nulle sauf celle de 
la lettre~`g'.

Mais fermons la parenthèse concernant les boîtes ! 

\medskip Il est donc possible d'extraire les caractéristiques d'un
objet (une lettre, un mot, une boîte, etc.) à l'aide des commandes
suivantes :
\indexcom{settowidth}\indexcom{settoheight}\indexcom{settodepth}
\begin{ltxcode}
  \settowidth{ø\marg{dim}ø}{ø\marg{obj}ø}
  \settoheight{ø\marg{dim}ø}{ø\marg{obj}ø}
  \settodepth{ø\marg{dim}ø}{ø\marg{obj}ø}
\end{ltxcode}
trois commandes qui affectent à la dimension \marg{dim} respectivement
la largeur, la hauteur et la profondeur de l'objet \marg{obj}. Par
exemple :
\labelexemple{malongueur}
\begin{ltxexemple}
     \newlength{\malongueur}
     \settowidth{\malongueur}{Machin chose}
     \begin{itemize}
     \item Machin chose bidule
     \item \hspace{\malongueur} truc
     \end{itemize}
\end{ltxexemple}
La longueur \verb+\malongueur+ contient alors la largeur du texte  « Machin
chose » et est utilisée pour insérer un blanc (voir le paragraphe sur
les \voir{sec-espace}{espaces}).


\subsection{Longueurs élastiques}
\label{sec-longelast}
\index{longueurs!élastiques}
\index{ressort}
Les dimensions présentées jusqu'ici sont des dimensions
\emph{rigides}%
\footnote{Sauf \texttt{$\backslash$parskip}.}, il existe cependant des
longueurs \emph{élastiques} ou \emph{ressort}. Au niveau de \TeX{},
un grand nombre de dimensions sont définies comme suit :
\begin{ltxcode}
  ø\marg{val}ø plus ø\marg{p\_val}ø minus ø\marg{m\_val}ø
\end{ltxcode}
cette syntaxe permet de définir une longueur ayant la dimension
\marg{val}, mais pouvant selon les circonstances s'agrandir ou se
rétracter. Et ainsi, si on appelle \marg{dim} la dimension
créée, on a :
\begin{displaymath}
val-m\_val\leqslant dim \leqslant val+p\_val
\end{displaymath}
\index{paragraphe!séparation}%
Par exemple, la longueur \ltxcom{parskip} qui sépare deux paragraphes 
consécutifs, est fixée à :
\begin{ltxcode}
  0pt plus 1pt
\end{ltxcode}
ce qui signifie qu'au cas où la page est un peu lâche, \LaTeX{}
insérera entre les paragraphes un blanc vertical de 1~point.  Ce type
de dimension prend tout son intérêt pour mettre en place un réglage
très fin des espaces verticales ou horizontales. Enfin, les
utilisateurs de \LaTeX{} auront la chance inouïe de pouvoir manipuler
une autre famille de longueurs élastiques tout aussi intéressante.
Cette famille possède les deux particularités suivantes :
\begin{enumerate}
\item une longueur \textbf{nulle} ;
\item la capacité de s'étirer \textbf{indéfiniment} avec une 
certaine force.
\end{enumerate}
%
\LaTeXe{} dispose d'une commande permettant de spécifier une longueur
élastique en précisant son degré d'élasticité :
\indexcom{stretch}
\begin{ltxcode}
  \stretch{ø\marg{nbre}ø}
\end{ltxcode}
où \marg{nbre} est la force du ressort. Ce nombre peut être signé et
avoir une partie décimale.  Voici un exemple :
\begin{ltxexemple}
  zéro\hspace{\stretch{1}}%
  tiers\hspace{\stretch{2}}un
\end{ltxexemple}
Ce code \LaTeX{} introduit des espaces\footnote{C'est la commande
  \texttt{$\backslash$hspace} qui produit une espace horizontale de
  longueur définie par son argument.} de longueurs élastiques entre
les mots « zéro tiers un ». Le deuxième ressort a une raideur deux fois
plus importante que le premier. L'espacement est donc double.  Vous
noterez aussi que ces ressorts ont une élasticité \emph{relative} mais
\emph{infinie} ; c'est pourquoi les mots « zéro » et « un » sont « poussés
» contre les marges.  Enfin, sachez que \ltxcom{fill} est un raccourci
agréable de \verb+\stretch{1}+.
% \begin{nota}
%   Deux petites subtilités de \LaTeX{} : multiplier \verb+\fill+ par un
%   nombre le rend rigide ; et multiplier \verb+\stretch{...}+ par un
%   nombre ne le change pas. Ce que l'on peut résumer par :
%   \begin{center}
%     $n$\ltxcom{fill}\verb+=0pt+ \quad et \quad
%     $n$\ltxcom{stretch}\verb+{+\marg{m}\verb+}=+\ltxcom{stretch}%
%   \verb+{+\marg{m}\verb+}+
% \end{center}
% \end{nota}



\subsection{Affichage}
\label{sec-longueur-affichage}

Il est parfois utile d'afficher la valeur d'une longueur. Pour ce
faire on peut avoir recours à la commande \ltxcom{showthe} qui
interrompt la compilation pour afficher la valeur de la longueur
passée en paramètre. Ainsi :
\begin{ltxcode}
  \showthe\linewidth
\end{ltxcode}
afficher la valeur de la longueur \ltxlen{linewidth} en interrompant
la \voir{sec-err}{compilation}. On aura sur le terminal quelque chose
du genre :
\begin{monverbatim}
  [ ... ] ¢ccomment«Le laïus initial»
  Document Class: book 2001/04/21 v1.4 Standard LaTeX document
  (/usr/share/texmf/tex/latex/base/bk12.clo)) (./test.aux)
  > 17.62482pt. ¢ccomment«la valeur de la longueur»
  l.10 \showthe\parindent ¢ccomment«la longueur à afficher»
                       
  ?
\end{monverbatim}
Lorsque la compilation est lancée dans un terminal de commande, une
pression sur la touche \verb+<Entrée>+ fait reprendre la compilation.
\begin{note}
  Comme indiqué à la page~\pageref{sec-err}, votre environnement de
  développement ne vous permet peut être pas directement d'avoir accès
  aux messages de \LaTeX{}. À vous de chercher où se trouvent ces
  informations...
\end{note}


\section{Espaces}
\label{sec-espace}
\index{espace}
On appelle \emph{espaces} les blancs que l'on insère à divers endroits
dans un document. Il existe des commandes permettant d'insérer des
blancs de longueur prédéfinie ou choisie par
l'utilisateur. Il s'agit bien sûr de longueur au sens de \LaTeX.

\subsection{Commandes de base}
Pour insérer une espace\footnote{Nous utilisons ici le genre
féminin
du mot \emph{espace} qui désigne alors les petites tiges métalliques utilisées
autrefois en imprimerie pour séparer les mots et les lettres. Aujourd'hui, 
le genre féminin est encore utilisé dans le monde de la typographie et de 
l'imprimerie.}
entre les objets, on dispose de commandes de la forme suivante :
\begin{ltxcode}
  \ø\marg{dir}øspace{ø\marg{dim}ø}
\end{ltxcode}
%\verb+\+
où \marg{dim} est une longueur rigide ou élastique,
et \marg{dir} vaut : 
\begin{itemize}
\item \texttt{v} pour une espace verticale ;
\item \texttt{h} pour une espace horizontale.
\end{itemize}

Ainsi :
\begin{ltxexemple}
  un saut\hspace{1cm}de \texttt{1cm}
  
  \vspace{2\baselineskip}
  
  et deux lignes vierges.
\end{ltxexemple}
\begin{note}
  Dans certaines situations, \TeX{} supprime les espaces. Il est alors
  nécessaire d'utiliser la forme « étoilée » des commandes
  d'espacement, à savoir \ltxcom{hspace*} et \ltxcom{vspace*}. Les
  situations en question sont :
\begin{itemize}
\item le début et la fin de page ;
\item le début et la fin d'une ligne s'il ne s'agit pas de la
première ou de la dernière ligne du paragraphe.
\end{itemize}
\end{note}

\subsection{Quelques espaces prédéfinies}
\index{espace!prédéfinie} On dispose de plusieurs commandes
d'espacement, regroupées en deux catégories selon le mode horizontal
ou vertical.

\subsubsection{Espaces horizontales}
\index{espace!horizontale}
Voici quelques espaces rigides :
\begin{tabbing}
   \qquad\=\verb+\enspace + \=:\enspace\=\qquad\quad\=\kill
   \>\ltxcom{enspace} \>:\>\espace{\enspace} \> soit \verb+0.5\quad+\\
   \>\ltxcom{quad}    \>:\>\espace{\quad}    \> soit \texttt{1em}\\
   \>\ltxcom{qquad}   \>:\>\espace{\qquad}   \> soit \verb+2\quad+
\end{tabbing}
et quelques espaces élastiques :
\begin{tabbing}
   \qquad\=\verb+\hrulefill + \=:\enspace\=\qquad\quad\=\kill
   \>\ltxcom{hfill}     \>:\> soit \verb+\hspace{\fill}+\\
   \>\ltxcom{hrulefill} \>:\> comme \verb+\hfill+ mais trace une ligne\\
   \>\ltxcom{dotfill}   \>:\> comme \verb+\hfill+ mais trace des points
\end{tabbing}

\index{traits}
\index{points}

Voici quelques exemples montrant l'utilisation des espaces horizontales.
Tout d'abord, notez que les espaces entourant la commande \verb+\hspace+
ne sont pas ignorées :
\begin{ltxexemple}
  zéro\hspace{1cm}un\par
  zéro \hspace{1cm}un\par
  zéro \hspace{1cm} un\par
\end{ltxexemple}
Voici ensuite, les espaces élastiques de \LaTeX{} : 
\begin{ltxexemple}
  zéro \hfill{} un\par
  zéro \hrulefill{} un\par
  zéro \dotfill{} un\par
\end{ltxexemple}
Et pour finir, la force relative des ressorts :
\begin{ltxexemple}
  zéro \dotfill{} demi \hfill{} un\par
  zéro \hrulefill{} tiers
  \hspace{\stretch{2}} un\par
\end{ltxexemple}
Vous aurez donc compris que les « ressorts » prédéfinis
de \LaTeX{} (à savoir \ltxcom{hfill}, \ltxcom{hrulefill}, et \ltxcom{dotfill})
ont une raideur de 1.

\subsubsection{Espaces verticales}
\index{espace!verticale}
Voici trois grands classiques de la famille des espaces verticales :
\begin{itemize}
\item \verb+\smallskip+ pour un \emph{petit} saut vertical ;
\item \verb+\medskip+ pour un  saut vertical \emph{moyen} ;
\item \verb+\bigskip+ pour un \emph{grand} saut vertical.
\end{itemize}
Ces espaces s'utilisent comme la commande \verb+\vspace+,
avec pour effet :
\begin{center}
\begin{minipage}[t]{0.2\textwidth}
défaut :
\par
§ suivant...
\end{minipage}
\begin{minipage}[t]{0.2\textwidth}
petite :
\par\smallskip
§ suivant...
\end{minipage}
\begin{minipage}[t]{0.2\textwidth}
moyenne :
\par\medskip
§ suivant...
\end{minipage}
\begin{minipage}[t]{0.2\textwidth}
grande :
\par\bigskip
§ suivant...
\end{minipage}
\end{center}

Il existe une espace verticale élastique  prédéfinie :
\ltxcom{vfill} équivalent à :
\begin{ltxcode}
  \par\vspace{\fill}
\end{ltxcode}
c'est-à-dire, un saut de paragraphe, suivi d'une espace verticale de
dimension \ltxcom{fill}.
\begin{ltxexempleenv}
\begin{ltxexempleinput}
  \hrulefill{}
  
  haut
  
  \vfill

  \hfill{}fragile\hfill{}
  
  \vspace{\stretch{2}}
  
  \hfill{}bas
  
  \hrulefill{}
\end{ltxexempleinput}
\begin{ltxexempleoutput}
  \hrulefill{}
  
  haut
  
  \vspace{1cm}
  
  \hfill{}fragile\hfill{}
  
  \vspace{2cm}
  
  \hfill{}bas
  
  \hrulefill{}
\end{ltxexempleoutput}
\end{ltxexempleenv}
\begin{nota}
Il est important d'utiliser la commande \ltxcom{vspace} 
\textbf{entre deux paragraphes} au risque d'avoir des résultats
surprenants. Il vaut donc mieux prendre l'habitude 
d'insérer un saut de paragraphe ---~une ligne vierge ou une commande
\ltxcom{par}~--- avant et/ou après \ltxcom{vspace}.
\end{nota}



\section{Boîtes}
\label{sec-wizard-boites}

\index{boîte!exemples}
La dernière section de ce chapitre sera dédiée aux \emph{boîtes}, et
vous verrez que le titre du présent chapitre sera amplement justifié !
Comme nous l'avons aperçu précédemment, les boîtes sont des entités
qui contiennent d'autres éléments (une boîte pouvant en contenir une
autre). Ces entités peuvent d'autre part être positionnées selon la
fantaisie\footnote{Humm... ainsi qu'avec patience et bonne humeur...}
de l'utilisateur.

Il existe deux principaux types de boîtes (au niveau de \TeX{} c'est
un peu plus subtil) chacun d'eux ayant un comportement
spécifique. Nous qualifierons ces deux catégories comme suit :
\begin{itemize}
\item boîte \emph{simple}
\item boîte \emph{paragraphe}
\end{itemize}
Nous verrons qu'une manipulation habile de ces boîtes permet de
produire des mises en page sophistiquées particulièrement utiles
notamment lors de la conception de transparents.

Voici un premier exemple avec des boîtes simples qui, j'en suis sûr,
vous a sauté aux yeux, c'est le logo de \texttt{TeX} : \TeX{}. Il
s'agit en fait des trois lettres, T, E et X « mises en boîte » et
assemblées avec des décalages horizontaux et verticaux :
\begin{center}
  \setlength{\fboxsep}{0pt} \setlength{\fboxrule}{0.2pt} 
  \Huge\fbox{T}\kern-.1667em%
  \raisebox{-.5ex}{\fbox{E}}%
  \kern-.125em\fbox{X}
\end{center}
notez que la boîte du `E' est décalée vers le bas et que les trois
boîtes se superposent. Un autre exemple :
\begin{center}
  \footnotesize
  \settowidth{\tmplength}{citroen}
  \rotatebox{45}{citroën}%
  \hspace{-.82\tmplength}%
  \raisebox{-4ex}{\rotatebox{45}{citroën}}%
  \raisebox{0.707\tmplength}{\rotatebox{-45}{citroën}}%
  \hspace{-0.82\tmplength}%
  \raisebox{0.707\tmplength-4ex}{\rotatebox{-45}{citroën}}
  \quad
  {\normalsize et pour éviter les querelles culturelles : }
  \tiny
  \settowidth{\tmplength}{renault}
  \rotatebox{60}{renault}%
  \hspace{-.5\tmplength}%
  renault%
  \hspace{-.5\tmplength}\raisebox{0.866\tmplength}{\rotatebox{-60}{renault}}%
  \hspace{-1.2\tmplength}\rotatebox{-60}{renault}
  \hspace{-0.25\tmplength}\raisebox{-0.866\tmplength}{\rotatebox{60}{renault}}%
\end{center}
ici chaque mot est dans une boîte. Chaque boîte est ensuite placée par
rapport aux autres avec moult décalages et rotations. Pour en finir avec
les exemples préliminaires, nous vous donnons ici deux exemples utilisant
les boîtes \emph{paragraphes} :

\begin{agrandirmarges}{1.1cm}{1.1cm}
\noindent\fbox{%
  \begin{minipage}{4cm} Ceci est une boîte paragraphe de 4cm de large.
    Une telle boîte est capable de contenir à peu près tout ce qu'on
    trouve dans un document \LaTeX{}.
  \end{minipage}}
le texte continue, et,
\rotatebox{45}{\fbox{\begin{minipage}[b]{3cm}
  \textbf{plaf !}\\
  une formule mathématique dans une  « boîboîte » 
  \begin{displaymath}
    ax+b=c
  \end{displaymath}
\end{minipage}}}
\end{agrandirmarges}

\medskip
Voici une image en couleur, avec ses 3 composantes :
\begin{center}
\settowidth{\tmplength}{GGGG}
\fbox{\begin{minipage}{\tmplength}
RRRR\par RRRR\par RRRR\par RRRR
\end{minipage}}%
\hspace{-3em}%
\raisebox{-\baselineskip}{\fbox{\begin{minipage}{\tmplength}
    GGGG\par GGGG\par GGGG\par GGGG
  \end{minipage}}}%
\hspace{-3em}%
\raisebox{-2\baselineskip}{\fbox{\begin{minipage}{\tmplength} BBBB\par
      BBBB\par BBBB\par BBBB
  \end{minipage}}}
\end{center}


\subsection{Boîtes simples}
\label{sec-boitesimple}
\index{boîte!simple} La première catégorie ---~les boîtes simples~--- se
comporte comme des mots dans un paragraphe.  Voici leurs
caractéristiques :
\begin{itemize}
\item on peut imposer sa \emph{largeur},
\item sa \emph{hauteur} est donnée par ce qu'elle contient,
\item Elle \textbf{ne doit pas contenir} de saut de paragraphe
\end{itemize}

\paragraph{Sans bordure}
La commande \ltxcom{makebox} permet de construire une boîte simple.
\begin{ltxcode}
  \makebox[ø\marg{larg}ø][ø\marg{pos}ø]{ø\marg{contenu}ø}
\end{ltxcode}
où \marg{larg} est la largeur désirée, \marg{pos} la position
(\verb+c=+centré, \verb+l=+aligné à gauche ou \verb+r=+à droite) de
\marg{contenu} dans la boîte. Voici quelques exemples :
\begin{ltxexemple}
  et \makebox[2cm][c]{hop !} une boîte\par
  et \makebox[3cm][r]{rehop !} une autre
\end{ltxexemple}
Les deux arguments \marg{larg} et \marg{pos} sont optionnels et s'ils
sont omis, la largeur de la boîte est celle du texte. Le cas échéant
on saisit :
\indexcom{mbox}
\begin{ltxcode}
  \mbox{ø\marg{texte}ø}
\end{ltxcode}
au lieu de \verb+\makebox[][]{+\marg{texte}\verb+}+. On notera
également que l'option~\verb+s+ de la commande \ltxcom{makebox} permet
d'étirer le contenu pour qu'il fasse exactement la dimension imposée :
\begin{ltxexemple}
  \makebox[4cm][s]{Ouaaah quelle fatigue !}
\end{ltxexemple}

\paragraph{Avec bordure}
\index{boîte!bordure}
\index{cadre de boîte}
On construit une boîte entourée par une bordure grâce à la commande
\ltxcom{framebox} qui suit la même syntaxe que \ltxcom{makebox} :
\begin{ltxcode}
  \framebox[ø\marg{larg}ø][ø\marg{pos}ø]{ø\marg{texte}ø}
\end{ltxcode}
le raccourci \ltxcom{fbox}\verb+{+\marg{texte}\verb+}+ existe comme
pour les boîtes sans bordure. Ce qui donne :
\begin{ltxexemple}
  bon \framebox[1.5cm][c]{alors} voilà\par
  et \framebox[2.8cm][r]{ah oui} d'accord
  \par ou \fbox{alors}
\end{ltxexemple}
Deux longueurs permettent de changer l'allure des
\ltxcom{framebox} :
\begin{itemize}
\item \ltxlen{fboxsep} la distance entre la bordure et le texte,
\item \ltxlen{fboxrule} l'épaisseur du trait.
\end{itemize}
\begin{ltxexemple}
  \setlength{\fboxrule}{5pt} 
  rouge \framebox[2cm]{vert} bleu\par
  \setlength{\fboxrule}{0.4pt} 
  \setlength{\fboxsep}{8pt}
  cyan \framebox[2cm]{magenta} jaune
\end{ltxexemple}

\begin{nota}
  Un particularité des boîtes simples contrairement aux boîtes
  paragraphes que l'on rencontrera un peu plus loin dans ce chapitre,
  est qu'elles n'effectuent pas de césure, ainsi :
  \begin{ltxcode}
    === \framebox[3cm]{Ça ne risque pas d'être coupé, ça} ===
  \end{ltxcode}
\continuenota%
donnera :
\begin{center}
  === \framebox[3cm]{Ça ne risque pas d'être coupé, ça} ===
\end{center}
\continuenota%
On peut d'ailleurs exploiter cette fonctionnalité pour superposer du
texte (cf. paragraphe sur les boîtes de largeur nulle
\vpageref{sec-wizard-boite-simple-largeur-nulle}).

\end{nota}

\subsection{Manipulation de boîtes simples}
On peut avec un peu d'habitude faire subir aux boîtes des déplacements
dans toutes les directions.


\subsubsection{Translation verticale}
\index{boîte!positionnement}
\index{positionnement de boîte}
\index{translation de boîte}
La translation est permise grâce à la commande :
\indexcom{raisebox}
\begin{ltxcode}
  \raisebox{ø\marg{trans}ø}[ø\marg{prof}ø][ø\marg{haut}ø]{ø\marg{texte}ø}
\end{ltxcode}
où \marg{trans} est le déplacement que vous voulez infliger à
\marg{texte}. Par exemple :
\begin{ltxexemple}
  C'est haut \raisebox{8pt}{New York,} 
  New York \raisebox{-1ex}{USA.}
\end{ltxexemple}
Les deux arguments optionnels \marg{prof} et \marg{haut} permettent de
« faire croire » à \LaTeX{} que la boîte résultant de la
translation a une hauteur de \marg{haut} et une profondeur de
\marg{prof}. L'exemple suivant illustre l'utilisation de la commande
\ltxcom{raisebox} avec ses arguments optionnels. 
\begin{ltxcode}
    ligne 1 : XXXXX\\
    ligne 2 :
    XX\raisebox{0.8\baselineskip}{O}XX\\
    ligne 3 : XXXXX\\
    ligne 4 : XXXXX\\
    ligne 5 : 
    XX%
    \raisebox{0.8\baselineskip}[1ex][2ex]{O}XX\\
    ligne 6 : XXXXX\\
  \end{flushleft}
\end{ltxcode}
Donnera :
\begin{flushleft}
     \settowidth{\tmplength}{X}%
     \setlength{\fboxsep}{0pt}%
     \newcommand{\blob}{\makebox[\tmplength]{O}}%
     ligne 1 : XXXXX\\
     ligne 2 :
     XX\hspace{-\fboxrule}%
     \fbox{\raisebox{0.8\baselineskip}{\blob}}%
     \hspace{-\fboxrule}XX \\
     ligne 3 : XXXXX\\
     ligne 4 : XXXXX\\
     ligne 5 : 
     XX\hspace{-\fboxrule}%
     \fbox{\raisebox{0.8\baselineskip}[1ex][2ex]{\blob}}%
     \hspace{-\fboxrule}XX \\
     ligne 6 : XXXXX\\
   \end{flushleft}
On « soulève » un `O' au milieu de la ligne~2. La bordure met en
évidence la place occupée par la boîte soulevée\footnote{Cette bordure
  est insérée ici pour la compréhension du mécanisme.}. Au milieu de
la ligne~5, on soulève le même `O' mais cette fois en imposant les
dimensions (montrées par la bordure). \LaTeX{} considère donc que la
boîte résultant de la translation fait \texttt{1ex} de haut et
\texttt{2ex} de profondeur, il effectue les sauts de lignes en
conséquence.


\subsubsection{Translation horizontale}
\index{translation de boîte} Les translations horizontales ne sont pas
à proprement parler des caractéristiques des boîtes, puisqu'on les
obtient en insérant des \voir{sec-espace}{espaces} appropriées. Voici
un exemple :
\begin{ltxexemple}
  Non à la \makebox[1.5cm]{censure}%
  \hspace{-1.5cm}\makebox[1.5cm]{///////} 
  sur Internet.
\end{ltxexemple}
Notez que ce n'est pas forcément la meilleure façon de « hachurer »
un mot, mais  cela illustre la manière de déplacer un boîte
horizontalement, à l'aide d'un \ltxcom{hspace} négatif.


\subsubsection{Boîte simple de largeur nulle}
\label{sec-wizard-boite-simple-largeur-nulle}

Il est parfois utile de manipuler les boîtes de largeur nulle, par
exemple dans le cas où l'on souhaite superposer des éléments. En
imposant une dimension nulle en guise de premier argument optionnel de
la commande \ltxcom{makebox} :
\begin{ltxexemple}
  \newcommand{\grogra}{\huge\bfseries}
  avant\makebox[0cm][c]{\grogra C}après

  avant\makebox[0cm][l]{\grogra G}après
  
  avant\makebox[0cm][r]{\grogra D}après
\end{ltxexemple}
on produit bien une superposition mais l'alignement n'est pas
exactement celui auquel on s'attendait ; en effet
l'argument~\texttt{l} met le contenu \emph{à droite} du point
d'insertion de la boîte, et \emph{à gauche} pour
l'argument~\texttt{r}.

\subsubsection{Rotation}
\index{rotation!de boîtes} Il existe plusieurs extensions de \LaTeX{}
pour faire subir des rotations à des éléments de texte ; nous avons
choisi de présenter ici la commande \ltxcom{rotatebox} de l'extension
\ltxpack{graphicx} présentée au chapitre \ref{chap-graphix}. La
syntaxe en est la suivante : \indexcom{rotatebox}
\begin{ltxcode}
  \rotatebox{ø\marg{angle}ø}{ø\marg{texte}ø}
\end{ltxcode}
où \marg{angle} est l'angle dans le sens trigonométrique, et
\marg{texte} l'élément de texte à faire tourner :
\begin{ltxexemple}
  Attention \rotatebox{30}{virage}
  dangereux.
\end{ltxexemple}
\begin{note}
  La version actuelle de \soft{xdvi} n'est pas en mesure d'afficher
  les objets qui ont subi une rotation\footnote{L'objet est affiché
    mais sans la rotation.}. Cette lacune (avec quelques petites
  autres) sera peut-être corrigée dans les prochaines versions. La
  parade est de visualiser la sortie \postscript{} avec
  \soft{ghostview} ou \soft{gv}, ou la sortie \voir{chap-pdf}{Pdf}.
\end{note}

\subsection{Boîtes paragraphe}
\label{sec-boitepar}
\index{boîte!paragraphe}
Les boîtes dites \emph{boîtes paragraphe} ont la particularité de
pouvoir contenir des sauts de ligne et des sauts de paragraphe
(contrairement aux boîtes dites \emph{simples}). Il existe deux
manières de créer des boîtes paragraphe ; la première avec la commande
\ltxcom{parbox} :
\begin{ltxcode}
  \parbox[ø\marg{bpos}ø][ø\marg{hauteur}ø][ø\marg{tpos}ø]{ø\marg{largeur}ø}{ø\marg{contenu}ø}
\end{ltxcode}
où \marg{contenu} est l'élément de texte à mettre en boîte,
\marg{largeur} la largeur de la boîte à créer, \marg{bpos} un argument
optionnel précisant le point de référence. Cet argument optionnel est
à rapprocher de celui de l'environnement
\voir{sec-tableaux}{\ltxenv{tabular}}. Par exemple :
\begin{ltxcode}
   Voici   --- \parbox{2cm}{une boîte\\paragraphe}
   --- une --- \parbox[t]{2cm}{autre boîte\\paragraphe}
   --- et  --- \parbox[b]{2cm}{une boîte\\paragraphe}
\end{ltxcode}
qui donne (avec des bordures pour mettre en évidence les
dimensions des boîtes) :


\noindent Voici   ---  \fbox{\parbox{1.8cm}{une boîte\\paragraphe}}
--- une ---  \fbox{\parbox[t]{1.8cm}{autre boîte\\paragraphe}}
--- et  ---  \fbox{\parbox[b]{1.8cm}{une boîte\\paragraphe}}

\medskip Pour construire une boîte paragraphe en imposant sa hauteur,
on utilise l'argument optionnel \marg{hauteur}.  On peut alors
éventuellement préciser la position verticale \marg{tpos} du texte
dans la boîte. Par défaut \marg{tpos} vaut \marg{bpos}, et il peut
prendre les valeurs habituelles \texttt{c} pour centré, \texttt{t} et
\texttt{b} pour haut et bas ; plus une valeur : \texttt{s} pour
spécifier que le texte peut s'étirer (\texttt{s}tretch) sur toute la
hauteur de la boîte ---~dans ce cas c'est à l'utilisateur de positionner
le texte. Par exemple :
\begin{ltxcode}
---\parbox[b][2cm]{2cm}{haut\par milieu\par bas}} 
   \parbox[b][2cm][t]{2cm}{haut\parmilieu\par bas}}
   \parbox[b][2cm][c]{2cm}{haut\par milieu\par bas}}
   \parbox[b][2cm][s]{2cm}{haut\par 
      \vspace{\stretch{2}} milieu\par\vfill bas}}---
\end{ltxcode}
donne avec les \ltxcom{fbox} pour y voir un peu plus clair :
\medskip


---\fbox{\parbox[b][1.9cm]   {1.9cm}{haut\par milieu\par bas}}
\fbox{\parbox[b][1.9cm][t]{1.9cm}{haut\par milieu\par bas}}
\fbox{\parbox[b][1.9cm][c]{1.9cm}{haut\par milieu\par bas}}
\fbox{\parbox[b][1.9cm][s]{1.9cm}{haut\par\vspace{\stretch{2}}
    milieu\par\vfill bas}}---

\medskip Pour créer une boîte paragraphe, il peut être utile
d'utiliser l'environnement \ltxenv{minipage}, qui simule la création
d'une page avec d'éventuelles notes de bas de page, tableaux, listes,
etc\footnote{Cet environnement ne peut toutefois pas contenir de
  flottants.}. La syntaxe est analogue à \ltxcom{parbox} sauf qu'il
s'agit d'un environnement :
\begin{ltxcode}
  \begin{minipage}[ø\marg{bpos}ø][ø\marg{hauteur}ø][ø\marg{tpos}ø]{ø\marg{largeur}ø}
    ... \marg{texte}  ... 
  \end{minipage}
\end{ltxcode}
Voici un exemple :
\medskip

\noindent\parbox{0.40\textwidth}{%
  Pour une raison $x$, $y$ ou $z$, on peut vouloir
  raconter sa vie avec une \ltxenv{minipage}.  Comme dans cet exemple
  là $\longrightarrow$}%
\hfill%
\begin{minipage}{0.55\textwidth}
  Ce que j'ai à dire\footnote{C'est un bien grand mot.} 
  n'est pas à franchement parler :
 \begin{itemize}
 \item ni très intéressant ;
 \item ni particulièrement indispensable
 \end{itemize}
 mais bon, j'en parle quand même.

 J'avais autre chose à raconter mais ça m'est sorti de la tête...
\end{minipage}

\medskip
Dans cet exemple on a créé une \ltxenv{minipage} faisant la moitié
(55\%) de la largeur du texte, et contenant un environnement
\ltxenv{itemize} et une \ltxcom{footnote}. La boîte ainsi créée est
centrée par rapport au paragraphe « Pour une raison... » car l'argument
optionnel \marg{pos} est absent : \small
\begin{verbatim}
   \parbox{0.40\textwidth}{... 
       Comme dans cet exemple là $\longrightarrow$}\hfill
   \begin{minipage}{0.55\textwidth}
     Ce que j'ai à dire\footnote{C'est un bien grand mot.}
     n'est pas à franchement parler :
     \begin{itemize}
     \item ni très intéressant ;
     \item ni particulièrement indispensable
     \end{itemize}
     mais bon, j'en parle quand même.
     
     J'avais autre chose à raconter mais ça m'est sorti de 
     la tête...
   \end{minipage}
\end{verbatim}
\normalsize
\begin{note}
  Dans les boîtes paragraphe la longueur \ltxlen{parindent} est mise à
  zéro. Ce qui explique que « J'avais autre chose ... » dans l'exemple
  précédent n'est pas indenté. Enfin, contrairement aux cas des
  \ltxcom{parbox}s, lorsqu'on fait référence dans une
  \ltxenv{minipage} à la dimension \ltxlen{textwidth}, il s'agit de
  celle de la boîte et non de celle du texte.
\end{note}

\subsection{Petites astuces}
Toutes les fonctions concernant les boîtes peuvent prendre en
paramètre de longueur les dimensions suivantes :
\begin{itemize}
\item \makebox[2.3cm][l]{\ltxlen{width}} : la largeur du texte contenu,
\item \makebox[2.3cm][l]{\ltxlen{height}} : la hauteur du texte contenu,
\item \makebox[2.3cm][l]{\ltxlen{depth}} : la profondeur du texte contenu,
\item \makebox[2.3cm][l]{\ltxlen{totalheight}} : (hauteur +
  profondeur) du texte.
\end{itemize}
Il est alors possible de préciser les dimensions de la boîte relativement au
texte qu'elle contient. Ce qui peut être utile dans certaines
situations :
\begin{ltxexemple}
  une \framebox[.7\width]{boîte} à l'étroit.
  
  une \framebox[1.8\width]{boîte} au large.
  
  une \fbox{%
    \parbox[c][3\height]{1cm}{%
      boîte\\vide.}}
\end{ltxexemple}

\subsection{Sauvegarde et réutilisation}
\label{sec-svgreutil}
\index{boîte!sauvegarde} \index{sauvegarde de boîte} Il est possible
de stocker un extrait de code \LaTeX{} dans une boîte pour le
réutiliser ---~ceci par exemple lorsque ce code exige de \LaTeX{} des
ressources importantes ; dans ce cas on procède en 3 étapes :
\begin{enumerate}
\item déclaration d'une boîte avec la commande  \ltxcom{newsavebox},
\item stockage avec \ltxcom{sbox} ou \ltxcom{savebox},
\item réutilisation avec \ltxcom{usebox}.
\end{enumerate}

Par exemple voici une texture de Gnu : 
\begin{ltxexemple}
  \newsavebox{\gnu}
  \sbox{\gnu}{\fbox{\textsc{Gnu}}}
  \begin{center}
  \usebox{\gnu}\usebox{\gnu}\usebox{\gnu}\\
  \usebox{\gnu}\usebox{\gnu}\usebox{\gnu}\\
  \usebox{\gnu}\usebox{\gnu}\usebox{\gnu}
  \end{center}
\end{ltxexemple}
On peut faire une analogie entre le couple de commande \ltxcom{sbox}
et \ltxcom{savebox} et le couple \ltxcom{mbox} et \ltxcom{makebox}
(cf.  \S~\ref{sec-boitesimple}). 


%
% NEWCOMMAND ET COMPAGNIE
%
\section{Définitions}
\label{sec-newcommand}
\index{définition}
\index{macro}
Une nouvelle fois, laissons parler le maître :
\begin{unecitation}[D. E. Knuth in the \TeX book]
  \ldots they have come to be known as \textsl{macros} because they
  are so powerful; one little macro can represent an enormous amount
  of material, so it has a sort of macroscopic effect.
\end{unecitation}

Lorsque dans un document, on peut définir une « entité »
indépendante et que cette entité apparaît plus d'un « certain nombre
de fois » il est nécessaire de se poser la question de savoir s'il
n'est pas judicieux d'en faire une \emph{macro}. Voilà une phrase
vague ! Pour résumer, les macros sont là pour vous éviter de refaire
$x$~fois les mêmes choses. Avec un peu d'expérience, on peut définir
des commandes très pratiques et avec le temps de plus en plus
complexes.

\subsection{Commandes}
\label{wizard-commandes}

\index{commande!définitions}
\index{macro!définitions}
\index{définition!commandes}
La commande \ltxcom{newcommand} permet de définir une macro, son
utilisation est très simple :
\begin{ltxcode}
  \newcommand{ø\marg{nomcom}ø}[ø\marg{nargs}ø]{ø\marg{code \LaTeX}ø}
\end{ltxcode}
où \marg{nargs} est le nombre d'\emph{arguments} ---~au sens arguments
d'une fonction d'un langage de programmation~--- et \marg{code \LaTeX}
le code définissant votre commande.  Voici un exemple de macro,
définissant le symbole d'un espace de représentation utilisé en
colorimétrie :
\begin{ltxexemple}
  \newcommand{\lab}{$L^*a^*b^*$}
  Soit \lab{} l'espace...
\end{ltxexemple}
Notez que cette commande ne prend pas d'argument, il n'est donc pas
nécessaire ici d'utiliser l'argument optionnel \marg{nargs}. Pour
améliorer un peu l'utilisation de cette commande, on peut la définir
comme suit :
\begin{ltxexemple}
  \newcommand{\Lab}{%  
    \ensuremath{L^*a^*b^*}}
    L'espace \Lab{} et $\vec{c}\in\Lab$.
\end{ltxexemple}
\index{mathématiques!et définitions de commande}
La commande \ltxcom{ensuremath} permet de s'assurer que la commande
sera utilisée dans un environnement mathématique, quel que soit le
contexte, comme dans l'exemple ci-dessous.
\begin{note}
  Les macros ou commandes de \LaTeX{} ne sont pas tout à fait des
  fonctions au sens d'un langage de programmation, elles s'apparentent
  plutôt au \verb+#define+ du C. Et en ce sens, elles suivent le
  mécanisme d'\emph{expansion}. Ainsi, dans le premier exemple de la
  fonction \ltxcom{Lab}, \verb+\Lab+ se « déploie » en 
  \verb+$L^* a^* b^*$+. On comprend donc pourquoi, \verb+$...\Lab$+ 
  aurait généré  une erreur de compilation.
\end{note}

Voici une commande utilisant un argument : elle permet de dessiner une
touche de clavier\footnote{Cette commande fait appel à la commande
  \ltxcom{Ovalbox} définie dans le package \ltxpack{fancybox}.} :
\begin{ltxexemple}
  \newcommand{\Touche}[1]{\Ovalbox{#1}}
  Appuyer sur \Touche{Tab} 
     puis sur \Touche{Entrée}
\end{ltxexemple}
On voit donc que cette commande attend \emph{un} argument (c'est le sens de «
\verb+[1]+ ») et qu'on fait référence à cet argument dans la définition
de la commande avec~\verb+#1+.


\index{argument!de commandes}
Si l'on souhaite définir une fonction avec plusieurs arguments
(9 au maximum), \emph{no problemo :}
\begin{ltxexemple}
  \newcommand{\fraction}[2]{%
    \raisebox{0.5ex}{#1}%
    \slash\raisebox{-0.5ex}{#2}}
  \fraction{1}{2} et \fraction{3}{4} font
  \fraction{5}{4}
\end{ltxexemple}
On remarquera donc que :
\begin{itemize}
\item la macro \ltxcom{fraction} prend 2 arguments,
\item on fait référence au $n$\ieme{} argument avec \verb+#n+,
\item les caractères \verb+%+
  s'il vous paraissent saugrenus, permettent d'insérer des sauts de
  ligne dans le code sans insérer d'espace dans le document (voir
  aussi le paragraphe~\vref{sec-outillage-pourcents} à ce sujet).
\end{itemize}

\medskip
\index{argument!optionnel} Il est également possible de  définir une commande dont le
premier argument est optionnel. La syntaxe est alors la suivante :
\indexcom{newcommand}
\begin{ltxcode}
  \newcommand{ø\marg{nomcom}ø}[ø\marg{narg}ø][ø\marg{arg defaut}ø]{ø\marg{code \LaTeX}ø}
\end{ltxcode}
où \marg{narg} est le nombre d'arguments, sachant que \verb+#1+ sera
l'argument par défaut, \marg{arg defaut} est la valeur que prend
\verb+#1+ par défaut, et \marg{code \LaTeX} le code de la commande.
Voici par exemple une autre approche de la commande vue précédemment,
qui dessine une touche de clavier :
\begin{ltxexemple}
  \newcommand{\Key}[1][Enter]{\Ovalbox{#1}}
  Appuyer sur \Key[Tab]{} puis sur \Key{}
\end{ltxexemple}
On voit donc que l'argument $1$ est facultatif et sa valeur par
défaut est : « Entrée ». On notera également que l'utilisation de
l'argument optionnel requiert des crochets et non des accolades. 
\begin{nota}
  On peut très bien imaginer que l'on ait à définir une commande ayant
  un argument optionnel et un ou plusieurs arguments obligatoires.
  Dans ce cas le premier argument obligatoire sera \verb+#2+. D'autre
  part, notez qu'on ne peut rendre optionnel que le \textbf{premier
    argument} d'une commande.
\end{nota}


\subsection{Environnement}
\label{sec-wizard-def-environnement}

\index{définition!environnement}
\index{environnement!définition}
Il est possible de définir ses propres environnements de la manière
suivante :
\indexcom{newenvironment}
\begin{ltxcode}
  \newenvironment{ø\marg{nom env}ø}[ø\marg{narg}ø]{ø\marg{clause begin}ø}{ø\marg{clause end}ø}
\end{ltxcode}
où \marg{nom env} est le nom de l'environnement ainsi défini,
\marg{narg} le nombre d'arguments, et \marg{clause begin} et
\marg{clause end} les « pré » et « post » traitements de
l'environnement.  Il est pratique de définir des environnements à
partir d'autres, par exemple les environnements de \LaTeX{} :
\begin{ltxexemple}
  \newenvironment{bonmot}%
  {\small\slshape\begin{flushright}}%
  {\end{flushright}\normalsize\upshape}
  \begin{bonmot}
    L'homme a reçu de la nature\\ 
    une clef\\
    avec laquelle il remonte la femme\\
    toutes les vingt-quatre heures.
  \end{bonmot}
\end{ltxexemple}
Il est vrai que ce « bon mot » serait un peu douteux si l'on ne citait
son auteur. On peut y remédier en ajoutant à notre environnement un
argument. Les arguments sont accessibles par \verb+#+ mais ne sont
visibles que dans la clause \verb+begin+.  On contourne ceci en
sauvant l'argument dans une boîte que l'on
\voir{sec-svgreutil}{réutilise} dans la clause \verb+end+ :
\begin{ltxexemple}
  \newsavebox{\auteurbm}
  \newenvironment{Bonmot}[1]%
    {\small\slshape%
    \savebox{\auteurbm}{%
      \upshape\sffamily#1}%
    \begin{flushright}}
    {\\[4pt]\usebox{\auteurbm}
    \end{flushright}\normalsize\upshape}
  \begin{Bonmot}{Victor Hugo}
    L'homme a reçu de la nature\\
    une clef\\
    avec laquelle il remonte la femme\\
    toutes les vingt-quatre heures.
  \end{Bonmot}
\end{ltxexemple}
La citation n'en reste certes pas moins douteuse...
\palironglet

\subsection{Redéfinitions}
\index{redéfinitions}
\index{environnement!redéfinition}
\index{commande!redéfinition}
\index{macro!redéfinition}
Il est possible de \emph{redéfinir} commandes et environnements avec :
\indexcom{renewcommand}
\begin{ltxcode}
  \renewcommand{ø\marg{nomcom}ø}[ø\marg{nargs}ø]{ø\marg{code\TeX}ø}
\end{ltxcode}
pour les commandes et :
\indexcom{renewenvironment}
\begin{ltxcode}
  \renewenvironment{ø\marg{nom\_env}ø}[ø\marg{narg}ø]
                   {ø\marg{clause\_begin}ø}{ø\marg{clause\_end}ø}
\end{ltxcode}
pour les environnements.  On redéfinit les commandes essentiellement
pour \emph{personnaliser} le comportement facétieux de \LaTeX{}. On
procède alors de la manière la plus naturelle qui soit, par exemple :
\begin{ltxcode}
  \renewcommand{\thepage}{\Roman{page}}
\end{ltxcode}
numérote les pages en chiffre romain majuscule.
\begin{nota}
  La modification du comportement par défaut de \LaTeX{} est un sujet
  très vaste qui dépasse le cadre de cette partie. Mais sachez que si
  vous modifiez une commande ou un environnement dont vous ne
  maîtrisez pas toutes les fonctionnalités, attendez vous à des
  résultats bizarres ! La lecture de la deuxième partie présente le
  moyen de redéfinir certaines commandes de \LaTeX{}.
\end{nota}

%\section{Fragilité des commandes}
%Un petit avertissement : les commandes de \LaTeX{} sont dites soit
%\emph{robustes} soit \emph{fragiles}. Le caractère fragile d'une
%commande sous-entend que cette commande doit être \emph{protégée} par
%la commande \ltxcom{protect}.
%On protègre une commande fragile lorsqu'elle fait partie de l'argument
%d'un commande qui touche 


\section{Mais encore ?}
Si vous avez l'intention de créer des fichiers contenant des commandes
de votre crû, vous devez ajouter la ligne :
\index{texinputs@\texttt{TEXINPUTS}!variable d'environnement}
\index{variable d'environnement!\texttt{TEXINPUTS}}
\begin{verbatim}
  export TEXINPUTS=$HOME/LaTeX/mesmacros//:
\end{verbatim}
dans votre \texttt{.bash\_profile} si vous utilisez \soft{bash}, pour
que \LaTeX{} cherche aussi les fichiers dans le répertoire
\verb+$HOME/LaTeX/mesmacros+ (c'est un exemple) et ses
sous-répertoires. Une ligne avec la directive \ltxcom{usepackage}\verb+{moncru}+ vous
permettra alors d'utiliser votre ensemble de commandes. \LaTeX{}
cherchera alors le fichier \verb+moncru.sty+. Une autre solution est
d'utiliser la commande \ltxcom{input}\verb+{moncru.sty}+.

Dans la plupart des distributions de \LaTeX{}, un fichier nommé
\texttt{texmf.cnf} définit un certain nombre de paramètres permettant
de configuer le moteur \LaTeX{} et notamment les chemins de recherche
des fichiers. Vous pouvez savoir où se trouve ce fichier grâce à la
commande :
\begin{unixcom}
  kpsewhich texmf.cnf
\end{unixcom}
D'autre part, il existe un mécanisme autorisant l'utiliseur lambda à
stocker ses propres commandes en dehors de l'arborescence de la
distribution de \LaTeX{}. Pour connaître ce dossier :
\begin{unixcom}
  kpsewhich -var-value=TEXMFHOME
\end{unixcom}
Sur mon système (\TeX{}Live Ubuntu) cette commande renvoie :
\begin{verbatim}
  /home/lozano/texmf
\end{verbatim}
indiquant que le système cherchera les fichiers à inclure dans le
répertoire \verb+texmf+ de mon répertoire privé. Il est alors possible
placer ses extensions « maison » dans le répertoire
\verb+~/texmf/tex/latex+.

Un dernier conseil : pour pouvoir définir vos commandes ou
environnements de manière plus confortable, nous vous recommandons de jeter un
petit coup d'\oe{}il sur :
\begin{itemize}
\item l'extension
  \voir{sec-outillage-structure-de-controle}{\ltxpack{ifthen}} qui
  propose des structures de contrôle de type « si-alors-sinon » et
  « faire-tant-que », \index{si-alors-sinon} \index{faire-tant-que}
\item le package \ltxpack{calc} qui permet d'effectuer des
  opérations arithmétiques sur les compteurs et les longueurs.
\item enfin l'environnement \voir{sec-outillage-list}{\ltxenv{list}}
  qui peut être un bon point de départ pour se définir un
  environnement de type liste.  \index{liste}
\end{itemize}
Ces extensions et leur utilisation sont présentées en détail dans la
deuxième partie de ce manuel.





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