I. Introduction▲
Utilisant depuis un moment déjà LaTeX, j'ai dû avoir recours à un index afin de faciliter les recherches dans un document qui prenait de l'ampleur. Quelle ne fut pas ma surprise de voir la tête des index par défaut qui ne sont guère attirants.
Je me suis donc plongé dans la documentation afin de voir ce que l'on pouvait faire pour obtenir des index plus attrayants.
Cet article devrait vous permettre de personnaliser vos index pas à pas. Je ne ferai pas une présentation de LaTeX, cet article présupposant que vous connaissez au minimum celui-ci et son fonctionnement.
II. Création d'un index▲
Dans LaTeX, générer un index est une chose très simple. Trois commandes sont principalement utilisées :
\makeindex
dans le préambule afin d'informer LaTeX qu'il faut générer l'index ;\index
{<mot ou expression à indexer>} ;\printindex
afin d'afficher l'index généré.
L'exemple ci-dessous montre l'utilisation de ces trois commandes ainsi que leur ordre d'apparition dans le document.
La commande \printindex
peut indifféremment être placée en début ou en fin de document, même si on trouve plus généralement l'index en fin de document, LaTeX remplaçant \printindex
par l'index formaté.
\documentclass
[a4paper,12pt,francais]{article}
\usepackage
[utf8]{inputenc}
\usepackage
[T1]{fontenc}
\usepackage
{lipsum}
\usepackage
[francais]{babel}
\makeindex
\begin
{document}
\section
{Lipsum 1}\index
{Lipsum 1}
\lipsum
[1]
\section
{Lipsum 2}\index
{Lipsum 2}
\lipsum
[2]
\printindex
\end
{document}
II-A. Utilisation de la commande index▲
II-A-1. Les caractères accentués▲
Les caractères accentués ne sont pas gérés par la commande makeindex.
Aussi, pour correctement classer l'entrée dans l'index, il convient de définir ce dernier de la manière suivante : \index
{sans_
accents@avec_
accents}.
Dans l'exemple qui suit, le mot « accentué » sera classé comme « accentue ».
\index
{accentue@accentué}
II-A-2. Entrées et sous-entrées▲
Pour mémoire, la commande makeindex ne gère que trois niveaux d'entrées. Les différents niveaux d'entrées sont séparés par le caractère « ! » (point d'exclamation).
- Entrée simple :
\index
{terme}. - Entrée à deux niveaux :
\index
{terme!sous-terme}. - Entrée à trois niveaux :
\index
{terme!sous-terme!sous-sous-terme}.
II-A-3. Renvoi à une autre entrée▲
Il est possible de faire référence à une autre entrée de l'index pour un terme indexé. Cela se fait de la manière suivante : \index
{Thermes|see{Bains}}.
Le caractère « | » est obtenu par la combinaison de touches « Alt Gr + 6 » sur un clavier azerty français.
\index
{Thermes|see{Bains}} donnera dans l'index « Thermes, voir Bains ».
II-B. Génération d'un premier index▲
L'exemple ci-dessous montre l'utilisation des trois commandes évoquées plus haut, ainsi que leur ordre d'apparition dans le document LaTeX.
\documentclass
[a4paper,12pt,francais]{article}
\usepackage
[utf8]{inputenc}
\usepackage
[T1]{fontenc}
\usepackage
{lipsum}
\usepackage
[francais]{babel}
\usepackage
{makeidx} % création d'index
\makeindex
\begin
{document}
\lipsum
[1]\index
{Lipsum 1}
\lipsum
[2]\index
{Lipsum 2}
\printindex
\end
{document}
Pour lancer la compilation du fichier exemple.tex, on utilise les commandes suivantes :
latex (ou pdflatex) exemple.tex
makeindex exemple.idx
latex (ou pdflatex) exemple.tex
L'usage de la commande \makeindex
dans le préambule du document LaTeX générera deux fichiers nommés dans notre cas exemple.ilg et exemple.ind, le fichier exemple.idx étant généré par la commande LaTeX (ou pdflatex). Le fichier exemple.ilg contient les logs de compilation, exemple.ind l'index formaté qui sera inclus dans le document final par la commande \printindex
, le fichier exemple.idx contenant les entrées de l'index.
Rien de très sexy, il faut bien l'avouer.
Pour y remédier, nous allons personnaliser notre index à l'aide d'un fichier de gabarit que nous nommerons perso.ist et qui sera sauvegardé dans le même répertoire que notre fichier source LaTeX.
III. Personnalisation du fichier « perso.ist »▲
Actuellement, notre fichier perso.ist est vide.
Dans cette partie, nous allons petit à petit le remplir afin d'obtenir un index beaucoup plus agréable.
III-A. Le fichier exemple.tex▲
Nous allons commencer par apporter quelques modifications à notre fichier exemple.tex afin d'avoir plus de termes à indexer et dans une plus grande gamme.
Voici le fichier exemple.tex qui nous servira pour la suite :
\documentclass
[a4paper,10pt,francais]{article}
\usepackage
[utf8]{inputenc}
\usepackage
[T1]{fontenc}
\usepackage
[francais]{babel}
\usepackage
{color} % définitions des couleurs
\usepackage
[dvipsnames,x11names,svgnames,table]{xcolor} % texte et tableau en couleur
\usepackage
{makeidx} % création d'index
\usepackage
{lipsum}
\makeindex
\begin
{document}
\lipsum
[1]\index
{premier verset}\index
{verset!premier}
\lipsum
[2]\index
{second verset}\index
{verset!second}
\lipsum
[3]\index
{troisieme verset@troisième verset}\index
{verset!troisieme@troisième}
\printindex
\end
{document}
Résultat de compilation :
Comme vous pouvez le voir, les termes sont indexés deux fois : une première fois avec une entrée simple et une seconde fois avec une sous-entrée. Ceci est bien sûr volontaire et nous permettra de mettre en place et de comprendre la mise en forme des sous-entrées dans le gabarit de l'index.
III-B. Faire apparaître les en-têtes de groupe de l'index▲
Pour cela, nous allons ajouter une ligne à notre fichier perso.ist :
headings_
flag 1
La valeur de headings_flag peut-être -1, 0 ou 1 selon le résultat voulu.
- headings_flag : selon la valeur choisie (-1, 0 ou 1) les en-têtes de groupe seront respectivement en minuscules, aucun en-tête ou en majuscules.
Le fait d'utiliser un fichier ist personnalisé modifie notre chaîne de compilation de la manière suivante :
latex (ou pdflatex) exemple.tex
makeindex exemple.idx -s perso.ist
latex (ou pdflatex) exemple.tex
L'ajout de -s perso.ist à la fin de la commande makeindex indique où se situe notre fichier personnalisé ainsi que son nom.
Valeurs et résultats de headings_flag :
-1 : En-têtes en minuscules |
0 : Aucun en-tête |
1 : En-têtes en majuscules |
III-C. Améliorer les en-têtes de groupe de l'index▲
Les en-têtes de groupe que nous avons ne sont pas particulièrement attirants. Nous allons améliorer leur apparence ici.
Pour cela, nous allons insérer les lignes ci-dessous dans notre fichier perso.ist :
heading_
prefix "{\\
bfseries\\
hfil "
heading_
suffix "\\
hfil}\\
nopagebreak\n
"
Une petite explication s'impose.
Les deux lignes ci-dessus forment une suite de commandes LaTeX qui seront exécutées avant (pour heading_prefix) et après (pour heading_suffix) les en-têtes de groupe.
- heading_prefix : commande ou suite de commandes exécutées avant les en-têtes de groupe.
- heading_suffix : commande ou suite de commandes exécutées après les en-têtes de groupe.
Il faut bien comprendre que ces deux lignes de commandes s'agrègent pour n'en former qu'une lors de la mise en forme de l'index.
Il est aussi important de noter que :
- une chaîne de caractères doit être mise entre guillemets ("<chaine>") ;
- la longueur maximale d'une chaîne de caractères est de 2048 ;
- pour les commandes LaTeX, l'antislash (\) doit être doublé ;
- la chaîne `\n` permet d'insérer un retour ligne ;
- la chaîne `\t` permet d'insérer une tabulation.
Ainsi, lors de la mise en forme de l'index, elles donnent la ligne suivante :
{\bfseries\hfil
<Lettre d'
en-tête de groupe> \hfil
}\nopagebreak
III-C-1. Explications▲
Les diverses commandes utilisées ci-dessus sont normalement connues d'un utilisateur de LaTeX :
- un groupe est créé avec {…} afin de limiter la portée des commandes au seul en-tête de groupe ;
\bfseries
permet d'activer la mise en gras ;\hfil
insère un espace élastique ;- À cet endroit, sera insérée la lettre correspondant à l'en-tête de groupe ;
\hfil
insère un espace élastique ;\nopagebreak
indique que l'on ne souhaite pas de saut de page à cet endroit.
{\bfseries\hfil
t \hfil
}\nopagebreak
{\bfseries\hfil
T \hfil
}\nopagebreak
Il est possible d'ouvrir un groupe dans heading_prefix et de le fermer dans heading_suffix. Toutefois, attention à bien le fermer sinon des erreurs de compilation apparaîtront.
La façon la plus simple est, à mon avis, de concevoir la ligne de commande entière, puis de la couper une fois qu'elle est fonctionnelle et enfin de l'insérer dans le fichier ist personnalisé.
III-C-2. Exemples divers▲
heading_
prefix "{\\
bfseries\\
hfil \\
fbox{ "
heading_
suffix "}\\
hfil}\\
nopagebreak\n
"
heading_
prefix "{\\
bfseries\\
hfil\\
textcolor{blue}{ "
heading_
suffix "}\\
hfil}\\
nopagebreak\n
"
heading_
prefix "{\\
bfseries\\
hfil\\
fbox{\\
textcolor{blue}{ "
heading_
suffix "}}\\
hfil}\\
nopagebreak\n
"
heading_
prefix "{\\
bfseries\\
hfil\\
fcolorbox{red}{lightgray}{\\
textcolor{blue}{ "
heading_
suffix "}}\\
hfil}\\
nopagebreak\n
"
III-D. Et pour les nombres et les symboles ?▲
Pour les nombres et les symboles, les commandes sont les suivantes :
- symhead_positive <string> : affiche la chaîne <string> si headings_flag est positif ;
- symhead_negative <string> : affiche la chaîne <string> si headings_flag est négatif ;
- numhead_positive <string> : affiche la chaîne <string> si headings_flag est positif ;
- numhead_negative <string> : affiche la chaîne <string> si headings_flag est négatif.
En résumé :
- si headings_flag est négatif (en-têtes de groupe en minuscules), les chaînes de symhead_negative et numhead_negative sont utilisées, respectivement pour les symboles et les nombres.
- si headings_flag est positif (en-têtes de groupe en majuscules) les chaînes de symhead_positive et numhead_positive sont utilisées, respectivement pour les symboles et les nombres.
Comme par défaut le texte est en anglais, nous allons le personnaliser en français en rajoutant les lignes suivantes à notre fichier perso.ist :
symhead_
positive "Symboles"
symhead_
negative "symboles"
numhead_
positive "Nombres"
numhead_
negative "nombres"
Résultat des compilations : |
|||
En-têtes encadrés |
En-têtes bleus |
En-têtes bleus et encadrés |
En-têtes bleus, encadrés de rouge sur fond gris |
Le résultat, s'il est déjà plus sympathique, a encore besoin d'améliorations. En effet, notre en-tête de groupe est pratiquement collé à la ligne qui le suit.
Pour corriger ce petit défaut, il suffit de modifier légèrement la ligne heading_suffix de notre fichier perso.ist en ajoutant l'instruction \\vspace*{3ex} entre \\hfil} et \\nopagebreak\n, ce qui aérera notre index.
heading_
suffix "\\
hfil}\\
vspace*{3ex}\\
nopagebreak\n
"
Nous rajoutons aussi la ligne suivante à notre fichier exemple.tex :
\lipsum
[4]\index
{4}
Une fois compilé, on obtient le résultat ci-dessous. C'est déjà beaucoup plus agréable non ?
Résultat de la compilation :
III-E. Améliorer la présentation des termes indexés et des numéros de pages▲
III-E-1. Les points de suite▲
Personnellement, j'aime bien qu'entre le terme indexé et les numéros de pages, il y ait des points de suite. Je trouve que cela facilite la lecture.
Je vais donc vous montrer comment obtenir cela.
La liste qui suit vous permettra de comprendre chaque paramètre :
- delim_0 <string> : chaîne qui sera insérée entre le terme indexé de niveau 0 et le premier numéro de page, par défaut une virgule suivie d'une espace (", ") ;
- delim_1 <string> : chaîne qui sera insérée entre le terme indexé de niveau 1 et le premier numéro de page, par défaut une virgule suivie d'une espace (", ") ;
- delim_2 <string> : chaîne qui sera insérée entre le terme indexé de niveau 2 et le premier numéro de page, par défaut une virgule suivie d'une espace (", ") ;
- delim_n <string> : chaîne qui sera insérée entre deux numéros de page pour le même terme indexé, par défaut une virgule suivie d'une espace (", ") ;
- delim_r <string> : chaîne qui sera insérée entre le premier et le dernier numéro de page d'une plage, par défaut "--" ;
- delim_t <string> : chaîne qui sera insérée à la fin d'une liste de numéro de page, par défaut "". Cette chaîne n'aura aucun effet s'il n'y a aucune liste de numéros de page.
Fort de ces informations, il ne reste plus qu'à insérer les trois lignes ci-dessous dans notre fichier perso.ist et lancer une compilation :
delim_
0 "\\
hspace{6pt}\\
dotfill\\
hspace{6pt}"
delim_
1 "\\
hspace{6pt}\\
dotfill\\
hspace{6pt}"
delim_
2 "\\
hspace{6pt}\\
dotfill\\
hspace{6pt}"
Résultat de la compilation :
Joli résultat. À un détail près. Notre index semble ne prendre que la moitié de la largeur de la page. Rien de bien grave, le style de page utilisé pour l'index est le style plain en mode deux colonnes (personnellement, j'aime bien en deux colonnes). Peut-être qu'avec le package multicol, il est possible de passer en mode une ou trois colonnes. Je n'ai pas testé. Si quelqu'un sait comment faire, je suis preneur de l'information.
Si vous souhaitez redéfinir l'en-tête ou le pied de page, le package fancyhdr vous permettra de le faire sans difficultés.
III-E-2. Les termes indexés▲
La liste ci-dessous fournit toutes les informations permettant de mettre en forme les termes indexés :
- item_0 <string> : commande insérée entre deux niveaux primaires de l'index (level 0). Par défaut `\n \\item ` ;
- item_1 <string> : commande insérée entre deux niveaux secondaires de l'index (level 1). Par défaut `\n \\subitem ` ;
- item_2 <string> : commande insérée entre deux niveaux tertiaires de l'index (level 2). Par défaut `\n \\subsubitem ` ;
- item_01 <string> : commande insérée entre un niveau primaire (level 0) et un niveau secondaire (level 1) de l'index. Par défaut `\n \\subitem ` ;
- item_x1 <string> : commande insérée entre un niveau primaire (level 0) et un niveau secondaire (level 1) de l'index quand le niveau primaire n'a pas de numéro de page associé. Par défaut `\n \\subitem ` ;
- item_12 <string> : commande insérée entre un niveau secondaire (level 1) et un niveau tertiaire (level 2) de l'index. Par défaut `\n \\subsubitem ` ;
- item_x2 <string> : commande insérée entre un niveau secondaire (level 1) et un niveau tertiaire (level 2) de l'index quand le niveau secondaire n'a pas de numéro de page associé. Par défaut `\n \\subsubitem `.
Afin de faciliter la compréhension, nous allons ajouter les deux lignes suivantes dans notre fichier perso.ist :
item_
0 "\n
\\
item \\
bfseries{"
item_
x1 "}\\
normalfont\n
\\
subitem "
Nous modifions aussi la ligne suivante :
delim_
0 "}\\
hspace{6pt}\\
dotfill\\
hspace{6pt}"
Avec ces modifications, les termes indexés de premier niveau seront en gras, tandis que les termes des deuxième et troisième niveaux seront en graisse normale.
Voici le résultat de la compilation prenant en compte les modifications précédentes.
Résultat de la compilation :
Ci-dessous le fichier exemple.ist final ayant permis la génération de l'index affiché au-dessus :
heading_
prefix "{\\
bfseries\\
hfil\\
fcolorbox{red}{lightgray}{\\
textcolor{blue}{ "
heading_
suffix "}}\\
hfil}\\
vspace*{3ex}\\
nopagebreak\n
"
headings_
flag 1
symhead_
positive "Symboles"
symhead_
negative "symboles"
numhead_
positive "Nombres"
numhead_
negative "nombres"
delim_
0 "}\\
hspace{6pt}\\
dotfill\\
hspace{6pt}"
delim_
1 "\\
hspace{5pt}\\
dotfill\\
hspace{5pt}"
delim_
2 "\\
hspace{4pt}\\
dotfill\\
hspace{4pt}"
item_
0 "\n
\\
item {\\
bfseries "
item_
x1 "}\n
\\
normalfont\\
subitem "
IV. Un index c'est bien, plusieurs c'est mieux▲
Il peut parfois être pratique d'avoir une indexation par thème. Le package index permet de gérer des index multiples, ce qui autorise une indexation par thème très facilement.
Voici la marche à suivre :
- L'appel du package index doit se faire dans le préambule après l'appel du package makeidx ;
- La définition du nouvel index doit se faire avant la commande
\makeindex
.
Voici la définition d'un nouvel index qui regroupera la liste des auteurs apparaissant dans un document :
\usepackage
{makeidx}
\usepackage
{index}
\newindex
{aut}{otx}{otd}{Liste des auteurs}
Comme le montre l'extrait de notre fichier exemple.tex ci-dessus, le package index est appelé après le package makeidx, puis suit la définition d'un nouvel index.
Cet ordre est indispensable, le package index redéfinissant la commande index du package makeidx ainsi que la commande \printindex
.
La commande \newindex
est composée de quatre champs :
- aut : identifiant de l'index ;
- otx : extension du fichier contenant les entrées de l'index aut (exemple.otx) ;
- otd : extension du fichier contenant l'index aut formaté (exemple.otd) ;
- Liste des auteurs : libellé apparaissant comme titre de l'index personnalisé.
\documentclass
[a4paper,10pt,francais]{article}
\usepackage
[utf8]{inputenc}
\usepackage
[T1]{fontenc}
\usepackage
[francais]{babel}
\usepackage
{color} % d`é`finitions des couleurs
\usepackage
[dvipsnames,x11names,svgnames,table]{xcolor} % texte et tableau en couleur
\usepackage
{makeidx} % cr`é`ation d'index
\usepackage
{index} % cr`é`ation d'index multiples
\newindex
{aut}{otx}{otd}{Liste des auteurs} % définition d'un nouvel index personnalisé
\usepackage
{lipsum}
\makeindex
\begin
{document}
\lipsum
[1]\index
{premier verset}\index
{verset!premier}
\lipsum
[2]\index
{second verset}\index
{verset!second}
\lipsum
[3]\index
{troisieme verset@troisième verset}\index
{verset!troisieme@troisième}
\lipsum
[4]\index
{4}\index
[aut]{moimoi}
\printindex
\printindex
[aut]
\end
{document}
Pour pouvoir compiler notre index personnalisé ainsi que notre index habituel, voici la chaîne de compilation nécessaire :
latex (ou pdflatex) exemple.tex
makeindex -s perso.ist exemple.idx
makeindex.exe exemple.otx -t exemple.otg -s perso.ist -o exemple.otd
latex (ou pdflatex) exemple.tex
Le fichier exemple.otg (non défini dans la déclaration du nouvel index) n'est autre que le fichier de log de la création de l'index (très utile à lire si la génération de l'index ne fonctionne pas bien).
Voici le résultat de la compilation prenant en compte les modifications précédentes.
Résultat de la compilation :
V. Conclusion▲
Comme vous avez pu le voir au cours de cet article, personnaliser l'apparence de son index n'est pas particulièrement difficile une fois que l'on a compris comment faire. Toutefois, il est prudent d'avancer pas à pas et d'effectuer des compilations régulières afin de juger du résultat obtenu et si celui-ci correspond bien à nos attentes.
VI. Remerciements▲
Merci à -Nikopol- pour sa relecture technique et ses conseils, ainsi que ced pour sa relecture orthographique.