Je réalise un inventaire de sites archéologiques. Chacun des sites est numéroté. J'utilise pour ceci un environnement enumerate personnalisé grâce à l'extension enumitem. J'ai créé une commande pour automatiser la tâche : cette commande se charge de créer une entrée dans l'index mais insère également un label, permettant ainsi de faire référence au numéro de ce site, la numérotation étant continue d'une liste à l'autre, chaque site possédant ainsi un identifiant unique.

Ma question est donc : puis-je faire figurer dans l'index, en plus du numéro de page, le numéro du site stocké dans le \label, en mettant par exemple ce numéro en gras afin de le différencier du numéro de page ? Je précise que je travaille avec XeLaTeX.

Ouvrir dans l'éditeur
\documentclass{article}

\usepackage{fontspec}
\usepackage[xindy]{indextools}
\usepackage{enumitem}
\usepackage{xkeyval}
\makeatletter
\define@key{site}{NomSite}{\def\@NomSite{#1}}
\define@key{site}{Periode}{\def\@Periode{#1}}
\define@key{site}{Contexte}{\def\@Contexte{#1}}

\newcommand{\Objet}[1]{%
    \setkeys{site}{#1}
    \item\@NomSite. \@Contexte. \@Periode.%
    \expandafter\index\expandafter\@NomSite%
    \edef\temp{{site:\@NomSite}}%
    \expandafter\label\temp%
    \let\temp\@undefined
}
\makeatother

\makeindex

\begin{document}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*}]

\Objet{NomSite={Chavéria},Contexte={Sépulture},Periode={Bronze ancien}}

\Objet{NomSite={Abbeville},Contexte={Dépôt terrestre},Periode={Bronze moyen}}

\end{enumerate}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*},resume]

\Objet{NomSite={Blénod-lès-Pont-a-Mousson},Contexte={Dépôt en milieu humide},Periode={Bronze final}}

\end{enumerate}

Blénod-lès-Pont-a-Mousson : \ref{site:Blénod-lès-Pont-a-Mousson}

Chavéria : \ref{site:Chavéria}

Abbeville : \ref{site:Abbeville}

\newpage

\printindex

\end{document}

Avec la solution proposée par Maïeul, je compile ce document :

Ouvrir dans l'éditeur
\documentclass{article}

\usepackage{fontspec}
\usepackage[xindy]{indextools}
\usepackage{enumitem}
\usepackage{xkeyval}

\makeatletter
\define@key{site}{NomSite}{\def\@NomSite{#1}}
\define@key{site}{Periode}{\def\@Periode{#1}}
\define@key{site}{Contexte}{\def\@Contexte{#1}}

\newcommand{\indexobjet}[1]{%
  \indtl@wrindexentry{\jobname}{#1}{\thepage-\ref\temp}
}%

\newcommand{\Objet}[1]{%
    \setkeys{site}{#1}
    \item\@NomSite. \@Contexte. \@Periode.%
    %\index{\@NomSite}
    \edef\temp{{site:\@NomSite}}%
    \indexobjet{\@NomSite}
    \expandafter\label\temp%
    \let\temp\@undefined
}
\makeatother

\makeindex[program=texindy,options=-I xelatex -M ecm]

\begin{document}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*}]

\Objet{NomSite={Chavéria},Contexte={Sépulture},Periode={Bronze ancien}}

\Objet{NomSite={Abbeville},Contexte={Dépôt terrestre},Periode={Bronze moyen}}

\end{enumerate}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*},resume]

\Objet{NomSite={Blénod-lès-Pont-a-Mousson},Contexte={Dépôt en milieu humidea$},Periode={Bronze final}}

\end{enumerate}

Blénod-lès-Pont-a-Mousson : \ref{site:Blénod-lès-Pont-a-Mousson}

Chavéria : \ref{site:Chavéria}

Abbeville : \ref{site:Abbeville}

\newpage

\printindex

\end{document}

avec le fichier ecm.xdy :

Ouvrir dans l'éditeur
 (define-location-class "inventaire"
 ("arabic-numbers" :sep"-" "arabic-numbers")
 :hierdepth 2
)
(markup-locref-list  :open " [" :sep " " :close "]"
                       :depth 1  :class "inventaire")

Mais cela ne donne rien et j'obtiens un fichier .idx avec :

Ouvrir dans l'éditeur
\indexentry{Chavéria}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Chavéria}' on page 1 undefined}}
\indexentry{Abbeville}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Abbeville}' on page 1 undefined}}
\indexentry{Blénod-lès-Pont-a-Mousson}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Blénod-lès-Pont-a-Mousson}' on page 1 undefined}}

Posée 03 Nov '15, 00:05

Namrod's gravatar image

Namrod
2831714
Taux d'acceptation : 20%

Modifiée 03 Nov '15, 17:58

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Quelles sont vos lignes de commande pour la compilation?

(03 Nov '15, 02:53) pluton pluton's gravatar image

indextools (et imakeidx) proposent une commande permettant de créer une entrée dans le fichier .idx avec autre chose que le numéro de page (¶5.5 de la doc) :

Ouvrir dans l'éditeur
\indtl@wrindexentry{names}{Charles}{26}

Donc tu peux créer ta propre commande d'indexation :

Ouvrir dans l'éditeur
\makeatletter
\newcommand{\indexobjet}[1]{%
  \indtl@wrindexentry{\jobname}{#1}{\thepage-\pageref{#1}}
}%
\makeatother

Mais le problème c'est qu'un \pageref va produire plein d'éléments parasites (message d'erreur si indéfini, \hbox{} etc.) que tu ne désires pas.

Dans le cas présent, l'un des problèmes est de pouvoir récupérer la référence brut produit par un \ref sans tous les éléments parasites tels que les \hbox ou, surtout, les messages d'erreurs si le label n'est pas défini.

D'abord je reprends ta commande \Objet que je modifie pour appeler \indexobjet :

Ouvrir dans l'éditeur
\newcommand{\Objet}[1]{%
    \setkeys{site}{#1}
    \item\@NomSite. \@Contexte. \@Periode.%
    %\index{\@NomSite}
    \edef\temp{{site:\@NomSite}}%
    \indexobjet{\@NomSite}
    \expandafter\label\temp%
    \let\temp\@undefined
}

Maintenant le code de \indexobjet proprement dit.

Je suppose que tu charges etoolbox - ce n'est pas obligatoire, mais cela simplifie les choses.

Il faut savoir que lorsqu'un label toto est défini, LaTeX définit une commande \r@toto. Nous allons d'abord tester l'existence de cette commande avec la commande \ifcsdef de etoolbox, puis nous allons récupérer une forme brute du numéro de référence à l'aide de divers \edef et \expandafter.

Ouvrir dans l'éditeur
\newcommand{\indexobjet}[1]{%
  \edef\tempa{\expandafter\@firstofone\temp}%\tempa  = le label SANS les {}, puisque \temp le contient
  \ifcsdef{r@\tempa}{% si la commande \csname r@\tempa\endcsname est définie, c'est qu'il y a un label posé > on index. Sinon on n'index pas.
    \edef\tempb{\expandafter\ref\temp}%Numero suivi de \hbox{}
    \edef\tempc{\expandafter\@firstoftwo\tempb}%Numero suivi de {}
    \edef\tempd{\expandafter\@firstoftwo\tempc}%Numero brut
%     \meaning\temp % Debug : trouver signif de \temp
%     \meaning\tempa % Debug : trouver signif de \tempa
%    \meaning\tempb % Debug : trouver signif de \tempb
%    \meaning\tempc % Debug : trouver signif de \tempc
%    \meaning\tempd % Debug : trouver signif de \tempd
    \indtl@wrindexentry{\jobname}{#1}{\thepage-\tempd}%
  }%
  {}
}%

Je t'invite à décommenter les \meaning pour voir le contenu exact de chacune des commandes.

Cela produit le fichier .idx suivant :

Ouvrir dans l'éditeur
\indexentry{Chavéria}{1-1}
\indexentry{Abbeville}{1-2}
\indexentry{Blénod-lès-Pont-a-Mousson}{1-3}

Reste ensuite à customiser xindy pour qu'il reconnaisse ce type d'entrée. On peut mettre ces lignes-là dans le fichier .xdy :

Ouvrir dans l'éditeur
(define-location-class "eledmac"
    ("arabic-numbers" :sep"-" "arabic-numbers")
    :hierdepth 2

Voir cette page pour comprendre comment gérer les sous-numéros de référence (mais attention on y parle également d'autre chose).

Lien permanent

Publiée 03 Nov '15, 11:06

Ma%C3%AFeul's gravatar image

Maïeul
321514
Taux d'acceptation : 37%

Modifiée 03 Nov '15, 17:57

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

En mettant ceci dans mon préambule (après avoir ajouté votre code) :

\newcommand{\Objet}[1]{% \setkeys{site}{#1} \item\@NomSite. \@Contexte. \@Periode.% %\index{\@NomSite} \edef\temp{{\@NomSite}}% \indexobjet{\@NomSite} \expandafter\label\temp% \let\temp\@undefined }

Tout se passe bien à la première compilation avec XeLaTeX, mais à la seconde j'obtiens un Use of \@item doesn't match his definition. Malheureusement les commentaires disposent d'un nombre de caractères trop limités pour ma réponse précédente.

(03 Nov '15, 13:31) Namrod Namrod's gravatar image

Il me faudrait l'exemple complet. Chez moi aucun souci.

(03 Nov '15, 13:38) Maïeul Ma%C3%AFeul's gravatar image

Veuillez m'excuser, je n'ai pas été tout à fait exact. En réalité, votre solution fonctionne, mais produit ceci lors de la compilation (l'exemple est celui de ma réponse ci-dessous) :

Undefined control sequence. l.9 \item Abbeville, \hyperpage {1 [\hyperpage{2}]}

Si j'ignore cela et que je termine la compilation, j'obtiens bien le résultat attendu. Mais si je charge l'extension hyperref, alors j'obtiens l'erreur précédente.

(03 Nov '15, 13:46) Namrod Namrod's gravatar image

Ça c'est un problème dans votre fichier .xdy augmenté de la manière dont vous gérez hyperref. Si le fichier .idx est bon, il faut juste que vous modifier votre fichier .xdy pour qu'il mette les bonnes commandes aux bon endroits...

(03 Nov '15, 14:10) Maïeul Ma%C3%AFeul's gravatar image

Je pense qu'avec les articles sur mon site vous devriez y arriver. Sinon n'hésitez pas à poser une nouvelle question plus directement centrée sur la transformation d'un fichier .idx en fichier .ind et sur la configuration de xindy.

J'ai vu que vous avez validé la réponse. Il est aussi d'usage d'accorder à la question qu'on valide un pouce en haut.

(03 Nov '15, 15:27) Maïeul Ma%C3%AFeul's gravatar image

@Maïeul : effectivement, j'avais vu cette commande. malheureusement, je n'arrive pas à la faire fonctionner.

J'ai créé un fichier ecm.xdy :

Ouvrir dans l'éditeur
 (define-location-class "inventaire"
 ("arabic-numbers" :sep"-" "arabic-numbers")
 :hierdepth 2
)
(markup-locref-list  :open " [" :sep " " :close "]"
                       :depth 1  :class "inventaire")

Et j'ai compilé ce document :

Ouvrir dans l'éditeur
\documentclass{article}

\usepackage{fontspec}
\usepackage[xindy]{indextools}
\usepackage{enumitem}
\usepackage{xkeyval}

\makeatletter
\define@key{site}{NomSite}{\def\@NomSite{#1}}
\define@key{site}{Periode}{\def\@Periode{#1}}
\define@key{site}{Contexte}{\def\@Contexte{#1}}

\newcommand{\indexobjet}[1]{%
  \indtl@wrindexentry{\jobname}{#1}{\thepage-\ref\temp}
}%

\newcommand{\Objet}[1]{%
    \setkeys{site}{#1}
    \item\@NomSite. \@Contexte. \@Periode.%
    %\index{\@NomSite}
    \edef\temp{{site:\@NomSite}}%
    \indexobjet{\@NomSite}
    \expandafter\label\temp%
    \let\temp\@undefined
}
\makeatother

\makeindex[program=texindy,options=-I xelatex -M ecm]

\begin{document}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*}]

\Objet{NomSite={Chavéria},Contexte={Sépulture},Periode={Bronze ancien}}

\Objet{NomSite={Abbeville},Contexte={Dépôt terrestre},Periode={Bronze moyen}}

\end{enumerate}

\begin{enumerate}[label=\textbf{\arabic*}.,ref={\arabic*},resume]

\Objet{NomSite={Blénod-lès-Pont-a-Mousson},Contexte={Dépôt en milieu humidea$},Periode={Bronze final}}

\end{enumerate}

Blénod-lès-Pont-a-Mousson : \ref{site:Blénod-lès-Pont-a-Mousson}

Chavéria : \ref{site:Chavéria}

Abbeville : \ref{site:Abbeville}

\newpage

\printindex

\end{document}

Mais cela ne donne rien, et mon fichier .idx ressemble à ça :

Ouvrir dans l'éditeur
\indexentry{Chavéria}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Chavéria}' on page 1 undefined}}
\indexentry{Abbeville}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Abbeville}' on page 1 undefined}}
\indexentry{Blénod-lès-Pont-a-Mousson}{1-\G@refundefinedtrue {\unhbox \voidb@x \hbox {\normalfont  \bfseries  ??}}\GenericWarning  {               }{LaTeX Warning: Reference `{site:Blénod-lès-Pont-a-Mousson}' on page 1 undefined}}
Lien permanent

Publiée 03 Nov '15, 11:47

Namrod's gravatar image

Namrod
2831714
Taux d'acceptation : 20%

Modifiée 03 Nov '15, 16:23

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Voici une proposition qui ajoute le numéro du label avant le numéro de page dans l'index. L'inverse me semble compliqué. En fait, ça ajoute au terme indexé un numéro de compteur. J'ai l'impression que votre mise en place pourrait être plus simple parce que toutes vos entrées sont identiques, à savoir « NomSite, Contexte, Periode » et donc les clés ne sont pas nécessaires. Enfin, ça n'est pas grave. J'ai seulement modifié votre commande \Objet en redéfinissant \index.

Ouvrir dans l'éditeur
\newcommand{\Objet}[1]{%
    \setkeys{site}{#1}
    \item\@NomSite. \@Contexte. \@Periode.%
    \edef\temp{{site:\@NomSite}}%
    \expandafter\label\temp%
    \index{\@NomSite\,\textbf{[\ref{site:\@NomSite}]}}%%%%%% MODIFICATIONS
}

Ça semble fonctionner.

Lien permanent

Publiée 03 Nov '15, 03:22

pluton's gravatar image

pluton
1.2k22937
Taux d'acceptation : 34%

Modifiée 03 Nov '15, 16:25

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Je compile avec xelatex et texindy. Pour information, j'ai considérablement simplifié la commande \Objet pour cet exemple, et l'usage des clés m'est indispensable en réalité. Cependant, votre solution ne me convient pas tellement, car elle ne prend pas en compte les modifications d'apparence de l'index, par exemple si je veux modifier son apparence en affichant les numéros de page après un \dotfill, le numéro de site restera collé au nom. N'y aurait il pas une solution plus « élégante » ?

(03 Nov '15, 09:25) Namrod Namrod's gravatar image

Je propose ceci, où la macro \Objet est d'emploi plus simple [edit : je ne comprends plus rien à ce fil qui part dans tous les sens, je donne donc une solution, tant pis si elle ne convient pas !] :

Ouvrir dans l'éditeur
\documentclass{article}

\usepackage{fontspec}
\usepackage[xindy]{indextools}
\usepackage{enumitem,filecontents}
\usepackage[hyperindex=false]{hyperref}
\makeatletter

\newcount\Objet@cnt
\def\Objet#1{\Objet@i#1\Objet@i}

\def\Objet@i#1,#2,#3\Objet@i{%
    \global\advance\Objet@cnt1
    \begin{enumerate}[label=\textbf{\arabic*}.,start=\number\Objet@cnt,ref={\arabic*}]\item#1. #2. #3.\end{enumerate}
    \label{site:#1}%
    \indtl@wrindexentry{\jobname}{#1}{\thepage-\number\value{enumi}}%
}
\makeatother
\begin{filecontents*}{monstyle.xdy}
(require "page-ranges.xdy")
(markup-locclass-list :open "\dotfill ")
(define-location-class "inventaire"
 ("arabic-numbers" :sep"-" "arabic-numbers"):hierdepth 2
)
(markup-locref-list  :open " [\begingroup\bfseries" :sep " " :close "\endgroup]"
                       :depth 1  :class "inventaire")
\end{filecontents*}

\makeindex[options=-I xelatex -L french -M monstyle.xdy]

\begin{document}

\Objet{Chavéria,Sépulture,Bronze ancien}

\Objet{Abbeville,Dépôt terrestre,Bronze moyen}

Bla bla bla

\Objet{Blénod-lès-Pont-a-Mousson,Dépôt en milieu humide,Bronze final}

Blénod-lès-Pont-a-Mousson : \ref{site:Blénod-lès-Pont-a-Mousson}

Chavéria : \ref{site:Chavéria}

Abbeville : \ref{site:Abbeville}

\newpage

\printindex

\end{document}
Lien permanent

Publiée 03 Nov '15, 08:40

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 03 Nov '15, 16:23

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.