IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tout ce que vous avez toujours voulu savoir sur LaTeX sans jamais oser le demander


précédentsommairesuivant

Introduction

Que tes pieds sont beaux dans ta chaussure, fille de prince!
Les contours de ta hanche sont comme des colliers, Œuvre des mains d'un artiste.
Ton sein est une coupe arrondie, Où le vin parfumé ne manque pas
Ton corps est un tas de froment, Entouré de lis(67).
Le Cantique des cantiques Ct 7 2.

Cette partie s'intitule « Tout ce que vous avez toujours voulu savoir sur (Tout ce que vous avez toujours voulu savoir sur LaTeX sans jamais oser le demander) sans jamais oser le demander ». Elle a pour but d'expliquer comment les chapitres précédents ont été produits, et donc présente les différentes commandes et environnements qui ont été définis pour générer le manuel que vous avez sous les yeux. Mais son objectif est plus large puisque nous espérons fournir ici au courageux lecteur, une base solide pour la création de ses propres styles...

L'idée a germé dans mon esprit d'écrire les chapitres suivants après avoir eu plusieurs questions de lecteurs me demandant s'ils pouvaient réutiliser tel ou tel aspect du style de ce document. Le chantier que représente la rédaction des pages qui suivent a été pour moi titanesque dans la mesure où j'ai dû présenter des aspects de LaTeX qui ne font plus partie des connaissances de base et qui sont donc à ce titre plus difficiles à expliquer(68). Enfin — et non des moindres — ce qui reste généralement de l'ordre du bazar privé a dû ici être « rationnalisé » pour être présentable. Ce qui n'a pas été une mince affaire.

J'ai voulu dans cette partie présenter la démarche que j'ai adoptée pour générer ce document. Je ne prétends pas qu'il s'agit du seul moyen possible pour obtenir la mise en page que vous avez sous les yeux. Par exemple, certaines parties de ce document auraient pu être produites à l'aide de paquets existants fournissant des fonctionnalités analogues ou même meilleures que celles des outils développés ici.

L'idée sous-jacente à cette partie est donc bien de guider l'utilisateur curieux vers des pistes d'exploration de LaTeX, de montrer comment on peut à l'aide de quelques outils, mettre au point des commandes originales correspondant exactement à ses propres besoins. Ces pistes sont suffisament générales pour être suivies telles quelles ou adaptées pour des cas similaires ou non. Il s'agit donc de découvrir les grands classiques des fonctionnalités internes de « LaTeX » et d'avoir la satisfaction — sans pour autant prôner la « ré-invention » de la roue — de créer ses propres outils.

J'ai tenté, autant que possible, de présenter des commandes n'utilisant que LaTeX. Il a cependant parfois été nécessaire d'utiliser certaines des fonctionnalités de TeX ce qui a donné l'occasion de les présenter ici. Cette partie se compose donc de trois chapitres :

Outillage nécessaire qui présente les commandes à connaître permettant de s'équiper pour la suite. On y trouve par exemple quelques pistes sur la structure des fichiers d'une distribution LaTeX, des idées pour changer les fontes d'un document, et une présentation détaillée de la création de nouveaux environnements basés sur les listes ;

Cosmétique qui présente les outils qui ont été mis en œuvre pour changer l'allure des titres, des en-têtes et pieds de page, des marges, et quelques autres petites choses ;

De nouveaux jouets qui est l'occasion d'expliquer la création des onglets de ce manuel, du glossaire, des exemples, du sommaire, des lettrines, des notas, et de quelques autres bricoles.

Certaines explications données dans les chapitres qui suivent sont tellement fumeuses que même l'auteur ne les comprend pas. Certaines solutions apportées aux problèmes ne sont que partielles. Enfin, certaines choses restent mystérieuses pour votre serviteur ; dans ces situations, un panneau « dos d'âne » est inséré dans le paragraphe.

9. Outillage nécessaire

Que tu es belle, que tu es agréable,
Ô mon amour, au milieu des délices !
Ta taille ressemble au palmier,
Et tes seins à des grappes.

Le Cantique des cantiques Ct 7 7.

Dans ce chapitre nous présentons les outils pré requis permettant de créer des commandes et des environnements plus complexes que ceux exposés au chapitre 4Un pas vers la sorcellerie. Nous profitons d'ailleurs de cette introduction pour dire que le chapitre 4Un pas vers la sorcellerie auquel nous faisons référence ici doit être correctement digéré pour commencer la lecture de cette partie. Quelques mécanismes autour des fontes sont également présentés ainsi que quelques pistes pour fouiller dans les sources de LaTeX.

9-1. Hercule Poirot

9-1-1. Fouiller dans les fichiers

Tout d'abord, pour personnaliser un document écrit avec LaTeX, il est nécessaire de connaître la manière dont sont organisés les fichiers qui composent la distribution du système TeX/LaTeX que vous utilisez. Votre serviteur utilise la distribution TeXLive pour Unix (http://www.tug.org/texlive). Dans cette distribution on pourra dans un premier temps compulser les documentations des packages se trouvant dans le répertoire :

 
Sélectionnez
1.
/usr/share/texmf-texlive/doc/latex/

Ce répertoire contient d'autres sous-répertoires, généralement un par package, dont la documentation est sous la forme d'un fichier dvi ou PostScript. Dans certaines situations, il est nécessaire d'aller scruter les sources des packages. Dans la distribution teTeX ces sources se trouvent dans :

 
Sélectionnez
1.
/usr/share/texmf-texlive/tex/latex

et là aussi, on trouvera généralement un répertoire par package, contenant les sources dans un fichier au format texte, portant l'extension .sty et éventuellement des fichiers connexes. Enfin, pour comprendre le comportement par défaut de LaTeX, indépendamment des packages que l'on peut inclure, on pourra avoir recours aux sources de LaTeX dans :

 
Sélectionnez
1.
/usr/share/texmf-texlive/tex/latex/base/latex.ltx

et aux sources des classes de documents dans :

 
Sélectionnez
1.
/usr/share/texmf-texlive/tex/latex/base/book.cls

pour la classe book.

9-1-2. Examiner les macros

Un moyen pratique de trouver la définition d'une commande consiste à le demander à LaTeX lors d'une session interactive. On lance directement dans un terminal de commande du système d'exploitation :

 
Sélectionnez
1.
latex

Mon système me répond froidement :

 
Sélectionnez
1.
2.
3.
This is e-TeXk, Version 3.14159-2.1 (Web2C 7.4.5)
 %&-line parsing enabled.
**

À l'invite de ce prompt spartiate (**) qui est le cri du « TeX tout nu », je réponds bravement &latex pour demander à charger le format LaTeX. La réponse ne tarde pas :

 
Sélectionnez
1.
2.
3.
4.
5.
**&latex
entering extended mode
LaTeX2e <2001/06/01>
Babel <v3.7h> and hyphenation patterns for american, french loaded.
*

Notez que le prompt a perdu une étoile. À partir de maintenant on peut écrire un document LaTeX interactivement. Ce qui a certes peu d'intérêt dans l'absolu, mais peut s'avérer très utile pour obtenir la définition d'une commande avec la syntaxe. On pourra par exemple taper :

  • *\showcommande

pour avoir la définition de commande. Par exemple :

 
Sélectionnez
1.
2.
3.
4.
*\show\mbox
> \mbox=\long macro:
#1->\leavevmode \hbox {#1}.     ← c'est la définition
<*> \show\mbox

nous montre la définition de la commande \mbox. On remarque que cette commande lorsqu'elle est appelée, se transforme en un appel à \leavevmode et \hbox. Notre esprit de curiosité nous pousse donc à écrire :

 
Sélectionnez
1.
2.
3.
*\show\hbox
> \hbox=\hbox.                ← c'est une primitive
<*> \show\hbox

On constate ici que \hbox n'est pas définie à partir d'une autre commande. Il s'agit donc de ce que TeX appelle une primitive. L'exploration peut être poursuivie :

 
Sélectionnez
1.
2.
3.
4.
*\show\leavevmode
> \leavevmode=macro:
->\unhbox \voidb@x .          ← définition de \leavevmode
<*> \show\leavevmode

et ainsi de suite...

9-2. Outils de bas niveaux

9-2-1. Pour qui sont ces pourcents ?

Vous avez peut-être déjà remarqué que le code LaTeX contient parfois le caractère % en fin de ligne. La présence de ce % s'explique par le fait qu'un saut de ligne dans le code insère un espace dans le texte. Ainsi la commande :

 
Sélectionnez
1.
\newcommand{\beurk}{bidule}

peut s'écrire pour des raisons de lisibilité :

9.1
Sélectionnez
1.
2.
3.
4.
\newcommand{\beurk}{
bidule
}
==(\beurk)==
Image non disponible

On constate donc qu'il y a deux espaces non désirés autour du mot « bidule ». On peut éviter cela en écrivant :

9.2
Sélectionnez
1.
2.
3.
4.
\newcommand{\ahhh}{%
  bidule%
}
==(\ahhh)==
Image non disponible

Il existe une autre situation où les espaces peuvent s'immiscer pernicieusement dans le texte. Définissons un environnement :

 
Sélectionnez
\newenvironment{hyperimportant}{%
  \bfseries\itshape}{%
  \upshape\mdseries}
9.3
Sélectionnez
1.
2.
3.
4.
5.
Il est impératif
\begin{hyperimportant}
  de multiplier les sauvegardes
\end{hyperimportant}
de vos documents personnels
Image non disponible

Si vous regardez attentivement le texte produit, vous noterez qu'il y a deux espaces de chaque côté de la séquence mise en italique gras « de ... sauvegardes » :

  • deux espaces avant « de » introduits par le saut de ligne à la fin de « est impératif » et celui à la fin de \begin{hyperimportant} ;
  • deux espaces après « sauvegardes » induits par le saut de ligne à la fin de « sauvegardes » et par celui à la fin de \end{hyperimportant}.

La preuve, si on supprime ces sauts de ligne :

9.4
Sélectionnez
1.
2.
3.
4.
Il est impératif\begin{hyperimportant} de
multiplier les
sauvegardes\end{hyperimportant} de vos
documents personnels
Image non disponible

Pour éviter d'avoir à se soucier de ce genre de problème on a généralement recours à deux commandes permettant de supprimer ces espaces doubles. On fait appel, pour éliminer ceux situés avant la séquence à \ignorespaces et pour ceux situés après, à la commande \unskip.

La commande \ignorespaces

Cette commande procède à l'expansion des commandes qui suivent en ignorant tous les espaces qui la suivent :

9.5
Sélectionnez
1.
2.
3.
4.
\newcommand{\truc}{ }\newcommand{\bidule}{ }

a\truc\bidule b\par
a\ignorespaces\truc\bidule b
Image non disponible

Dans l'exemple ci-dessus, les commandes \truc et \bidule ont pour seul but de produire un espace lorsqu'elles seront appelées. Par conséquent, la ligne :

 
Sélectionnez
1.
a\truc\bidule b

produira 'a␣{␣}b' c'est-à-dire les deux lettres a et b séparées par deux espaces. L'appel avec la commande \ignorespaces ignore — comme son nom l'indique — les deux espaces produits par les commandes \truc et \bidule. On peut donc utiliser cette commande dans notre exemple précédent :

 
Sélectionnez
1.
2.
\newenvironment{hyperimportant}{%
  \bfseries\itshape\ignorespaces}{\upshape\mdseries}

qui devrait supprimer un espace :

9.6
Sélectionnez
1.
2.
3.
4.
5.
Il est impératif
\begin{hyperimportant}
  de multiplier les sauvegardes
\end{hyperimportant}
de vos documents personnels.
Image non disponible
La commande \unskip

Si vous êtes attentif, vous noterez que deux espaces entre « sauvegardes » et « de » résistent à nos assauts. C'est là qu'intervient la primitive TeX \unskip qui enlève le dernier espace inséré :

9.7
Sélectionnez
1.
2.
3.
4.
\newcommand{\truc}{ }\newcommand{\bidule}{ }

a\truc\bidule b\par
a\truc\bidule\unskip b
Image non disponible

Finalement la définition « correcte » de notre environnement est la suivante :

 
Sélectionnez
1.
2.
\newenvironment{hyperimportant}{%
  \bfseries\itshape\ignorespaces}{\unskip\upshape\mdseries}

qui devrait supprimer tous les espaces indésirables :

9.8
Sélectionnez
1.
2.
3.
4.
5.
Il est impératif
\begin{hyperimportant}
  de multiplier les sauvegardes
\end{hyperimportant}
de vos documents personnels.
Image non disponible

9-2-2. Le caractère @

Lorsque vous vous lancerez dans l'exploration des sources des packages vous remarquerez que le nom d'une grande partie des commandes qui y sont définies contient le caractère @. Or dans un document .tex, il n'est pas autorisé d'exécuter une commande dont le nom contient ce dernier. Ceci permet de protéger ou de limiter la portée des commandes des packages. Par exemple la commande \cb@defpoint, définie dans le package changebar, ne peut pas être appelée par un utilisateur du package. Pour redéfinir ces commandes internes, il est nécessaire d'effectuer la petite manipulation suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
\makeatletter
% ici on peut bidouiller
\renewcommand{\@ttention}{oulala...}
\makeatother
% ici on ne peut plus

La commande hypothétique \@ttention peut uniquement être manipulée si le caractère @ est une lettre. C'est le rôle de \makeatletter qui transforme le caractère @ en une lettre comme les autres, tandis que la commande \makeatother lui réaffecte sa fonction spéciale.

Cette manipulation n'est pas nécessaire dans les fichiers de styles inclus avec la commande \usepackage pour lesquels la lettre @ peut être utilisée comme un caractère.

La manière dont TeX peut changer la catégorie des caractères est expliquée au chapitre suivant au paragraphe 10.5.1Digression vers les caractères....

9-2-3. Le \let de TeX

Il est parfois utile de modifier une commande interne de LaTeX pour ajouter une fonctionnalité à son comportement par défaut. Par exemple pour modifier la commande interne \bidule(69), on peut procéder comme suit :

  1. sauvegarder la commande grâce à l'instruction \let de TeX :

     
    Sélectionnez
    1.
    \let\biduleORIG\bidule
    
  2. redéfinir la commande \bidule en se basant sur la définition intiale :

     
    Sélectionnez
    1.
    \renewcommand{\bidule}{quelque chose en plus\biduleORIG}
    
  3. si nécessaire, revenir à la définition initiale grâce à :

     
    Sélectionnez
    1.
    \let\bidule\biduleORIG
    

9-3. Structures de contrôle et tests

Les structures introduites par le package ifthen suivent la syntaxe :

  • \ifthenelse{ expression booléenne }
    { ... code LaTeX si vrai ... }
    { ... code LaTeX si faux ... }

