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.
Après la série de compilation grâce a latexmk
configuré pour xindy
, nous obtenons l’index ci-dessous.
2 - Répartition des tâches
Ouvrons le fichier .ind
produit par xindy
pour observer son contenu :
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
\lettergroup{C}
\item chat
\subitem domestique, 1, 2
\subitem sauvage, 1, 2
\indexspace
\lettergroup{E}
\item élan
\subitem d'Amérique, 1, 2
\subitem de Sibérie, 1, 2
\item élèphant
\subitem d'Afrique, 1, 2
\subitem d'Asie, 1, 2
\indexspace
\lettergroup{T}
\item tortue
\subitem marine, 1, 2
\subitem terrestre, 1, 2
\end{theindex}
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
\makeindex[name=animal,title=Animaux]
mettons
\makeindex[name=animal,title=Animaux,columnseprule]
et nous obtenons alors l’index avec son 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
:
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
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 :
\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 :
La lettre est centrée dans la colonne, en taille \large
, en italique, et entouré de tirets longs.
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
:
\apptocmd{\subitem}{$\rightarrow$\,}{}{}
Le \,
insère une espace fine insécable après la flèche.
Ceci donne le résultat ci-dessous.
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 :
Loading module "lang/french/utf8-lang.xdy"...
Loading module "lang/french/utf8.xdy"...
Finished loading module "lang/french/utf8.xdy".
Finished loading module "lang/french/utf8-lang.xdy".
Loading module "texindy.xdy"...
Loading module "numeric-sort.xdy"...
Finished loading module "numeric-sort.xdy".
Loading module "latex.xdy"...
Loading module "tex.xdy"...
Finished loading module "tex.xdy".
Finished loading module "latex.xdy".
Loading module "latex-loc-fmts.xdy"...
Finished loading module "latex-loc-fmts.xdy".
Loading module "makeindex.xdy"...
Finished loading module "makeindex.xdy".
Loading module "latin-lettergroups.xdy"...
Finished loading module "latin-lettergroups.xdy".
Finished loading module "texindy.xdy".
Loading module "page-ranges.xdy"...
Finished loading module "page-ranges.xdy".
Loading module "word-order.xdy"...
Finished loading module "word-order.xdy".
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 :
$ texindy -L french -I xelatex -M monstyle animal.idx
Et donc dans le fichier de configuration de latexmk
$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’optionopen
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
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\par\textbf{#1}\par
\nopagebreak
}
\lettergroup{C}
\item chat
\subitem domestique\dotfill 1, 2
\subitem sauvage\dotfill 1, 2
\indexspace
\lettergroup{E}
\item élan
\subitem d'Amérique\dotfill 1, 2
\subitem de Sibérie\dotfill 1, 2
\item élèphant
\subitem d'Afrique\dotfill 1, 2
\subitem d'Asie\dotfill 1, 2
\indexspace
\lettergroup{T}
\item tortue
\subitem marine\dotfill 1, 2
\subitem terrestre\dotfill 1, 2
\end{theindex}
Ce qui nous produit donc l’index ci-dessous.
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.
\newpage
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}.
On obtient l’index ci-dessous.
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 :
(define-location-class "arabic-page-numbers"
("arabic-numbers") :min-range-length 9999999999)
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 de9999999999
. Cas qui ne risque normalement pas d’arriver [2]. On obtient alors l’index ci-dessous.
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.
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
Xs
oùX
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
: utilisers
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.
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
.
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.
# Le 10 mars 2017 à 19:54, par Wiener En réponse à : Régler l’apparence des index avec
xindy
Bonjour,
J’ai une question : pour certaines entrées d’index (qui sont des références chiffrées), j’ai de nombreux numéros de page, qui peuvent prendre plusieurs ligne.
Or la première ligne se colle à l’entrée d’index chiffrée, ce qui rend la lecture très peu claire. Exemple : entrée 13, qui se trouve pages 1, 3, 7, 15, 29, etc.
Cela donne 13 1, 3, 7, 15 etc., le 1 de la page 1 étant collé au 13 de l’entrée d’index, parce qu’en tout il y a 50 numéros de pages à la suite où se trouve la référence 13.
Comment faire pour imposer par exemple 1cm (en \dotfill, puisque c’est ce que j’utilise comme liaison entre les entrées d’index et les n° de page) systématiquement, au minimum, entre l’entrée d’index et les numéros de page, aussi nombreux soient-ils ?
Pour que ça fasse systématiquement 13.....1, 3, 7, 15, etc., même s’il y a plusieurs lignes de numéros de pages qui suivent le « 13 ».
Je n’ai rien trouvé ailleurs sur internet. Une idée ? Merci d’avance...
Très bonnes salutations !
# Le 10 mars 2017 à 21:02, par Maïeul En réponse à : Régler l’apparence des index avec
xindy
Il vous faut créer une commande qui affiche une ligne de point de sur une taille donnée, puis un
\dotfill
La commande
\dotfill
est définie dans le code source de LaTeX de la manière suivante :\cleaders
) horizontalement (\hfill<code>) à l'infini (ou plutôt jusqu'à ce qu'on rencontre du contenu) une boîte de 0,44~em de largeur (\hb@xt@ .44em) comprenant une point positionné au milieu de la boîte (<code>\hss.\hss
). Ceci veut dire que la longueur fixe de votre ligne de point minimum doit être un multiple de 0, 44 em et d’un entier, sinon vous aurez un problème lors du passage au\dotfill
, avec un espace trop important (ou trop faible) entre le dernier point de votre ligne de longueur fixe et le premier point du\dotfill
. Je suggère 2, 64 em (0,44*6).Votre command
\dotfillminimal
peut donc être ainsi définie, de préférence dans votre préambule :C’est à dire :
\dotfill
classique.Il vous reste à remplacer dans votre fichier
.xdy
par
Et à relancer xindy avant de faire une nouvelle compilation.
# Le 11 mars 2017 à 14:57, par Wiener En réponse à : Régler l’apparence des index avec
xindy
Merci ! Comme vous l’aviez pressenti, le problème se trouve dans la jonction entre la box et \dotfill. Voici la solution qui me convient, grâce à la piste sur laquelle vous m’avez mise :
Donc merci beaucoup, pour votre réactivité et l’excellente piste donnée ! Meilleures salutations !!
# Le 11 mars 2017 à 15:09, par Maïeul En réponse à : Régler l’apparence des index avec
xindy
Avec votre code, les points ne sont pas espacés autant au début qu’à la fin. Est-ce voulu ?
# Le 11 mars 2017 à 15:13, par Wiener En réponse à : Régler l’apparence des index avec
xindy
Non, pas du tout voulu, ça fonctionnait, et là je viens de recompiler et ce n’est pas du tout ce que je voulais...
# Le 11 mars 2017 à 15:17, par Maïeul En réponse à : Régler l’apparence des index avec
xindy
Vous voulez des points répartis uniformément ? Dans ce cas ma solution est la meilleure (a vous de choisir votre facteur multiplicateur…)
# Le 11 mars 2017 à 15:28, par Wiener En réponse à : Régler l’apparence des index avec
xindy
Oui, je veux des points répartis uniformément, sans espace entre la box et \dotfill qui suit. Donc, puisque vous me dites que votre solution est la meilleure, merci !
# Le 24 juin 2018 à 01:03, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
Thank you for your excellent tutorial on Xindy. This is the only place where I’ve seen it clearly explained how one can make use, in one’s tex file, of the new location-classes and attributes, for example, that one defines in one’s xindy style file.
I’m having difficulty showing the numbers of manually defined endnotes with page numbers in the index. Your package indextools has the notenumber option for automatically generated footnotes (i.e., via \footnote command). The stackexchange item https://tex.stackexchange.com/questions/328833/page-n-footnote-number-in-index-with-texindy is also very clear, but again applies to footnotes generated via \footnote. I tried to change the function defintions in this example but wasn’t able to get what I want. All I want is to define a new function \indexen so I can type \indexen{foo,8}, for example, to get something like « foo, 210n8 » in the printed index (if \indexen command corresponds to \thepage=210).
Since the note number is being provided directly, we avoid having to calculate it by analyzing the \footnote command, so my problem is actually easier than the one solved by the stackexchange item or by your \innotenumber definition in indextools. Yet I am finding it difficult to get it done !
I’ll appreciate any solution or hints. BTW, I read French well, so you don’t need to change the language of your superb « Geekographie » for me. It’s just that I’ve been long out of practice writing French and shouldn’t try to make a fool of myself in yet another way ! Thanks.
# Le 24 juin 2018 à 14:53, par Maïeul En réponse à : Régler l’apparence des index avec
xindy
Merci de me fournir un MWE, pour que je puisse vous répondre.
# Le 24 juin 2018 à 19:46, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
Thanks. Here is an MWE in two parts
Part I. mwe.xdy :
# Le 24 juin 2018 à 19:54, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
Part 2 : mwe.tex
# Le 24 juin 2018 à 20:19, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
Resubmitting didn’t work. The sumbitting form again automaticaly formatted the last part. I’ll resumbmit that part to you by email.
# Le 24 juin 2018 à 20:24, par Maïeul En réponse à : Régler l’apparence des index avec
xindy
not a problem, I will correct it directly in the website.
# Le 24 juin 2018 à 22:25, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
Submission via the submission form is corrupted. For example, all the brace have disappeared. Please ignore the previous form submissions, and only consider what I sent via email. Sorry
# Le 2 juillet 2018 à 23:08, par Kamal Abdali En réponse à : Régler l’apparence des index avec
xindy
The question was how to show page and note numbers together in an index ; e.g., "210n7" for an entry in note numbered 7 occurring on page 210. This is needed for manually added notes in a document processed by xelatex and xindy.
Below is a solution which seems to work. It still has the shortcoming that the index is showing the entries in this order : « gnu, 1, 2, 1n9, 2n6 » instead of « gnu, 1, 1n9, 2, 2n6 ». Xindy allows ordering location classes as a whole. But in its manuals I can’t find any way of specifying an order between individual members of two location classes. In the present case, we can obviously impose an order quite logically by sequentially comparing the individual members of the two location classes. Fortunately, this flaw doesn’t matter in my current project because all the pages that contain the endnotes come after the main text pages anyway !
The program listings are as follows :
========================= mwe.xdy ========================== ; ; Style for printing page and note numbers together as e.g. "210n7" ; ; This is for manually added notes, such as endnotes.
(define-location-class "page-note-numbers" :var ("arabic-numbers" :sep " " "arabic-numbers") ) (define-location-class-order ("arabic-page-numbers" "page-note-numbers"))
(define-attributes (("formatpn")) ) (markup-locref :attr "formatpn" :open "\formatpn" :close "" )
========================= mwe.tex ==========================