\chapter{De nouveaux jouets}
\label{chap-jouets}

\begin{epigraphe}{Le Cantique des cantiques Ct \textbf{7} 11}
  Je suis à mon bien-aimé,  Et ses désirs se portent vers moi.\\
  Viens, mon bien-aimé, sortons dans les champs, Demeurons dans les villages!\\
  Dès le matin nous irons aux vignes,  Nous verrons si la vigne
  pousse, \\
  Si la fleur s'ouvre, Si les grenadiers fleurissent.\\
  Là je te donnerai mon amour.
\end{epigraphe}


\begin{introchap}{Nous présentons} dans ce chapitre les outils qui ont
  été créés spécialement pour ce manuel. Pour comprendre la plupart
  des commandes et environnements définis ici, il est impératif
  d'avoir lu les deux précédents chapitres...  Il est question dans ce
  chapitre de la manière dont le nota avec panneau danger a été créé,
  des lettrines apparaissant en début de chapitres, du sommaire, du
  glossaire, des onglets contenant le numéro du chapitre courant, et
  enfin de l'environnement permettant de produire du code \LaTeX{} et
  son interprétation côte à côte.
\end{introchap}

\section{Quelques bricoles}


\subsection{Arguments et convention typographique}
\label{sec-jouets-marg}

Dans un document parlant de langage informatique, il est important de
faire ressortir clairement les arguments de commande ou de fonction.
Par exemple on écrira : 
\labelexemple{ex-marg}
\begin{ltxexemple}
  Pour compiler le fichier \bwarg{fichier} :
  \begin{flushleft}
    \ttfamily latex \bwarg{fichier}
  \end{flushleft}
\end{ltxexemple}
La commande \ltxcom{bwmarg} écrit son argument en \textsl{fonte
  penchée}, entre les symboles~$\langle$ et~$\rangle$ produits
respectivement par les commandes \ltxcom{langle} et \ltxcom{rangle} en
mode mathématique. De plus vous aurez sans doute remarqué qu'on peut
utiliser une notation indicée comme ci-dessous :
\begin{ltxexemple}
  Pour copier des fichiers :
  \begin{flushleft}\ttfamily 
    cp \bwarg[1]{fichier} ... 
    \bwarg[n]{fichier}
    \bwarg[dst]{fichier}
  \end{flushleft}
\end{ltxexemple}
La commande \ltxcom{bwarg}\footnote{Pour « black \& white »
  argument...} est définie comme suit :
