Chemin principal : Accueil > LaTeX > Index > Régler l’apparence des index avec xindy

Autres chemins : (Aller directement au contenu de l'article)

Succession d'articles :

  1. Premier pas avec xindy
  2. Régler l’apparence des index avec xindy
  3. xindy, eledmac et hyperref
  4. Tri personnalisé des entrées avec xindy
  5. xindy, hyperref et |see
  6. xindy et bibleref

Régler l’apparence des index avec xindy

mercredi 15 avril 2015, mise à jour mercredi 13 avril 2016, par Maïeul
Suivre la vie du site RSS 2.0 Forum

Après avoir créé notre premier index avec xindy, nous allons maintenons modifier son apparence. Par « apparence » nous entendons la manière dont sont affichés les entrées et les pages, mais pas l’ordre de tri ou les divisions par initiales.

1- Exemple adapté à la situation

Nous allons prendre un exemple avec un seul index, mais avec plusieurs niveau d’entrées, et en en prenant des entrées présentent sur plusieurs pages.

  1. \documentclass{article}
  2. \usepackage{fontspec}
  3. \setmainfont{Linux Libertine O}
  4. \usepackage{setspace}
  5. \onehalfspacing
  6. \usepackage[xindy]{indextools}%On précise qu'on veut utiliser xindy
  7. \makeindex[name=animal,title=Animaux]
  8. \begin{document}
  9.  
  10. On va parler de
  11. chats sauvages\index[animal]{chat!sauvage} et domestiques\index[animal]{chat!domestique},
  12. de tortues marines\index[animal]{tortue!marine} et terrestres\index[animal]{tortue!terrestre},
  13. d'élèphant d'Asie\index[animal]{élèphant!d'Asie} et d'Afrique\index[animal]{élèphant!d'Afrique},
  14. et soyons fou, d'élans de Sibérie\index[animal]{élan!de Sibérie} et d'Amérique\index[animal]{élan!d'Amérique}.
  15.  
  16.  
  17. On va parler sur la page suivante des même animaux. C'est à dire : de
  18. chats sauvages\index[animal]{chat!sauvage} et domestiques\index[animal]{chat!domestique},
  19. de tortues marines\index[animal]{tortue!marine} et terrestres\index[animal]{tortue!terrestre},
  20. d'élèphant d'Asie\index[animal]{élèphant!d'Asie} et d'Afrique\index[animal]{élèphant!d'Afrique},
  21. et soyons fou, d'élans de Sibérie\index[animal]{élan!de Sibérie} et d'Amérique\index[animal]{élan!d'Amérique}.
  22.  
  23. \printindex[animal]
  24. \end{document}

Télécharger

Après la série de compilation grâce a latexmk configuré pour xindy, nous obtenons l’index ci-dessous.

PDF - 11.5 ko
Formatage par défaut avec xindy + indextools

2- Répartition des tâches

Ouvrons le fichier .ind produit par xindy pour observer son contenu :

  1. \begin{theindex}
  2. \providecommand*\lettergroupDefault[1]{}
  3. \providecommand*\lettergroup[1]{%
  4. \par\textbf{#1}\par
  5. \nopagebreak
  6. }
  7.  
  8. \lettergroup{C}
  9. \item chat
  10. \subitem domestique, 1, 2
  11. \subitem sauvage, 1, 2
  12.  
  13. \indexspace
  14.  
  15. \lettergroup{E}
  16. \item élan
  17. \subitem d'Amérique, 1, 2
  18. \subitem de Sibérie, 1, 2
  19. \item élèphant
  20. \subitem d'Afrique, 1, 2
  21. \subitem d'Asie, 1, 2
  22.  
  23. \indexspace
  24.  
  25. \lettergroup{T}
  26. \item tortue
  27. \subitem marine, 1, 2
  28. \subitem terrestre, 1, 2
  29.  
  30. \end{theindex}

Télécharger

On voit qu’il s’agit tout simplement d’un ensemble d’instruction LaTeX. Il y a donc une répartition du travail entre :

  • le noyau LaTeX, les package et notre propre code LaTeX qui se chargent de définir les commandes.
  • xindy qui se charge d’insérer les commandes LaTeX dans le fichier .ind à partir du fichier .idxy et de ses propres fichiers de configuration.

3- Trois exemples de configuration niveau LaTeX

3.1- Colonages : les options de indextools

L’environnement theindex est défini par chaque classe LaTeX, mais redéfini indextools pour le rendre facilement configurable.

Ainsi, je vous invite à lire la documentation d’indextool et de la commande makeindex qui explique comment facilement personnaliser l’apparence. Je ne vais présenter ici qu’une option : celle qui permet d’avoir un filet de séparation entre les deux colonnes.

À la place de

  1. \makeindex[name=animal,title=Animaux]

mettons

  1. \makeindex[name=animal,title=Animaux,columnseprule]

et nous obtenons alors l’index avec son filet de séparation.

PDF - 11.5 ko
Index avec filet de séparation

3.2- Apparence des sectionnement par lettre

En revanche, certaines éléments d’apparence sont à définir via la personnalisation des commandes. C’est par exemple le cas de l’apparence des entêtes de groupe par initiales. Nous voyons en consultant le fichier .ind qu’elle sont formatées via la commande \lettergroup.

Cette commande est définie ainsi au début de l’environnement theindex :

  1.  
  2. \providecommand*\lettergroup[1]{%
  3. \par\textbf{#1}\par
  4. \nopagebreak
  5. }

Télécharger

La commande \providecommand est très utile : elle définit une commande sauf si celle-ci est aussi définie via \newcommand. Dans le cas présent, cela permet de proposer un formatage par défaut mais personnalisable.

Ainsi, si nous ne souhaitons pas afficher les lettres de séparation, il suffit de mettre dans son préambule :

  1. \newcommand{lettergroup}[1]{}

Mais on on peut aussi s’en servir pour personnaliser de manière plus subtile l’apparence. Par exemple avec le code suivant :

  1. \newcommand{\lettergroup}[1]{%
  2. {\centering\large---\emph{#1}---\par}%
  3. }

Télécharger

La lettre est centrée dans la colonne, en taille \large, en italique, et entouré de tirets longs.

PDF - 13.2 ko
Exemple de personnalisation de l’entête de groupe de lettre

3.3- Une flèche avant les sous-entrée bibliographique

Supposons maintenant que nous souhaitions mettre une petite flèche avant chaque sous-entrée bibliographique. La méthode la plus simple est de modifier la commande \subitem pour ajouter cette flèche à la fin. On peut utiliser pour cela la commande \apptocmd du package etoolbox qui est chargé par indextools :

  1. \apptocmd{\subitem}{$\rightarrow$\,}{}{}

Le \, insère une espace fine insécable après la flèche.

Ceci donne le résultat ci-dessous.

PDF - 14.8 ko
Une flèche avant les sous-entrée d’un index

4- XXX exemples de configuration niveau au niveau de xindy

4.1- xindy, ou la succession de fichiers de configuration

Lorsque vous lancez texxindy, vous voyez apparaître dans le terminal les lignes suivantes :

  1. Loading module "lang/french/utf8-lang.xdy"...
  2. Loading module "lang/french/utf8.xdy"...
  3. Finished loading module "lang/french/utf8.xdy".
  4. Finished loading module "lang/french/utf8-lang.xdy".
  5. Loading module "texindy.xdy"...
  6. Loading module "numeric-sort.xdy"...
  7. Finished loading module "numeric-sort.xdy".
  8. Loading module "latex.xdy"...
  9. Loading module "tex.xdy"...
  10. Finished loading module "tex.xdy".
  11. Finished loading module "latex.xdy".
  12. Loading module "latex-loc-fmts.xdy"...
  13. Finished loading module "latex-loc-fmts.xdy".
  14. Loading module "makeindex.xdy"...
  15. Finished loading module "makeindex.xdy".
  16. Loading module "latin-lettergroups.xdy"...
  17. Finished loading module "latin-lettergroups.xdy".
  18. Finished loading module "texindy.xdy".
  19. Loading module "page-ranges.xdy"...
  20. Finished loading module "page-ranges.xdy".
  21. Loading module "word-order.xdy"...
  22. Finished loading module "word-order.xdy".

Télécharger

Ces lignes indiquent que xindy chargent des modules de configuration .xdy et y lis les instructions pour savoir comment transformer les fichiers .idx en .ind.

Contrairement à makeindex qui pour cela utilise un fichier .ist, xindy peut utiliser plusieurs fichiers .xdy.

L’intérêt étant évidemment de permettre d’avoir une configuration modulaire. Un fichier .xdy est essentiellement une liste d’instruction.

On trouve dans le manuel de xindy la listes des instructions fournies. Par ailleurs, un certain nombre de fichiers .xdy sont livrés par défaut avec xindy.

Vous les trouverez dans le dossier xindy/modules du dossier texmf-dist de votre distribution tex. Typiquement avec une installation MacTeX2014, dans le dossier /usr/local/texlive/2014/texmf-dist/xindy. Ou plus simplement vous pouvez les consulter sur le CTAN (prendre la version 2.5.0, qui est celle livrée avec TeXLive).

Il suffit donc pour avoir ses propres styles de créer un fichier monstyle.xdy dans le dossier à côté du .tex et d’utiliser l’option -M monstyle lors de l’appel à la commande :

  1. $ texindy -L french -I xelatex -M monstyle animal.idx

Et donc dans le fichier de configuration de latexmk

  1. $makeindex = "texindy -L french -I xelatex -M philologue";

Après ce préalable, il est temps de voir ce qu’on met dans ce fichier.

4.2- Séparation l’entrée et ses références par une ligne de point

Par défaut, l’entrée dans l’index est séparé de ses par une virgule. À titre personnel, je trouve plus lisibles les index dont la séparation entre les deux est plus marquée. Par exemple lorsque la séparation est constituée par une ligne de point : \dotfill en LaTeX.

Mettons donc la ligne suivante

Commentons rapidement ces lignes :

  • un ; marque un commentaire qui s’étend jusqu’à la fin de la ligne. Il est d’usage de mettre deux ; lorsque nous avons affaire à une ligne de commentaire
  • chaque instruction est mise entre parenthèse. Une instruction peut courir sur plusieurs lignes (pas le cas ici)
  • en général une instruction correspond à une propriété, ici markup-locclass-lis à laquelle est passée des paramètres. Souvent les paramètres sont des liste d’option, chaque option étant préfixée par : (deux-points). Ici la valeur de l’option open est une chaîne de caractère (marquée par les guillemets) égalent à \dotfill.

Après avoir executé texindy -L french -I xelatex -M monstyle animal.idx, on constate que le nouveau fichier .ind est devenu

  1. \begin{theindex}
  2. \providecommand*\lettergroupDefault[1]{}
  3. \providecommand*\lettergroup[1]{%
  4. \par\textbf{#1}\par
  5. \nopagebreak
  6. }
  7.  
  8. \lettergroup{C}
  9. \item chat
  10. \subitem domestique\dotfill 1, 2
  11. \subitem sauvage\dotfill 1, 2
  12.  
  13. \indexspace
  14.  
  15. \lettergroup{E}
  16. \item élan
  17. \subitem d'Amérique\dotfill 1, 2
  18. \subitem de Sibérie\dotfill 1, 2
  19. \item élèphant
  20. \subitem d'Afrique\dotfill 1, 2
  21. \subitem d'Asie\dotfill 1, 2
  22.  
  23. \indexspace
  24.  
  25. \lettergroup{T}
  26. \item tortue
  27. \subitem marine\dotfill 1, 2
  28. \subitem terrestre\dotfill 1, 2
  29.  
  30. \end{theindex}

Télécharger

Ce qui nous produit donc l’index ci-dessous.

PDF - 14.9 ko
Index avec ligne de points

4.3- Regrouper les pages dans un intervalle

Ajoutons maintenant avant l’index une nouvelle page de telle sorte que certains termes se trouvent sur trois pages d’affilée, d’autre sur deux pages d’affilée, et d’autres sur une seule page.

  1. Et pour la bonne cause, on va aussi parler de chats sauvages\index[animal]{chat!sauvage} qui se disputent avec les chiens errants\index[animal]{chien!errant}.

Télécharger

On obtient l’index ci-dessous.

PDF - 15.5 ko
Plusieurs pages d’affilée pour une même entrée d’index : réglage par défaut

On constate que si le nombre de pages consécutives est supérieur à 2, xindy va remplacer par la page de début et la page de fin. On peut cependant vouloir d’autres réglages

4.3.1- Pas de regroupement des pages

On peut tout simplement ne pas vouloir de regroupement des pages. Dans ce cas on peut utiliser :

  1. (define-location-class "arabic-page-numbers"
  2. ("arabic-numbers") :min-range-length 9999999999)

Télécharger

Explication :

  • on définit une manière de référencer des termes. Cette manière est nommée arabic-page-numbers
  • cette manière consiste à tout simplement utiliser un nombre arabe ("arabic-numbers").
  • on indique que pour pour fusionner plusieurs références consécutives, il faut que les références consécutives tiennent dans un intervalle de 9999999999 [1], c’est à dire que la différence entre la première et la dernière référence consécutive soit de 9999999999. Cas qui ne risque normalement pas d’arriver [2]. On obtient alors l’index ci-dessous.
PDF - 15.4 ko
Plusieurs pages d’affilée pour une même entrée d’index : pas de fusion
4.3.2- Regroupement dès deux pages

Cependant en général on souhaite plutôt regrouper les numéros de page, y compris s’il n’y a que deux pages consécutives. Dans ce cas on peut utiliser :

(define-location-class "arabic-page-numbers"
                       ("arabic-numbers") :min-range-length 1)

Ce qui signifie que si l’écart entre les références consécutives est d’au moins 1, on fusionne les références. Ce qui permet d’obtenir l’index ci-dessous.

PDF - 15.4 ko
Plusieurs pages d’affilée pour une même entrée d’index : fusion dès deux pages

Note : les numéros sont séparés par des tirets demi-cadratins (--). On peut vouloir utiliser à la place des traits d’unions simples. Dans ce cas il suffit d’utiliser :

(markup-range :sep "-")
4.3.3- s et ss

On peut aussi vouloir :

  • que deux pages d’affilée soit rendu par XsX est le premier numéro de page.
  • que plus de deux pages d’affilée soit rendu par Xss.

On va pour cela prendre le modèle livré dans le fichier base/ff-ranges-only.xdy, en nous contenant de remplacer f par s et ff par s.

Commentaire :

  • l. 1-2 : même chose que précédemment.
  • l. 3 : balisage des pages consécutives lorsque l’écart entre la première et la dernière référence est de 1 : utiliser s comme séparateur, et ne pas afficher la page de fin.
  • l. 4 : balisage des références consécutives dans les autres cas : utiliser ss comme séparateur, et ne pas afficher la page de fin.

Ce qui nous donne l’index ci-dessous.

PDF - 15.4 ko
Plusieurs pages d’affilée pour une même entrée d’index : utilisation de s et ss

Cependant, dans un tel cas, lorsqu’on aura plus de trois pages consécutives, par exemple « 1,2,3,4 » on aura aussi ss. Ce qui manque de précision.

Dans ce cas on peut s’inspirer du fichier base/ff-ranges.xdy et remplacer

par

Ce qui signifie que ss ne sera utilisé que si l’écart entre la première et la dernière référence est de 2. Donc pour 1-3 mais pas pour 1-4.

5- Synthèse

JPEG - 24.3 ko
C’est tout pour aujourd’hui

Notes

[1D’après le manuel on peut utilise le mot-clef none mais chez moi cela provoque une erreur de compilation.

[2Ou alors vous écrivez un très long livre avec un index totalement inutile, puisqu’il indique qu’on parle de votre sujet sur 10 000 000 000 pages d’affilée.

Vos commentaires

  • Le 13 avril 2016 à 14:51, par André Bellaïche En réponse à : Régler l’apparence des index avec xindy

    Bonjour,

    Je n’ai jamais écrit de fichier .xdy. Je veux bien m’y mettre, mais ce serait plus facile pour moi si quelqu’un avait déjà écrit un fichier donnant à xindy la commande simple suivante : respecter les intervalles indiqués dans le fichier Latex, ne pas prendre l’initiative de créer des intervalles. Je précise.

    Dans ce qui suit, j’écris 28 pour une commande index située page 28, (28 pour une commande d’ouverture d’intervalle page 28, et 28) pour une commande de fermeture d’intervalle page 28.

    Ce que je veux dire, c’est que aussi bien makeindex que xindy font, sauf erreur, la chose suivante :

    (28 29) produit 28, 29 au lieu de 28—29 (28 29) 30 produit 28—30 au lieu de 28—29, 30 (28 29) (30 32) produit 28—32 au lieu de 28—29, 30—32

    Merci pour toute aide,

    André Bellaïche

  • Le 13 avril 2016 à 15:02, par Maïeul En réponse à : Régler l’apparence des index avec xindy

    Bonjour,

    je vous invite à lire le paragraphe 4.3 du présent article qui vous donne tous les outils pour régler ce genre de détail… Ou alors je n’ai rien compris à ce que vous entrez comme commande et ce que vous attendez comme sortie, ce qui est bien possible…

  • Le 13 avril 2016 à 17:01, par André Bellaïche En réponse à : Régler l’apparence des index avec xindy

    Merci pour votre réponse.

    Je me suis sans doute mal expliqué.

    Je voudrais simplement que xindy ne prenne pas l’initiative de créer des intervalles là où l’auteur n’a pas indiqué d’intervalles avec les commandes |( et |), même si la même commande \index se retrouve aux pages 28, 29, 30, 31, et que si en revanche on donne des commandes |( et |) explicites, il en tienne compte exactement comme elles ont été entrées.

    J’ai vu qu’on peut empêcher xindy de couper un intervalle 28—29 demandé explicitement avec |( et |) en 28, 29 en prenant 2 pour valeur par défaut de la longueur minimum des intervalles, mais est-ce qu’alors il ne va pas créer des intervalles 31—32, etc. chaque fois qu’il verra la même commande \index sur deux pages consécutives ?

    Pour les autres demandes, je ne sais pas s’il y a moyen d’y satisfaire. Si on me dit que c’est possible uniquement au moyen d’un fichier de style .xdy, je peux me lancer dans cet apprentissage. Mais s’il faut reprogrammer xindy, je renonce.

    A.B.

  • Le 13 avril 2016 à 17:35, par Maïeul En réponse à : Régler l’apparence des index avec xindy

    Malheureusement il ne me semble pas que cela soit possible. En tout cas je ne vois pas dans l’immédiat.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

À propos

Titulaire d’un master en sciences religieuses de l’Université de Strasbourg, je suis depuis août 2012 assistant-diplômé en histoire du christianisme antique et littérature apocryphe chrétienne à l’Université de Lausanne, où je prépare une thèse sous la direction de Frédéric Amsler.

Dans le cadre de la rédaction de mon mémoire de master, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul