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
makeindex
transforme toute syntaxe de type|xxx
en 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|xxx
après une entrée dans le fichier.idx
correspond à 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.xdy
quetexindy
charge 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\xindy
comme des marqueurs de renvois au sein de l’index, alors quemakeindex
est 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 à :
xindy
ethyperref
Super, 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 à :
xindy
ethyperref
oui, 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 à :
xindy
ethyperref
Merci 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 à :
xindy
ethyperref
@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
.xdy
les lignes suivantes :Nous indiques : 1) que les mots clefs doivent êtres intégrés dans une commande
\targetindexentry
2) que les références croisés de typesee
doivent être marqué par la commande\seelink
Ce 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 à :
xindy
ethyperref
Merci 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 à :
xindy
ethyperref
Oups, 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 à :
xindy
ethyperref
Et voilà, publié sur xindy, hyperref et
|see
.# Le 2 novembre 2015 à 22:52, par Namrod En réponse à :
xindy
ethyperref
Quelle rapidité ! Merci beaucoup !