et :

  • \whiledo{ expression booléenne }
    { ... code LaTeX tant que c'est vrai ... }

L'expression booléenne peut être constituée selon le contexte de différentes commandes du package ifthen, et parmi elles :

  • les expressions nombre1 > nombre2, nombre1 < nombre2 ainsi que l'expression nombre1 = nombre2 permettant chacune d'elles de comparer les deux valeurs nombre1 et nombre2 ;
  • \equal{C1}{C2} qui renvoie vrai ou faux selon que la chaîne de caractère C1 est égale à la chaîne C2 ;
  • \isodd{nombre} qui renvoie vrai si le nombre est impair, faux sinon ;
  • \value{compteur} qui renvoie la valeur d'un compteur sous la forme d'un nombre exploitable dans les conditions booléennes ;
  • \lengthtest{test longueur} qui renvoie l'évaluation de test longueur, test contenant les opérateurs <, > ou = et des longueurs LaTeX comme opérandes.

On notera également qu'on pourra utiliser les connecteurs logiques \OR, \AND et \NOT qui jouent le rôle qu'on attend d'eux dans une expression booléenne. On peut grouper des expressions avec les opérateurs \( et \).

9-3-1. Booléens et opérateurs associés

Le package ifthen propose à ses vaillants utilisateurs la possibilité de manipuler des booléens. On peut en déclarer un avec la commande \newboolean :

  • \newboolean{id booléen}

qui définit une « variable » booléenne identifiée par id booléen. On pourra ensuite lui affecter la valeur true ou false avec la commande \setboolean :

  • \setboolean{id booléen}{valeur}

Et bien sûr on pourra utiliser le booléen ainsi créé avec les structures de contrôleStructures de contrôle et tests, par exemple comme ceci :

  • \ifthenelse{\boolean{id booléen}}
    { code LaTeX si id booléen vaut vrai }
    { code LaTeX s'il vaut faux }

Il est bon de connaître la version TeX de ce qui précède. On trouve en effet dans les packages LaTeX du code écrit en TeX, et en particulier l'utilisation de la structure de contrôle « Si Alors Sinon ». Voici un exemple pour définir un nouveau booléen avec monsieur TeX :

 
Sélectionnez
1.
\newif\ifimprimantecouleur

On le positionne à faux avec :

 
Sélectionnez
1.
\imprimantecouleurfalse

et à vrai avec :

 
Sélectionnez
1.
\imprimantecouleurtrue

On peut ensuite exploiter ce booléen dans une structure « Si Alors Sinon » à la mode TeX comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
\ifimprimantecouleur
  ... % code si on a une imprimante couleur
\else
  ... % code si c'est une imprimante noir et blanc
\fi

9-3-2. Exemples

On souhaite écrire une commande pour produire le développement de la fonction factorielle(70) de manière à pouvoir écrire :

9.9
Sélectionnez
1.
2.
3.
4.
5.
On peut exprimer la factorielle de 10
comme suit :
\begin{displaymath}
  10!=\itfactorielle{10}
\end{displaymath}
Image non disponible

Une façon de résoudre le problème est d'écrire une commande contenant une boucle \whiledo :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\itfactorielle}[1]{%
  \setcounter{cptfact}{#1}% on stocke l'argument dans un compteur
  \whiledo{\value{cptfact}>1}{% tant qu'il est > 1
    \thecptfact\times% on l'affiche avec un ×
    \addtocounter{cptfact}{-1}}% on décrémente le compteur
1}% on affiche 1 à la fin

Il faudra bien sûr déclarer le compteur :

 
Sélectionnez
1.
\newcounter{cptfact}

On notera que dans la condition booléenne de la boucle « TantQue », on fait appel à la commande \value pour comparer la valeur du compteur avec la valeur 1. Un peu plus tordu : on peut implémenter cette commande de manière récursive :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newcommand{\recfactorielle}[1]{% version récursive :
\setcounter{cptfact}{#1}% on affecte l'argument au compteur
  \ifthenelse{#1>1}{% si cette valeur est supérieure à 1
    \thecptfact\times% on l'affiche suivie de ×
    \addtocounter{cptfact}{-1}% on décrémente le compteur
    \recfactorielle{\thecptfact}}% on fait un appel récursif
{1}}% sinon (valeur=1) on affiche 1

Cette commande produit évidemment le même résultat que la précédente. On notera que dans la condition du \ifthenelse on compare un nombre (#1) avec un autre (1). Enfin on pourra remarquer que la présence de la commande \times impose le mode mathématique pour exécuter ces commandes. On peut contourner le problème, si nécessaire, avec la commande \ensuremathCommandes.

Le \whiledo et le \ifthenelse ont été utilisés dans le document que vous avez sous les yeux pour générer les tableaux de symboles C.22 et C.23, ainsi que les tableaux 7.1 sur le codage du chapitre sur les documents en français. Nous avons tout d'abord créé une commande permettant d'afficher un symbole :

9.10
Sélectionnez
1.
2.
\affsymb{pzd}{249} \affsymb{pzd}{75}
\affsymb{pzd}{221} \affsymb{pzd}{88}
Image non disponible

Cette commande est la suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\affsymb}[2]{%
  \framebox{% un cadre
    \parbox[][16pt][b]{1em}{% autour d'une boîte paragraphe
      \centering% de 16 pt de hauteur, 1em de large,
      \Pisymbol{#1}{#2}\\% dont le contenu centré
      \tiny#2}}}% est composé du symbole et de son numéro

L'argument #1 est le nom de la police (pzd ou psy), et l'argument #2 est le numéro de symboleAnnexe C -Symboles. Sinon, rien de particulier dans cette commande, si vous avez suivi jusqu'ici (notamment en lisant le chapitre 4Un pas vers la sorcellerie et plus particulièrement le paragraphe 4.4Boîtes)… Nous avons ensuite défini une commande permettant d'afficher une série de symboles :

9.11
Sélectionnez
1.
2.
3.
4.
5.
Voici les symboles Zapf Dingbats, à partir
du \No 40, sur 3 lignes et 6 colonnes :
\begin{center}
  \symboles[40]{pzd}{3}{6}
\end{center}
Image non disponible

Voici le code de la commande \symboles :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
\newcommand{\symboles}[4][0]{%
  \setcounter{clig}{0}% Mise à zéro des compteurs de ligne
  \setcounter{ccol}{0}% et de colonne
  \setcounter{cligmax}{#3}% arguments 3 et 4 pour fixer
  \setcounter{ccolmax}{#4}% le nombre max de colonnes et de lignes
  % Pour chaque ligne :
  \whiledo{\value{clig}<\value{cligmax}}{%
    \setcounter{ccol}{0}% remise à zéro du compteur de colonne
    % et pour chaque colonne :
    \whiledo{\value{ccol}<\value{ccolmax}}{%
      % on calcule le numéro du symbole
      \setcounter{csym}{%
        \value{clig}*\value{ccolmax}+\value{ccol}+#1}
      % si sa valeur est inférieure à 256
      \ifthenelse{\value{csym}<256}{%
        \affsymb{#2}{\thecsym}}{% on l'affiche
        \mbox{}}% sinon on créé un boîte vide
      \stepcounter{ccol}}% on passe à la colonne suivante
    \stepcounter{clig}% on passe à la ligne suivante
    % on saute une ligne , sauf à la fin
    \ifthenelse{\value{clig}<\value{cligmax}}{\\}{}}}

Il faudra bien sûr déclarer les cinq compteurs avec la commande \newcounter.

9.12
Sélectionnez
1.
2.
3.
4.
5.
6.
Et je sais que vous êtes tout particulièrement
curieux de voir ce que fait cette commande
lorsque le compteur dépasse les bornes :
\begin{center}
  \symboles[240]{psy}{3}{6}
\end{center}
Image non disponible

9-3-3. Tester la parité des pages

C'est une pratique courante — on le verra par la suite — de créer des commandes ayant un comportement différent selon la parité de la page. À l'entrée « Finding if you're on an odd or an even page » de la Faq anglaise [14] est expliqué que le naïf :

 
Sélectionnez
1.
2.
3.
\ifthenelse{\isodd{\value{page}}}
{ ... la page est impaire ... }
{ ... la page est paire ... }

peut ne pas donner le résultat escompté. Le compteur de page lorsqu'il est examiné à la frontière entre deux pages peut ne pas être à jour : le compteur de page s'il est interrogé au début d'une page renverra le numéro de la page précédente... Ceci est dû à la manière dont TeX procède pour effectuer les sauts de page. Pour contourner ce problème plusieurs solutions sont possibles. Celle adoptée dans ce document consiste à utiliser le package chngpage qui insère artificiellement un \label à l'endroit où l'on veut tester la parité de la page.

Par conséquent dans le cas où le test de parité à réaliser peut être évalué à la frontière entre deux pages, il faudra écrire :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\checkoddpage%
\ifcpoddpage
  ... la page est impaire ...
\else
  ... la page est paire...
\fi

9-4. Fontes

9-4-1. Le jeu des « trois » familles

Pour conserver une homogénéité dans l'allure des caractères dans un document LaTeX, sont définies trois familles :

  1. kitxmlcodeinlinelatexdvp\textrm{la famille roman celle que vous êtes en train de lire}finkitxmlcodeinlinelatexdvp ;
  2. kitxmlcodeinlinelatexdvp\textsf{la famille sans sérif que vous êtes également en train de lire à l'instant même}finkitxmlcodeinlinelatexdvp ;
  3. et la famille machine à écrire, également appellée « typewriter » lorsqu'on est anglophone, que — cela ne vous aura sans doute pas échappé — kitxmlcodeinlinelatexdvp\texttt{vous êtes en train de lire}finkitxmlcodeinlinelatexdvp.

Il est important de noter que ces trois familles de fontes sont par défaut trois familles de la police baptisée par son auteur (Knuth lui-même) « Computer Modern ». Elles sont conçues pour s'harmoniser au sein d'un même document. Dans cet ordre d'idée, il faudra toujours veiller à ce que ces trois familles (roman, sans sérif, et machine à écrire) soient visuellement « compatibles » entre elles. Les distributions de LaTeX proposent généralement des packages permettant d'utiliser les fontes PostScript dans un document, avec notamment le célèbre(71) package times utilisant :

  • Image non disponible ;
  • Image non disponible ;
  • Image non disponible.

De même le package newcent utilise :

  1. Image non disponible ;
  2. Image non disponible ;
  3. Image non disponible.

9-4-2. Désignation des fontes et de leurs attributs

Une fonte(72) ou police de caractères est définie dans LaTeX par plusieurs caractéristiques dont il a été question au paragraphe 2.1Mise en évidence. De manière à désigner la fonte à l'aide des commandes que nous allons découvrir dans ce paragraphe, on utilisera :

  • un codage qui sera à quelques exceptions près le codage T1 ;
  • une série de caractères identifiant la famille : cmr pour « computer modern roman », ptm pour « PostScript times », etc.
  • une série de caractères pour la « graisse » de la fonte : m pour « médium », b pour « bold » (gras), bx pour « bold extended » (gras étendu, c'est-à-dire gras avec des caractères plus larges), etc.
  • une série de caractères définissant l'allure (shape en anglais) de la fonte : n pour « normal », it pour « italique », sl pour « slanted » (penché), etc.
Fontes « computer modern »

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

Image non disponible
Image non disponible
Fontes en béton

Elles ont été dessinées par Knuth pour son ouvrage intitulé « Mathématiques concrètes ». Le package beton(73) permet de les charger dans un document.

Image non disponible
Fontes « gothiques »
Image non disponible
Image non disponible
Fontes PostScript

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

Image non disponible
Image non disponible
Image non disponible
Image non disponible

9-4-3. Changer de fontes

Globalement

On peut changer de police de caractères en utilisant des packages plus ou moins standard de la distribution LaTeX :

  • mathptmx : pour utiliser le « vilain » Times New Roman ;
  • mathptmx : pour le New Century ;
  • mathptmx : pour le Palatino ;
  • ... : et d'autres, n'avez qu'à fouiller votre distribution...

Si l'on examine le contenu du fichier newcent.sty on trouve simplement :

 
Sélectionnez
1.
2.
3.
\renewcommand{\rmdefault}{pnc}
\renewcommand{\sfdefault}{pag}
\renewcommand{\ttdefault}{pcr}

ce qui signifie que — comme expliqué au §9.4.1Le jeu des « trois » familles — on a redéfini les trois familles « roman », « sans sérif » et « machine à écrire » en les nommant par leur nom LaTeX standardisé : pcn pour PostScript NewCentruy, pag pour PostScript AvantGarde etc. Les noms standardisés sont donnés dans les tableaux de la section précédente.

Localement

Il est toujours possible de changer localement de fonte dans un texte en spécifiant les paramètres nécessaires :

9.13
Sélectionnez
1.
2.
3.
4.
5.
{\fontfamily{cmfr}\selectfont
  On passe en ``Funny Roman'' et même qu'on
  peut faire de l'\emph{italique}...
  c'est dingue !} Et hop nous voila de nouveau
en \verb+\rmdefault+
Image non disponible

Les appels qu'il est possible de faire avant la commande \selectfont sont :

  • \fontencoding pour le codage ;
  • \fontfamily avec comme argument la famille (cmr pour Computer Modern, ptm pour PostScript Times, etc.) ;
  • \fontseries pour préciser la graisse (argument b pour gras, m pour la graisse moyenne, etc. ) ;
  • \fontshape pour l'allure de la fonte (argument n pour normal, sl pour penché, etc.) ;
  • \fontsize avec deux arguments : la taille des caractères et l'espace entre deux lignes consécutives.

Voici un autre exemple :

9.14
Sélectionnez
1.
2.
3.
4.
5.
{\fontfamily{ppl}\fontseries{b}%
  \fontsize{2cm}{2.5cm}\selectfont
  gros !}

Et nous voila de nouveau en \verb+\rmdefault+
Image non disponible

Finalement, s'il on veut faire appel de manière répétée à une fonte dont tous les attributs sont fixes, on pourra avoir recours à la commande \DeclareFixedFont prenant six arguments (nom, codage, famille, graisse, allure, taille) et permettant d'être ensuite utilisée comme une déclaration :

9.15
Sélectionnez
1.
2.
3.
4.
\DeclareFixedFont{\toupiti}{T1}{pag}{m}{n}{3pt}
Avant {\toupiti bon bé là à moins d'avoir une
bonne loupe vous ne serez pas capable de lire
ce texte} après.
Image non disponible

9-5. Listes et nouveaux environnements

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

9-5-1. Principe

Pour définir un environnement basé sur les listes, on utilisera la syntaxe suivante :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newenvironment{maliste}%
{\begin{list}%
  { ... code pour l'item par défaut ... }
  { ... caractéristiques de la liste ... }
}%
{\end{list}}

L'environnement list prend donc deux arguments. Le premier permet de définir l'allure de l'étiquette (ou item) par défaut. Le second permet de définir la liste elle-même et en particulier :

Sa géométrie : les marges, les espaces entre les paragraphes composant la liste, les espaces entre la liste et l'environnement dans lequel elle est insérée, etc.

la production de l'étiquette : c'est-à-dire la manière dont on va effectivement produire le titre de chaque entrée de la liste.

La liste suivante tente d'illustrer les différentes dimensions que l'on peut modifier pour définir sa propre liste :

Image non disponible

La commande \makelabel prenant un argument, permet de produire l'étiquette. Ainsi lorsqu'on entre la commande \item[texte étiquette], il est fait appel à la commande \makelabel{texte étiquette}.

9-5-2. Réglage de l'étiquette

Pour comprendre le fonctionnement de l'environnement list et plus particulièrement le principe du positionnement relatif de l'étiquette et du paragraphe adjacent, on peut imaginer que les éléments sont positionnés dans l'ordre suivant :

  1. le paragraphe est d'abord positionné par rapport à la marge de gauche à l'aide de la longueur \leftmargin ;
  2. la première ligne du paragraphe est ensuite indenté à l'aide de la longueur \itemindent ;
  3. puis l'étiquette est positionnée relativement au début du paragraphe ainsi indenté à l'aide de la longueur \labelsep.

Il découle de ceci que l'entrée de liste (ou étiquette) peut être produite dans la marge de gauche... La figure 9.1 illustre le positionnement de l'entrée de liste par rapport au paragraphe dans les deux situations suivantes :

Image non disponible
Fig. 9.1 - Positionnement de l'entrée de liste
  • cas de la figure 9.1a où la largeur de l'entrée de liste est inférieure à la dimension \labelwidth. Dans ce cas l'entrée de liste est positionnée à une distance de \labelsep du paragraphe, lui même étant indenté de \itemindent et positionné par rapport à la marge gauche à l'aide de \leftmargin ;
  • cas de la figure 9.1b : la largeur de l'entrée de liste est supérieure à la dimension \labelwidth. Dans ce cas l'entrée de liste est toujours positionnée à la distance \labelsep du paragraphe, mais celui-ci est indenté d'une valeur supérieure à \itemindent.

9-5-3. Réglages verticaux

On peut également régler les blancs verticaux dans l'environnement list. Ces paramètres permettent notamment de définir les espaces entre les paragraphes constituant les entrées de liste, mais également les blancs que l'on veut insérer avant ou après la liste. Il s'agit de :

  • \itemsep : l'espace entre chaque entrée de liste ;
  • \parsep : l'espace entre deux paragraphes à l'intérieur d'une entrée de liste ;
  • \topsep : le blanc inséré avant et après l'environnement créé, auquel est ajouté \partopsep si celui-ci commence un nouveau paragraphe.

9-5-4. Valeurs par défaut

Tous les paramètres de l'environnement list ont des valeurs par défaut. Les longueurs pour les réglages horizontaux sont par défaut les suivantes sur le système de votre serviteur :

dimension valeur par défaut
\itemindent 0pt
\itemindent 0pt
\listparindent 0pt
\rightmargin 0pt
\leftmargin 25pt
\labelwidth 20pt
\labelsep 5pt

Et pour les réglages verticaux :

dimension valeur par défaut
\itemsep 4.0pt plus 2.0pt minus 1.0pt
\parsep 4.0pt plus 2.0pt minus 1.0pt
\topsep 8.0pt plus 2.0pt minus 4.0pt
\partopsep 2.0pt plus 1.0pt minus 1.0pt

La commande \makelabel est quant à elle définie par :

 
Sélectionnez
1.
\hfil #1

par conséquent, dans la boîte de largeur \labelwidth, le contenu de l'étiquette est poussé à droite. Ainsi si on définit une liste simple avec :

 
Sélectionnez
1.
2.
3.
\newenvironment{listebasique}
{\begin{list}{}{}}
{\end{list}}

On aura :

9.16
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Avant avant avant avant avant avant avant
avant avant
\begin{listebasique}
  \item[X] o o o o o o o o o o o o o o o o
    o o o o o o o o o o o o o o o o o o o o

    u u u u u u u u u u u u u u u u u u u u
  \item[Machin] v v v v v v v v v v v v v v
\end{listebasique}
Après après après après après après après
après après après
Image non disponible

avec des étiquettes, et sans étiquette :

9.17
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
Avant avant avant avant avant avant avant
avant avant avant avant avant avant avant
\begin{listebasique}
  \item[] e e e e e e e e e e e e e e e e e
    e e e e e e e e e e e e e e e e e e e e
\end{listebasique}
Après après après après après après après
après après après après après après après
Image non disponible

9-5-5. Exemples

La liste décrivant les fichiers auxiliaires de LaTeX située annexe B.2Les fichiers auxiliaires a été produite avec le code suivant :

9.18
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\begin{ficaux}
\item[tex] fichier source \LaTeX{} ; blabla
  blabla blabla blabla blabla blabla blabla
  blabla blabla blabla blabla
\item[aux] fichier auxiliaire ...
\item[log] le fichier de trace ...
\item[dvi] fichier \emph{device
         independant},...
\end{ficaux}
Image non disponible

L'environnement ficaux a lui été conçu comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newenvironment{ficaux}{%
  \begin{list}{}{%
    \setlength{\labelwidth}{1cm}% largeur de la boîte englobant le label
    \setlength{\labelsep}{8pt}% espace entre paragraphe et l'étiquette
    \setlength{\leftmargin}{\labelwidth+\labelsep}% marge de gauche
    \renewcommand{\makelabel}[1]{% production de l'étiquette :
      \framebox[\labelwidth]{\texttt{##1}}}}}{\end{list}}

Dans cet exemple la relation :

 
Sélectionnez
1.
\leftmargin=\labelwidth+\labelsep

permet de positionner l'entrée de liste comme indiqué à la figure 9.2a.

Fig. 9.2 Positionnement des étiquettes dans les listes exemples.
Fig. 9.2 Positionnement des étiquettes dans les listes exemples.

Un autre exemple : la création d'un environnement de liste numérotée pour produire des questions dans un énoncé de travaux pratiques ou autre devoir surveillé...

9.19
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\begin{question}
\item o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o
\item o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o
\item o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o
\end{question}
Image non disponible

Cet environnement a été produit par le code suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newenvironment{question}{\begin{list}{}{%
  \usecounter{cptquestion}%
  \setlength{\labelwidth}{2em}%
  \setlength{\labelsep}{1em}\setlength{\itemindent}{15pt}%
  \setlength{\leftmargin}{.8cm}\setlength{\rightmargin}{10pt}
  \renewcommand{\makelabel}[1]{\etiquettequestion{##1}}}}
{\end{list}}

Le positionnement correspondant est montré à la figure 9.2b page précédente. On notera que dans la définition de la liste est fait usage de la commande \usecounter permettant de créer une liste numérotée et de préciser quel compteur est utilisé. On devra donc déclarer le compteur en question :

 
Sélectionnez
1.
\newcounter{cptquestion}

Enfin, chaque entrée de liste composée du numéro de la question et d'un « joli » crayon est produite par la commande :

 
Sélectionnez
1.
2.
\newcommand{\etiquettequestion}[1]{%
  \makebox[\labelwidth]{\Pisymbol{pzd}{47}$_\thecptquestion$}}

Finalement la commande :

 
Sélectionnez
1.
\renewcommand{\makelabel}[1]{\etiquettequestion{##1}}}}

redéfinit la commande \makelabel comme faisant appel à notre « joli » crayon. Le premier et unique argument est passé à \etiquettequestion à l'aide de l'expression ##1, car #1 désignerait, dans le contexte de la définition de environnement question, le premier argument de celui-ci.

Dans ce manuel, on trouve dans le mémento une liste de packages (annexe B.1Extensions) produite par le code suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newenvironment{packages}{\begin{list}{}{%
  \setlength{\labelwidth}{2.5cm}%
  \setlength{\itemindent}{0pt}%
  \setlength{\leftmargin}{\labelwidth+\labelsep}%
  \renewcommand{\makelabel}[1]{%
    $\blacktriangle$ \ltxpack{##1} \hfil:}}}{\end{list}}

La commande \ltxpack est définie au paragraphe 11.1.2Autour de la génération de l'index. Pour information, l'environnement ci-dessus donne :

9.20
Sélectionnez
1.
2.
3.
4.
5.
\begin{packages}
  \item[bidule] cette extension permet d'insérer
    des bidules dans son document sans avoir
    à savoir s'il s'agit de machin ou de truc.
\end{packages}
Image non disponible

9-5-6. Un exemple un peu plus tordu...

Nous allons détailler dans cette section la manière dont la liste composant le glossaireGlossaire a été générée. Cette liste dont l'allure est donnée ci-dessous exploite deux idées :

Image non disponible

  • La longueur \labelsep peut être négative ce qui permet de superposer l'entrée de liste avec le paragraphe. Ceci est illustré à la figure 9.3a ;

Image non disponible

  • On peut créer une boîte paragraphe pour la boîte produisant l'étiquette. La boîte ainsi créée pourra donc être composée de deux lignes : celle du haut contenant le texte de l'étiquette, celle du dessous étant vide, se superpose avec le paragraphe (figure 9.3b).
Fig. 9.3 Postionnement de l'étiquette dans la liste « glossaire »
Fig. 9.3 Postionnement de l'étiquette dans la liste « glossaire »

Le code permettant de générer la liste ci-dessus et celle du glossaire de ce manuel est donc :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\newenvironment{glossaire}{\begin{list}{}{%
  \setlength{\labelwidth}{.5\textwidth}%
  \setlength{\labelsep}{-.8\labelwidth}%
  \setlength{\itemindent}{\parindent}%
  \setlength{\leftmargin}{25pt}%
  \setlength{\rightmargin}{0pt}%
  \setlength{\itemsep}{.8\baselineskip}%
  \renewcommand{\makelabel}[1]{\boiteentreeglossaire{##1}}}}
{\end{list}}

La valeur .8\baselineskip pour \itemsep permet d'aérer le glossaire en insérant des blancs entre chaque entrée. La commande permettant de générer la boîte contenant l'entrée de liste à superposer est :

 
Sélectionnez
1.
2.
3.
4.
5.
\newcommand{\boiteentreeglossaire}[1]{%
  \parbox[b]{\labelwidth}{%
    \setlength{\fboxsep}{3pt}%
    \setlength{\fboxrule}{.4pt}%
    \shadowbox{\sffamily#1}\\\hfill\mbox{}}}

Pour comprendre comment est positionnée cette boîte, nous avons quelque peu modifié la commande précédente pour dessiner un cadre autour :

9.21
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\begin{leglossaire}
  \renewcommand{\boiteentreeglossaire}{%
    \fboiteentreeglossaire}%
\item[Bidule] o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o o o
\item[Truc muche] o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o o o
  o o o o o o o o o o o o o o o o o o o o
\end{leglossaire}
Image non disponible

9-6. Des environnements qui mettent en boîte

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

9-6-1. Principe

On déclare une boîte comme expliqué au paragraphe 4.4.5Sauvegarde et réutilisation :

  • \newsavebox{maboite}

On peut ensuite écrire :

  • \begin{lrbox}{maboite}...contenu...\end{lrbox}

qui est parfaitement équivalent à :

  • \savebox{maboite}{...contenu...}

Bon mais alors si c'est la même chose, à quoi ça sert ?? Ca sert pour la définition d'un environnement.

9-6-2. Exemple

Supposons, par exemple l'existence d'un environnement :

 
Sélectionnez
1.
2.
3.
4.
5.
\newenvironment{remarque}{%
  % clause begin
  \begin{center}\begin{minipage}{.8\textwidth}}{%
  % clause end
  \end{minipage}\end{center}}

Et :

9.22
Sélectionnez
1.
2.
3.
4.
5.
6.
On peut faire la remarque (édifiante) suivante :
\begin{remarque}
  Jazz is not dead. It just smells funny.
  \hfill Frank \textsc{Zappa}
\end{remarque}
Et on reprend notre propos.
Image non disponible

À la question : comment pourrait-on faire pour encadrer cette remarque ? nous répondons sans hésiter : « avec l'environnement lrbox ». Dans la mesure où il n'y a pas de moyen avec LaTeX de commencer une \fbox dans la clause begin et de la finir dans la claude end, on utilisera le principe suivant :

  1. stocker le contenu à encadrer à l'aide de l'environnement lrbox ;
  2. l'encadrer en réutilisant la boîte ainsi construite.

On aura donc :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
\newsavebox{\boiteremarque}
\newenvironment{remarque}{%
  % clause begin
  \begin{lrbox}{\boiteremarque}% début mise en boîte
  \begin{minipage}{.8\textwidth}}{%
  % clause end
  \end{minipage}
  \end{lrbox}% fin mise en boîte
  % production de la boîte encadrée
  \begin{center}
    \fbox{\usebox{\boiteremarque}}
  \end{center}}
9.23
Sélectionnez
1.
2.
3.
4.
5.
6.
On peut faire la remarque (édifiante) suivante :
\begin{remarque}
  Jazz is not dead. It just smells funny.
  \hfill Frank \textsc{Zappa}
\end{remarque}
Et on reprend notre propos.
Image non disponible

Cette idée est utilisée à plusieurs reprises dans les deux chapitres qui suivent.

Il faut noter que la boîte que définit l'environnement lrbox est une boîte simpleBoîtes simples à l'instar des boîtes créées par les commandes de la famille \mbox et par conséquent ne peut contenir de saut de paragraphe.

10. Cosmétique

Je me dis : Je monterai sur le palmier, J'en saisirai les rameaux !
Que tes seins soient comme les grappes de la vigne,
Le parfum de ton souffle comme celui des pommes,
Et ta bouche comme un vin excellent qui coule aisément pour mon bien-aimé,
Et glisse sur les lèvres de ceux qui s'endorment !
Le Cantique des cantiques Ct 7 10.

L'idée générale de ce chapitre, laissant présager des macros parfumées, est de présenter les outils standard de LaTeX qui ont été personnalisés pour produire certaines parties du document. Ces personnalisations s'entendent à plusieurs niveaux : en utilisant des options de packages (par exemple pour les en-têtes de page), ou parfois en « mettant le nez » dans la définition des macros, comme pour l'allure des chapitres et des sections, ou en modifiant plus en profondeur ces macros comme dans le cas de la minitable des matières. Une partie du chapitre est consacrée aux outils que l'on peut mettre au point à partir du package fancyvrb. Enfin un combat en règle contre les guillemets français est mené en guise de clôture de ce chapitre.

10-1. Allure de l'index

Pour changer l'allure de l'index, il faut comprendre que lorsqu'on tape fébrilement avec ses petits doigts la commande :

  • makeindex document

on génère alors un fichier document.ind contenant quelque chose ressemblant à :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\begin{theindex}                         ← préambule

\item Cosmic debris, 12,34

\indexspace                              ← espace inter-groupe

\item Debra kadabra, 23                  ← entrée, séparateur, page

\end{theindex}                           ← postambule

En réalité, ce code est généré à partir d'entités génériques ayant des valeurs prédéfinies et pouvant être modifiées. Pour s'en convaincre, il suffit de savoir que le programme makeindex peut générer un fichier .ind contenant autre chose que du code LaTeX. Pour comprendre cette affaire d'entités génériques, on pourrait décrire le travail de makeindex comme suit :

  1. Ecrire le préambule en examinant la valeur de l'entité preamble ;
  2. Pour chaque entrée du fichier .idx :

    1. écrire le contenu de l'entité item_0 ;
    2. écrire l'entrée (« Cosmic debries » dans l'exemple précédent) ;
    3. écrire le séparateur (valeur de l'entité delim_0)
    4. écrire le numéro de page
  3. À chaque fin de groupe (changement de lettre) écrire le contenu de l'entité group_skip ;
  4. Écrire le postambule en examinant la valeur de l'entité postamble.

Les valeurs des entités auxquelles il est fait allusion sont par défaut les suivantes :

preamble
item_0
delim_0
group_skip
postamble
"\\begin{theindex}\n"
"\n \\item"
", "
"\n\n \\indexspace\n"
"\n\n\\end{theindex}\n"

Ces valeurs peuvent être modifiées par l'intermédiaire d'un fichier de style auquel on met généralement l'extension .ist et que l'on utilisera lors de l'appel à makeindex de la manière suivante :

  • makeindex -s style.ist document

Ainsi pour produire l'index de ce document, nous avons dans un premier temps redéfini les séparateurs de niveau 1 et 2 :

 
Sélectionnez
1.
2.
delim_0 " \\dotfill \ "
delim_1 " \\dotfill \ "

on remplace donc la virgule qui sépare par défaut l'entrée d'index et son numéro de page par des points de suspension. Ensuite, en lisant scrupuleusement la documentation makeindex(74), on apprend qu'écrire :

 
Sélectionnez
1.
headings_flag 1

est la manière polie de demander à makeindex de produire entre les groupes d'entrées la lettre correspondant au groupe. Cette lettre sera (en majuscule) et encadrée par les contenus respectifs des entités heading_prefix et heading_suffix. Qu'à cela ne tienne, pour produire nos jolies boîtes ombrées, nous écrivons dans le fichier de style :

 
Sélectionnez
1.
2.
heading_prefix "{\\large\\sffamily\\bfseries\\shadowbox{"
heading_suffix "}\\hfill}\\nopagebreak\n"

Ce qui vous l'avez compris, produira par exemple pour la lettre « c » :

10.1
Sélectionnez
1.
2.
{\large\sffamily\bfseries%
\shadowbox{C}\hfil}\nopagebreak
Image non disponible

Cette commande sera précédée par le contenu de group_skip qui, nous l'avons dit un peu plus haut, vaut par défaut \indexspace. Nous avons après quelques mois de recherche(75), déniché la définition de cette commande dans book.cls et l'avons modifiée pour augmenter légèrement l'espace entre les groupes :

 
Sélectionnez
1.
\renewcommand\indexspace{\par \vskip 20pt plus5pt minus3pt\relax}

Ce paragraphe ne donne bien évidemment qu'un aperçu très succinct des fonctionnalités proposées par makeindex. Outre les informations que l'on peut trouver dans le LaTeX companion, la page de manuel de cet utilitaire dans un environnement Debian donne une liste exhaustive des entités génériques que l'on peut définir. Un fichier nommé ind.dvi écrit par P. Chen et M. A. Harrinson constitue également un bon point de départ pour la personnalisation de l'index.

10-2. Allures des titres

Nous proposons ici d'exposer la manière dont on a modifié l'allure des titres standard (partie, chapitre, section, etc.) de LaTeX.

10-2-1. Numérotation des titres et table des matières

Avant toute chose il faut savoir qu'on peut agir sur la table des matières à l'aide de deux compteurs :

  1. secnumdepth (section numbering depth) stipulant la profondeur de la numérotation des titres dans le document ;
  2. tocdepth (table of contents depth) définissant quel est le niveau (ou profondeur) de titre maxi dans la table des matières.

Pour utiliser ces deux compteurs, il faut en outre avoir connaissance de la manière dont LaTeX associe une profondeur à chaque titre. Et bien réjouissez-vous, le tableau suivant vous fournit cette information :

Titre profondeur Titre profondeur
part -1    
chapter 0 subsubsection 3
section 1 paragraph 4
subsection 2 subparagraph 5

Ainsi, affecter la valeur 1 à secnumdepth et la valeur 2 à tocdepth numérotera les titres jusqu'aux \sections et insérera dans la table des matières, tous les titres jusqu'aux \subsections...

10-2-2. Sections et niveaux inférieurs

Dans le fichier book.cls du système TeX, on trouve le code suivant(76) :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\newcommand{\section}{%
  \@startsection%
  {section}% nom du titre
  {1}% niveau de titre
  {0pt}% indentation
  {-3.5ex plus -1ex minus -.2ex}% espace vertical avant
  {2.3ex plus.2ex}% espace vertical après
  {\normalfont\Large\bfseries}} % allure du titre

Ce code permet de définir comment sera produit le titre d'une section. On constate que la \section fait appel à la commande \@startsection, cette dernière attendant six arguments :

  • le nom du titre : section, subsection, etc.
  • son niveau : 1 pour section, 2 pour subsection, 3 pour subsubsection, etc.
  • son indentation ;
  • le blanc vertical avant le titre ;
  • le blanc vertical après le titre ;
  • un ensemble de déclarations pour formater le titre lui-même.

On pourra donc noter que la mise en page par défaut de LaTeX pour les sections dans la classe book est la suivante :

  • pas d'indentation (0pt)
  • espace avant le titre de 3.5ex avec un tolérance de plus -1ex et moins -.2ex ;
  • espace après le titre de 2.3ex avec une tolérance de plus .2ex ; on pourra noter que si l'espace est négatif, le paragraphe commence juste après le titre, et non sur un nouveau paragraphe ;
  • les titres sont en gros et en gras dans la fonte « normale ».

Pour définir l'allure des sections de ce document, nous avons introduit trois longueurs pour l'indentation de sections, subsections et subsubsections :

 
Sélectionnez
1.
2.
3.
\newlength{\sectiontitleindent}
\newlength{\subsectiontitleindent}
\newlength{\subsubsectiontitleindent}

Ces longueurs ont pour valeur :

 
Sélectionnez
1.
2.
3.
\setlength{\sectiontitleindent}{-1cm}
\setlength{\subsectiontitleindent}{-.5cm}
\setlength{\subsubsectiontitleindent}{-.25cm}

D'autre part, nous avons défini une fonte particulière pour les titres, définie comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\sectionfont}{%
  \fontencoding{\encodingdefault}%
  \fontfamily{pag}%
  \fontseries{bc}%
  \fontshape{n}%
  \selectfont}

Cette commande permet de sélectionner la fonte PostScript Avant-Garde en gras condensé (cf. 9.4Fontes). Finalement, pour définir l'allure de nos sections on utilisera :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\renewcommand{\section}{%
  \@startsection%
  {section}%
  {1}%
  {\sectiontitleindent}%
  {-3.5ex plus -1ex minus -.2ex}%
  {2.3ex plus.2ex}%
  {\sectionfont\Large}}

Des commandes équivalentes ont été écrites pour les titres de niveaux inférieurs.

10-2-3. Chapitres

C'est en fouillant dans le fichier book.cls qu'on peut trouver des informations sur la manière dont LaTeX produit les en-têtes de chapitres.

Principe

Dans le fichier book.cls, on trouve la commande :

 
Sélectionnez
1.
2.
3.
4.
5.
\newcommand{\chapter}{%
  ...
  \thispagestyle{plain}%
  ...
  \secdef\@chapter\@schapter} % la ligne qui nous intéresse

La commande \chapter fait donc elle-même appel à deux commandes distinctes :

  1. \@chapter pour les titres de chapitre qui sont numérotés ;
  2. \@schapter pour les titres de chapitre non numérotés (s pour star ou étoile faisant référence à la commande \chapter*).

En cherchant vaillamment la définition de ces deux commandes (toujours dans le fichier book.cls), on trouve quelque chose du genre :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\def\@chapter[#1]#2{%
   ...
  \refstepcounter{chapter}%
  \typeout{\@chapapp\space\thechapter.}% message sur le terminal
  \addcontentsline{toc}{chapter}% ajout du titre dans la toc
  ...
  \if@twocolumn
  ...
  \else% le cas d'un document à une colonne
  \@makechapterhead{#2}% la ligne qui nous intéresse
  \fi}

ce qui nous met sur la voie… en effet la commande \@makechapterhead (qu'on peut traduire littéralement par « faire l'en-tête de chapitre ») est celle qu'il va nous falloir redéfinir pour changer l'allure des en-têtes. Une recherche supplémentaire nous met également sur la piste de la commande \@makeschapterhead produisant l'en-tête d'un chapitre non numéroté. Ces deux commandes attendent un argument qui est le titre du chapitre.

Petits outils nécessaires

Nous avons défini un environnement cadrechap dont le propos est simplement d'élargir la marge de droite de deux centimètres :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\newenvironment{cadrechap}%
{\begin{list}{}{%
    \setlength{\leftmargin}{0pt}%
    \setlength{\rightmargin}{-2cm}% on se met au large
    \setlength{\itemindent}{0pt}%
    \setlength{\labelsep}{0pt}%
  }\item}%
{\end{list}}

Il sera également fait usage du booléen @mainmatter permettant de savoir si on se trouve dans la partie « centrale » du document. C'est le cas lorsque la commande \mainmatter a été appelée (cf. 6.4Diviser votre document).

En-tête des chapitres à proprement parler

Pour ce manuel la commande qui produit l'en-tête du chapitre a été définie comme un assemblage de deux minipages :

  1. sur la gauche une boîte minipage dont la hauteur est imposée pour y mettre le mini-sommaire (cf. §10.7Une boîte pour la minitable des matières) ;
  2. sur la droite une boîte contenant le mot « Chapitre » et son numéro
Image non disponible

Le squelette pour réaliser un tel assemblage de boîte est le suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\begin{cadrechap}
  \begin{minipage}[t][6cm][t]{0.75\linewidth}
    % insertion ici du mini−sommaire
  \end{minipage}
  \begin{minipage}[t]{0.25\linewidth}
    % insertion ici du n ° de chapitre
  \end{minipage}
  \begin{flushright}
    % insertion ici du titre du chapitre
  \end{flushright}
\end{cadrechap}

Il est sans doute utile de noter ici que la boîte de gauche (celle qui reçoit la mini table des matières) a une hauteur imposée ce qui permet de produire les en-têtes de chapitres de manière identique quel que soit le nombre de sections de chapitres (et donc quelle que soit la hauteur de la mini table des matières). Pour finir, il reste à définir des fontes pour les différents éléments. Pour ce manuel ont été définies :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
% numéro du chapitre
\DeclareFixedFont{\chapnumfont}{T1}{phv}{b}{n}{80pt}
% pour le mot « Chapitre »
\DeclareFixedFont{\chapchapfont}{T1}{phv}{b}{n}{16pt}
% pour le titre
\DeclareFixedFont{\chaptitfont}{T1}{phv}{b}{n}{24.88pt}

D'ailleurs :

10.2
Sélectionnez
1.
2.
{\chapnumfont 8}
{\chaptitfont Oula !}
Image non disponible

10-2-4. Parties

Dans le fichier book.cls on trouve la définition de la commande \part :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand\part{%
  \cleardoublepage
  \thispagestyle{plain}
  [...]
  \null\vfil
  \secdef\@part\@spart}

qui nous informe qu'à l'instar des chapitres, la commande \part fait appel à deux commandes distinctes pour produire les parties numérotées et non numérotées (grâce à un appel aux commandes \@part et \@spart respectivement). Dans un premier temps nous avons imposé que le style de page pour les débuts de partie soit vide (c'est-à-dire sans numéro de page ni en-tête etc.), nous avons donc écrit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand\part{%
  \cleardoublepage
  \thispagestyle{empty}% à la place de plain par défaut
  [...]
  \null\vfil% un boîte vide et un ressort vertical
  \secdef\@part\@spart}

On peut ensuite examiner la définition de la commande \@part qui produit la page de partie :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\def\@part[#1]#2{%
  [...]
  {\centering % centrage
    [...]
    \huge\bfseries \partname\nobreakspace\thepart
      \par
      \vskip 20\pt
    [...]
  \Huge \bfseries #2\par}%
\@endpart}

En examinant ce code on constate que la page de partie est constituée d'une ligne en gros caractères gras, du nom « Partie » suivie du numéro de la partie(77) :

 
Sélectionnez
1.
\huge\bfseries \partname\nobreakspace\thepart

suivie 20 points plus bas du titre de la partie (contenu dans l'argument #2). Pour ce manuel, nous avons redéfini la commande \@part comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\def\@part[#1]#2{%
  [...]
  {\centering
    \interlinepenalty \@M
    \normalfont
    [...]
    \partnumfont \thepart % juste le numéro de la partie
    \par
    \vskip 50\p@% 50 point au lieu de 20...
    \partfont #2\par}% le titre avec une fonte personnalisée
  \@endpart}

Pour garder une homogénéité avec les en-têtes de chapitres on a défini les commandes de fontes comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\partfont}{%
  \fontencoding{\encodingdefault}\fontfamily{phv}%
  \fontseries{bc}\fontshape{n}%
  \fontsize{32}{34}%
  \selectfont}
\DeclareFixedFont{\partnumfont}{T1}{phv}{bc}{n}{80}%

On notera également que la commande \@part se termine par l'appel à une autre commande : \@endpart. En examinant le fichier book.cls on pourra se rendre compte que cette dernière permet de s'opposer au ressort vertical de la commande \part et de sauter une page blanche…

10-3. Géométrie

Les différentes dimensions de chaque page de ce document ont été définies à l'aide du package geometry et de la commande :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\geometry{%
  a4paper,
  body={150mm,250mm},
  left=25mm,top=25mm,
  headheight=7mm,headsep=4mm,
  marginparsep=4mm,
  marginparwidth=27mm}

qui définit respectivement (voir aussi figure 10.1) :

  • un corps de texte faisant 150 mm de largeur par 250 mm ;
  • le positionnement du corps du texte dans la page, à 25 mm du bord gauche du papier, et 25 mm du bord supérieur du papier ;
  • la hauteur de l'en-tête (7mm) et l'espace entre l'en-tête et le texte luimême (4 mm) ;
  • la taille du papier : standard A4 ;
  • la largeur de la marge pour les notes de marges (2.7 cm).
Fig. 10.1 - Quelques unes des dimensions pour définir la géométrie d'un document.
Fig. 10.1 - Quelques unes des dimensions pour définir la géométrie d'un document.

De manière générale, comme le montre la figure 10.1, le package geometry permet de définir un certain nombre de dimensions que l'on peut passer soit en option à la commande \usepackage soit à l'aide de la commande \geometry.

Dimension du papier :

  • a4paper, a5paper, etc. pour utiliser un format de papier prédéfini,
  • paperwidth=dim et paperheight=dim pour spécifier une dimension de papier libre, par exemple pour un document qui sera massicoté.

Texte :

  • soit avec : body={largeur, hauteur}
  • soit avec : width=largeur et height=hauteur.
  • le texte est positionné à l'intérieur de la page par rapport à un point de référence spécifié avec top=pos_vert et left=pos_horiz

Haut et bas de page :

  • la hauteur de la surface réservée à l'en-tête peut être définie à l'aide de la formule magique headheight=hauteur et sa position par rapport au corps du texte à l'aide de headsep=espace.
  • la position du pied de page peut être imposée avec footskip=espace qui définit l'espace entre le bas du corps du texte et la première ligne du contenu du pied de page.

Note de marge : dans le même esprit la largeur et la position de la surface réservée aux notes de marge peuvent être définies en faisant appel à marginparwidth=largeur et à marginparsep=espace.

Dans le package geometry les dimensions concernant l'en-tête, le pied de page et la zone pour les notes de marge, sont par défaut comptabilisées en plus du corps du texte. Des options permettent d'inclure l'une ou l'intégralité de ces dimensions dans le corps du texte pour le calcul, en disant par exemple : « je veux que la largeur soit de 10 centimètres, notes de marge comprises. » (voir la documentation du package pour les détails).

10-4. En-tête et pied de page

Les zones au-dessus et en dessous du corps du texte appelées en-tête et pied de page peuvent être personnalisées à l'aide du package fancyhdr. Le principe de base est simple(78), il suffit d'utiliser la commande :

 
Sélectionnez
1.
\pagestyle{fancy}

pour spécifier qu'on veut utiliser des en-têtes et des pieds de page définis grâce au package fancyhdr. Par défaut le package produit des traits horizontaux en dessous de l'en-tête et au-dessus du pied de page dont les épaisseurs sont définies par les commandes \footrulewidth et \headrulewidth. On peut ensuite utiliser les commandes :

  • \fancyhead pour définir l'en-tête ;
  • \fancyfoot pour définir le pied de page.

Ces deux commandes peuvent prendre un argument optionnel constitué d'une ou deux séquences des caractères suivants :

  • E ou O pour spécifier la parité de la page (paire=even, impaire=odd) ;
  • R, L, C pour spécifier où l'on veut produire l'information : respectivement à droite, à gauche ou au centre.

Voici un exemple :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
\fancyhf{} % on efface tout et on recommence
% EN TÊTE :
% initiales à droite sur page paire , à gauche sur page impaire :
\fancyhead[RE,LO]{VL}
% numéro de page au centre :
\fancyhead[C]{\thepage}
% numéro de section à droite sur page impaire, à gauche sur page paire :
\fancyhead[LE,RO]{\thesection}
% PIED DE PAGE :
% une image à droite sur page impaire, à gauche sur page paire :
\fancyfoot[RO,LE]{\includegraphics[height=4ex]{punch}}
% titre à gauche sur page impaire, à droite sur page paire :
\fancyfoot[LO,RE]{%
  Tout ce que vous avez toujours voulu savoir sur \LaTeX{}}
% épaisseur des traits
\renewcommand{\footrulewidth}{3pt}

10-4-1. Cas de la première page des chapitres

Dans la classe book, LaTeX fait automatiquement appel au style plain pour les premières pages de chapitre. Pour demander au package fancyhdr de définir un style particulier pour ces pages, on écrit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
% le cas de la première page d'un chapitre
\fancypagestyle{plain}{%
  \fancyhf{}% on efface tout
  \fancyfoot[C]{\thepage}% numéro en bas de la page
  % on efface tous les traits
  \renewcommand{\headrulewidth}{0pt}%
  \renewcommand{\footrulewidth}{0pt}}

Vérifiez maintenant que les pages 3, 19, 43, 89, etc. ont ce style...

10-4-2. Pages vierges avant le début d'un chapitre

Dans la classe book en mode recto-verso (c'est le cas de ce document), LaTeX commence par défaut un chapitre sur une page impaire — appelée dans le jargon typographique la « belle page ». Pour ce faire LaTeX fait appel dans différentes commandes internes, à la commande \cleardoublepage qui permet d'insérer si nécessaire une page blanche avant le début du chapitre. Cette page reçoit par défaut le style des en-têtes et pieds en cours. Dans le manuel que vous avez sous les yeux, nous avons imposé un style « vide » à ces pages en modifiant la définition de la commande \cleardoublepage du fichier latex.ltx :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\renewcommand{\cleardoublepage}{% redéfinition de la commande
  \clearpage\ifodd\c@page\else
  \hbox{}
  \vspace*{\fill}
  \thispagestyle{empty}% ligne ajoutée
  \newpage
  \fi}

Feuilletez le manuel et cherchez si les pages vierges avant le début des chapitres sont bien vides...

10-4-3. Mécanisme de marqueurs

Vous aurez sans doute remarqué que dans ce manuel, les en-têtes des pages contiennent des informations qui dépendent du contexte. Sont en effet insérés sur les pages paires (page de gauche) le titre du chapitre, et sur les pages impaires (page de droite) le titre de la dernière section de la page. Il est possible de produire ce genre d'en-têtes car LaTeX dispose d'un mécanisme de marqueurs que nous allons tenter d'expliquer ici.

Il n'est pas inutile de préciser maintenant que lorsque TeX et LaTeX produisent une page, ils vont garnir l'en-tête et le pied en fonction d'information collectées le long de la page en question. La production de l'en-tête et du pied est donc postérieure à la composition de la page.

Les commandes \markboth et \markright

Soient les commandes :

  • \markboth{texteg}{texted}

ou

  • \markright{texte}

Nous allons imaginer que les arguments textex sont stockés dans une pile et une file. Dans cet ordre d'idée :

  • \markboth empile texteg, et stocke texted dans la file ;
  • \markright stocke texte dans la file.

Ces deux commandes de « marquage » peuvent être appelées plusieurs fois ou jamais, sur une même page. Les données de la pile et de la file seront exploitées au moment de générer les en-têtes et pieds de page, lorsque TeX achève la mise en forme de la page, et ceci grâce aux commandes :

  • \leftmark renvoie le sommet de la pile, c'est-à-dire texteg du dernier appel à \markboth ;
  • \rightmark renvoie le début de la file, c'est-à-dire texted du premier appel à \markboth ou texte du premier appel à \markright.

Une petite subtilité au sujet de la « file » que nous présentons ici : tant qu'aucune commande de « marquage » n'ajoute de données au cours d'une page, la file contiendra la dernière information insérée dans les pages précédentes. La « file » est vidée dès qu'une commande \markboth ou \markright survient.

Un autre moyen de comprendre ce mécanisme de marqueurs pourrait être de dire :

  • \leftmark contient la dernière information que j'ai insérée sur la pile (à l'aide du premier argument de \markboth) ;
  • \rightmark contient la première information de la « file », si on en a mis une sur cette page, ou la dernière qui a été enfilé (à l'aide du deuxième argument de \markboth ou de l'argument de \markright.

Il peut être utile de savoir que l'auteur a utilisé ces commandes pour la production d'un trombinoscope composé de plusieurs dizaines de noms et photos par page. L'idée était d'exploiter le mécanisme de marquage pour faire apparaître dans l'en-tête le premier et le dernier nom de la page, comme dans un dictionnaire. Il suffit pour cela d'appeler pour chaque personne (nom et photo) la commande :

  • \markboth{nom du gugusse}{nom du gugusse}

puis d'insérer dans les en-têtes la commande \rightmark sur les pages de gauche (impaires) et \leftmark sur les pages de droite (paires)...

Interactions avec les commandes de paragraphe

À chaque début de chapitre, de section, de sous-section, etc. une commande interne de LaTeX fait appel aux commandes de marquages présentées au paragraphe précédent, pour stocker des informations susceptibles d'enrichir l'en-tête ou le pied de page. Ces commandes se nomment :

  • \chaptermark pour les chapitres ;
  • \sectionmark pour les sections ;
  • ...

elles attendent un argument qui contient le titre du chapitre ou du paragraphe. Dans ce manuel, les deux commandes précédentes ont été définies comme suit :

 
Sélectionnez
1.
2.
3.
4.
\renewcommand{\sectionmark}[1]{% #1 contient le titre de la section
  \markright{\sectionfont\thesection\ #1}}
\renewcommand{\chaptermark}[1]{% #2 contient le titre du chapitre
  \markboth{\sectionfont#1}{}}

Puis :

 
Sélectionnez
1.
2.
3.
\fancyhead[LE,RO]{\thepage}
\fancyhead[LO]{\rightmark}
\fancyhead[RE]{\leftmark}

Par conséquent : \rightmark vaut « 10.4 En-tête et pied de page » et \leftmark vaut « Cosmétique ».

  • à droite des pages paires, on trouve (\leftmark) le dernier titre de chapitre rencontré ;
  • à gauche des pages impaires, on trouve (\rightmark) le numéro et le titre de la première \section de cette page, ou le numéro et le titre de la dernière \section rencontrée...

Si vous ne me croyez pas voyez par vous-même le haut de la page 184.

10-4-4. Organisation du document

Il est nécessaire de savoir que dans un document tel que celui que vous lisez, il existe trois parties qui sont reconnues par LaTeX : le front matter, le main matter et le back matter désignant respectivement le début du document (comportant généralement la préface et le sommaire), la partie principale, et la partie clôturant le document (comportant généralement la table des matières, le ou les index, la ou les bibliographies, le glossaire, etc). On doit alors explicitement écrire un document LaTeX comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\documentclass{classe du document}
\begin{document}
\frontmatter % introduction
[...]
\mainmatter % partie principale
[...]
\backmatter % pour clore le document
[...]
\end{document}

Nous verrons dans la suite de ce chapitre que nous serons amenés à modifier les trois commandes permettant de passer d'une partie à une autre. Pour l'instant, il faut savoir que la classe book définit un booléen :

 
Sélectionnez
1.
\newif\if@mainmatter

utilisé par défaut dans LaTeX pour savoir si on se trouve dans le « main matter » ou pas. Nous avons en outre défini pour notre document un autre booléen :

 
Sélectionnez
1.
\newif\if@frontmatter

qui nous permettra d'effectuer des traitements particuliers lorsqu'on sera dans la partie introductive du document. Les trois commandes délimitant les trois parties sont définies par :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
\renewcommand\frontmatter{%
  \cleardoublepage
  \@frontmattertrue
  \@mainmatterfalse
  \pagenumbering{roman}% numérotation en romain
}
\renewcommand\mainmatter{%
  \cleardoublepage
  \@mainmattertrue
  \@frontmatterfalse
  \pagenumbering{arabic}% numérotation en chiffres arabes
}
\renewcommand\backmatter{%
  \cleardoublepage
  \@frontmatterfalse
  \@mainmatterfalse
}

En farfouillant dans le code de LaTeX on peut comprendre que \pagenumbering, la commande permettant de changer la numérotation, réinitialise le compteur de page à 1.

10-4-5. Numéroter l'introduction en roman « petites capitales »

Votre serviteur a tenu à ce que les pages de l'introduction soient numérotées en chiffres romains et petites capitales. On ne peut malheureusement pas écrire :

 
Sélectionnez
1.
\renewcommand{\thepage}{\textsc{\roman{page}}}

Puisque cela provoque une incompatibilité avec la gestion de l'index. L'idée retenue est de procéder comme suit :

  1. utiliser la numérotation en chiffre romain minuscule ;
  2. dans le pied de page afficher \textsc{\thepage} ;
  3. modifier la commande \index pour que les numéros de pages s'affichent en petites capitales.

D'où dans la définition de \frontmatter on ajoutera :

 
Sélectionnez
1.
2.
3.
4.
5.
\let\indexORI\index % sauvegarde de la définition initiale
\renewcommand{\index}[1]{\indexORI{##1|textsc}}

\fancyfoot{}
\fancyhead[LE,RO]{\textsc{\thepage}}

Et dans la définition de \mainmatter :

 
Sélectionnez
1.
\let\index\indexORI% pour revenir à la définition initiale

Pour être parfaitement rigoureux on va modifier l'allure des premières pages de chapitre :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\fancypagestyle{plain}{%
  \fancyhf{}
  \if@frontmatter% introduction
    \fancyfoot[C]{\textsc{\thepage}}
  \else
    \fancyfoot[C]{\thepage}
  \fi
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}}
\makeatother

10-4-6. Index, bibliographie et table des matières

Dans la classe book, deux environnements sont définis :

  • thebibliography permettant de produire la bibliographie ;
  • theindex pour produire l'index ;

et la commande :

  • \tableofcontents pour produire la table des matières.

Ces environnements et cette commande sont conçus pour produire des entêtes avec le numéro de la page et le nom du chapitre en majuscules à savoir \bibname, \indexname et \contentsname. Voici par exemple un extrait de \tableofcontents :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\newcommand\tableofcontents{%
  [...]
  \chapter*{\contentsname
    \@mkboth{%
      \MakeUppercase\contentsname}%
    {\MakeUppercase\contentsname}}%
  \@starttoc{toc}%
  [...]
}

J'ai souhaité que dans ce manuel les en-têtes ne soient pas en majuscules. Deux solutions sont possibles :

  1. utiliser la commande \nouppercase du package fancyhdr et écrire dans la définition de \backmatter :

     
    Sélectionnez
    1.
    2.
    \fancyhead[LO]{\nouppercase\rightmark}% en−tête en minuscule
    \fancyhead[RE]{\nouppercase\leftmark}%
    
  2. recopier la définition de \tableofcontents provenant de book.cls, et la modifier pour supprimer les commandes \MakeUppercase. Faire la même chose pour l'index et la bibliographie.

Dans ce document, c'est la deuxième solution qui a été adoptée. On en a également profité pour insérer l'index et la bibliographie dans la table des matières, ce qui n'est pas le comportement par défaut de LaTeX et de la classe book. Nous avons donc pour l'environnement theindex :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\renewenvironment{theindex}
{%
  [...]
  % insertion dans la table des matières
  \addcontentsline{toc}{chapter}{\indexname}
  \@mkboth{\indexname}{\indexname}% suppression de \MakeUppercase
  \thispagestyle{plain}
  [...]
{\if@restonecol\onecolumn\else\clearpage\fi}

10-5. Environnements avec caractères spéciaux

Les packages fancyvrb et listings ont tous deux la particularité de produire du texte avec des caractères spéciaux. Le premier permet de produire des environnements de type verbatim avec beaucoup plus de souplesse. Il permet notamment de personnaliser d'éventuelles bordures, les marges, et surtout on peut « s'échapper vers LaTeX » au beau milieu de l'environnement, ou comme disent les anglophones : to escape to LaTeX. En d'autres termes, bien qu'étant \, { et } sont sans effet, il est malgré tout possible de faire appel à des commandes LaTeX.

Le second (listings) a pour objectif de produire des extraits de langage de programmation. Il propose également parmi un grand nombre de fonctionalités, la possibilité de s'échapper vers LaTeX. Nous vous proposons donc ici de découvrir ces deux environements à l'aide d'exemples « en grandeur nature » utilisés dans ce manuel.

10-5-1. Digression vers les caractères...

Il peut ne pas être inutile(79) de faire ici une petite digression sur la manière dont TeX mange et digère les caractères qu'on lui fournit. Il faut savoir que les caractères peuvent entrer dans seize catégories différentes. Chaque caractère peut n'appartenir qu'à une catégorie à la fois. Chacune de ces catégories permet de basculer TeX vers un traitement particulier. Par exemple lorsque le caractère \ est rencontré, TeX va lire les caractères qui suivent pour connaître le nom de la commande (ou séquence de contrôle), lorsqu'il rencontre le caractère {, TeX va ouvrir un nouveau groupe, lorsque que le caractère % est lu, TeX va ignorer les caractères jusqu'à la fin de la ligne, c'est-à-dire jusqu'à ce qu'il rencontre un caractère catégorisé « fin de ligne », etc. Parmi les catégories reconnues par TeX :

Catégorie 0 caractère de contrôle (\ dans LaTeX) ;

Catégorie 1 début de groupe ({ dans LaTeX) ;

Catégorie 2 fin de groupe (} dans LaTeX) ;

Catégorie 11 lettre ;

Catégorie 14 commentaire (% dans LaTeX) ;

On peut alors s'amuser — même si cela est assez « dangereux » — à changer le contenu de chaque catégorie. Dans l'exemple ci-dessous, on a transformé les caractères \, { et } en lettres, et on a décidé que les caractères /, ( et ) appartiendraient respectivement aux catégories : caractère de contrôle, début de groupe et fin de groupe. Le caractère # a également été changé de catégorie, c'est désormais un caractère de commentaire.

10.3
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
{ \catcode`\/=0 \catcode`\(=1 \catcode`\)=2
  \catcode`\#=14
  \catcode`\{=11 \catcode`\}=11 \catcode`\\=11
  # ça on devrait pas le voir...
  \bidule{truc muche} /textbf(en gras)
  )\par
  on retourne dans le monde \LaTeX{}...
Image non disponible

En outre, il est intéressant de savoir que TeX peut rendre actifs certains caractères (qui entrent alors dans la catégorie 13). Ces caractères peuvent alors être définis comme des commandes voici un exemple idiot :

10.4
Sélectionnez
1.
2.
3.
\catcode`\+=13
\newcommand{+}{plus}
3 + 4 = 7
Image non disponible

Dans cet exemple on a rendu « actif » le caractère +, puis on l'a défini comme une commande. Vous noterez qu'ici on a pu créer une commande que l'on utilise sans faire appel au caractère \.

Il peut être utile de savoir que lorsqu'on charge le package babel et l'extension française, les caractères de ponctuations double sont également rendus actifs notamment pour empêcher la césure avant ceux-ci. En outre le caractère ~ est dans la catégorie des caractères actifs dans LaTeX. On peut d'ailleurs voir sa définition dans une session LaTeX interactive :

 
Sélectionnez
1.
2.
3.
4.
*\show~
> ~=macro:
->\nobreakspace {}.
<*> \show~

10-5-2. Environnements maison basés sur fancyvrb

Les environnements du type de verbatim ont pour but de changer l'appartenance des caractères à leur catégorie respective. En outre, le package fancyvrb permet de définir quels caractères permettent de repasser le contrôle à LaTeX. Dans ce document, l'environnement unixcom a été défini comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
\DefineVerbatimEnvironment{unixcom}{Verbatim}{%
  commandchars=¢«»,
  frame=single, framerule=.4pt, framesep=1.5mm,
  gobble=2,
  xleftmargin=15pt}

Cet environnement est donc de type verbatim mais dans lequel on peut « exécuter » des commandes LaTeX à l'aide des caractères ¢ de catégorie 0, « de catégorie 1 et » de catégorie 2 — on peut bien évidemment choisir n'importe quel caractère pour ce faire. Il faut cependant garder à l'esprit que ceux-ci doivent être à la fois lisibles pour l'utilisateur et peu utilisés à d'autres fins que de repasser le contrôle à LaTeX.

10.5
Sélectionnez
1.
2.
3.
4.
Pour afficher le contenu d'une variable :
\begin{unixcom}
  echo ${ ${¢marg«nom variable»}
\end{unixcom}
Image non disponible

La commande \margArguments et convention typographique permet de produire son argument entre chevrons simples et en penché. Les autres paramètres de \DefineVerbatimEnvironment ont pour but de préciser l'allure de la bordure (paramètres frame...), la marge de gauche (paramètre xleftmargin) et le fait que les premiers caractères de chaque ligne seront systématiquement ignorés (gobble). Comme le montre la documentation du package fancyvrb beaucoup d'autres options sont disponibles.

Un autre environnement de ce genre a été créé pour saisir les commandes d'Emacs dans l'annexe consacrée à AucTeX. L'environnement en question (baptisé emacscom) a été créé comme suit :

 
Sélectionnez
1.
2.
3.
4.
\DefineVerbatimEnvironment{emacscom}{Verbatim}{%
  commandchars=¢«»,
  frame=leftline, framerule=1mm, framesep=2mm,
  gobble=2, xleftmargin=15pt}

qui donne par exemple :

10.6
Sélectionnez
1.
2.
3.
4.
Pour jouer à Tetris dans \soft{Emacs} :
\begin{emacscom}
  M-x tetris
\end{emacscom}
Image non disponible

10-5-3. Environnements pour les langages de programmation

Le package listings reconnaît la syntaxe d'un grand nombre de langage de programmation. Une manière simple d'utiliser ce package consiste à créer son propre environnement à l'aide d'une commande analogue à \newenvironment :

 
Sélectionnez
1.
\lstnewenvironment{C}{\lstset{language=C}}{}

On pourra alors simplement écrire :

10.7
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\begin{C}
  /* hello world en C */
  int main()
  {
    printf("bonjour monde\n");
    return 0;
  }
\end{C}
Image non disponible

Bien évidemment une foultitude d'options de configuration permet d'adapter cet environement à vos besoins. Le plus simple et le plus efficace est sans doute de lire la documenation accompagnant le package. À titre d'exemple, il faut savoir que l'on peut changer la mise en évidence des mots réservés et des commentaires du langage considéré. Ainsi, en écrivant :

 
Sélectionnez
1.
2.
3.
4.
\lstnewenvironment{Cbis}{%
  \lstset{language=C,
    basicstyle=\rmfamily\slshape,
    commentstyle=\rmfamily\upshape,}}{}

On aura :

10.8
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\begin{Cbis}
  /* hello world en C */
  int main()
  {
    printf("Salut...\n");
    return 0;
  }
\end{Cbis}
Image non disponible

Et puisqu'il est question des caractères spéciaux et de l'« échappement vers LaTeX », il faut savoir qu'à l'instar de fancyvrb, le package listings permet de spécifier un caractère permettant cet échappement. Ainsi :

 
Sélectionnez
1.
\lstnewenvironment{Cter}{\lstset{language=C, escapechar=@}}{}

Permet d'insérer des commandes LaTeX dans le listing :

10.9
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\begin{Cter}
  int main()
  {
    printf("bonjour monde\n");
    return @\fbox{code de retour}@;
  }
\end{Cter}
Image non disponible

10-6. About those so called “french guillemets”

Un des plaisirs de la typographie française est sans aucun doute l'utilisation de ces merveilleux guillemets « à la française »…(80) Cependant le package babel ne gère pas la césure correctement s'il on saisit dans un document :

 
Sélectionnez
1.
2.
3.
4.
5.
\begin{minipage}{3.7cm}
  Cette courte phrase dans une boîte a pour unique
  but de montrer que ces symboles ne se comportent
  pas comme de « gentils » guillemets.
\end{minipage}
on aura la minipage suivante :
Image non disponible

Ce qui est pour le moins gênant... Il est bien sûr possible de saisir ces guillemets avec les commandes \og et \fg fournies par le package babel, mais cela est au goût de votre serviteur trop contraignant dans la mesure où ce caractère est directement accessible depuis le clavier(81). Il existe une solution — qui avait été adoptée par le package french — palliant le problème de la césure qui consiste à rendre actifsDigression vers les caractères... les caractères ‘«’ et ‘»’. Nous avons donc écrit :

 
Sélectionnez
1.
2.
\catcode`\«=13
\catcode`\»=13

puis défini les deux commandes suivantes :

 
Sélectionnez
1.
2.
\newcommand{\fermerguillemets}{\unskip\kern.15em\symbol{20}}
\newcommand{\ouvrerguillemets}{\symbol{19}\ignorespaces\kern.15em}

On notera l'utilisation de la commande TeX \kern permettant d'insérer un blanc insécable d'une longueur donnée, de la commande \unskipLa commande \unskip et enfin de la commande \symbol qui insère ici les 19e et 20e caractères de la fonte courante :

10.10
Sélectionnez
1.
2.
3.
4.
\setcounter{car}{1}
\whiledo{\value{car}<64}{%
  \symbol{\value{car}}$_{\thecar}$
  \stepcounter{car}}
Image non disponible

Enfin, on a affecté aux caractères les deux commandes précédentes :

 
Sélectionnez
1.
2.
\let»=\fermerguillemets
\let«=\ouvrerguillemets

Cette façon de faire a trois inconvénients mineurs que je suis bien incapable de résoudre aujourd'hui. Tout d'abord, les moteurs sachant gérer le codage Utf 8 et permettant à TeX de rendre actif le caractère « (alors codé sur 2 octets), sont aujourd'hui peu répandus et j'avoue humblement que je ne les ai pas encore testés. Par conséquent la manipulation proposée ici est limitée aux codages utilisant 1 octet par caractère . Ensuite on ne peut utiliser ces guillemets dans un titre au risque d'avoir des artéfacts dans les « signets/bookmarks » d'un fichier PDF. Enfin, ces guillemets ne fonctionnent pas avec l'environnement ltxexemple défini à la fin du chapitre suivant. Un drame quoi !

10-7. Une boîte pour la minitable des matières

Le package mini-toc permet — comme son nom l'indique — de produire des « minitables des matières » que l'on peut insérer dans un document à un endroit donné, généralement en début de chapitre. Après avoir utilisé l'ordre \dominitoc dans le préambule, on fait ensuite appel à la commande \minitoc pour insérer cette minitable des matières à l'endroit voulu. La documentation du package explique tout cela en détail et présente notamment les différents styles que l'on peut utiliser. Pour ce manuel, j'ai trouvé l'idée d'une table des matières en début de chapitre séduisante, mais les styles proposés par le package ne me convenaient pas. En fait je souhaitais pouvoir mettre les titres de sections dans une boîte comme ceci :

Image non disponible

C'est-à-dire une boîte avec un titre — ici le titre est « Sommaire ». À ma connaissance, LaTeX ne propose pas de telles boîtes et suite à une question posée sur les forums de discussions, une bonne âme — en l'occurrence Benjamin Bayart — me propose un code TeX répondant au cahier des charges. Je vous propose dans ce paragraphe, une version(82) LaTeX d'une boîte avec titre...

10-7-1. L'interface de la commande

Plusieurs solutions sont possibles pour créer une telle commande. En s'inspirant de l'interface des boîtes de LaTeX, on peut créer une macro dont la syntaxe d'utilisation serait :

10.11
Sélectionnez
1.
2.
\titlebox{\footnotesize Un titre}{%
  Le contenu de la boîte}
Image non disponible

ou encore :

10.12
Sélectionnez
1.
2.
3.
4.
5.
6.
\setlength{\fboxsep}{5pt}
\setlength{\fboxrule}{2pt}
\titlebox{Un autre titre}{%
  \begin{minipage}{3cm}\begin{center}
    truc\\ muche
  \end{center}\end{minipage}}
Image non disponible

10-7-2. Quand même un peu de TeX

La primitive de TeX \leaders permet de remplir un espace élastique avec ce qui vous passe par la tête. Sa syntaxe :

  • \leadersce qui vous chanteespace

permet donc de remplir l'espace avec ce qui vous chante. Par exemple :

10.13
Sélectionnez
1.
2.
\framebox[3cm]{%
  \leaders\hbox{o}\hfill}
Image non disponible

La primitive \hbox de TeX (utilisée par \mbox et \makebox) permet de créer des boîtes horizontales :

10.14
Sélectionnez
1.
2.
\framebox[3cm]{%
  \leaders\hbox to 3pt{o}\hfill}
Image non disponible

Les \leaders peuvent également être utilisés avec la primitive \hrule de TeX permettant de dessiner des traits :

10.15
Sélectionnez
1.
2.
\framebox[3cm]{%
  \leaders\hrule height 4pt\hfill}
Image non disponible

Ici, le ressort \hfill s'étire les trois centimètres de la \framebox et est rempli par un trait de hauteur quatre points.

10.16
Sélectionnez
1.
2.
3.
4.
\framebox[3cm]{%
  \leaders\hbox to5pt{%
    \leaders\hrule width1pt\hfill%
    \kern2pt}\hfill}
Image non disponible

Dans l'exemple ci-dessus, l'espace de trois centimètres est rempli par des boites de cinq points de large, contenant chacunes d'elles des \leaders comme dans l'exemple précédent, et un blanc de deux points de large. Avec TeX, on peut régler la raideurLongueurs élastiques du ressort de la manière suivante :

10.17
Sélectionnez
1.
2.
\framebox[5cm]{%
  \hskip0pt plus 2fill X\hskip0pt plus 3fill}
Image non disponible

La dimension :

  • \hskip 0pt plus nfill

permet de définir une longueur élastique de raideur relative n. Dans l'exemple précédent la lettre 'X' se trouve donc au 2/5 de la boîte... En utilisant ce type de blanc élastique et des \leaders, on peut définir la commande suivante :

 
Sélectionnez
1.
2.
\newcommand{\traitressort}[2][1]{%
  \leaders\hrule height#2\hskip0pt plus #1fill\relax}

pouvant être par exemple utilisée comme suit :

10.18
Sélectionnez
1.
2.
\framebox[5cm]{%
  \traitressort[2]{2ex}X\traitressort{2pt}}
Image non disponible

on a donc dans la boîte de cinq centimètres :

  • un blanc élastique de raideur 2, rempli d'un trait de quatre points de hauteur ;
  • la lettre X ;
  • un blanc élastique de raideur 1, rempli d'un trait de deux points de hauteur.

Nous allons bien entendu nous servir de cette commande pour la suite...

10-7-3. Conception de la boîte

Pour concevoir la boîte à proprement parler, nous allons créer trois \parbox comme suit :

Image non disponible

Il y a :

  • deux \parboxs pour contenir les deux traits verticaux à droite et à gauche ;
  • une \parbox pour le centre, contenant le trait du haut interrompu par le titre, le contenu, et en bas un trait horizontal.

Nous allons voir maintenant comment on peut construire ces trois boîtes et les positionner correctement les unes par rapport aux autres.

10-7-4. Le code

Nous allons avoir besoin d'une boîte pour stocker la \parbox centrale :

 
Sélectionnez
1.
\newsavebox{\boitetitre}

et de deux dimensions :

 
Sélectionnez
1.
2.
\newlength{\largeurboitetitre}
\newlength{\hauteurboitetitre}

qui portent un nom suffisamment explicite m'évitant ainsi des phrases alambiquées expliquant la signification de telle ou telle variable. La première tâche que l'on va demander à la commande \titlebox est de stocker son contenu et de le mesurer :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\newcommand{\titlebox}[2]{%
  \begin{lrbox}{\boitetitre}% stockage du contenu
    \kern\fboxsep#2\kern\fboxsep
  \end{lrbox}
  % mesure de la largeur de la parbox centrale
  \settowidth{\largeurboitetitre}{\usebox{\boitetitre}}%
  % mesure de la hauteur de la parbox centrale
  \settoheight{\hauteurboitetitre}{\usebox{\boitetitre}}%
  \settodepth{\tempdim}{\usebox{\boitetitre}}%
  \addtolength{\hauteurboitetitre}{\tempdim+2\fboxrule+2\fboxsep}%
  ... }

\kern est une commande TeX permettant d'insérer un blanc insécable, ici de largeur \fboxsep. Notez que pour mesurer la hauteur totale on a recours à une longueur temporaire qui nous permet de faire la somme de la hauteur (height) et la profondeur (depth). On ajoute ensuite à cette hauteur totale deux fois l'épaisseur du trait et deux fois l'espace \fboxsep. Vous vous souvenez sans doute que les dimensions \fboxrule et \fboxsep définissent respectivement l'épaisseur du trait et l'espace entre la bordure et le contenu d'une boîte simpleBoîtes simples. Par conséquent, on a :

  • \largeurboitetitre correspond à la largeur de la \parbox centrale augmentée de deux fois \fboxsep ;
  • \hauteurboitetitre correspond à la hauteur totale augmentée de l'espace occupée par les deux traits horizontaux : 2(\fboxsep+\fboxrule).

On peut donc construire une première version de la commande :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\newcommand{\titleboxI}[2]{%
  ...
  \parbox{\fboxrule}{% le trait de gauche
    \rule{\fboxrule}{\hauteurboitetitre}}%
  \parbox{\largeurboitetitre}{% la boîte centrale
    \begin{flushleft}
      \usebox{\boitetitre}
    \end{flushleft}}%
  \parbox{\fboxrule}{% le trait de droite
    \rule{\fboxrule}{\hauteurboitetitre}}}}

Ce qui donnera pour l'instant :

10.19
Sélectionnez
1.
2.
3.
4.
\titleboxI{titre}{Bidule truc muche}

\titleboxI{encore}{%
  \parbox{4cm}{truc\\bidule\\machin}}
Image non disponible

Il reste donc à modifier le contenu de la \parbox centrale pour ajouter les deux traits horizontaux, celui du bas, et celui du haut coupé par le titre. L'idée est d'entasser trois boîtes :

  1. une boîte contenant le titre et des « traits ressorts » ;
  2. la boîte stockant le contenu (\boitetitre) ;
  3. un trait de largeur \largeurboitetitre.

Voici une première approche :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\newcommand{\titleboxII}[2]{%
  ...
  \parbox{\largeurboitetitre}{% la boîte centrale
    \begin{flushleft}
      \makebox[\largeurboitetitre]{%
        \traitressort{\fboxrule}#1\traitressort[5]{\fboxrule}}\\
      \usebox{\boitetitre}\\
      \rule{\largeurboitetitre}{\fboxrule}
    \end{flushleft}}
  ...}

qui donnera :

10.20
Sélectionnez
1.
2.
3.
4.
\titleboxII{titre}{Bidule truc muche}

\titleboxII{encore}{%
  \parbox{4cm}{truc\\bidule\\machin}}
Image non disponible

On dirait que c'est pas « tout à fait ça ». Il faudrait penser à faire en sorte que la commande \\ effectue un saut vertical équivalent à la dimension \fboxsep. On en profite au passage pour faire subir au titre une translation verticale vers le bas :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
\newcommand{\titleboxIII}[2]{%
  ...
  \parbox{\largeurboitetitre}{% la boîte centrale
    \begin{flushleft}
      \makebox[\largeurboitetitre]{%
        \traitressort{\fboxrule}%
        \raisebox{-.5ex}[0pt][0pt]{#1}%
        \traitressort[5]{\fboxrule}}\\[\fboxsep]
      \usebox{\boitetitre}\\[\fboxsep]
      \rule{\largeurboitetitre}{\fboxrule}
    \end{flushleft}}
  ...}

ce qui donnera :

10.21
Sélectionnez
1.
2.
3.
4.
\titleboxIII{titre}{Bidule truc muche}

\titleboxIII{encore}{%
  \parbox{4cm}{truc\\bidule\\machin}}
Image non disponible

On dirait que ça n'a pas arrangé grand chose... Il faut savoir que lorsque TeX entasse des boîtes en mode vertical, il insère de lui même des espaces entres ces boîtes de manière à ce que les lignes soit espacées de la longueur \baselineskip. On trouve dans le TeXbook, à la page 79 du chapitre traitant des glues :

« Exception : no interline glue is inserted before or after a rule box. You can also inhibit interline glue by saying \nointerlineskip between two boxes. »

L'ordre \nointerlineskip résout donc le problème :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
\newcommand{\titleboxIV}[2]{%
 ...
  \parbox{\largeurboitetitre}{% la boîte centrale
    \begin{flushleft}
      \makebox[\largeurboitetitre]{%
        \traitressort{\fboxrule}%
        \raisebox{-.5ex}[0pt][0pt]{#1}%
        \traitressort[5]{\fboxrule}}\\[\fboxsep]\nointerlineskip
      \usebox{\boitetitre}\\[\fboxsep]\nointerlineskip
      \rule{\largeurboitetitre}{\fboxrule}
    \end{flushleft}}
  ...}

ce qui donnera :

10.22
Sélectionnez
1.
2.
3.
4.
\titleboxIV{titre}{Bidule truc muche}

\titleboxIV{encore}{%
  \parbox{4cm}{truc\\bidule\\machin}}
Image non disponible

Ce qui répond au cahier des charges.

D'autres améliorations — laissées en guise d'exercice — peuvent être apportées à cette commande. On pourra par exemple définir un argument optionnel permettant de régler l'abaissement du titre (on a mis ici -.5ex en dur). Il est également possible de régler le rapport des traits entourant le titre. Enfin, il est tout à fait envisageable de régler l'espace autour du titre (ici il n'y en a pas).

10-7-5. Utilisation avec package minitoc

L'utilisation de la commande \titlebox précédemment définie, dans le package minitoc se fait simplement en revêtant le chapeau de monsieur Poirot. En inspectant à la loupe le fichier de style, on trouve la définition d'une commande nommée \minitoc@. J'ai simplement recopié le code de cette macro et inséré un appel à la merveilleuse commande \titlebox.

11. De nouveaux jouets

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.
Le Cantique des cantiques Ct 7 11.

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.

11-1. Quelques bricoles

11-1-1. Arguments et convention typographique

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 :

11.1
Sélectionnez
1.
2.
3.
4.
Pour compiler le fichier \bwarg{fichier} :
\begin{flushleft}
  \ttfamily latex \bwarg{fichier}
\end{flushleft}
Image non disponible

La commande \bwmarg écrit son argument en fonte penchée, entre les symboles kitxmlcodeinlinelatexdvp\langlefinkitxmlcodeinlinelatexdvp et kitxmlcodeinlinelatexdvp\ranglefinkitxmlcodeinlinelatexdvp produits respectivement par les commandes \langle et \rangle en mode mathématique. De plus vous aurez sans doute remarqué qu'on peut utiliser une notation indicée comme dans l'exemple ci-dessous :

11.2
Sélectionnez
1.
2.
3.
4.
5.
Pour copier des fichiers :
\begin{flushleft}\ttfamily
  cp \bwarg[1]{fichier} ... \bwarg[n]{fichier}
  \bwarg[dst]{fichier}
\end{flushleft}
Image non disponible

La commande \bwarg(83) est définie comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\marg}[2][]{%
  {\normalfont%
    \textsl{$\langle$#2%
      \ifthenelse{\equal{#1}{}}{}% si l'argument optionnel est présent
      {$_\mathit{#1}$}% on l'affiche en indice
      $\rangle$}}}%

La commande \normalfont permet de revenir à la fonte par défaut dans le document. Ce qui explique que « ⟨fichier⟩ » n'apparaît pas en fonte machine à écrire dans l'exemple 11.1.

Dans la version électronique du document — version lue sur un écran — il a été décidé, pour la mise en évidence, d'utiliser la couleur plutôt que les caractères h et i. Ainsi on peut définir la commande \colarg :

 
Sélectionnez
1.
2.
3.
\newcommand{\colarg}[2][]{{%
  \normalfont\color{blue!90}#2% un bleu
  \ifthenelse{\equal{#1}{}}{}{$_\mathit{#1}$}}}

On pourra ensuite grâce à un booléenBooléens et opérateurs associés habilement positionné, définir une commandegénérique \marg faisant appel à l'une ou l'autre des versions (noir & blanc ou couleur) :

 
Sélectionnez
1.
2.
3.
4.
5.
\ifversionenligne
  \let\marg\colarg
\else
  \let\marg\bwarg
\fi

Cette construction fait appel à la commande \let de TeX présentée de manière lumineuse à la section 9.2.3Le \let de TeX.

11-1-2. Autour de la génération de l'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 :

11.3
Sélectionnez
1.
2.
Le package \ltxpack{varioref} permet
d'utiliser la commande \ltxcom{vref}...
Image non disponible

La commande \ltxpack est définie comme suit. Tout d'abord :

 
Sélectionnez
1.
2.
\newcommand{\ltx@pack}[1]{%
  \upshape\textsf{#1}}

définissant la commande \ltx@pack permettant simplement de produire le nom du package en sans sérif. On définit ensuite :

 
Sélectionnez
1.
2.
3.
4.
\newcommand{\ltxpack}[1]{%
  \ltx@pack{#1}%
  \protect\index{extensions!\protect\texttt{#1}}%
  \protect\index{#1@\protect\textsf{#1 extension}}}

qui appelle la commande précédente, et qui insère deux entrées dans l'index. Une de la forme « nom du package extension » et l'autre comme sous-entréeIndex de « extensions ». La commande \protect permet ici d'éviter les ennuis si la commande \ltxpack est elle-même en argument d'une autre commande. Dans un même ordre d'idée, la commande \ltxcom est définie tout d'abord par :

 
Sélectionnez
1.
2.
\newcommand{\ltx@com}[1]{%
  \texttt{\symbol{92}#1}}

permettant de produire en fonte machine à écrire, le nom de la commande précédé du caractère \. La commande \symbol est une commande LaTeX permettant d'insérer ici le 92e caractère de la fonte sélectionnée (en l'occurrence le backslash). On peut alors définir la commande finale :

 
Sélectionnez
1.
2.
3.
\newcommand{\ltxcom}[1]{%
  \ltx@com{#1}%
  \index{#1@\protect\texttt{\symbol{92}#1}}}

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 :

 
Sélectionnez
1.
2.
3.
\newcommand{\jargonanglais}[1]{%
  \emph{#1}%
  \index{#1}}

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 :

 
Sélectionnez
1.
2.
3.
\newcommand{\postscript}{%
  PostScript%
  \protect\index{PostScript}}

11-1-3. Des renvois

La version « papier » de ce document est parsemée de renvois comme celui-ci parlant de glossaire (▶ §D.3.5Nettoyage de printemps) qui n'a strictement rien à voir avec le propos du moment(84) si ce n'est qu'il s'agit d'un renvoi. La commande mise en œuvre pour les renvois a été baptisée \voir et attend deux arguments :

  • \voir{label cible}{texte objet du renvoi}

Par exemple, le renvoi précédent a été produit par :

 
Sélectionnez
1.
\voir{chap-glossaire}{glossaire}

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 chngpage comme expliqué au paragraphe 9.3.3Tester la parité des pages.

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 \voir :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\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}

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 (§). Les deux commandes \v@irpageimpaire et \v@irpagepaire sont symétriques l'une de l'autre et ont pour objet :

  1. de placer un triangle du « bon côté » du texte faisant l'objet du renvoi
  2. de produire une note marginale avec la cible du renvoi.

Les triangles sont obtenus à l'aide de symboles contenus dans le package amssymb :

10.4
Sélectionnez
1.
2.
3.
Oh les \og joulis\fg{} triangles :
$\blacktriangleleft$ et
$\blacktriangleright$ !
Image non disponible

Voici finalement la commande permettant de faire un renvoi dans le cas d'une page paire :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\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{}}}}

On notera donc que la partie du renvoi qui réside dans la marge a été inclue dans une \parboxBoîtes paragraphe dans laquelle le numéro du paragraphe et le numéro de la page sont produits sur deux lignes. 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 :-)
Dans la version « en ligne » les renvois apparaissent comme un lien hypertexte. Ceci est facilement réalisable grâce à la commande \hyperref du package éponyme. On aura donc quelque chose du genre :

 
Sélectionnez
1.
2.
\newcommand{\voir}[3][\S]{%
  \hyperref[#2]{#3}}

L'argument optionnel ne sert ici à rien d'autre qu'à assurer la compatibilité avec la version « papier » de la commande \voir.

11-1-4. Changement de marges

À 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 Kluth(85) qui maintient la Faq française de LaTeX avait suggéré un environnement ressemblant à celui-ci :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\newenvironment{changemargin}[2] %
{\begin{list}{}{%
  \setlength{\listparindent}{\parindent}%
  \setlength{\itemindent}{\parindent}%
  \setlength{\leftmargin}{#1}%
  \setlength{\rightmargin}{#2}%
}\item }%
{\end{list}}

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
\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}}

Notez qu'on utilise ici la commande \isodd pour tester la parité de la page.

Fig. 11.1 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...
Fig. 11.1 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...

La figure 11.1 montre un exemple d'utilisation de cet environnement avec le code suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\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}

11-2. Des nota

Les pictogrammes(86) proviennent d'une collection de « cliparts » (...) et sont représentés à la figure 11.2 en trois centimètres de large.

Fig. 11.2 Les pictogrammes du manuel
Fig. 11.2 Les pictogrammes du manuel

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 TeXBook : la commande \parshape. Cette commande permet de donner une forme arbitraire à un paragraphe :

11.5
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
    \parshape=5
    2cm 3cm
    2cm 3cm
    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 a a a a a a a a a
Image non disponible

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 :

  • les deux premières lignes auront un retrait de deux centimètres et mesureront chacune trois centimètres ;
  • les deux lignes suivantes seront indentées d'un centimètre et mesureront deux centimètres ;
  • 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 \textwidth.

Pour insérer un nota dans un paragraphe, on va donc déplacer les deux premières lignes à l'aide de cette commande.

11.6
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
\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...
Image non disponible

Bon, il reste à essayer de mettre l'image dans le « trou » laissé par la commande \parshape. Essayons simplement :

11.7
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\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 [...]
Image non disponible

É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 :

11.8
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\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 [...]
Image non disponible

Il reste à faire subir au pictogramme, une translation verticale (le pictogramme est pratiquement carré, on se sert donc de la dimension \indnota) :

11.9
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
\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 [...]
Image non disponible

Bon, encore raté, il faut faire croire à LaTeX que la boîte qu'on translate verticalement est de taille nulle :

11.10
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\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 [...]
Image non disponible

On y es t presque. Deux a justements sont nécessaires :

  • 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 1ex (la hauteur d'un caractère) à la translation ;
  • il serait bon d'ajouter un espace entre le pictogramme est le texte. On définit pour cela une longueur \padnota.
11.11
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
\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 [...]
Image non disponible

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 list présenté au paragraphe 9.5Listes et nouveaux environnements. Le code complet de l'environnement est le suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
\newenvironment{pictonote}[1]{% on passe le nom du fichier en argument
  \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}}

On notera l'utilisation de la dimension \@totalleftmargin permettant d'obtenir la largeur de la marge de gauche dans une liste, en tenant compte d'éventuelles imbrications. En effet la dimension \leftmargin dans une liste correspond à la marge de gauche relativement à l'environnement contenant ladite liste.

On pourra ensuite utiliser cet environnement en lui passant en paramètre un fichier particulier, ou mieux définir un nouvel environnement par exemple :

 
Sélectionnez
1.
2.
\newenvironment{nota}{%
  \begin{pictonote}{votre fichier}}{\end{pictnote}}

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 :

 
Sélectionnez
1.
\par\parshape=1\@totalleftmargin\linewidth

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 :-)

11-3. Des citations

11-3-1. Epigraphes

Les épigraphes provocatrices de ce manuel ont été produites par un environnement que j'ai nommé epigraphe. Par exemple au début du code LaTeX du chapitre 2Ce qu'il faut savoir, on trouve :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\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}

L'environnement epigraphe est défini comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
\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}}

Il faut bien entendu déclarer la boîteSauvegarde et réutilisation qu'on utilise pour sauvegarder l'origine de notre citation :

 
Sélectionnez
1.
\newsavebox{\nomepigraphe}

Les blancs verticaux (\vspace de caler correctement l'épigraphe entre le début du chapitre et la minitable des matières.

11-3-2. Citations

Quelques citations parsèment le manuel que vous avez sous les yeux. Elles ont été pro duites avec un environnement fait maison :

11.12
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
Image non disponible

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 9.6Des environnements qui mettent en boîte (permettant de faire une remarque encadrée) et sur celui du §4.5.2Environnement qui produit une citation avec son auteur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
% 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}}

Ce qui donne :

11.13
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
Image non disponible

On peut également changer l'indentation du paragraphe dans la minipage (qui vaut par défaut 0pt dans cet environnement) en modifiant dans l'environnement la valeur de la longueur \parindent :

 
Sélectionnez
1.
2.
3.
4.
5.
...
\begin{lrbox}{\boitecitation}
  \begin{minipage}{.8\linewidth}%
    \setlength{\parindent}{10pt}%     ← pour indenter la 1re ligne
...

On insère ensuite des guillemets en début et fin de citation, avec le code suivant :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
...
\begin{minipage}{.8\linewidth}%
  \setlength{\parindent}{10pt}%
  \small\slshape« \ignorspaces}% on passe en petit et penché
{\unskip »
  \par\mbox{}\hfill\usebox{\auteurcitation}
...

On se réfèrera aux paragraphes 9.2.1.1La commande \ignorespaces et 9.2.1.2La commande \unskip pour la signification des commandes \ignorespaces et \unskip. Ce qui donne :

11.14
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
Image non disponible

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 :

 
Sélectionnez
1.
\newboolean{auteurcitationpresent}

On modifie ensuite la définition de l'environnement comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
\newenvironment{unecitation}[1][] {% argument optionnel vide par défaut
  % 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
...

Puis on modifie la clause \end de l'environnement en insérant l'auteur uniquement s'il est présent en argument :

 
Sélectionnez
1.
2.
3.
4.
5.
{ »% 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 ...

Enfin, on met la citation sur un fond. On peut par exemple déclarer cette couleur grâce au package xcolor :

 
Sélectionnez
1.
\definecolor{coulcitation}{rgb}{0.60,0.70,0.90}%

Il suffit alors de remplacer la commande \usebox de la clause end par quelque chose du genre :

 
Sélectionnez
1.
2.
\setlength{\fboxsep}{10pt}%
\colorbox{coulcitation}{\usebox{\boitecitation}}

Ce qui donnera finalement :

11.15
Sélectionnez
1.
2.
3.
4.
5.
6.
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
Image non disponible

11-4. Des lettrines

Les documents soignés font souvent appel aux 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 :

11.16
Sélectionnez
1.
2.
3.
\lettrine{Les documents} soignés font souvent
appel aux lettrines, qui selon les règles
d'usage en typographie...
Image non disponible

Il y a deux difficultés dont une a déjà été surmontée :

  • comment appliquer un traitement à une seule lettre d'un argument d'une commande ;
  • comment décaler les lignes pour laisser la place à la lettrine. On utilisera pour cela la commande \parshape comme pour le nota (§11.2Des nota).

11-4-1. La commande \glurps ou un pas vers TeX

Au niveau de LaTeX c'est la commande \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 { et }. 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 :

11.17
Sélectionnez
1.
2.
\def\bidule{machin truc}
\bidule{} et \bidule
Image non disponible

Avec un ou plusieurs arguments, on écrira

11.18
Sélectionnez
1.
2.
3.
\def\bidule#1#2{(1=#1) et (2=#2)}

\bidule{ab}{cd}
Image non disponible

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 \bidule :

11.19
Sélectionnez
1.
2.
3.
4.
5.
\def\bidule#1#2{(1=#1) et (2=#2)}

\bidule abcd

\bidule ab cd
Image non disponible

On remarque donc que si on ne délimite pas explicitement les arguments avec les caractères { et }, le premier argument (#1) est remplacé par le premier caractère rencontré, le deuxième argument (#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 :

 
Sélectionnez
1.
\def\bidule#1#2/{(1=#1) et (2=#2)}

Ici, on indique que pour appeler la commande \bidule il faut lui faire suivre deux arguments suivis du caractère /.

11.20
Sélectionnez
1.
2.
3.
\bidule abc/d

\bidule ab/cd
Image non disponible

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 /. On peut donc créer une ébauche de commande pour une lettrine :

11.21
Sélectionnez
1.
2.
3.
\def\glurps#1#2/{{\Huge#1}\textsc{#2}}
\newcommand{\lettrinedev}[1]{\glurps#1/}
\lettrinedev{Bon bé} ouala le travail
Image non disponible

On va même pousser le vice jusqu'à mettre la grosse lettre un peu plus bas :

11.22
Sélectionnez
1.
2.
3.
4.
5.
\def\glurps#1#2/{%
  {\Huge#1}%
  \raisebox{\baselineskip}{\textsc{#2}}}
\newcommand{\lettrinedev}[1]{\glurps#1/}
\lettrinedev{Bon bé} ouala le travail
Image non disponible

11-4-2. Insertion de la lettrine dans un paragraphe

Pour insérer la lettrine dans un paragraphe on aura recours à la commande \parshape. La figure 11.3 montre que l'on doit définir deux dimensions pour insérer la lettrine :

  1. l'indentation de la première ligne, correspondant à la largeur de la « grosse lettre » plus celle de la suite de la lettrine ;
  2. l'indentation de la deuxième ligne, correspondant à la largeur de la « grosse lettre » éventuellement augmentée d'une espace pour aérer un peu.
Image non disponible
Fig. 11.3 – Insertion de la lettrine dans un paragraphe

On définit les dimensions suivantes :

  • \indletH et \larligH respectivement l'indentation et la largeur de la première ligne (la ligne « du Haut ») du paragraphe contenant une lettrine ;
  • \indletB et \larligB la même chose pour la deuxième ligne (la ligne « du Bas »)

Ceci permet d'écrire quelque chose du genre :

11.23
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\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
\noindent Ce paragraphe est prêt à recevoir
une jolie lettrine qui occupera deux lignes
environ voire même exactement...
Image non disponible

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 :

11.24
Sélectionnez
1.
2.
3.
\DeclareFixedFont{%
  \lettrinefont}{T1}{ppl}{m}{n}{2\baselineskip}
{\lettrinefont Pour écrire les grosses lettres}
Image non disponible

Ensuite on va modifier la commande \glurps(87) et la commande \lettrine pour qu'elles calculent elles-mêmes les dimensions définies ci-avant (\indletH, \larligH, ...).

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\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}}}

La commande \creerlettrine (digne héritière de \glurps) sauve la lettrine dans une boîte et en profite pour sauvegarder la largeur de la « grosse lettre » dans la dimension \indletB, et la dimension de l'ensemble dans \indletH. Tentons maintenant, une première version de la lettrine :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newcommand{\lettrineI}[1]{%
  \creerlettrine#1/%
  \setlength{\larligH}{\textwidth-\indletH}%
  \setlength{\larligB}{\textwidth-\indletB}%
  \parshape=3\indletH\larligH\indletB\larligB%
  0cm\textwidth%
  \noindent\usebox{\lalettrine}}

Qui donne(88) :

11.25
Sélectionnez
1.
2.
3.
4.
\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.
Image non disponible

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 la commande \lettrine, on écrira donc :

 
Sélectionnez
1.
\noindent\hspace{-\indletH} % décalage équivalent à la largeur totale

qui produira :

11.26
Sélectionnez
1.
2.
3.
4.
\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.
Image non disponible

Puis on intègre la translation verticale :

 
Sélectionnez
1.
2.
\noindent\hspace{-\indletH}%
\raisebox{-\baselineskip}[0pt][0pt]{\usebox{\lalettrine}}

qui produira :

11.27
Sélectionnez
1.
2.
3.
4.
\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.
Image non disponible

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 \indletB. Voici finalement le code de la lettrine :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\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}}}

11-5. 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 book.cls définissant la classe éponyme, on trouve une instruction commune aux commandes \tableofcontents et \listoffigures : la commande \@starttoc.

 
Sélectionnez
1.
\@starttoc{toc}

pour la commande \tableofcontents et :

 
Sélectionnez
1.
\@starttoc{lof}

pour la commande \listoffigures. La commande interne \@starttoc permet de commencer un table (matières, figures, etc.) à partir d'un fichier auxiliaire portant l'extension donnée en argument, ici toc pour la table des matières et lof pour la liste des figures. Nous avons donc créé dans un premier temps la commande \sommaire comme suit :

 
Sélectionnez
1.
2.
3.
\newcommand{\sommaire}{%
  \chapter*{Sommaire}
  \@starttoc{som}}

Le fichier portant l'extension som contiendra les entrées du sommaire. L'étape suivante consiste à remplir le fichier som. Pour cela, il faut savoir que les commandes \chapter, \section, etc. font toutes appel à une commande pour insérer une entrée dans la table des matières. Ainsi quand on écrit :

 
Sélectionnez
1.
\section{Bidule truc muche}

il sera fait appel à la commande :

 
Sélectionnez
1.
\addcontentsline{toc}{section}{Bidule truc muche}

pour insérer le titre dans la table des matières. De même lorsqu'on écrit :

 
Sélectionnez
1.
\chapter{Machin chose}

il sera fait automatiquement appel à :

 
Sélectionnez
1.
\addcontentsline{toc}{chapter}{Machin chose}

Cette dernière commande écrit dans le fichier de table des matières (portant donc l'extension toc) la ligne :

 
Sélectionnez
1.
\contentsline{chapter}{\numberline {1}Machine chose}{3}{chapter.1}

Et (Hercule Poirot a eu du pain sur la planche), il se trouve que cette dernière commande, fait finalement appel à une commande de la forme :

  • \l@type d'entrée

pour produire l'entrée dans la table. Par exemple la commande précédente fait appel à l@chapter. Ceci parce qu'on trouve la définition suivante :

 
Sélectionnez
1.
\def\contentsline#1{\csname l@#1\endcsname}

dans latex.ltx. Nous passons volontairement sous silence le détail de ces commandes, et on se contentera ici de savoir que la commande \l@section produit une entrée de table de matières pour les sections, \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 \addcontentsline originale :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
% 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}}{}}

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 :

 
Sélectionnez
1.
\aclORIG{som}{section}{...}

c'est donc la commande \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 :

 
Sélectionnez
1.
\aclORIG{som}{somsection}{...}

puis définir la commande \l@somsection pour mettre en page les entrées de sections dans le sommaire...

11-6. Un 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 makeindex présenté au paragraphe 6.3Index et sur le paragraphe 10.1Allure de l'index présentant les outils permettant de changer l'allure de l'index.

11-6-1. Tordre le cou à makeindex

De même que pour la création d'un index, on doit mettre dans le préambule du document la commande \makeglossary. Cette commande demande à monsieur LaTeX de bien vouloir créer un fichier portant l'extension glo, réceptacle des entrées de glossaire. On pourra écrire :

 
Sélectionnez
1.
\glossary{machin chouette chose}

pour ajouter « machin chouette chose » dans le glossaire. En réalité cette commande a pour effet d'ajouter dans le fichier d'extension glo, la ligne :

  • \glossaryentry{machin chouette chose}{n° page}

La phase suivante consiste à produire le glossaire proprement dit grâce au programme makeindex et au fichier d'entrées de glossaire :

  • makeindex -s style glossaire document.glo -o document.glx

qui produit, en utilisant comme fichier de style gglo.ist le glossaire suivant :

 
Sélectionnez
1.
2.
3.
\begin{theglossary}
\item machin chouette chose\pfill 27
\end{theglossary}

On note donc que le glossaire — qu'il va falloir insérer explicitement dans notre document — est constitué par l'environnement theglossary et que chaque entrée donne lieu à un \item et son numéro de page (ici 27 pour l'exemple). Pour arriver à nos fins, il nous faudra :

  1. définir l'environnement theglossary car rien n'est fait par défaut dans LaTeX ;
  2. produire les entrées avec un terme suivi de sa définition, sous la forme :

     
    Sélectionnez
    1.
    2.
    3.
    \begin{theglossary}
    \item[terme] blabla de définition
    \end{theglossary}
    
  3. supprimer les numéros de pages puisqu'ils n'apparaissent pas dans un glossaire.

Ces trois tâches font l'objet des paragraphes suivants.

11-6-2. Un environnement pour le glossaire

Au paragraphe 9.5.6Un exemple un peu plus tordu... du chapitre 9Outillage nécessaire, 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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
\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}}

\boiteentreeglossaire est :

 
Sélectionnez
1.
2.
3.
4.
5.
\newcommand{\boiteentreeglossaire}[1]{%
  \parbox[b]{\labelwidth}{%
    \setlength{\fboxsep}{3pt}%
    \setlength{\fboxrule}{.4pt}%
    \shadowbox{\sffamily#1}\\\hfill\mbox{}}}

On se reportera au paragraphe mentionné ci-dessus pour les explications de ces commandes. En tous les cas on aura :

11.28
Sélectionnez
1.
2.
3.
\begin{leglossaire}
\item[Sphère] Patate bien régulière.
\end{leglossaire}
Image non disponible

11-6-3. Produire le fichier .glx

De manière à ce que makeindex produise le fichier d'extension glx avec cet environnement on doit écrire le fichier de style suivant :

 
Sélectionnez
1.
2.
preamble "\n\\begin{leglossaire}"
postamble "\n\\end{leglossaire}"

Doit également apparaître dans ce fichier de style — que l'on nommera par exemple glossaire.ist — le mot clef désignant les entrées de glossaire dans le fichier .glo :

 
Sélectionnez
1.
keyword "\\glossaryentry"

Pour que chaque entrée soit constituée d'un terme et de sa définition, nous avons défini la commande suivante :

 
Sélectionnez
1.
\newcommand{\entreeglossaire}[2]{\glossary{[#1] #2}}

De telle sorte que :

 
Sélectionnez
1.
\entreeglossaire{Sphere}{Patate bien régulière.}

aura pour effet d'écrire :

 
Sélectionnez
1.
\glossary{[Sphère] Patate bien régulière.}

dans le fichier .glo. Après appel de makeindex :

  • makeindex -s glossaire.ist document.glo -o document.glx

on aura dans le fichier .glx :

 
Sélectionnez
1.
2.
3.
\begin{leglossaire}
\item [Sphère] Patate bien régulière., n° de page
\end{leglossaire}

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 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 :

 
Sélectionnez
1.
delim_0 ""

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. §6.3.3Différents types d'entrée d'index). Voici la commande \entreeglossaire modifiée :

 
Sélectionnez
1.
2.
3.
\newcommand{\pasdenumerodepage}[1]{}% « mange » l'argument
\newcommand{\entreeglossaire}[2]{%
  \glossary{[#1] #2|pasdenumerodepage}}

ceci permet de créer le fichier .glx de la forme :

 
Sélectionnez
1.
2.
3.
\begin{leglossaire}
\item [Sphère] Patate bien régulière.\pagedenumerodepage{27}
\end{leglossaire}

qui enverra le numéro de page (ici 27 pour l'exemple) dans le vide intersidéral.

11-6-4. 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 .glx. On peut décomposer les tâches à effectuer par la commande en question, comme suit :

  • créer un nouveau chapitre (avec comme titre « glossaire ») ;
  • lire les entrées de glossaire (commande \entreeglossaire) depuis un fichier ;
  • insérer le fichier .glx

Voici la commande effectuant ces traitements :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
\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}}
}

On notera les points suivants concernant cette commande :

  • le fichier d'entrée de glossaire est par défaut le fichier glossaire.tex ;
  • on a décidé d'insérer le glossaire dans la table des matières ;
  • pour insérer un fichier, on fait appel à la commande \InputIfFileExists définie dans le format LaTeX ayant la forme suivante :

     
    Sélectionnez
    1.
    2.
    3.
    \InputIfFileExists{fichier à inclure}
    {code LaTeX si le fichier existe}
    {code LaTeX si le fichier n'existe pas}
    

    Enfin \jobname contient le nom du fichier (ou document maître) en cours de compilation et la commande \typeout affiche un message sur la console de compilation.

Enfin, le fichier glossaire.ist contient finalement :

 
Sélectionnez
1.
2.
3.
4.
delim_0 ""
preamble "\n\\begin{leglossaire}"
postamble "\n\\end{leglossaire}"
keyword "\\glossaryentry"

11-7. Des 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…

11-7-1. Idée retenue

Le cahier des charges est le suivant :

  • les onglets apparaissent sur chaque page du coté opposé à la reliure ;
  • ils sont produits « à l'envers » sur les pages paires ;
  • ils doivent être à une hauteur proportionnelle au numéro du chapitre.

D'où l'idée :

  • d'utiliser les fonctionnalités du package fancyhdr pour produire les onglets ;
  • utiliser des translations verticales pour les positionner.

11-7-2. 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(89) :

 
Sélectionnez
1.
2.
3.
4.
\newlength{\ongletwidth}
\newlength{\ongletheight}
\setlength{\ongletheight}{32pt}
\setlength{\ongletwidth}{.96cm}

Voici la commande produisant la boîte :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
\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}}}

On notera l'utilisation de la commande \reflectbox du package 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 mystérieuse fonteFontes enclenchée par la commande \ongletfont.

11.29
Sélectionnez
1.
Et voici la boîte : \b@iteonglet...
Image non disponible

Il est important de noter que les boîtes produites par \colorbox sont assujetties à la dimension \fboxsep :

11.30
Sélectionnez
1.
2.
\setlength{\fboxsep}{15pt}
En voici une autre : \b@iteonglet...
Image non disponible

11-7-3. Position des onglets

Pour positionner les onglets, il faut effectuer deux translations :

  • une horizontale pour pousser l'onglet jusqu'au bout de la zone de note marginale ;
  • une verticale en fonction du numéro de chapitre.

On utilisera le mécanisme de définition des en-têtes de page du package fancyhdr pour positionner les onglets. L'idée est simple, on écrit :

 
Sélectionnez
1.
2.
\fancyhead[RO]{\bfseries\thepage\onglet}
\fancyhead[LE]{\onglet\bfseries\thepage}

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 \onglet (à droite sur les pages impaires et à gauche sur les pages paires). Nous allons voir comment construire pas à pas cette commande.

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(90) :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newcommand{\ongletI}{%
  \ifthenelse{\isodd{\value{page}}}{%
    % page impaire
    \hspace*{\marginparwidth}\hspace*{\marginparsep}}{%
    % page paire
    \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
  \b@iteonglet}

Voici ce que donnerait cette commande sur cette page :

Image non disponible

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\newcommand{\ongletII}{%
  \makebox[0pt][l]{%
  \ifthenelse{\isodd{\value{page}}}{%
    \hspace*{\marginparwidth}\hspace*{\marginparsep}}{%
    \hspace*{-\marginparwidth}\hspace*{-\marginparsep}}%
    \b@iteonglet}}

qui donnerait sur cette page :

Image non disponible

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 :

Image non disponible

Par conséquent, le positionnement horizontal est obtenu grâce à la commande :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\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}}

puisqu'à la largeur de la boîte de l'onglet, il faut rajouter deux fois la dimension \fboxsep induite par la commande \colorbox.

Positionnement vertical

Reste maintenant à traiter le problème du positionnement vertical… La commande \raisebox va nous permettre de positionner verticalement l'onglet.

De plus avec la forme suivante :

  • \raisebox{déplacement}[0pt][0pt]{objet à déplacer}

on fait croire à LaTeX que l'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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\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}}}

On place à partir d'ici un onglet à cinq centimètres vers le bas :

Image non disponible

La méthode choisie pour définir le placement de la boîte est la suivante : pour le chapitre de numéro c :

  • se déplacer vers le bas d'une dimension fixe donnée df ;
  • ajouter à ce déplacement un déplacement proportionnel à c. Le déplacement de l'onglet pour le chapitre c peut s'écrire :

    kitxmlcodelatexdvpc \times \color{blue}{hauteuronglet} \times \alphafinkitxmlcodelatexdvp

    où kitxmlcodeinlinelatexdvp\alphafinkitxmlcodeinlinelatexdvp est un facteur permettant d'espacer les onglets. Si kitxmlcodeinlinelatexdvp\alphafinkitxmlcodeinlinelatexdvp = 1, les onglets seront espacés d'exactement la longueur de la boîte, avec kitxmlcodeinlinelatexdvp\alphafinkitxmlcodeinlinelatexdvp = 2 ils seront séparés par un espacement égal à deux fois la hauteur de l'onglet, etc.

Voici pour le premier déplacement :

 
Sélectionnez
1.
2.
3.
% position de la première étiquette
\newlength{\ongletvshift}
\setlength{\ongletvshift}{2cm}

Puis pour le facteur alpha :

 
Sélectionnez
1.
\newcommand{\ongletsep}{1.37}

On déclare une dimension permettant de positionner l'onglet :

 
Sélectionnez
1.
\newlength{\ongletpos}

On peut maintenant écrire, la commande \onglet :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
\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}}}

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'œil dans book.cls nous confirme cela :

 
Sélectionnez
1.
2.
3.
4.
5.
\newcommand\appendix{\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
[...]
\gdef\thechapter{\@Alph\c@chapter}}

on peut comprendre ici que lorsqu'on commence les annexes avec la commande \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 :

 
Sélectionnez
1.
\newcounter{chapitre}

On précise tout de suite qu'on veut le produire en chiffre arabe :

 
Sélectionnez
1.
\renewcommand{\thechapitre}{\arabic{chapitre}}

On ajoute la mise à zéro de ce compteur dans la commande \frontmatter :

 
Sélectionnez
1.
2.
3.
4.
5.
\renewcommand\frontmatter{%
  \cleardoublepage
  \setcounter{chapitre}{1}
  [...]
}

Puis à chaque appel de la commande \chapter, on incrémente le compteur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
\renewcommand{\chapter}{%
\cleardoublepage
\stepcounter{chapitre}
\thispagestyle{plain}
[...]
}

11-8. Exemples LaTeX

11.31
Sélectionnez
1.
2.
3.
4.
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...
Image non disponible

11-8-1. Outils nécessaires

Le package fancyvrb propose deux fonctionnalités axées autour des fichiers. Tout d'abord, la commande \VerbatimInput permet d'insérer le contenu d'un fichier. Par exemple :

 
Sélectionnez
1.
\VerbatimInput[lastline=4]{corps/jouets.tex}

donne (jouets.tex est le fichier source de ce chapitre) :

 
Sélectionnez
1.
2.
3.
4.
\chapter{De nouveaux jouets}
\label{chap-jouets}

\begin{epigraphe}{Le Cantique des cantiques Ct \textbf{7} 11}

Ensuite, l'environnement VerbatimOut réalisant la tâche inverse :

 
Sélectionnez
1.
2.
3.
\begin{VerbatimOut}{fichier}
  code LaTeX
\end{VerbatimOut}

stockera le code LaTeX dans le fichier nommé fichier.

Le deuxième outil nécessaire est défini en s'inspirant de la définition des commandes \settowidth, \settoheight, etc. dans le fichier 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 :

 
Sélectionnez
1.
2.
3.
4.
5.
\newcommand{\hauteurtotale}[2]{%
  \setbox\@tempboxa\hbox{{#2}}% sauvegarde de l'objet à mesurer
  \setlength{#1}{\ht\@tempboxa}% récupération de la hauteur
  \addtolength{#1}{\dp\@tempboxa}% à laquelle on ajoute la profondeur
  \setbox\@tempboxa\box\voidb@x}% vidange de la boîte temporaire

On notera l'utilisation des commandes TeX, \ht et \dp renvoyant respectivement la hauteur et la largeur d'une boîte. La commande \setbox et l'équivalent TeX de \savebox. La boîte \@tempboxa est une boîte temporaire utilisée par LaTeX et enfin, la boîte \voidb@x est une boîte vide.

11-8-2. Le principe de l'environnement ltxexemple

L'environnement 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{ltxexemple} contenu \end{ltxexemple}

il faut d'une part pouvoir produire 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 deux fois contenu ce qui n'est pas envisageable. Une solution pour contourner ce problème est précisément de sauvegarder 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 :

 
Sélectionnez
1.
2.
3.
4.
\newenvironment{ltxexemple}{%
  \VerbatimEnvironment
  \begin{VerbatimOut}{\jobname.exa}}{% clause begin
  \end{VerbatimOut}}% clause end

Ne me demandez pas à quoi sert la commande \VerbatimEnvironment non documentée dans le package, mais nécessaire au bon fonctionnement de l'environnement défini ci-dessus.

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 :

 
Sélectionnez
1.
2.
3.
\end{VerbatimOut}%
\VerbatimInput{\jobname.exa}% le contenu tel quel
\input{\jobname.exa}% le contenu interprété par LaTeX

Ainsi :

 
Sélectionnez
1.
2.
3.
\begin{ltxexemplei}
du code \LaTeX{}...
\end{ltxexemplei}
donne :
Image non disponible

Il reste donc à modifier la mise en page des deux parties. Ce qui fait l'objet du paragraphe suivant.

11-8-3. Mises en boîte

L'idée de base consiste à mettre dans deux boîtes :

 
Sélectionnez
1.
2.
\newsavebox{\b@iteentree}
\newsavebox{\b@itesortie}

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
[...]
\end{VerbatimOut}%
\begin{ltxexempleenv}% pour agrandir les marges
  \savebox{\b@iteentree}{% sauvegarde du code en verbatim
    \begin{minipage}{.57\linewidth}
      \VerbatimInput{\jobname.exa}
    \end{minipage}}%
  \savebox{\b@itesortie}{% code interprété
    \begin{minipage}{.40\linewidth}
      \setlength{\parindent}{10pt}% par défaut 0pt
      \input{\jobname.exa}
    \end{minipage}}%
  \usebox{\b@iteentree}
  \usebox{\b@itesortie}
\end{ltxexempleenv}

L'environnement ltxexempleenv est analogue à celui que nous avons présenté au paragraphe concernant l'agrandissement des margesChangement de marges. La seule différence est qu'il bascule en \small et effectue quelques réglages sur les blancs verticaux. On notera que la boîte « entrée » occupera 57 % de la largeur de la page et, la boîte « sortie » 40 %. Ainsi, le code :

 
Sélectionnez
1.
2.
3.
4.
5.
\begin{ltxexempleii}
du code \LaTeX{}...
\par\noindent
et c'est tout.
\end{ltxexempleii}

Donnera :

Image non disponible

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 :

 
Sélectionnez
1.
2.
3.
\pagebreak[3] % on suggère de changer de page ici
\VerbatimEnvironment%
\begin{VerbatimOut}[gobble=2]{\jobname.exa}

L'option [gobble=2] permet de « manger » systématiquement deux caractères au début de chaque ligne car tout bon éditeur(91) ajoute des espaces pour l'indentation du source. Ainsi le code :

 
Sélectionnez
1.
2.
3.
4.
5.
\begin{ltxexempleii}
du code \LaTeX{}...
\par\noindent
et c'est tout.
\end{ltxexempleii}

donnerait :

Image non disponible

La suite de la mise en page consiste en la création du trait central. Ceci fait l'objet du paragraphe 11.8.5Le trait central. Avant cela nous nous attarderons sur la numérotation des exemples.

11-8-4. Numérotation des exemples

Pour numéroter les exemples, il est nécessaire de déclarer un compteurCompteurs :

 
Sélectionnez
1.
\newcounter{c@exemple}[chapter]

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 :

 
Sélectionnez
1.
\renewcommand{\thec@exemple}{\thechapter.\arabic{c@exemple}}

À chaque appel à l'environnement ltxexemple, on fera appel à :

 
Sélectionnez
1.
\refstepcounter{c@exemple}

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 \l@rgeurnumex (définie à 16 points) et est produite par :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
\newcommand{\affichenumex}{%
  \raisebox{-1.7pt}[0pt][0pt]{%
    \setlength{\fboxsep}{.7pt}%
      \colorbox{black}{%                ← la boîte noire
        \makebox[\l@rgeurnumex]{%       ← une boîte de largeur fixée (16 pt)
          \color{white}%                ← le contenu en blanc
          \tiny\textsf{\thec@exemple}}}}}

Ainsi :

Image non disponible

Un nouvelle version de l'environnement ltxexemple pourrait donc être :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
\newenvironment{ltxexempleiii}{%
\VerbatimEnvironment%
\begin{VerbatimOut}[gobble=2]{\jobname.exa}}{%
\end{VerbatimOut}%
\begin{ltxexempleenv}%
  \refstepcounter{c@exemple}%         ← 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}}%

qui donnera :

Image non disponible

La dernière difficulté est de gérer le système de référencement. En effet, on ne peut pas écrire :

 
Sélectionnez
1.
Voici un exemple.\label{monexemple}.

Puisque la séquence « \label{monexemple} » apparaîtra dans l'exemple :

Image non disponible

Ce qui n'est pas souhaitable... La solution adoptée ici a été de passer l'éventuelle étiquette de \label à l'environnement par le truchement d'une commande. On a défini :

 
Sélectionnez
1.
2.
3.
\newcommand{\l@belex}{} % la valeur courante du label
\newcommand{\labelexemple}[1]{% commande pour la mettre à jour
  \renewcommand{\l@belex}{#1}}

Ainsi avant l'utilisation d'un environnement ltxexemple il suffira d'appeler :

  • \labelexemple{étiquette}

pour pouvoir ensuite y faire référence avec \ref{étiquette} ou une commande équivalente. Dans la définition de l'environnement ltxexemple, on a ajouté :

 
Sélectionnez
1.
2.
\ifthenelse{\equal{\l@belex}{}}{}{% si le label courant n'est pas vide
  \label{\l@belex}}% on pose un label

qui signifie en français : « si la commande \l@belex est définie à une valeur non vide, on pose une étiquette (commande \label) avec cette valeur ». Il faut ensuite repositionner la commande \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 :

 
Sélectionnez
1.
2.
3.
\ifthenelse{\equal{\l@belex}{}}{}{% si le label courant n'est pas vide
  \label{\l@belex}% on pose un label
  \renewcommand{\l@belex}{}}

ce qui est correct du point de vue de la syntaxe. Cependant la portée de la commande \renewcommand est ici locale au groupe dans lequel le test \ifthenelse intervient. Pour contourner ce problème on utilisera la construction TeX :

 
Sélectionnez
1.
\global\def\l@belex{}

en lieu et place du \renewcommand pour effectuer une redéfinition à portée globale…

11-8-5. Le 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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
% 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}}{}

Les dimensions \hauteurdutrait et \tempodim auront bien entendu fait l'objet d'une déclaration préalable. La commande \settotoalheight est quant à elle présentée au paragraphe 11.8.1Outils nécessaires.

La dimension du trait noir à tracer entre l'entrée et la sortie correspond exactement \hauteurtrait moins \l@rgeurnumex (la largeur de la boîte contenant le numéro de l'exemple). On stocke cette dimension :

 
Sélectionnez
1.
2.
% hauteur du trait sans la boîte du numéro
\setlength{\hauteurdutrait}{\tempodim-\l@rgeurnumex}

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 \parbox comme suit :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
% le trait c entral
\parbox{3pt}{%
  \begin{center}
    \rule{3pt}{.7\hauteurdutrait}\\\nointerlineskip% 70% au dessus
    \rotatebox{90}{\affichenumex}\\\nointerlineskip%
    \rule{3pt}{.3\hauteurdutrait}% 30% en dessous
  \end{center}}

La commande \nointerlineskip permet de supprimer tout blanc vertical supplémentaire qui pourrait être inséré par la commande \\. Plus de détails sont donnés à la section présentant l'implémentation de la boîte avec titreLe code pour la minitable des matières.

Image non disponible

précédentsommairesuivant
Les épigraphes de cette partie sont toutes tirées du Cantique des cantiques et n'ont jamais de lien avec le titre du chapitre.
D'autant plus, je l'écris en petit, que je ne les maîtrise pas du tout.
Oui oui ça n'est pas une commande interne, mais un exemple idiot de nom de commande qui n'existe pas…
Y en a qui n'ont pas grand chose à faire de leur journée…
Mais obsolète. Aujourd'hui il est conseillé d'utiliser le package mathptmx
Terme faisant référence au plomb de l'imprimerie…
Notez ici le jeu de mots désopilant, concrete veut aussi dire « béton » en langue anglaise.
Voir également le nota qui suit pour les références bibliographiques utiles.
Je plaisante, juste quelques semai… minutes veux-je dire.
Légèrement simplifié…
En réalité, après avoir enclenché le package babel et l'option french ces deux commandes sont redéfinies pour produire quelque chose du style : « Première partie »
Vous ne serez sans doute pas tout à fait d'accord avec le terme « simple » après avoir lu la suite…
Les français sont parait-il des spécialistes de la litote. Mais ne nous égarons pas…
On notera d'ailleurs que la mode qui consiste aujourd'hui à faire subir à ses majeurs et index des mouvements d'oreilles de lapin, pendant qu'on parle pour dire « entre guillemets » sans le dire, est clairement empruntée aux américains. Je propose donc ici publiquement que l'on se force à utiliser plutôt l'index et le pouce pour faire ce geste, il faudra par contre se munir de deux autres bras pour être en mesure d'imiter les deux chevrons ‘«’ et ‘»’, ou peut-être qu'un habile tortillage de quatre doigts d'une main peut donner un résultat…
Alt-Gr-z et Alt-Gr-x.
Tout à fait discutable et limitée dans ses fonctionnalités comme tout « logiciel » pondu par un bricoleur…
Pour « black & white » argument...
Je veux dire que nous ne sommes pas en train de parler de glossaire, ou alors vous ne suivez pas du tout…
Qui possède un lom prédestilé…
L'idée de ces pictogrammes a été inspirée par la lecture de TeXbook, comme je l'explique en introduction.
Vous pourrez notez qu'il est tout à fait inadmissible d'utiliser des noms aussi ridicules pour les commandes que vous serez amené à définir…
Des traits ont été ajoutés pour bien situer la boîte en globant la lettrine.
On remarquera cette maladie des informaticiens de nommer les variables avec des noms à moitié en français et en anglais…
Je suis toujours très ému de commencer une phrase par le beau ‘Q’ de la police Computer Modern…
Je veux bien sûr parler de vi, pardon, Emacs…

Licence Creative Commons
Le contenu de cet article est rédigé par Vincent Lozano et est mis à disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.