Un exemple qui marche …
Reprenons l’exemple de l’article précédent mais en activant hyperref :
\documentclass{article}
\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{french}
\setmainfont{Linux Libertine O}
\usepackage{setspace}
\onehalfspacing
\usepackage[xindy]{indextools}%On précise qu'on veut utiliser xindy
\makeindex[name=animal,title=Animaux,columnseprule]
% Personnaliser l'apparence de lettergroup
\newcommand{\lettergroup}[1]{%
{\centering\large---\emph{#1}---\par}%
}
\apptocmd{\subitem}{$\rightarrow$\,}{}{}
\begin{document}
On va parler de
chats sauvages\index[animal]{chat!sauvage} et domestiques\index[animal]{chat!domestique},
de tortues marines\index[animal]{tortue!marine} et terrestres\index[animal]{tortue!terrestre},
d'élèphant d'Asie\index[animal]{élèphant!d'Asie} et d'Afrique\index[animal]{élèphant!d'Afrique},
et soyons fou, d'élans de Sibérie\index[animal]{élan!de Sibérie} et d'Amérique\index[animal]{élan!d'Amérique}.
\newpage
On va parler sur la page suivante des même animaux. C'est à dire : de
chats sauvages\index[animal]{chat!sauvage} et domestiques\index[animal]{chat!domestique},
de tortues marines\index[animal]{tortue!marine} et terrestres\index[animal]{tortue!terrestre},
d'élèphant d'Asie\index[animal]{élèphant!d'Asie} et d'Afrique\index[animal]{élèphant!d'Afrique},
et soyons fou, d'élans de Sibérie\index[animal]{élan!de Sibérie} et d'Amérique\index[animal]{élan!d'Amérique}.
\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}.
\printindex[animal]
\end{document}Cela produit le PDF ci-dessous.
Comme vous pouvez constater, tout semble fonctionner : notre index est correct et les liens internes fonctionnent.
… mais c’est tout
Les problèmes surviennent lorsqu’on tente de marquer une référence comme importante, par exemple avec |textbf.
Ainsi :
Et pour la bonne cause, on va aussi parler de chats sauvages\index[animal]{chat!sauvage|textbf} qui se disputent avec les chiens errants\index[animal]{chien!errant}.
\printindex[animal]Lors de la compilation texindy vous obtenez le message suivant :
WARNING : unknown cross-reference-class `hyperindexformat’ !
Et de fait, la référence marquée par |textbf est absente de l’index final.
La cause du problème
Rappelons que xindy se « contente » de transformer un fichier .idx en un fichier .ind. Ouvrons le fichier .idx pour comprendre comment cela.
À côté de ligne sans qui ne posent pas de soucis telle que :
\indexentry{chat!sauvage|hyperpage}{1}Nous y trouvons la ligne problématique :
\indexentry{chat!sauvage|hyperindexformat{\textbf}}{3}Et nous voici en face de deux limites de xindy [1] :
- alors que
makeindextransforme toute syntaxe de type|xxxen la commande correspondante, il n’en va pas de même avecxindy, qui nécessite qu’on lui déclare ces commandes manuellement. En effet,xindy, qui n’est pas conçue uniquement pour LaTeX, considère que la syntaxe|xxxaprès une entrée dans le fichier.idxcorrespond à un attribut de localisation, c’est à dire une propriété associée à la localisation d’une entrée. Certains de ces attribut de localisation sont déclarés dans le fichierbase/latex-loc-fmts.xdyquetexindycharge par défaut. - ces attributs ne peuvent pas recevoir d’arguments. Ainsi, même si nous déclarions
hyperindexformat, cela ne nous arrangerait pas. En effet, les commandes avec arguments sont considérés par\xindycomme des marqueurs de renvois au sein de l’index, alors quemakeindexest plus souple sur la question.
Solution
Comment résoudre ce problème ? En demandant à hyperref de ne pas intervenir dans la gestion du .idx et en gérant nous même cela via le fichier de configuration .xdy
Désactiver la modification de l’index par hyperref
Il suffit simplement de charger le package avec l’option hyperindex=false :
\usepackage[hyperindex=false]{hyperref}Vous constaterez alors que le fichier .ind ne contient plus que des lignes de type :
\indexentry{chat!sauvage}{1}et
\indexentry{chat!sauvage|textbf}{3}qui sont très bien interprétés par xindy, mais sans évidemment que les liens hypertextes ne soit intégrés.
Configuration de xindy
Pour résoudre ce problème, il nous suffit d’ajouter dans le fichier de configuration .xdy les lignes suivantes :
La première ligne permet de définir l’attribut emph qui n’est pas défini par défaut dans texindy alors qu’il est plus sémantique que l’attribut textit.
Dans les quatres lignes nous réglons la propriété markup-locref pour l’attribut de localisation indiqué entre guillemets après le :attr, sachant que l’attribut defaut est – comme son nom l’indique – celui utilisé si aucun attribut n’est mentionné.
Pour chaque attribut nous définissons via :open un marqueur à insérer avant la localisation, et via :close nous définissons un marqueur à insérer après la localisation.
Avec un tel système, notre fichier .idx deviendra un fichier .ind contenant des lignes telles que
\subitem sauvage\dotfill \hyperpage{1}--\hyperpage{2}, \textbf{\hyperpage{3}}Ce qui est parfaitement compris par LaTeX lors de compilation suivante, \hyperpage insérant un lien hypertexte vers une page.
Cela nous permet d’obtenir le fichier ci-dessous, contenant de liens internes, y compris en gras.


Vos commentaires
# Le 16 avril 2015 à 13:42, par pluton
En réponse à :
xindyethyperrefSuper, c’est ce problème entre hyperref et xindy qui m’empêchait d’utiliser xindy !
# Le 16 avril 2015 à 13:48, par Maïeul
En réponse à :
xindyethyperrefoui, c’est assez piégeux. Une fois qu’on a compris ca va, mais avant ...
# Le 2 novembre 2015 à 19:24, par Namrod
En réponse à :
xindyethyperrefMerci pour ces tutoriels clairs et précis qui m’aide beaucoup dans la réalisation d’un index. Seulement, je rencontre un problème similaire à ceux exposés ici, si ce n’est qu’il s’agit pas de mise en forme mais de l’usage de |see et de |seealso avec hyperref. Auriez vous une idée du code à ajouter au fichier .xdy pour que ces deux fonctions fonctionnent correctement ?
# Le 2 novembre 2015 à 20:08, par Maïeul
En réponse à :
xindyethyperref@Namrod. Bon déjà il faut savoir/constater que hyperref makeindex seul n’insère pas de lien hypertexte pour les see. Mais on peut ruser un peu.
Prenons le contenu minimum suivant :
Si hyperref est chargé ainsi :
on obtient le fichier .idx suivant :
Le tout maintenant est 1) de marquer les cibles 2) de marquer les textes qui pointent vers les cibles.
Mettons dans notre fichier
.xdyles lignes suivantes :Nous indiques : 1) que les mots clefs doivent êtres intégrés dans une commande
\targetindexentry2) que les références croisés de typeseedoivent être marqué par la commande\seelinkCe qui produit un fichier .ind ainsi :
Il ne nous reste plus qu’à définir dans notre préambule nos deux commandes, qui font appelle aux commandes d’hyperref :
Merci de me signaler s’il s’agit bien là d’une réponse à votre problème. J’en ferai un article.
Ps : merci aussi d’ouvrir le ticket github suite à votre question sur texnique.fr
# Le 2 novembre 2015 à 20:32, par Namrod
En réponse à :
xindyethyperrefMerci d’avoir pris le temps de me répondre, ceci répond en effet parfaitement à ma question, à ceci près qu’avec l’option passée à hyperref, le reste des numéros de page indiqués dans l’index n’est plus cliquable. Est-il possible d’arranger cela ?
PS : oui bien sûr, désolé, cela m’était complétement sorti de la tête...
# Le 2 novembre 2015 à 20:49, par Namrod
En réponse à :
xindyethyperrefOups, veuillez m’excuser, je n’avais pas vu que la réponse à ma question figurait dans cet article... Ainsi tout fonctionne parfaitement avec votre solution, merci !
# Le 2 novembre 2015 à 22:47, par Maïeul
En réponse à :
xindyethyperrefEt voilà, publié sur xindy, hyperref et
|see.# Le 2 novembre 2015 à 22:52, par Namrod
En réponse à :
xindyethyperrefQuelle rapidité ! Merci beaucoup !