\begin{ltxcode}
  \newcommand{\marg}[2][]{%
    {\normalfont%
      \textsl{$\langle$#2%
        % si l'argument optionnel est présent
        \ifthenelse{\equal{#1}{}}{}
        {$_\mathit{#1}$}% on l'affiche en indice
        $\rangle$}}}%
\end{ltxcode}
La commande \ltxcom{normalfont} permet de revenir à la fonte par
défaut dans le document. Ce qui explique que « \bwarg{fichier} »
n'apparaît pas en fonte machine à écrire dans l'exemple~\ref{ex-marg}.

Dans la version électronique du document ---~version lue sur un
écran~--- il a été décidé, pour la mise en évidence, d'utiliser la
\emph{couleur} plutôt que les caractères~$\langle$ et~$\rangle$. Ainsi on
peut définir la commande \ltxcom{colarg} :
\begin{ltxcode}
  \newcommand{\colarg}[2][]{{%
      \normalfont\color{blue!90}#2% un bleu
      \ifthenelse{\equal{#1}{}}{}{$_\mathit{#1}$}}}
\end{ltxcode}
On pourra ensuite grâce à un \voir{outillage-sec-boolean}{booléen}
habilement positionné, définir une commande générique \ltxcom{marg}
faisant appel à l'une ou l'autre des versions (noir \& blanc ou
couleur) :
\begin{ltxcode}
  \ifversionenligne
     \let\marg\colarg
  \else
     \let\marg\bwarg
  \fi
\end{ltxcode}
Cette construction fait appel à la commande \ltxcom{let} de \TeX{}
présentée de manière lumineuse à la section~\vref{sec-outillage-let}.

\subsection{Autour de la génération de l'index}
\label{sec-jouets-index}

Lorsque dans le texte du présent manuel, il est question d'une
commande, d'un environnement, d'un package, d'une classe de document,
etc. il est fait appel à une commande particulière insérant
automatiquement une entrée dans l'index. Ainsi par exemple :
\begin{ltxexemple}
  Le package \ltxpack{varioref} permet
  d'utiliser la commande \ltxcom{vref}...
\end{ltxexemple}
La commande \ltxcom{ltxpack} est définie comme suit. Tout d'abord :
\begin{ltxcode}
  \newcommand{\ltx@pack}[1]{%
    \upshape\textsf{#1}}
\end{ltxcode}
définissant la commande \ltxcom{ltx@pack} permettant simplement
de produire le nom du package en sans sérif. On définit ensuite :
\begin{ltxcode}
  \newcommand{\ltxpack}[1]{%
    \ltx@pack{#1}%
    \protect\index{extensions!\protect\texttt{#1}}%
    \protect\index{#1@\protect\textsf{#1 extension}}}
\end{ltxcode}
qui appelle la commande précédente, et qui insère deux entrées dans
l'index. Une de la forme « \marg{nom du package} extension » et l'autre
comme \voir{science-index}{sous-entrée} de « extensions ». La commande
\ltxcom{protect} permet ici d'éviter les ennuis si la commande
\ltxcom{ltxpack} est elle-même en argument d'une autre commande.
Dans un même ordre d'idée, la commande \ltxcom{ltxcom} est définie
tout d'abord par :
\begin{ltxcode}
  \newcommand{\ltx@com}[1]{%
    \texttt{\symbol{92}#1}}
\end{ltxcode}
permettant de produire en fonte machine à écrire, le nom de la
commande précédé du caractère \verb+\+. La commande \ltxcom{symbol}
%\verb+\+
est une commande \LaTeX{} permettant d'insérer ici le 92\ieme{}
caractère de la fonte sélectionnée (en l'occurrence le backslash). On
peut alors définir la commande finale :
\begin{ltxcode}
  \newcommand{\ltxcom}[1]{%
    \ltx@com{#1}%
    \index{#1@\protect\texttt{\symbol{92}#1}}}
\end{ltxcode}
qui appelle la commande précédente et introduit une entrée dans
l'index.  L'idée à retenir, c'est qu'il est peut être utile de définir
des commandes pour insérer automatiquement des entrées dans l'index.
On pourrait par exemple définir une commande :
\begin{ltxcode}
  \newcommand{\jargonanglais}[1]{%
    \emph{#1}%
    \index{#1}}
\end{ltxcode}
permettant à la fois de formater les mots du jargon en anglais, et de
les insérer dans l'index, voire dans un index spécial. De même si un
mot revient souvent dans un document on peut définir une commande pour
le produire et l'insérer dans l'index. Par exemple dans ce manuel, on
a défini :
\begin{ltxcode}
  \newcommand{\postscript}{%
    PostScript%
    \protect\index{PostScript}}
\end{ltxcode}

\subsection{Des renvois}

La version « papier » de ce document est parsemée de renvois comme
celui-ci parlant de
\makeatletter\v@irpapier{chap-glossaire}{glossaire}\makeatother{} qui n'a
strictement rien à voir avec le propos du moment\footnote{Je veux dire
  que nous ne sommes pas en train de parler de glossaire, ou alors
  vous ne suivez pas du tout...} si ce n'est qu'il s'agit d'un renvoi.
La commande mise en \oe uvre pour les renvois a été baptisée
\ltxcom{voir} et attend deux arguments :
\begin{ltxcode}
  \voir{ø\marg{label cible}ø}{ø\marg{texte objet du renvoi}ø}
\end{ltxcode}
Par exemple, le renvoi précédent a été produit par :
\begin{ltxcode}
  \voir{chap-glossaire}{glossaire}
\end{ltxcode}
Toute la « difficulté » de la conception de cette commande réside dans
l'orientation des triangles qui dépend de la parité de la page. Cette
difficulté peut être levée grâce à l'utilisation du package
\ltxpack{chngpage} comme expliqué au
paragraphe~\vref{sec-outillage-parite-page}.

Le reste concerne la mise en page des triangles. Pour cela deux
commandes ont été définies, produisant chacunes les renvois dans la
marge et les marques dans le texte. D'où la forme de la commande
\ltxcom{voir} :
\begin{ltxcode}
  \newcommand{\voir}[3][\S]{%
    \checkoddpage%
    \ifcpoddpage
      \v@irpageimpaire{#1}{#2}{#3}}{% renvoi sur page impaire
    \else
      \v@irpagepaire{#1}{#2}{#3}}}  % renvoi sur page paire
    \fi
\end{ltxcode}
On notera qu'outre les deux arguments obligatoires, la commande
accepte un argument optionnel défini par défaut comme étant le
caractère de paragraphe (\S). Les deux commandes
\ltxcom{v@irpageimpaire} et \ltxcom{v@irpagepaire} sont symétriques
l'une de l'autre et ont pour objet :
\begin{enumerate}
\item\ifframabookversion de placer un triangle du « bon côté » du texte
  faisant l'objet du renvoi \else d'encadrer le texte objet du renvoi
  par des triangles correctement orientés ; \fi
\item de produire une note marginale avec la cible du renvoi.
\end{enumerate}
Les triangles sont obtenus à l'aide de symboles contenus dans le
package \ltxpack{amssymb} :
\begin{ltxexemple}
  Oh les \og joulis\fg{} triangles :
  $\blacktriangleleft$ et
  $\blacktriangleright$ !
\end{ltxexemple}

\ifframabookversion%
Voici finalement la commande permettant de faire un renvoi dans le cas
d'une page paire : 
\begin{ltxcode}
  \newcommand{\v@irpageimpaire}[3]{%
    {\tiny$\blacktriangleright$}#3% le renvoi dans le texte
    \marginpar{%
      \parbox[t]{.9\marginparwidth}{% 
        {\footnotesize\sffamily%
          \hfill#1~\ref{#2}}~{\small$\blacktriangleleft$}\\
        {\footnotesize\sffamily%
          \mbox{}\hfill p.~\pageref{#2}\hfill\mbox{}}}}
\end{ltxcode}
On notera donc que la partie du renvoi qui réside dans la marge a été
inclue dans une \voir{sec-boitepar}{\ltxcom{parbox}} dans laquelle le
numéro du paragraphe et le numéro de la page sont produits sur deux
lignes. \else%
Le petit triangle à plat est obtenu grâce à la commande suivante :
\begin{ltxcode}
  \newcommand{\petit@triangle}{%
    \makebox[2.5pt]{\tiny$\blacktriangle$}}  
\end{ltxcode}
\makeatletter
On peut alors écrire :
\begin{ltxexemple}
  Mais, il sont tous \petit@triangle{}petits
  ces \petit@triangle{}triangles...
\end{ltxexemple}
\makeatother Il n'est pas inutile de noter l'usage de la boîte de deux
points et demi de large pour faire croire à ce naïf de \LaTeX{} que
c'est la largeur effective de \ltxcom{blacktriangle}. Ce qui n'est
bien entendu pas le cas, mais contribue à coller ce « petit triangle »
au mot qui le suit. Je sens que vous n'êtes pas convaincu, donc :
\begin{ltxexemple}
  Mais, il sont tous {\tiny$\blacktriangle$}%
  petits ces {\tiny$\blacktriangle$}triangles...  
\end{ltxexemple}

Voici finalement la commande permettant de faire un renvoi dans le cas
d'une page paire :
\begin{ltxcode}
  \newcommand{\v@irpagepaire}[3]{%
    \petit@triangle#3{\small$\blacktriangleleft$}% le renvoi est à gauche
    \marginpar{{\small% on écrit en petit dans la marge
        % le numéro et la page de la cible du renvoi...
        $\blacktriangleright$ #1~\ref{#2} p.~\pageref{#2}}}}
\end{ltxcode}
\fi
Pour la page impaire il faut faire la même chose que pour la page
paire, mais en tenant compte que c'est une page impaire~\jeblague{}

Dans la version « en ligne » les renvois apparaissent comme un lien
hypertexte. Ceci est facilement réalisable grâce à la commande
\ltxcom{hyperref} du package éponyme. On aura donc quelque chose du
genre :
\begin{ltxcode}
  \newcommand{\voir}[3][\S]{% 
    \hyperref[#2]{#3}}
\end{ltxcode}
L'argument optionnel ne sert ici à rien d'autre qu'à assurer la
compatibilité avec la version « papier » de la commande \ltxcom{voir}.

% \ifframabookversion Bon si vous êtes attentif vous aurez remarqué que
% le code précédent ne peut générer des renvois tels qu'ils apparaissent
% dans la version du document que vous lisez fébrilement en ce
% moment-même. En effet, la partie du renvoi qui réside dans la marge a
% été inclue dans une \voir{sec-boitepar}{\ltxcom{parbox}} dans laquelle
% le numéro du paragraphe et le numéro de la page sont produits sur deux
% lignes.\fi

\subsection{Changement de marges}
\label{sec-jouets-agrandirmarge}

À plusieurs reprises dans ce document, j'ai eu recours à des
changements de marges provisoires. C'est le cas notamment des
exemples de code \LaTeX{} avec le résultat en face, ou pour les
épigraphes. Pour ce faire, Marie-Paul \nom{Kluth}\footnote{Qui possède
  un lom prédestilé...} qui maintient la Faq française de \LaTeX{}
avait suggéré un environnement ressemblant à celui-ci :
\begin{ltxcode}
  \newenvironment{changemargin}[2]%
  {\begin{list}{}{%
    \setlength{\listparindent}{\parindent}%
    \setlength{\itemindent}{\parindent}%
    \setlength{\leftmargin}{#1}%
    \setlength{\rightmargin}{#2}%
  }\item }%
{\end{list}}
\end{ltxcode}
L'idée est donc de définir une liste dont on change les marges. Les
deux arguments qu'attend cet environnement correspondent
respectivement aux dimensions des marges gauche et droite. Une idée
intéressante serait celle d'un environnement dans lequel les marges
ont des dimensions différentes selon la parité de la page. Un tel
environnement peut être défini comme suit :
\begin{ltxcode}
  \newenvironment{agrandirmarges}[2]{%
  \begin{list}{}{%
      \setlength{\topsep}{0pt}%
      \setlength{\listparindent}{\parindent}%
      \setlength{\itemindent}{\parindent}%
      \setlength{\parsep}{0pt plus 1pt}%
      \checkoddpage%
      \ifcpoddpage
        \setlength{\leftmargin}{-#1}
        \setlength{\rightmargin}{-#2}
      \else
        \setlength{\leftmargin}{-#2}
        \setlength{\rightmargin}{-#1}
      \fi}\item }%
  {\end{list}}
\end{ltxcode}
Notez qu'on utilise ici la commande \ltxcom{isodd} pour tester la
parité de la page.
\begin{figure}[tb]
  \centering
  \newcommand{\graphtex}{%
    \includegraphics[height=2cm]{knuth-tex}}
  \begin{agrandirmarges}{1.2cm}{1.3cm}
    \begin{center}
      \graphtex\graphtex\graphtex\graphtex\graphtex%
      \graphtex\graphtex\graphtex\graphtex\graphtex%
      \graphtex\graphtex\graphtex\graphtex%
    \end{center}
  \caption[Une figure qui ne sert à rien...]{Une figure qui ne sert à
    rien si ce n'est à montrer qu'on peut momentanément changer les
    marges gauche et droite quand on a besoin de place...}
  \label{fig-epilogue-marge}
  \end{agrandirmarges}
\end{figure}
La figure~\vref{fig-epilogue-marge} montre un exemple d'utilisation de
cet environnement avec le code suivant :
\begin{ltxcode}
  \begin{figure}[tb]
    \begin{agrandirmarges}{1cm}{2cm}
      % ici on a  1cm de plus côté « reliure »
      %        et 2cm de plus côté « bord »
      ...
      \caption{Une figure qui ne sert à rien...}
    \end{agrandirmarges}
  \end{figure}
\end{ltxcode}


\section{Des nota}
\label{sec-nota}

Les pictogrammes\footnote{L'idée de ces pictogrammes a été inspirée par
  la lecture de \TeX{}book, comme je l'explique en introduction.}
\ifframabookversion%
proviennent d'une collection de « cliparts » (\url{...})  \else%
ont été « conçus » avec le logiciel \soft{xfig} \fi%
et sont représentés à la figure~\vref{fig-notabene} en trois
centimètres de large.
\begin{figure}[htbp]
  \begin{center}
    \includegraphics[width=3cm]{\ficnota}\quad%
    \includegraphics[width=3cm]{\ficnote}\quad%
    \includegraphics[width=3cm]{\ficnotahack}
  \end{center}
  \caption{Les pictogrammes du manuel}
  \label{fig-notabene}
\end{figure}
Les « nota » insérés ça et là dans le document, ont été produits
par un environnement défini par votre serviteur,  basé sur une
fonctionnalité de niveau \TeX{} découverte lors de mes laborieuses
lecture du \TeX{}Book : la commande \ltxcom{parshape}. Cette commande
permet de donner une forme arbitraire à un paragraphe :
\begin{ltxexemple}
      \parshape=5 
      1.5cm 2.5cm 
      1.5cm 2.5cm 
      1cm 2cm
      1cm 2cm
      0pt \textwidth 
  a a a a a a a a a a a a a a a a a a a
  a a a a a a a a a a a a a a a a a a a
  a a a a a a a a a a a a a a a a a a a
\end{ltxexemple}
Le nombre suivant le signe `=' permet de spécifier le nombre de lignes
auxquelles on imposera une déformation. Suivent ensuite des couples de
dimensions indiquant le retrait et la longueur de chaque ligne
déformée. Dans l'exemple ci-dessus :
\begin{itemize}
\item les deux premières lignes auront un retrait de deux centimètres et
  mesureront chacune trois centimètres ;
\item les deux lignes suivantes seront indentées d'un centimètre et
  mesureront deux centimètres ;
\item la cinquième et dernière spécification détermine l'allure de
  toutes les lignes restantes : retrait de zéro centimètre et longueur
  de la ligne égale à la longueur prédéfinie~\ltxlen{textwidth}.
\end{itemize}
Pour insérer un nota dans un paragraphe, on va donc déplacer les deux
premières lignes à l'aide de cette commande. 


\newlength{\larnota}
\newlength{\indnota}
\newlength{\largligne}
\newlength{\padnota}
\begin{ltxexemple}
  \setlength{\larnota}{.9cm}
  \setlength{\largligne}{%
    \textwidth-\larnota}
  \parshape=3
  \larnota\largligne
  \larnota\largligne
  0pt\textwidth  
  \noindent Attention ce paragraphe a 
  uniquement pour but de montrer que l'on 
  peut décaler deux lignes dans un 
  paragraphe et ensuite continuer comme 
  si de rien n'était...
\end{ltxexemple}
Bon, il reste à essayer de mettre l'image dans le « trou » laissé par
la commande \ltxcom{parshape}. Essayons simplement :
\begin{ltxexemple}
  \setlength{\larnota}{.9cm}
  \setlength{\largligne}{%
    \textwidth-\larnota}
  \parshape=3
  \larnota\largligne\larnota\largligne
  0pt\textwidth\noindent% 
  \includegraphics[width=\larnota]{%
    \ficnota}
  Attention ce paragraphe a uniquement
  pour but de montrer que l'on peut décaler
  deux lignes dans un paragraphe [...]
\end{ltxexemple}
Évidemment, l'image se pose sur la ligne comme n'importe quel autre
caractère. On la met dans une boîte de largeur nulle dont le contenu
est aligné à droite :
\begin{ltxexemple}
  \setlength{\larnota}{.9cm}
  \setlength{\largligne}{%
    \textwidth-\larnota}%
  \parshape=3
  \larnota\largligne\larnota\largligne%
  0pt\textwidth\noindent% 
  \makebox[0pt][r]{%
    \includegraphics[width=\larnota]{%
      \ficnota}}%
  Attention ce joli paragraphe a
  uniquement pour but de montrer que 
  l'on peut décaler deux lignes dans 
  un paragraphe [...]
\end{ltxexemple}
Il reste à faire subir au pictogramme, une translation verticale (le
pictogramme est pratiquement carré, on se sert donc de la dimension
\ltxlen{indnota}) :
\begin{ltxexemple}
  \setlength{\larnota}{.9cm}
  \setlength{\largligne}{%
    \textwidth-\larnota}
  \parshape=3
  \larnota\largligne\larnota\largligne
  0pt\textwidth\noindent% 
  \raisebox{-\larnota}{%
    \makebox[0pt][r]{%
      \includegraphics[width=\larnota]{%
        \ficnota}}}%
  Attention ce joli paragraphe a uniquement
  pour but de montrer que l'on peut décaler
  deux lignes dans un paragraphe [...]
\end{ltxexemple}
Bon, encore raté, il faut faire croire à \LaTeX{} que la boîte qu'on
translate verticalement est de taille nulle :
\begin{ltxexemple}
  \setlength{\larnota}{.9cm}
  \setlength{\largligne}{%
    \textwidth-\larnota}
  \parshape=3
  \larnota\largligne\larnota\largligne
  0pt\textwidth\noindent% 
  \raisebox{-\larnota}[0pt][0pt]{%
    \makebox[0pt][r]{%
    \includegraphics[width=\larnota]{%
      \ficnota}}}%
  Attention ce joli paragraphe a uniquement
  pour but de montrer que l'on peut décaler
  deux lignes dans un paragraphe [...]
\end{ltxexemple}
On y est presque. Deux ajustements sont nécessaires :
\begin{itemize}
\item la boîte est un peu trop basse, puisque la ligne de référence
  est le bas de la ligne du texte. Par conséquent on peut
  enlever~\verb+1ex+ (la hauteur d'un caractère) à la translation ;
\item il serait bon d'ajouter un espace entre le pictogramme est le
  texte. On définit pour cela une longueur~\ltxlen{padnota}.
\end{itemize}
\begin{ltxexemple}
  \setlength{\padnota}{5pt}
  \setlength{\larnota}{.9cm}
  \setlength{\indnota}{\larnota+\padnota}
  \setlength{\largligne}{%
    \textwidth-\indnota}
  \parshape=3
  \indnota\largligne\indnota\largligne
  0pt\textwidth\noindent% 
  \raisebox{-\larnota+2.2ex}[0pt][0pt]{%
    \makebox[0pt][r]{%
    \includegraphics[width=\larnota]{%
      \ficnota}%
    \hspace*{\padnota}}}%
  Attention ce joli paragraphe a uniquement
  pour but de montrer qu'on peut décaler
  deux lignes dans un paragraphe [...]
\end{ltxexemple}
Et ouala ! Il ne reste « qu'à » modifier ce code pour créer un nouvel
environnement. La technique choisie ici est de se baser sur
l'environnement \ltxenv{list} présenté au
paragraphe~\vref{sec-outillage-list}. Le code complet de
l'environnement est le suivant :
\begin{ltxcode}
% on passe le nom du fichier en argument
\newenvironment{pictonote}[1]{%
  \begin{list}{}{%
      \setlength{\labelsep}{0pt}%
      \setlength{\rightmargin}{15pt}}
  \item%
    \setlength{\indentationnota}{%
      \@totalleftmargin+\largeurnota+\paddingnota}%
    \setlength{\largeurlignenota}{%
      \linewidth-\largeurnota-\paddingnota}%
    \parshape=3%
    \indentationnota\largeurlignenota%
    \indentationnota\largeurlignenota%
    \@totalleftmargin\linewidth%
    \raisebox{-\largeurnota+2.2ex}[0pt][0pt]{%
      \makebox[0pt][r]{%
        \includegraphics[width=\largeurnota]{#1}%
        \hspace{\paddingnota}}}%
    \ignorespaces}{%
  \end{list}}
\end{ltxcode}
\begin{nota}
  On notera l'utilisation de la dimension \ltxlen{@totalleftmargin}
  permettant d'obtenir la largeur de la marge de gauche dans une
  liste, en tenant compte d'éventuelles imbrications. En effet la
  dimension \ltxlen{leftmargin} dans une liste correspond à la marge
  de gauche \emph{relativement} à l'environnement contenant la dite
  liste.
\end{nota}
On pourra ensuite utiliser cet environnement en lui passant en
paramètre un fichier particulier, ou mieux définir un nouvel
environnement par exemple :
\begin{ltxcode}
  \newenvironment{nota}{%
    \begin{pictonote}{ø\marg{votre fichier}ø}}{\end{pictnote}}
\end{ltxcode}
\begin{notahack}
  Pour terminer cette section sur les nota il faut savoir que cet
  environnement a un défaut : Si un nota contient un saut de
  paragraphe, un espace est de nouveau laissé libre pour un
  pictogramme

  Oui oui comme dans celui-ci, vous voyez bien qu'il y a un
  emplacement prévu pour le pictogramme, alors qu'ici on n'a pas
  vraiment l'intention d'en mettre un, non ?  Pour éviter ce genre de
  désagrément il faut réinitialiser les retraits au niveau \TeX{}
  grâce aux incantations vaudoues suivantes :
  \begin{ltxcode}
    \par\parshape=1\@totalleftmargin\linewidth
  \end{ltxcode}
  \continuenota%
  qui pourra faire l'objet d'une commande à insérer manuellement au
  début de chaque nouveau paragraphe, comme je viens de le faire
  ici~\jeblague
\end{notahack}
\section{Des citations}

\subsection{Épigraphes}
\label{sec-epigraphe}

Les épigraphes provocatrices de ce manuel ont été produites par un
environnement que j'ai nommé \ltxenv{epigraphe}. Par exemple au
début du code \LaTeX{} du chapitre~\ref{chap-savoir}, on trouve :
\begin{ltxcode}
  \chapter{Ce qu'il faut savoir}
  \label{chap-savoir}
  \begin{epigraphe}{Les proverbes Pr \textbf{21} 11}
    Quand on châtie le railleur, le simple s'assagit ;\\
    quand on instruit le sage,  celui-ci gagne en savoir.
  \end{epigraphe}
\end{ltxcode}
L'environnement \ltxenv{epigraphe} est défini comme suit :
\begin{ltxcode}
  \newenvironment{epigraphe}[1]
  {% clause begin
    \vspace*{-1.5cm}%
    \small\sffamily% mise en évidence
    \savebox{\nomepigraphe}{#1}% une boîte pour sauvegarder
                               % l'origine de la citation
    \slshape% tout est penché
    \begin{changemargin}{0pt}{-2cm}% on se met au large
      \begin{flushright}}% tout est poussé à droite
      {% clause end
        \\[4pt]\usebox{\nomepigraphe}.% insertion de l'origine
      \end{flushright}%
    \end{changemargin}\par\vspace*{0.6cm}}
\end{ltxcode}
Il faut bien entendu \voir{sec-svgreutil}{déclarer la boîte} qu'on
utilise pour sauvegarder l'origine de notre citation :
\begin{ltxcode}
  \newsavebox{\nomepigraphe}
\end{ltxcode}
Les blanc verticaux (\ltxcom{vspace}) insérés avant et après cet
environnement permettent de caler correctement l'épigraphe entre le
début du chapitre et la minitable des matières.


\subsection{Citations}
\label{sec-epilogue-citations}

Quelques citations parsèment le manuel que vous avez sous les
yeux. Elles ont été produites avec un environnement fait maison :
\begin{ltxexemple}
  xxxxxxxxxxxxx
  \begin{unecitation}[Georges
    \textsc{Bataille}]
    La vieillesse renouvelle la terreur à 
    l'infini. Elle ramène l'être sans 
    finir au  commencement. Le commencement 
    qu'au bord de la tombe j'entrevois est
    le \emph{porc} qu'en moi la mort ni 
    l'insulte ne peuvent tuer. La terreur 
    au bord de la tombe est divine et je 
    m'enfonce dans la terreur dont je suis
    l'enfant.
  \end{unecitation}
  xxxxxxxxxxxxxxx
\end{ltxexemple}
Nous allons créer pas à pas cet environnement de manière à mettre le
doigt sur quelques problèmes classiques auxquels on peut être
confronté avec monsieur~\LaTeX{}. On va définir l'environnement
citation en s'appuyant sur celui du paragraphe~\vref{sec-out-lrbox}
(permettant de faire une remarque encadrée) et sur celui du
\S~\vref{sec-wizard-def-environnement} qui produit une citation
avec son auteur :
\begin{ltxcode}
  % un boite pour l'auteur de la citation
  \newsavebox{\auteurcitation}
  \newsavebox{\boitecitation}
  \newenvironment{citationi}[1]{% clause begin
    % on sauve l'argument 1 pour l'auteur
    \savebox{\auteurcitation}{#1}%
    \begin{lrbox}{\boitecitation}
      \begin{minipage}{.8\linewidth}
        \small\slshape}% on passe en petit et penché
    {% clause end : on pousse l'auteur de la citation à droite
      \par\mbox{}\hfill\usebox{\auteurcitation}
      \end{minipage}
    \end{lrbox}
    \begin{center}
      \usebox{\boitecitation}
    \end{center}
\end{ltxcode}
Ce qui donne :
%
\newsavebox{\auteurcitation}%
\newsavebox{\boitecitation}%
\newboolean{auteurcitationpresent}%
\definecolor{coulcitation}{rgb}{0.9,0.95,0.780}%
\newenvironment{citationi}[1]{%
    % on sauve l'argument 1 pour l'auteur
    \savebox{\auteurcitation}{#1}%
    \begin{lrbox}{\boitecitation}
      \begin{minipage}{.8\linewidth}%
      \small\slshape}% on passe en petit et penché
    { % clause end
      % on saute un paragraphe et on pousse l'auteur de la citation à droite
      \par\mbox{}\hfill\usebox{\auteurcitation}
      \end{minipage}
    \end{lrbox}
    \begin{center}
      \usebox{\boitecitation}
    \end{center}  }
%
%
\begin{ltxexemple}
  Avant avant avant avant avant avant avant 
  avant avant avant avant avant avant avant   
  \begin{citationi}{%
      Michel \textsc{Bakounine}, 1845}
    Dans presque tous les pays les femmes 
    sont esclaves ; tant qu'elles ne seront 
    pas complètement émancipées, notre
    propre liberté sera impossible.
  \end{citationi}
  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}
On peut également changer l'indentation du paragraphe dans la minipage
(qui vaut par défaut~\texttt{0pt} dans cet environnement) en modifiant
dans l'environnement la valeur de la longueur \ltxlen{parindent} :
\begin{ltxcode}
  ...
  \begin{lrbox}{\boitecitation}
    \begin{minipage}{.8\linewidth}%
      \setlength{\parindent}{10pt}%ø\ccomment{indente la 1\iere{} ligne}ø
  ...
\end{ltxcode}
%
\newenvironment{citationii}[1]{%
    % on sauve l'argument 1 pour l'auteur
    \savebox{\auteurcitation}{#1}%
    \begin{lrbox}{\boitecitation}
      \begin{minipage}{.8\linewidth}%
        \setlength{\parindent}{10pt}%
        \small\slshape}% on passe en petit et penché
    { % clause end
      % on saute un paragraphe et on pousse l'auteur de la citation à droite
      \par\mbox{}\hfill\usebox{\auteurcitation}
      \end{minipage}
    \end{lrbox}
    \begin{center}
      \usebox{\boitecitation}
    \end{center}}
%
% \begin{ltxexemple}
%   Avant avant avant avant avant avant avant 
%   avant avant avant avant avant avant avant 
%   \begin{citationii}{%
%       Michel \textsc{Bakounine}, 1845}
%     Dans presque tous les pays les femmes 
%     sont esclaves ; tant qu'elles ne seront 
%     pas complètement émancipées, notre propre
%     liberté sera impossible.
%   \end{citationii}
%   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}
  On insère ensuite des guillemets en début et fin de citation, avec
  le code suivant :
\begin{ltxcode}
  ...
  \begin{minipage}{.8\linewidth}%
    \setlength{\parindent}{10pt}%
    \small\slshape«\ignorspaces}% on passe en petit et penché
  {\unskip»
    \par\mbox{}\hfill\usebox{\auteurcitation}
  ...
\end{ltxcode}
%
\newenvironment{citationiii}[1]{%
    % on sauve l'argument 1 pour l'auteur
    \savebox{\auteurcitation}{#1}%
    \begin{lrbox}{\boitecitation}
      \begin{minipage}{.8\linewidth}%
        \setlength{\parindent}{10pt}%
        \small\slshape«\ignorespaces}% on passe en petit et penché
    {\unskip»
      % on saute un paragraphe et on pousse l'auteur de la citation à droite
      \par\mbox{}\hfill\usebox{\auteurcitation}
      \end{minipage}
    \end{lrbox}
    \begin{center}
      \usebox{\boitecitation}
    \end{center}}
%
%
  On se réfèrera aux
  paragraphes~\ref{sec-outillage-pourcents-ignorespaces}
  et~\vref{sec-outillage-pourcents-unskip} pour la signification des
  commandes \ltxcom{ignorespaces} et \ltxcom{unskip}.  Ce qui donne :
\begin{ltxexemple}
  Avant avant avant avant avant avant avant 
  avant avant avant avant avant avant avant 
  \begin{citationiii}{%
      Michel \textsc{Bakounine}, 1845}
    Dans presque tous les pays les femmes 
    sont esclaves ; tant qu'elles ne seront 
    pas complètement émancipées, notre
    propre liberté sera impossible.
  \end{citationiii}
  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}
Ensuite ---~on y est presque~--- on se propose de rendre l'argument «
auteur de la citation » optionnel de manière à pouvoir produire une
citation sans auteur si besoin est. L'idée est de déclarer un booléen
de manière à mémoriser le fait qu'un auteur est présent ou pas :
\begin{ltxcode}
  \newboolean{auteurcitationpresent}
\end{ltxcode}
On modifie ensuite la définition de l'environnement comme suit :
\begin{ltxcode}
  % argument optionnel vide par défaut :
  \newenvironment{unecitation}[1][] {% 
    % Clause begin :
    % on note si on a un auteur pour la citation ou pas
    \ifthenelse{\equal{#1}{}}{%
      \setboolean{auteurcitationpresent}{false}}{%
      \setboolean{auteurcitationpresent}{true}%
      \savebox{\auteurcitation}{#1}}% on le sauve si nécessaire
  ...
\end{ltxcode}
Puis on modifie la clause \verb+\end+ de l'environnement en insérant l'auteur
uniquement s'il est présent en argument :
\begin{ltxcode}
  {»% clause end de l'environnement
    % s'il y a un auteur on le met poussé tout à droite
    \ifthenelse{\boolean{auteurcitation}}%
    {\par\nopagebreak\hfill\usebox{\auteurcitation}}
    {}% sinon on ne fait rien...
  \end{ltxcode}
Enfin, on met la citation sur un fond. On peut par exemple
déclarer cette couleur grâce au package \ltxpack{xcolor} :
\begin{ltxcode}
  \definecolor{coulcitation}{rgb}{0.90,0.75,0.20}%
\end{ltxcode}
Il suffit alors de remplacer la commande \ltxcom{usebox} de la clause
end par quelque chose du genre :
\begin{ltxcode}
  \setlength{\fboxsep}{10pt}%
  \colorbox{coulcitation}{\usebox{\boitecitation}}
\end{ltxcode}
\newenvironment{citationiv}[1][]{%
  \ifthenelse{\equal{#1}{}}{%
    \setboolean{auteurcitationpresent}{false}}{%
    \setboolean{auteurcitationpresent}{true}%
    \savebox{\auteurcitation}{#1}}% on le sauve si nécessaire
  \begin{lrbox}{\boitecitation}
    \begin{minipage}{.8\linewidth}%
      \setlength{\parindent}{10pt}%
      \small\slshape«\ignorespaces}% on passe en petit et penché
    {\unskip»
      \ifthenelse{\boolean{auteurcitationpresent}}%
      {\par\nopagebreak\hfill\usebox{\auteurcitation}}
      {}% sinon on ne fait rien...
    \end{minipage}
  \end{lrbox}
  \begin{center}
    \setlength{\fboxsep}{10pt}%
    \colorbox{coulcitation}{\usebox{\boitecitation}}
  \end{center}}
%


Ce qui donnera finalement :
\begin{ltxexemple}
  avant avant avant avant avant avant avant 
  \begin{citationiv}[Pierre 
    \textsc{Desproges}]
    Il était tellement obsédé qu'à la fin 
    il sautait même des repas.
  \end{citationiv}
  Après après après après après après après 
\end{ltxexemple}

\section{Des lettrines}
\label{sec-lettrine}

Les documents soignés font souvent appel aux \emph{lettrines} qui
permettent, selon les règles d'usage en typographie, de produire la
première lettre du chapitre en gros, ainsi que le mot ou groupe de
mots qui suit. Par exemple :
\begingroup\ifframabookversion
\setlength{\ltxexmargextdeborde}{.6cm}
\renewcommand{\ltxexoutputwidthpercent}{37}
\renewcommand{\ltxexinputwidthpercent}{58}
\fi
\begin{ltxexemple}
  \lettrine{Les documents} soignés font
  souvent appel aux lettrines, qui selon 
  les règles d'usage en typographie...
\end{ltxexemple}
\endgroup\noindent
Il y a deux difficultés dont une a déjà été surmontée :
\begin{itemize}
\item comment appliquer un traitement à une seule lettre d'un argument
  d'une commande ;
\item comment décaler les lignes pour laisser la place à la lettrine.
  On utilisera pour cela la commande \ltxcom{parshape} comme pour le
  nota (\S~\vref{sec-nota}).
\end{itemize}


\subsection{La commande \ltxcom{glurps} ou un pas vers \TeX}
\label{sec-lettrine-glurps}

Au niveau de \LaTeX{} c'est la commande \ltxcom{newcommand} qui permet
de créer de nouvelles commandes. Une des limitations de \LaTeX{} pour
ce qui concerne la création de commandes réside dans le fait que les
délimiteurs d'arguments sont toujours les caractères~\verb+{+
  et~\verb+}+. Comme nous le verrons un peu plus bas, au niveau de
\TeX{}, cette contrainte n'existe pas. En effet, pour créer une
commande avec \TeX{}, on peut écrire :
\begin{ltxexemple}
     \def\bidule{machin truc}
     \bidule{} et \bidule
\end{ltxexemple}
Avec un ou plusieurs arguments, on écrira
\begin{ltxexemple}
     \def\bidule#1#2{(1=#1) et (2=#2)}

     \bidule{ab}{cd}
\end{ltxexemple}
On note qu'en \TeX{}, on écrit dans la définition les arguments dans
l'ordre.  Ce qui est intéressant et que l'on va exploiter pour notre
lettrine, peut être illustré par les exemples suivants d'utilisation de la
commande \ltxcom{bidule} :
\begin{ltxexemple}
     \def\bidule#1#2{(1=#1) et (2=#2)}

     \bidule abcd

     \bidule ab cd
\end{ltxexemple}
On remarque donc que si on ne délimite pas explicitement les arguments
avec les caractères \verb+{+ et~\verb+}+, le premier
argument~(\verb+#1+) est remplacé par le premier caractère rencontré,
le deuxième argument~(\verb+#2+) par le deuxième caractère, etc.
Encore plus intéressant, on peut définir très souplement le format
d'appel de la commande, par exemple :
\begin{ltxcode}
  \def\bidule#1#2/{(1=#1) et (2=#2)}  
\end{ltxcode}
Ici, on indique que pour appeler la commande \ltxcom{bidule} il faut
lui faire suivre deux arguments suivis du caractère~\verb+/+. 
\def\bidule#1#2/{(1=#1) et (2=#2)}
\begin{ltxexemple}
  \bidule abc/d

  \bidule ab/cd
\end{ltxexemple}
Par conséquent cette dernière commande prendra comme premier argument,
le premier caractère rencontré, et comme deuxième : tout ce qu'elle
trouve jusqu'au caractère~\verb+/+. On peut donc créer une ébauche de
commande pour une lettrine :
\begin{ltxexemple}
  \def\glurps#1#2/{{\Huge#1}\textsc{#2}}
  \newcommand{\lettrinedev}[1]{\glurps#1/}
  \lettrinedev{Bon bé} ouala le travail
\end{ltxexemple}
On va même pousser le vice jusqu'à mettre la grosse lettre un peu plus bas :
\begin{ltxexemple}
  \def\glurps#1#2/{%
    {\Huge#1}%
    \raisebox{\baselineskip}{\textsc{#2}}}
  \newcommand{\lettrinedev}[1]{\glurps#1/}
  \lettrinedev{Bon bé} ouala le travail
\end{ltxexemple}
  

\subsection{Insertion de la lettrine dans un paragraphe}
\label{sec-lettrine-insertion}

Pour insérer la lettrine dans un paragraphe on aura recours à la
commande \ltxcom{parshape}. La figure~\vref{fig-lettrine} montre que
l'on doit définir deux dimensions pour insérer la lettrine :
\begin{enumerate}
\item l'indentation de la première ligne, correspondant à la largeur
  de la « grosse lettre » plus celle de la suite de la lettrine ;
\item l'indentation de la deuxième ligne, correspondant à la largeur
  de la « gros\-se lettre » éventuellement augmentée d'une espace pour
  aérer un peu.
\end{enumerate}
\begin{figure}[tbh]
  \centering
  \includegraphics[width=.35\textwidth]{lettrine}
  \caption{Insertion de la lettrine dans un paragraphe}
  \label{fig-lettrine}
\end{figure}
On définit les dimensions suivantes :
\begin{itemize}
\item \ltxlen{indletH} et \ltxlen{larligH} respectivement
  l'indentation et la largeur de la première ligne (la ligne « du Haut
  ») du paragraphe contenant une lettrine ;
\item \ltxlen{indletB} et \ltxlen{larligB} la même chose pour la
  deuxième ligne (la ligne « du Bas »)
\end{itemize}

Ceci permet d'écrire quelque chose du genre :
\begin{ltxexemple}
  \setlength{\indletB}{.8cm}% au pif
  \setlength{\larligB}{\textwidth-\indletB}
  \setlength{\indletH}{1.5cm}% au pif
  \setlength{\larligH}{\textwidth-\indletH}
  \parshape=3
  \indletH\larligH
  \indletB\larligB
  0pt\textwidth
  Ce paragraphe est prêt à 
  recevoir une jolie lettrine qui occupera
  deux lignes environ voire même exactement.
\end{ltxexemple}
L'emplacement est prêt, il reste à insérer la « grosse lettre » et ce
qui suit à la bonne place. On commence par créer une commande pour la
fonte à utiliser : 
\begin{ltxexemple}
  \DeclareFixedFont{%
    \lettrinefont}{T1}{ppl}{m}{n}{%
    2\baselineskip}
  {\lettrinefont
    Pour écrire les grosses lettres}
\end{ltxexemple}
Ensuite on va modifier la commande \ltxcom{glurps}\footnote{Vous
  pourrez notez qu'il est tout à fait inadmissible d'utiliser des noms
  aussi ridicules pour les commandes que vous serez amené à
  définir...} et la commande \ltxcom{lettrine} pour qu'elles calculent
elles-mêmes les dimensions définies ci-avant (\ltxlen{indletH},
\ltxlen{larligH}, ...).
\begin{ltxcode}
  \newsavebox{\lalettrine}% une boîte pour la lettrine
  \def\creerlettrine#1#2/{%
    \savebox{\lalettrine}{%
      {\lettrinefont#1}%
      \raisebox{\baselineskip}{\textsc{#2}}}%
    \settowidth{\indletB}{{\lettrinefont#1}}%
    \settowidth{\indletH}{\usebox{\lalettrine}}}
\end{ltxcode}
La commande \ltxcom{creerlettrine} (digne héritière de
\ltxcom{glurps}) sauve  la lettrine dans une boîte et en profite
pour sauvegarder la largeur de la « grosse lettre » dans la dimension
\ltxlen{indletB}, et la dimension de l'ensemble dans \ltxlen{indletH}.
Tentons maintenant, une première version de la lettrine :
\begin{ltxcode}
  \newcommand{\lettrineI}[1]{%
    \creerlettrine#1/%
    \setlength{\larligH}{\textwidth-\indletH}%
    \setlength{\larligB}{\textwidth-\indletB}%
    \parshape=3\indletH\larligH\indletB\larligB%
    0cm\textwidth%
    \noindent\usebox{\lalettrine}}
\end{ltxcode}

Qui donne\footnote{Des traits ont été ajoutés pour bien situer la
  boîte englobant la lettrine.} :  \newcommand{\lettrineI}[1]{%
  \creerlettrine#1/%
  \setlength{\larligH}{\textwidth-\indletH}%
  \setlength{\larligB}{\textwidth-\indletB}%
  \parshape=3%
  \indletH\larligH%
  \indletB\larligB%
  0cm\textwidth%
  \setlength{\fboxrule}{.5pt}\setlength{\fboxsep}{-.5pt}%
  \noindent\fbox{\usebox{\lalettrine}}}
\begin{ltxexemple}
  \lettrineI{Ce chapitre} a pour but de 
  produire des caractères les uns derrière 
  les autres et ainsi de former des mots 
  donnant lieu à des  phrases.
\end{ltxexemple}
Les lecteurs très attentifs auront noté que ce nota n'est pas à la
bonne place. Il semblerait que des translations horizontales et
verticales soient nécessaires. On commencera ici par se décaler vers
la gauche. À la dernière ligne de la définition de 
\ltxcom{lettrine}, on écrira donc :
\begin{ltxcode}
  % décalage équivalent à la largeur totale
  \noindent\hspace{-\indletH}
\end{ltxcode}
qui produira :
\newcommand{\lettrineII}[1]{%
  \creerlettrine#1/%
  \setlength{\larligH}{\textwidth-\indletH}%
  \setlength{\larligB}{\textwidth-\indletB}%
  \parshape=3%
  \indletH\larligH%
  \indletB\larligB%
  0cm\textwidth%
  \setlength{\fboxrule}{.5pt}\setlength{\fboxsep}{-.5pt}%
  \noindent\hspace{-\indletH}\fbox{\usebox{\lalettrine}}}
\begin{ltxexemple}
  \lettrineII{Ce chapitre} a pour but de 
  produire des caractères les uns derrière
  les autres et ainsi de former des mots
  donnant lieu à des phrases.
\end{ltxexemple}
Puis on intègre la translation verticale :
\begin{ltxcode}
  \noindent\hspace{-\indletH}%
  \raisebox{-\baselineskip}[0pt][0pt]{\usebox{\lalettrine}}
\end{ltxcode}
qui produira :
\newcommand{\lettrineIII}[1]{%
  \creerlettrine#1/%
  \setlength{\larligH}{\textwidth-\indletH}%
  \setlength{\larligB}{\textwidth-\indletB}%
  \parshape=3%
  \indletH\larligH%
  \indletB\larligB%
  0cm\textwidth%
  \setlength{\fboxrule}{.5pt}\setlength{\fboxsep}{-.5pt}%
  \noindent\hspace{-\indletH}%
  \raisebox{-\baselineskip}[0pt][0pt]{%
    \fbox{\usebox{\lalettrine}}}}
\begin{ltxexemple}
  \lettrineIII{Ce chapitre} a pour but de
  produire des caractères les uns derrière
  les  autres et ainsi de former des mots
  donnant lieu à des phrases.
\end{ltxexemple}
Les lecteurs encore éveillés auront remarqué que la « grosse lettre »
est un peu trop rapprochée du texte. On peut donc augmenter légèrement
la dimension \ltxlen{indletB}. Voici finalement le code de la
lettrine :
\begin{ltxcode}
  \newcommand{\lettrine}[1]{%
    \creerlettrine#1/%
    \addtolength{\indletB}{3pt}% pour avoir un peu d'espace
    \setlength{\larligH}{\textwidth-\indletH}%
    \setlength{\larligB}{\textwidth-\indletB}%
    \parshape=3%
    \indletH\larligH\indletB\larligB0cm\textwidth%
    \noindent\hspace{-\indletH}%
    \raisebox{-\baselineskip}[0pt][0pt]{%
      \usebox{\lalettrine}}}
\end{ltxcode}


\section{Un sommaire}

C'est une pratique courante que le sommaire d'un document rédigé en
français soit placé en tête de document et contienne un condensé de la
table des matières. Cette dernière est quant à elle généralement
insérée à la fin.  En fouillant dans le fichier \ltxfile{book.cls}
définissant la classe éponyme, on trouve une instruction commune aux
commandes \ltxcom{tableofcontents} et \ltxcom{listoffigures} : la
commande \verb+\@starttoc+.
\begin{ltxcode}
  \@starttoc{toc}
\end{ltxcode}
pour la commande \ltxcom{tableofcontents} et :
\begin{ltxcode}
  \@starttoc{lof}
\end{ltxcode}
pour la commande \ltxcom{listoffigures}. C'est la commande interne
\verb+\@starttoc+ qui permet de commencer un table (matières, figures,
etc.) à partir d'un fichier auxiliaire portant l'extension donnée en
argument, ici \verb+toc+ pour la table des matières et \verb+lof+ pour
la liste des figures. Nous avons donc créé dans un premier temps la
commande \ltxcom{sommaire} comme suit :
\begin{ltxcode}
  \newcommand{\sommaire}{%
    \chapter*{Sommaire}
    \@starttoc{som}}
\end{ltxcode}
Le fichier portant l'extension \verb+som+ contiendra les entrées du
sommaire. L'étape suivante consiste à remplir le fichier \texttt{som}.
Pour cela, il faut savoir que les commandes \ltxcom{chapter},
\ltxcom{section}, etc. font toutes appel à une commande pour insérer
une entrée dans la table des matières. Ainsi quand on écrit :
\begin{ltxcode}
  \section{Bidule truc muche}
\end{ltxcode}
il sera fait appel à la commande :
\begin{ltxcode}
  \addcontentsline{toc}{section}{Bidule truc muche}
\end{ltxcode}
pour insérer le titre dans la table des matières. De même lorsqu'on
écrit :
\begin{ltxcode}
  \chapter{Machin chose}
\end{ltxcode}
il sera fait automatiquement appel à :
\begin{ltxcode}
  \addcontentsline{toc}{chapter}{Machin chose}
\end{ltxcode}
Cette dernière commande écrit dans le fichier de table des matières
(portant donc l'extension \texttt{toc}) la ligne :
\begin{ltxcode}
  \contentsline{chapter}{%
    \numberline {1}Machine chose}{3}{chapter.1}
\end{ltxcode}
Et (Hercule \textsc{Poirot} a eu du pain sur la planche), il se trouve
que cette dernière commande, fait finalement appel à une commande de
la forme :
\begin{ltxcode}
  \l@ø\marg{type d'entrée}ø
\end{ltxcode}
pour produire l'entrée dans la table. Par exemple la commande
précédente fait appel à \verb+l@chapter+. Ceci parce qu'on trouve la
définition suivante :
\begin{ltxcode}
  \def\contentsline#1{\csname l@#1\endcsname}
\end{ltxcode}
dans \ltxfile{latex.ltx}. Nous passons  volontairement sous silence
le détail de ces commandes, et on se contentera ici de savoir que la
commande \verb+\l@section+ produit une entrée de table de matières
pour les sections, \verb+\l@subsection+ produit une entrée pour les
subsections, etc. Pour finir notre sommaire, il reste à écrire dans le
fichier de sommaire. Nous avons choisi d'insérer dans le sommaire les
titres de parties, chapitres et sections. Pour arriver à nos fins,
nous avons ajouté cette insertion à la commande
\ltxcom{addcontentsline} originale :
\begin{ltxcode}
  % sauvegarde de l'originale
  \let\aclORIG\addcontentsline
  % redéfinition
  \renewcommand{\addcontentsline}[3]{%
    \aclORIG{#1}{#2}{#3}% appel de l'originale
    \ifthenelse{% on insère sections, chapitres et parties 
      \equal{#2}{section} \or \equal{#2}{chapter} 
                          \or \equal{#2}{part}}{%
      \aclORIG{som}{#2}{#3}}{}}
\end{ltxcode}
\begin{nota}
  Il faut noter que notre sommaire sera mis en page exactement de la
  même manière que la table des matières, puisque tous deux font appel
  à la même commande interne :
  \begin{ltxcode}
    \aclORIG{som}{section}{...}
  \end{ltxcode}
  \continuenota%
  c'est donc la commande \verb+\l@section+ qui sera appelée pour
  mettre en page l'entrée. Pour mettre en page le sommaire
  différemment, il aurait fallu écrire :
  \begin{ltxcode}
    \aclORIG{som}{somsection}{...}
  \end{ltxcode}
  puis définir la commande \verb+\l@somsection+ pour mettre en page
  les entrées de sections dans le sommaire...
\end{nota}

\section{Un glossaire}
\label{sec-jouets-glossaire}

Il est souvent utile d'agrémenter un document d'un glossaire ayant
pour but de rendre moins mystérieux les termes du jargon qu'on appelle
aussi vocabulaire technique. Nous proposons ici une méthode s'appuyant
sur le programme \soft{makeindex} présenté au
paragraphe~\vref{science-index} et sur le
paragraphe~\vref{sec-cosmetique-allure-index} présentant les outils
permettant de changer l'allure de l'index.

\subsection{Tordre le cou à \soft{makeindex}}

De même que pour la création d'un index, on doit mettre dans le
préambule du document la commande \ltxcom{makeglossary}. Cette
commande demande à monsieur \LaTeX{} de bien vouloir créer un fichier
portant l'extension \texttt{glo}, réceptacle des entrées de glossaire.
\begin{ltxcode}
  \glossary{machin chouette chose}
\end{ltxcode}
ajoutera « machin chouette chose » dans le glossaire. En réalité
cette commande a pour effet d'ajouter dans le fichier d'extension
\texttt{glo}, la ligne :
\begin{ltxcode}
  \glossaryentry{machin chouette chose}{ø\marg{\no page}ø}
\end{ltxcode}
La phase suivante consiste à produire le glossaire proprement dit
grâce au programme \soft{makeindex} et au fichier d'entrées de
glossaire :
\begin{unixcom}
  makeindex -s ¢marg«style glossaire» ¢marg«document».glo -o ¢marg«document».glx
\end{unixcom}
qui produit, en utilisant comme fichier de style \ltxfile{gglo.ist} le
glossaire suivant :
\begin{ltxcode}
  \begin{theglossary} 
  \item machin chouette chose\pfill 27
  \end{theglossary}
\end{ltxcode}
On note donc que le glossaire ---~qu'il va falloir insérer explicitement
dans notre document~--- est constitué par l'environnement
\ltxenv{theglossary} et que chaque entrée donne lieu à un
\ltxcom{item} et son numéro de page (ici 27 pour l'exemple).  Pour
arriver à nos fins, il nous faudra :
\begin{enumerate}
\item définir l'environnement \ltxenv{theglossary} car rien n'est fait
  par défaut dans \LaTeX{} ;
\item produire les entrées avec un terme suivi de sa définition, sous
  la forme :
  \begin{ltxcode}
  \begin{theglossary} 
  \item[ø\marg{terme}ø] blabla de définition
  \end{theglossary}    
  \end{ltxcode}
\item supprimer les numéros de pages puisqu'ils n'apparaissent pas
  dans un glossaire.
\end{enumerate}
Ces trois tâches font l'objet des paragraphes suivants.

\subsection{Un environnement pour le glossaire}

Au paragraphe \vref{sec-outillage-liste-glossaire} du
chapitre~\ref{chap-outillage}, nous avons proposé une liste
particulière permettant de présenter les entrées dans une boîte avec
une ombre. La définition était la suivante :
\begin{ltxcode}
  \newenvironment{leglossaire}{\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}
où \ltxcom{boiteentreeglossaire} est :
\begin{ltxcode}
  \newcommand{\boiteentreeglossaire}[1]{%
    \parbox[b]{\labelwidth}{%
      \setlength{\fboxsep}{3pt}%
      \setlength{\fboxrule}{.4pt}%
      \shadowbox{\sffamily#1}\\\hfill\mbox{}}}
\end{ltxcode}
On se reportera au paragraphe mentionné ci-dessus pour les
explications de ces commandes. En tous les cas on aura :
\begin{ltxexemple}
  \begin{leglossaire}
  \item[Sphère] Patate bien régulière.
  \end{leglossaire}
\end{ltxexemple}

\subsection{Produire le fichier {\mdseries\ttfamily.glx}}

De manière à ce que \soft{makeindex} produise le fichier d'extension
\texttt{glx} avec cet environnement on doit écrire le fichier de
style suivant :
\begin{verbatim}
   preamble "\n\\begin{leglossaire}"
   postamble "\n\\end{leglossaire}"
\end{verbatim}
Doit également apparaître dans ce fichier de style ---~que l'on nommera
par exemple \texttt{glossaire.ist}~--- le mot clef désignant les entrées
de glossaire dans le fichier \texttt{.glo} :
\begin{verbatim}
   keyword "\\glossaryentry"
\end{verbatim}
Pour que chaque entrée soit constituée d'un terme et de sa définition,
nous avons défini la commande suivante :
\begin{ltxcode}
  \newcommand{\entreeglossaire}[2]{\glossary{[#1] #2}}
\end{ltxcode}
De telle sorte que :
\begin{ltxcode}
  \entreeglossaire{Sphere}{Patate bien régulière.}
\end{ltxcode}
aura pour effet d'écrire :
\begin{ltxcode}
  \glossary{[Sphère] Patate bien régulière.}
\end{ltxcode}
dans le fichier \texttt{.glo}. Après appel de \soft{makeindex} :
\begin{unixcom}
  makeindex -s glossaire.ist ¢marg«document».glo -o ¢marg«document».glx  
\end{unixcom}
 on
aura dans le fichier \texttt{.glx} :
\begin{ltxcode}
  \begin{leglossaire}
  \item [Sphère] Patate bien régulière., ø\marg{\no de page}ø
  \end{leglossaire}
\end{ltxcode}
Si vous m'avez bien suivi jusqu'ici, vous devriez râler et me dire : «
faudrait p'têt' voir à enlever cette vilaine virgule et ce numéro de
page... » Certes. La virgule est automatiquement mise par
\soft{makeindex} comme délimiteur « de premier niveau » entre une
entrée d'index et le numéro de page où apparaît cette entrée. Pour
utiliser autre chose qu'une virgule (ici rien en l'occurrence) on
écrit dans le fichier de style :
\begin{verbatim}
  delim_0 "" 
\end{verbatim}
Il reste à régler le cas du numéro de page. La solution que j'ai
adoptée consiste à utiliser une commande « absorbante » en guise de
mise en forme du numéro de page (cf. \S~\vref{sec-index-entries}).
Voici la commande\ltxcom{entreeglossaire} modifiée :
\begin{ltxcode}
  \newcommand{\pasdenumerodepage}[1]{}% « mange » l'argument
  \newcommand{\entreeglossaire}[2]{%
    \glossary{[#1] #2|pasdenumerodepage}}
\end{ltxcode}
ceci permet de créer le fichier \texttt{.glx} de la forme :
\begin{ltxcode}
  \begin{leglossaire}
  \item [Sphère] Patate bien régulière.
    \pagedenumerodepage{27}
  \end{leglossaire}
\end{ltxcode}
qui enverra le numéro de page (ici 27 pour l'exemple) dans le vide
intersidéral.

\subsection{Recollons les morceaux}

Pour en finir avec le glossaire, il nous faut créer une commande
suffisamment souple qui aura essentiellement pour but de produire un
chapitre contenant le glossaire, c'est-à-dire d'insérer dans le
document le fichier \texttt{.glx}. On peut décomposer les tâches à
effectuer par la commande en question, comme suit :
\begin{itemize}
\item créer un nouveau chapitre (avec comme titre « glossaire ») ;
\item lire les entrées de glossaire (commande
  \ltxcom{entreeglossaire}) depuis un fichier ;
\item insérer le fichier \texttt{.glx}
\end{itemize}
Voici la commande effectuant ces traitements :
\begin{ltxcode}
  \newcommand{\printglossary}[1][glossaire.tex]{%
    \chapter*{Glossaire}
    \label{chap-glossaire}
    \markboth{Glossaire}{Glossaire}% en-tête de page
    % insertion dans la table des matières :
    \addcontentsline{toc}{chapter}{Glossaire}
    % insertion des entrées de glossaire :
    \InputIfFileExists{#1}{%
      \typeout{Données du glossaire}}{% 
      \typeout{Pas de fichier glossaire.tex}}
    % insertion du fichier .glx
    \InputIfFileExists{\jobname.glx}{%
      \typeout{Glossaire trié}}{%
      \typeout{Pas de fichier \jobname.glx}}
  }
\end{ltxcode}
On notera les points suivants concernant cette commande :
\begin{itemize}
\item le fichier d'entrée de glossaire est par défaut
  \texttt{glossaire.tex} ;
\item on a décidé d'insérer le glossaire dans la  table des matières ;
\item pour insérer un fichier, on fait appel à 
  \ltxcom{InputIfFileExists} définie dans le format \LaTeX{} ayant la
  forme suivante :
  \begin{ltxcode}
    \InputIfFileExists{ø\marg{fichier à inclure}ø}
    {ø\marg{code \LaTeX{} si le fichier existe}ø}
    {ø\marg{code \LaTeX{} si le fichier n'existe pas}ø}
  \end{ltxcode}
\item Enfin \ltxcom{jobname} contient le nom du fichier (ou document
  maître) en cours de compilation et la commande \ltxcom{typeout}
  affiche un message sur la console de compilation.
\end{itemize}
Enfin, le fichier \ltxfile{glossaire.ist} contient finalement :
\begin{verbatim}
  delim_0 ""
  preamble "\n\\begin{leglossaire}"
  postamble "\n\\end{leglossaire}"
  keyword "\\glossaryentry"
\end{verbatim}


\section{Des onglets}
\label{sec-jouets-onglets}

J'avais initialement prévu de mettre en page ce document sur du papier
plus petit que le standard A4 pour ensuite le massicoter. D'où l'idée
de créer des onglets, petits carrés colorés se retrouvant au ras de la
feuille après massicotage.  Le fait que l'établissement dans lequel je
travaille s'est séparé de son massicot hydraulique d'une part, et que
d'autre part tout le monde n'a pas facilement accès à ce type de
matériel m'a fait changer d'avis quant au bien fondé que ce document
devait impérativement être massicoté. Les onglets sont malgré tout
restés dans le document, bien que leur place n'est plus tout à fait au
ras de la feuille. Voici comment ils ont été générés...

\subsection{Idée retenue}

Le cahier des charges est le suivant :
\begin{itemize}
\item les onglets apparaissent sur chaque page du coté opposé à la reliure ;
\item ils sont produits « à l'envers » sur les pages paires ;
\item ils doivent être à une hauteur proportionnelle au numéro du chapitre.
\end{itemize}
D'où l'idée  :
\begin{itemize}
\item d'utiliser les fonctionnalités du package \ltxpack{fancyhdr}
  pour produire les onglets ;
\item utiliser des translations verticales pour les positionner ;
\end{itemize}

\subsection{Les boîtes dans la marge}

De manière à produire les numéros de chapitres dans la marge, j'ai
simplement créé des boîtes paragraphe de largeur et hauteur imposées
\footnote{On remarquera cette maladie des informaticiens de nommer
  les variables avec des noms à moitié en français et en anglais...} :
\begin{ltxcode}
  \newlength{\ongletwidth}
  \newlength{\ongletheight}
  \setlength{\ongletheight}{32pt}
  \setlength{\ongletwidth}{.96cm}
\end{ltxcode}
Voici la commande produisant la boîte :
\begin{ltxcode}
  \newcommand{\b@iteonglet}{%
    \colorbox[gray]{.7}{% une boîte avec un fond gris contenant
      % la boîte paragraphe de largeur et hauteur fixée :
      \parbox[t][\ongletheight][s]{\ongletwidth}{%
        \vfill%
        \centering%
        % on applique un effet miroir selon la parité  de la page
        \ifthenelse{\isodd{\value{page}}}{%
          \ongletfont\thechapter}{%
          \reflectbox{\ongletfont\thechapter}}%        
        \vfill}}}
\end{ltxcode}
On notera l'utilisation de la commande \ltxcom{reflectbox} du package
\ltxpack{graphicx}. On pourra également remarquer que le contenu de la
boîte paragraphe est centré en hauteur grâce à deux ressorts verticaux
et qu'on insère finalement dans cette boîte le numéro du chapitre dans
une \voir{sec-outillage-fontes}{mystérieuse fonte} enclenchée par la
commande \ltxcom{ongletfont}.  \makeatletter
\begin{ltxexemple}
     Et voici la boîte : \b@iteonglet...
\end{ltxexemple}
\makeatother Il est important de noter que les boîtes produites par
\ltxcom{colorbox} sont assujetties à la dimension \ltxlen{fboxsep} :
\makeatletter
\begin{ltxexemple}
  \setlength{\fboxsep}{15pt}
  En voici une autre : \b@iteonglet...
\end{ltxexemple}
\makeatother


\subsection{Position des onglets}

Pour positionner les onglets, il faut effectuer deux translations :
\begin{itemize}
\item une horizontale pour pousser l'onglet jusqu'au bout de la zone
  de note marginale ;
\item une verticale en fonction du numéro de chapitre.
\end{itemize}
On utilisera le mécanisme de définition des en-têtes de page du package
\ltxpack{fancyhdr} pour positionner les onglets. L'idée est simple,
on écrit :
\begin{ltxcode}
  \fancyhead[RO]{\bfseries\thepage\onglet}
  \fancyhead[LE]{\onglet\bfseries\thepage}
\end{ltxcode}
pour dire qu'en plus du numéro de page en gras, on mettra dans
l'en-tête le résultat de la commande \ltxcom{onglet} (à droite sur les
pages impaires et à gauche sur les pages paires). Nous allons voir
comment construire pas à pas cette commande.


\subsubsection{Postionnement horizontal}

Dans le cas des pages impaires, il faut dans un premier temps pousser
la boîte de l'onglet vers la droite, et vers la gauche pour les pages
paires. Qu'à cela ne tienne\footnote{Je suis toujours très ému de
  commencer une phrase par le beau `Q'  de la police Computer
  Modern...} :
\begin{ltxcode}
  \newcommand{\ongletI}{%
    \ifthenelse{\isodd{\value{page}}}{%
      % page impaire
      \hspace*{\marginparwidth}\hspace*{\marginparsep}}{%
      % page paire
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
    \b@iteonglet}
\end{ltxcode}
\makeatletter
  \newcommand{\ongletI}{%
    \ifthenelse{\isodd{\value{page}}}{%
      \hspace*{\marginparwidth}\hspace*{\marginparsep}}{%
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
    \b@iteonglet}
\makeatother
Voici ce que donnerait cette commande sur cette page  :
\ifthenelse{\isodd{\value{page}}}{%
  \begin{flushright}
    \bfseries\thepage\ongletI\\
    \rule{\textwidth}{.4pt}
  \end{flushright}}{%
  \begin{flushleft}
  \ongletI\bfseries\thepage\\
    \rule{\textwidth}{.4pt}
  \end{flushleft}} Pour placer correctement le numéro de la page
dans l'en-tête, il faut donc « leurrer » \LaTeX{} en utilisant une
boîte de largeur nulle contenant la boîte de l'onglet et les espaces
de translation horizontale :
\begin{ltxcode}
  \newcommand{\ongletII}{%
    \makebox[0pt][l]{%
    % si la page est impaire
    \ifthenelse{\isodd{\value{page}}}{%
      \hspace*{\marginparwidth}\hspace*{\marginparsep}}{%
    % sinon
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
      \b@iteonglet}}
\end{ltxcode}
\makeatletter
  \newcommand{\ongletII}{%
    \makebox[0pt][l]{%
    \ifthenelse{\isodd{\value{page}}}{%
      \hspace*{\marginparwidth}%
      \hspace*{\marginparsep}}{%
      \hspace*{-\marginparwidth}%
      \hspace*{-\marginparsep}}%
      \b@iteonglet}}
\makeatother
qui donnerait sur cette page  :
\ifthenelse{\isodd{\value{page}}}{%
  \begin{flushright}
    \bfseries\thepage\ongletII\\
    \rule{\textwidth}{.4pt}
  \end{flushright}}{%
  \begin{flushleft}
  \ongletII\bfseries\thepage\\
    \rule{\textwidth}{.4pt}
  \end{flushleft}} Pour les pages impaires, s'il on veut pousser la
boîte de l'onglet contre le bord de la zone réservée aux notes
marginales, on doit également tenir compte de la largeur totale de
cette boîte, comme le montre les points de références dans le schéma
ci-dessous :
\begin{center}
  \includegraphics[width=.45\textwidth]{onglets}
\end{center}
Par conséquent, le positionnement horizontal est obtenu grâce à la
commande :
\begin{ltxcode}
  \newcommand{\ongletIII}{%
    \makebox[0pt][l]{%
    \ifthenelse{\isodd{\value{page}}}{% page impaire
      \hspace*{\marginparwidth}\hspace*{\marginparsep}%
      \hspace*{-\ongletwidth}\hspace{-2\fboxsep}}{% page paire
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
      \b@iteonglet}}
\end{ltxcode}
puisqu'à la largeur de la boîte de l'onglet, il faut rajouter deux
fois la dimension \ltxlen{fboxsep} induite par la commande
\ltxcom{colorbox}.


\subsubsection{Positionnement vertical}


Reste maintenant à traiter le problème du positionnement vertical...
La commande \ltxcom{raisebox} va nous permettre de positionner
verticalement l'onglet. De plus avec la forme suivante :
\begin{ltxcode}
  \raisebox{ø\marg{déplacement}ø}[0pt][0pt]{ø\marg{objet à déplacer}ø}
\end{ltxcode}
on fait croire à \LaTeX{} que l'\marg{objet à déplacer} a une hauteur
nulle. Il n'y aura par conséquent pas de déplacement des objets aux
alentours et en particulier ceux constituant l'en-tête de la page. 
Par exemple, en écrivant :
\begin{ltxcode}
  \newcommand{\ongletIV}{%
    \makebox[0pt][l]{%
    \ifthenelse{\isodd{\value{page}}}{%
      \hspace*{\marginparwidth}\hspace*{\marginparsep}%
      \hspace*{-\ongletwidth}\hspace{-2\fboxsep}}{%
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
      \raisebox{-5cm}[0pt][0pt]{\b@iteonglet}}}
\end{ltxcode}
\makeatletter
  \newcommand{\ongletIV}{%
    \makebox[0pt][l]{%
    \ifthenelse{\isodd{\value{page}}}{%
      \hspace*{\marginparwidth}\hspace*{\marginparsep}%
      \hspace*{-\ongletwidth}\hspace{-2\fboxsep}}{%
      \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
      \raisebox{3cm}[0pt][0pt]{\b@iteonglet}}}
\makeatother
On place à partir d'ici un onglet à deux centimètres vers le haut :
\ifthenelse{\isodd{\value{page}}}{%
  \begin{flushright}
    \bfseries\thepage\ongletIV\\[-10pt]
    \rule{\textwidth}{.4pt}
  \end{flushright}}{%
  \begin{flushleft}
  \ongletIV\bfseries\thepage\\[-10pt]
    \rule{\textwidth}{.4pt}
  \end{flushleft}}

La méthode choisie pour définir le placement de la boîte est la
suivante : pour le chapitre de numéro $c$ :
\begin{itemize}
\item se déplacer vers le bas d'une dimension fixe donnée $d_f$;
\item ajouter à ce déplacement un déplacement proportionnel à $c$. Le
  déplacement de l'onglet pour le chapitre $c$ peut s'écrire :
  \begin{displaymath}
    c\times\marg{hauteur onglet}\times\alpha
  \end{displaymath}
  où $\alpha$ est un facteur permettant d'espacer les onglets. Si
  $\alpha=1$, les onglets seront espacés d'exactement la longueur de
  la boîte, avec $\alpha=2$ ils seront séparés par un espacement égal
  à deux fois la hauteur de l'onglet, etc.
\end{itemize}
Voici pour le premier déplacement :
\begin{ltxcode}
  % position de la première étiquette
  \newlength{\ongletvshift}
  \setlength{\ongletvshift}{2cm}
\end{ltxcode}
Puis pour le facteur alpha :
\begin{ltxcode}
  \newcommand{\ongletsep}{1.37}
\end{ltxcode}
On déclare une dimension permettant de positionner l'onglet :
\begin{ltxcode}
  \newlength{\ongletpos}
\end{ltxcode}
On peut maintenant écrire, la commande \ltxcom{onglet} :
\begin{ltxcode}
  \newcommand{\onglet}{%
    \makebox[0pt][l]{%
      \ifthenelse{\isodd{\value{page}}}{%
        \hspace*{\marginparwidth}\hspace*{\marginparsep}%
        \hspace*{-\ongletwidth}\hspace*{-2\fboxsep}%
      }{%
        \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
      % calcul de la position verticale
      \setlength{\ongletvpos}{%
        -\ongletvshift
        -\ongletheight*\real{\thechapter}*\real{\ongletsep}}%
      % positionnement de l'onglet
      \raisebox{\ongletvpos}[0pt][0pt]{\b@iteonglet}}}
\end{ltxcode}
Ouf ! ça marche... Oui pour le chapitre ne faisant pas partie des
annexes. Mais pour ceux en faisant partie, numérotés A, B, etc. ça ne
collera pas. Puisqu'on ne pourra pas calculer la position verticale en
fonction de ces numéros. En petit coup d'\oe il dans
\ltxfile{book.cls} nous confirme cela :
\begin{ltxcode}
  \newcommand\appendix{\par
  \setcounter{chapter}{0}%
  \setcounter{section}{0}%
  [...]
  \gdef\thechapter{\@Alph\c@chapter}}
\end{ltxcode}
on peut comprendre ici que lorsqu'on commence les annexes avec la
commande \ltxcom{appendix}, le compteur de chapitre est remis à zéro,
  et produit en lettre majuscule. Il faut donc trouver une parade pour
  que l'onglet continue à se décaler même après les annexes. La
  solution que j'ai adoptée consiste simplement à utiliser un nouveau
  compteur permettant de numéroter les chapitres et les annexes. Pour
  cela, on le déclare :
\begin{ltxcode}
  \newcounter{chapitre}
\end{ltxcode}
On précise tout de suite qu'on veut le produire en chiffre arabe :
\begin{ltxcode}
  \renewcommand{\thechapitre}{\arabic{chapitre}}
\end{ltxcode}
On ajoute la mise à zéro de ce compteur dans la définition de 
\ltxcom{frontmatter} :
\begin{ltxcode}
  \renewcommand\frontmatter{%
    \cleardoublepage
    \setcounter{chapitre}{1}
    [...]
    }
\end{ltxcode}
Puis à chaque appel de la
commande \ltxcom{chapter}, on incrémente le compteur  :
\begin{ltxcode}
  \renewcommand{\chapter}{%
  \cleardoublepage
  \stepcounter{chapitre}
  \thispagestyle{plain}
  [...]
  }
\end{ltxcode}

\framanouvellepage
\section{Exemples \LaTeX{}}

\begin{ltxexemple}
  Pour clore ce chapitre, nous présenterons 
  l'environnement \ltxenv{ltxexemple} 
  permettant d'introduire des exemples de
  code \LaTeX{}  et le résultat dans le
  document...
\end{ltxexemple}


\subsection{Outils nécessaires}
\label{sec-jouets-ltxexemple-outils}

Le package \ltxpack{fancyvrb} propose deux fonctionnalités axées
autour des fichiers. Tout d'abord, la commande \ltxcom{VerbatimInput}
permet d'insérer le contenu d'un fichier. Par exemple :
\begin{ltxcode}
  \VerbatimInput[lastline=4]{corps/jouets.tex}
\end{ltxcode}
donne (\texttt{jouets.tex} est le fichier source de ce chapitre) :
\VerbatimInput[lastline=4]{corps/jouets.tex} Ensuite, l'environnement
\ltxenv{VerbatimOut} réalisant la tâche inverse :
\begin{ltxcode}
  \begin{VerbatimOut}{ø\marg{fichier}ø}
    ø\marg{code \LaTeX}ø
  \end{VerbatimOut}
\end{ltxcode}
stockera le \marg{code \LaTeX} dans le fichier nommé \marg{fichier}.

Le deuxième outil nécessaire est défini en s'inspirant de la
définition des commandes \ltxcom{settowidth}, \ltxcom{settoheight},
etc. dans le fichier \ltxfile{latex.ltx}. Il s'agit d'une commande
permettant de récupérer la hauteur totale d'un objet, c'est-à-dire sa
hauteur additionnée de sa profondeur :
\begin{ltxcode}
  \newcommand{\hauteurtotale}[2]{%
    % sauvegarde de l'objet à mesurer
    \setbox\@tempboxa\hbox{{#2}}%
    % récupération de la hauteur
    \setlength{#1}{\ht\@tempboxa}%
    % à laquelle on ajoute la profondeur
    \addtolength{#1}{\dp\@tempboxa}%
    % vidange de la boîte temporaire
    \setbox\@tempboxa\box\voidb@x}%
\end{ltxcode}
On notera l'utilisation des commandes \TeX{}, \ltxcom{ht} et
\ltxcom{dp} renvoyant respectivement la hauteur et la largeur d'une
boîte. La commande \ltxcom{setbox} et l'équivalent \TeX{} de
\ltxcom{savebox}. La boîte \verb+\@tempboxa+ est une boîte temporaire
utilisée par \LaTeX{} et enfin, la boîte \verb+\voidb@x+ est une boîte
vide.


% \subsection{Le début et la fin...}

% Les environnements de \LaTeX{} utilisent tous la structure :
% \begin{ltxcode}
%   \begin{ø\marg{truc}ø}...\end{ø\marg{truc}}
% \end{ltxcode}
% mais comment cela est-il construit ? en jetant un \oe il dans
% \ltxfile{latex.ltx} on trouve quelque chose du genre :
% \begin{ltxcode}
%   \def\begin#1{\csname#1\endcsname}
% \end{ltxcode}
% ce qui veut dire que lorsqu'on écrit :
% \begin{ltxcode}
%   \begin{ø\marg{truc}ø}
% \end{ltxcode}
% on appelle la commande \verb+\+\marg{truc} si elle existe. De même,
% trouve la définition :
% \begin{ltxcode}
%   \def\end#1{\csname end#1\endcsname}
% \end{ltxcode}
% qui implique que lorqu'on écrit :
% \begin{ltxcode}
%   \end{ø\marg{truc}ø}
% \end{ltxcode}
% on appelle la macro \verb+\end+\marg{truc} si elle existe. On peut par
% exemple écrire :
% \begin{ltxexemple}
%   \newcommand{\debut}[1]{\csname#1\endcsname}
%   \newcommand{\fin}[1]{\csname end#1\endcsname}
%   \debut{center}
%      ceci\\est\\centré
%   \fin{center}
% \end{ltxexemple}
% Cela fonctionne car pour chaque environnement~\marg{env}---de \LaTeX{}
% ou d'une extension---que nous avons rencontré jusqu'à maintenant, il
% existe deux commandes : \verb+\+\marg{env} et \verb+\end+\marg{env}.
% C'est pourquoi une manière de définir un nouvel environnement peut
% être de définir deux commandes :
% \begin{ltxexemple}
%   \def\gros{\begingroup\Large}
%   \def\endgros{\endgroup}
%   bon
%   \begin{gros}bé\end{gros}
%   ouala
% \end{ltxexemple}


\subsection{Le principe de l'environnement \ltxenv{ltxexemple}}

L'environnement \ltxenv{ltxexemple} que nous présentons en début de
section, est un peu plus complexe que ce que nous avons rencontré
jusqu'à maintenant. En effet lorsqu'on écrit :
\begin{ltxcode}
  \begin{ltxexemple} ø\marg{contenu}ø \end{ltxexemple}
\end{ltxcode}
il faut d'une part pouvoir produire \marg{contenu} tel quel (en
verbatim), et d'autre part pouvoir l'interpréter c'est-à-dire le
traiter comme \LaTeX{} le ferait. Finalement, on se rend compte qu'il
faudrait demander à \LaTeX{} de traiter \emph{deux fois}
\marg{contenu} ce qui n'est pas envisageable. Une solution pour
contourner ce problème est précisément de sauvegarder \marg{contenu}
dans un fichier pour pouvoir le réutiliser, soit en tant que verbatim,
soit pour être interprété par \LaTeX{}. La première difficulté à
surmonter est donc de créer un environnement sauvegardant son contenu
:
\begin{ltxcode}
  \newenvironment{ltxexemple}{%
    \VerbatimEnvironment
    \begin{VerbatimOut}{\jobname.exa}}{% clause begin
    \end{VerbatimOut}}% clause end
\end{ltxcode}
\begin{notahack}
  Ne me demandez surtout pas à quoi peut bien servir la commande
  \ltxcom{VerbatimEnvironment} non documentée dans le package, mais
  nécessaire au bon fonctionnement de l'environnement défini
  ci-dessus.
\end{notahack}
Tout cela est bien joli, mais cet environnement ne fait que
sauvegarder son contenu dans un fichier. Il faut donc écrire dans la
clause « end » de l'environnement :
\begin{ltxcode}
  \end{VerbatimOut}%
  \VerbatimInput{\jobname.exa}% le contenu tel quel
  \input{\jobname.exa}% le contenu interprété par LaTeX
\end{ltxcode}
\def\ltxexemplei{%
  \VerbatimEnvironment%
  \begin{VerbatimOut}[gobble=2]{\jobname.exa}}
\def\endltxexemplei{%
\end{VerbatimOut}%
\VerbatimInput{\jobname.exa}%
\input{\jobname.exa}}
\framanouvellepage Ainsi  :
\begin{flushleft}
  \begin{boxedminipage}{.33\linewidth}
\begin{ltxcode}
  \begin{ltxexemplei}
    du code \LaTeX{}...
  \end{ltxexemplei}
\end{ltxcode}
  \end{boxedminipage}%
  \ifframabookversion
  ~{\small donne :}~% 
  \else
  \hfill donne :\hfill
  \fi
  \begin{boxedminipage}{.4\linewidth}
    \begin{ltxexemplei}
      du code \LaTeX{}...
    \end{ltxexemplei}
\end{boxedminipage}
\end{flushleft}
Il reste donc à modifier la mise en page des deux parties. Ce qui fait
l'objet du paragraphe suivant.


\subsection{Mises en boîte}

L'idée de base consiste à mettre dans deux boîtes :
\begin{ltxcode}
  \newsavebox{\b@iteentree}
  \newsavebox{\b@itesortie}
\end{ltxcode}
pour stocker l'« entrée » (le code) et la « sortie » (le code
interprété par \LaTeX{}). On écrira donc dans la clause « end » de
l'environnement :
\begin{ltxcode}
  [...]
  \end{VerbatimOut}%
  \begin{ltxexempleenv}% pour agrandir les marges
    \savebox{\b@iteentree}{% sauvegarde du code en verbatim
      \begin{minipage}{.ø\ltxexinputwidthpercentø\linewidth}
        \VerbatimInput{\jobname.exa}
      \end{minipage}}%
    \savebox{\b@itesortie}{% code interprété
      \begin{minipage}{.ø\ltxexoutputwidthpercentø\linewidth} 
        \setlength{\parindent}{10pt}% par défaut 0pt
        \input{\jobname.exa}
      \end{minipage}}%
    \usebox{\b@iteentree}
    \usebox{\b@itesortie}
   \end{ltxexempleenv}
\end{ltxcode}
L'environnement \ltxenv{ltxexempleenv} est analogue à celui que nous
avons présenté au paragraphe concernant
l'\voir[][-5pt]{sec-jouets-agrandirmarge}{agrandissement des marges}. La seule
différence est qu'il bascule en \ltxcom{small} et effectue quelques
réglages sur les blancs verticaux. On notera que la boîte « entrée »
occupera \ltxexinputwidthpercent\% de la largeur de la page et, la
boîte « sortie » \ltxexoutputwidthpercent\%.  \makeatletter%
\newenvironment{ltxexempleii}{%
  \setlength{\fboxsep}{.5pt}%
  \VerbatimEnvironment%
  \begin{VerbatimOut}[gobble=2]{\jobname.exa}}{%
  \end{VerbatimOut}%
  \begin{ltxexempleenv}% ø\ccomment{pour agrandir les marges}ø
    \savebox{\b@iteentree}{% ø\ccomment{le code en verbatim}ø
      \begin{boxedminipage}{\ltxexinputwidthratio\linewidth}
        \VerbatimInput{\jobname.exa}
      \end{boxedminipage}}%
    \savebox{\b@itesortie}{%ø\ccomment{le code interprété}ø
      \begin{boxedminipage}{\ltxexoutputwidthratio\linewidth} 
        \setlength{\parindent}{10pt}% ø\ccomment{par défaut \texttt{0pt}}ø
        \input{\jobname.exa}
      \end{boxedminipage}}%
    \usebox{\b@iteentree}%
    \usebox{\b@itesortie}
  \end{ltxexempleenv}}%
\makeatother%
Ainsi, le code :
\begin{ltxcode}
  \begin{ltxexempleii}
    du code \LaTeX{}...
    \par\noindent
    et c'est tout.
  \end{ltxexempleii}
\end{ltxcode}
Donnera :
\begin{ltxexempleii}
  du code \LaTeX{}...
  \par\noindent
  et c'est tout.
\end{ltxexempleii}
Nous avons mis des bordures aux ras des deux boîtes « entrée » et «
sortie » pour mettre en évidence leurs dimensions. On peut également
noter ici que la clause « begin » de l'environnement est en réalité
définie comme suit :
\begin{ltxcode}
  \pagebreak[3]% on suggère de changer de page ici
  \VerbatimEnvironment%
  \begin{VerbatimOut}[gobble=2]{\jobname.exa}
\end{ltxcode}
L'option \verb+[gobble=2]+ permet de « manger » systématiquement deux
caractères au début de chaque ligne car tout bon éditeur\footnote{Je
  veux bien sûr parler de \makebox[0pt][l]{//}vi, pardon,
  \soft{Emacs}...} ajoute des espaces pour l'indentation du source.
Ainsi le code :
\begin{ltxcode}
  \begin{ltxexempleii}
  du code \LaTeX{}...
  \par\noindent
  et c'est tout.
  \end{ltxexempleii}
\end{ltxcode}
donnerait :
\begin{ltxexempleii}
du code \LaTeX{}...
\par\noindent
et c'est tout.
\end{ltxexempleii}
La suite de la mise en page consiste en la création du trait central.
Ceci fait l'objet du
paragraphe~\vref{sec-jouets-ltxexemple-trait-central}. Avant cela nous
nous attarderons sur la numérotation des exemples.

\subsection{Numérotation des exemples}

Pour numéroter les exemples, il est nécessaire de déclarer un
\voir{sec-wizard-compteurs}{compteur} :
\begin{ltxcode}
  \newcounter{c@exemple}[chapter]
\end{ltxcode}
qui sera donc remis à zéro à chaque chapitre. On précise la manière
dont il s'affichera lorsqu'on y fera référence :
\begin{ltxcode}
  \renewcommand{\thec@exemple}{%
    \thechapter.\arabic{c@exemple}}
\end{ltxcode}
À chaque appel à l'environnement \ltxenv{ltxexemple}, on fera appel à :
\begin{ltxcode}
  \refstepcounter{c@exemple}
\end{ltxcode}
pour incrémenter le compteur et mettre à jour le système de référence.
La petite boîte noire que vous avez pu apercevoir au milieu des
exemples a pour largeur \makeatletter\ltxlen{l@rgeurnumex}\makeatother{}
(définie à 16 points) et est produite par :
\begin{ltxcode}
  \newcommand{\affichenumex}{%
    \raisebox{-1.7pt}[0pt][0pt]{%
      \setlength{\fboxsep}{.7pt}%
      \colorbox{black}{% ø\ccomment{la boîte noire}ø
        \makebox[\l@rgeurnumex]{% ø\ccomment{une boîte de largeur fixée}ø
          \color{white}% ø\ccomment{le contenu en blanc}ø
          \tiny\textsf{\thec@exemple}}}}} 
\end{ltxcode}
Ainsi :
\begin{ltxexemple}
  La petite boîte (\affichenumex)
\end{ltxexemple}
Un nouvelle version de l'environnement \ltxenv{ltxexemple} pourrait
donc être :
\begin{ltxcode}
  \newenvironment{ltxexempleiii}{%
  \VerbatimEnvironment%
  \begin{VerbatimOut}[gobble=2]{\jobname.exa}}{%
  \end{VerbatimOut}%
  \begin{ltxexempleenv}% 
    \refstepcounter{c@exemple}% ø\ccomment{incrémentation du compteur}ø
    \savebox{\b@iteentree}{ [...] }% 
    \savebox{\b@itesortie}{ [...] }%
    \usebox{\b@iteentree}%
    \kern2pt%
    \parbox{3pt}{\rotatebox{90}{\affichenumex}}%
    \kern2pt%
    \usebox{\b@itesortie}
  \end{ltxexempleenv}}%
\end{ltxcode}
\makeatletter
\newenvironment{ltxexempleiii}{%
  \setlength{\fboxsep}{.5pt}%
  \VerbatimEnvironment%
  \begin{VerbatimOut}[gobble=2]{\jobname.exa}}{%
  \end{VerbatimOut}%
  \begin{ltxexempleenv}% ø\ccomment{pour agrandir les marges}ø
    \savebox{\b@iteentree}{% ø\ccomment{le code en verbatim}ø
      \begin{boxedminipage}{\ltxexinputwidthratio\linewidth}
        \VerbatimInput{\jobname.exa}
      \end{boxedminipage}}%
    \savebox{\b@itesortie}{%ø\ccomment{le code interprété}ø
      \begin{boxedminipage}{\ltxexoutputwidthratio\linewidth} 
        \setlength{\parindent}{10pt}% ø\ccomment{par défaut \texttt{0pt}}ø
        \input{\jobname.exa}
      \end{boxedminipage}}%
    \usebox{\b@iteentree}%
    \kern2pt%
    \parbox{3pt}{\rotatebox{90}{\affichenumex}}%
    \kern2pt%
    \usebox{\b@itesortie}
  \end{ltxexempleenv}}%
\makeatother%
qui donnera :
\begin{ltxexempleiii}
  \setlength{\fboxsep}{-2pt}
  \setlength{\fboxrule}{.5mm}
  Ceci est un \fbox{EXEMPLE} idiot...
\end{ltxexempleiii}
La dernière difficulté est de gérer le système de référencement. En
effet, on ne peut pas écrire :
\begin{ltxcode}
  Voici un exemple.\label{monexemple}.
\end{ltxcode}
Car la séquence \verb+\label{monexemple}+  apparaîtra dans
l'exemple :
\begin{ltxexemple}
  Voici un exemple.\label{monexemple}  
\end{ltxexemple}
Ce qui n'est pas souhaitable... La solution adoptée ici a été de
passer l'éventuelle étiquette de \verb+\label+ à l'environnement par
le truchement d'une commande. On a défini :
\begin{ltxcode}
  \newcommand{\l@belex}{} % la valeur courante du label
  % commande pour la mettre à jour
  \newcommand{\labelexemple}[1]{%
    \renewcommand{\l@belex}{#1}}
\end{ltxcode}
Ainsi avant l'utilisation d'un environnement \ltxenv{ltxexemple} il
suffira d'appeler :
\begin{ltxcode}
  \labelexemple{ø\marg{étiquette}ø}
\end{ltxcode}
pour pouvoir ensuite y faire référence avec
\verb+\ref{+\marg{étiquette}\verb+}+ ou une commande équivalente. Dans
la définition de l'environnement \ltxenv{ltxexemple}, on a ajouté :
\begin{ltxcode}
  % si le label courant n'est pas vide
  \ifthenelse{\equal{\l@belex}{}}{}{%
    \label{\l@belex}}% on pose un label
\end{ltxcode}
qui signifie en français : « si la commande \verb+\l@belex+ est
définie à une valeur non vide, on pose une étiquette (commande
\ltxcom{label}) avec cette valeur ». Il faut ensuite repositionner la
commande \verb+\l@belex+ à une valeur vide car dans le cas contraire
l'étiquette serait définie plusieurs fois (message « Label `xxx'
multiply defined » de \LaTeX{}). On pourrait donc écrire :
\begin{ltxcode}
  % si le label courant n'est pas vide
  \ifthenelse{\equal{\l@belex}{}}{}{%
    \label{\l@belex}% on pose un label
    \renewcommand{\l@belex}{}}
\end{ltxcode}
ce qui est correct du point de vue de la syntaxe. Cependant la portée
de la commande \ltxcom{renewcommand} est ici locale au groupe dans
lequel le test \ltxcom{ifthenelse} intervient. Pour contourner ce
problème on utilisera la construction \TeX{} :
\begin{ltxcode}
  \global\def\l@belex{}
\end{ltxcode}
en lieu et place du \ltxcom{renewcommand} pour effectuer une
redéfinition à portée globale...

\subsection{Le trait central}
\label{sec-jouets-ltxexemple-trait-central}

Il reste donc à traiter la partie ayant pour but de tracer le vilain
trait entre les deux boîtes. La première chose à faire est de mesurer
la hauteur totale des deux boîtes, et de conserver la plus importante.
Ceci est réalisé grâce au code suivant :
\begin{ltxcode}
  % mesure de la boîte d'entrée
  \hauteurtotale{\tempodim}{\usebox{\b@iteentree}}%
  % mesure de la boîte de sortie
  \hauteurtotale{\hauteurdutrait}{\usebox{\b@itesortie}}%
  % on garde la plus grande
  \ifthenelse{\hauteurdutrait>\tempodim}{%
    \setlength{\tempodim}{\hauteurdutrait}}{}
\end{ltxcode}
Les dimensions \ltxlen{hauteurdutrait} et \ltxlen{tempodim} auront
bien entendu fait l'objet d'une déclaration préalable. On peut voir
une présentation de La commande \ltxcom{settotoalheight} au
paragraphe~\ref{sec-jouets-ltxexemple-outils}.

La dimension du trait noir à tracer entre l'entrée et la sortie
correspond exactement \ltxlen{hauteurtrait} moins
\ltxlen{l@rgeurnumex} (la largeur de la boîte contenant le numéro de
l'exemple). On stocke cette dimension :
\begin{ltxcode}
  % hauteur du trait sans la boîte du numéro
  \setlength{\hauteurdutrait}{\tempodim-\l@rgeurnumex}
\end{ltxcode}
Nous avons décidé après un vote à bulletin secret en assemblée
générale, de dessiner 70\% du trait au dessus du numéro et 30\% en
dessous. Par conséquent le trait central est produit dans un
\ltxcom{parbox} comme suit :
\begin{ltxcode}
  % le trait central
  \parbox{3pt}{%
    \begin{center}
      % 70% au dessus
      \rule{3pt}{.7\hauteurdutrait}\\\nointerlineskip%
      \rotatebox{90}{\affichenumex}\\\nointerlineskip%
      % 30% en dessous
      \rule{3pt}{.3\hauteurdutrait}% 
    \end{center}}
\end{ltxcode}
La commande \ltxcom{nointerlineskip} permet de supprimer tout blanc
vertical supplémentaire qui pourrait être inséré par la commande
\verb+\\+. Plus de détails sont donnés à la section présentant
l'implémentation de la \voir[][-5pt]{sec-cosmetique-myminitoc-code}{boîte avec
  titre} pour la minitable des matières.
\begin{ltxexemple}
  Voilà, c'est tout pour ce merveilleux
  environnement \ltxenv{ltexexemple}. Notez 
  que la  dimension \texttt{3pt} pourrait 
  faire l'objet de la définition d'une 
  longueur...
\end{ltxexemple}




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