Les index sous LaTeX et leur personnalisation

Christophe Boulet

Cet article a pour but de faciliter la création d'index personnalisés à ceux qui le souhaitent.

Commentez

- Titre : Les index sous LaTeX et leur personnalisation

- Auteur : Christophe Boulet

- Parution : 30 mai 2014

- Mise à jour : 31 mai 2014

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2014 Winnt. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Création d'un index

- II-A. Utilisation de la commande index

- II-A-1. Les caractères accentués

- II-A-2. Entrées et sous-entrées

- II-A-3. Renvoi à une autre entrée

- II-B. Génération d'un premier index

- III. Personnalisation du fichier « perso.ist »

- III-A. Le fichier exemple.tex

- III-B. Faire apparaître les en-têtes de groupe de l'index

- III-C. Améliorer les en-têtes de groupe de l'index

- III-C-1. Explications

- III-C-2. Exemples divers

- III-D. Et pour les nombres et les symboles ?

- III-E. Améliorer la présentation des termes indexés et des numéros de pages

- III-E-1. Les points de suite

- III-E-2. Les termes indexés

- IV. Un index c'est bien, plusieurs c'est mieux

- V. Conclusion

- VI. Remerciements

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

1. Entrée simple : \index{terme}.

2. Entrée à deux niveaux : \index{terme!sous-terme}.

3. 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.

Fichier exemple.tex :

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

Commandes de compilation :

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 :

Fichier exemple.tex :

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

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 :

Commandes de compilation :

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 :

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.

Exemple avec la lettre T minuscule :

{\bfseries\hfil t \hfil}\nopagebreak

Exemple avec la lettre T majuscule :

{\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

Exemple d'en-têtes de groupe encadrés :

heading_prefix "{\\bfseries\\hfil \\fbox{ "
heading_suffix "}\\hfil}\\nopagebreak\n"

Exemple d'en-têtes de groupe en bleu (nécessite les packages xcolor et color) :

heading_prefix "{\\bfseries\\hfil\\textcolor{blue}{ "
heading_suffix "}\\hfil}\\nopagebreak\n"

Exemple d'en-têtes de groupe en bleu et encadrés (nécessite les packages xcolor et color) :

heading_prefix "{\\bfseries\\hfil\\fbox{\\textcolor{blue}{ "
heading_suffix "}}\\hfil}\\nopagebreak\n"

Exemple d'en-têtes de groupe bleu, encadrés de rouge sur fond gris (nécessite les packages xcolor et color) :

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 :

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.

Fichier perso.ist :

heading_suffix "\\hfil}\\vspace*{3ex}\\nopagebreak\n"

Nous rajoutons aussi la ligne suivante à notre fichier exemple.tex :

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 :

Fichier perso.ist :

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 :

Fichier perso.ist :

item_0 "\n \\item \\bfseries{"
item_x1 "}\\normalfont\n \\subitem "

Nous modifions aussi la ligne suivante :

Fichier perso.ist :

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 :

Fichier exemple.ist final :

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 :

1. L'appel du package index doit se faire dans le préambule après l'appel du package makeidx ;

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

Fichier exemple.tex :

\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é.

Fichier exemple.tex final :

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

Commandes de compilation :

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.