Les besoins
Voici quels étaient mes besoins :
- Ne pas avoir à signaler soi même qu’on souhaite indexer une source primaire, mais que cela soit fait automatiquement lorsqu’on cite le texte.
- Ne pas indexer les sources secondaires.
- Avoir un index classé de la manière suivante : en entrée principale, le nom de l’auteur, en entrée secondaire le titre de l’ouvrage, éventuellement abrégé, et si possible, avoir en troisième niveau d’entrée la référence précise.
La manière dont LaTex gère des index
Je renvoie ici à la documentation sur Wikibook : http://fr.wikibooks.org/wiki/LaTeX/Structure_du_document#Index.
Comme je souhaite avoir un index pour les sources distinct d’autres index éventuels (par exemple les pages), j’ai décidé d’en déclarer un nouveau. Et tant qu’à faire, autant créer un index pour la bibliographie secondaire.
Dans mon en-tête, j’ai donc mis ceci :
\usepackage{index}
\makeindex
\newindex{sources}{sox}{sod}{Index des sources}
\newindex{secondaires}{sex}{sed}{Index des études}
Et j’appellerai ces deux index par
\printindex[sources]
\printindex[secondaires]
Il faudra que je compile ces index entre la première compilation de mon fichier principal.tex
et la seconde. Toutefois, comme il s’agit d’un index bibliographique, il faudra le faire après la compilation du fichier .aux
avec BibTex.
Je compile en faisant :
% makeindex principal.sox -o principal.sod
% makeindex principal.sex -o principal.sed
Indexer automatiquement les références bibliographiques, le réglage de base
BibLaTex, propose une option au chargement du package pour indexer automatiquement les références citées [1] :
\usepackage[indexing=cite]{biblatex}
Seulement voilà : on obtient ainsi une entrée pour le titre du livre et une entrée pour l’auteur. Ce qui n’est pas vraiment ce que je cherche.
Redéfinir la manière dont elles sont indexées
Fort heureusement, cela fonctionne par une bibmacro
, bibindex
qui est un des outils de BibLaTex. Il suffit donc que je redéclare cette macro avec la commande \renewmacro
, dans mon fichier .bbx
, et ce, avant la commande \endinput
.
\renewbibmacro{citeindex}{%
\ifciteindex{%
\indexfield[biblio]{entrykey}%
}%
{}%
}
J’utilise la commande renewbibmacro{citeindex}
car la bibmacro
citeindex
a déjà été déclarée.
Le \ifciteindex
vérifie qu’on se trouve bien dans une référence citées (et non pas dans la bibliographie finale) et qu’on a bien déclaré qu’on souhaitait les indexer.
La commande indexfield[biblio]{entrykey}
signifie que l’on souhaite indexer le champ entrykey
avec le format biblio
. Le champ correspond au code de la référence dans le fichier .bib
. Le format d’indexation se définit avec la commande \DeclareIndexFieldFormat{format}
, dans le même fichier.
Mon format d’indexation
Cette commande récupère en premier, et unique, argument le champ passé à \indexfield
.
Dans mon fichier .bib
, j’ai choisi d’utiliser le champ facultatif usera
pour indiquer s’il s’agit d’une source primaire : la valeur est égale à 1 si c’est le cas [2].
Voilà ce que ça donne :
\DeclareIndexFieldFormat{biblio}{%
\iffieldequalstr{usera}{#1}{%
\index[sources]{@\citeauthor{#1} ! \textit{\citefield{#1}{indextitle}}}%
}%
{\index[secondaires]{1@\citeauthor{#1} ! \textit{\citefield{#1}{indextitle}}}%
}
}%
\citefield
et \citeauthor
sont des commandes de BibLatex.
Problème : si j’ai deux livres différents pour un même auteur, \citeauthor
ne me renvoie pas pour autant le même résultat. En effet, le code LaTex (\citeauthor
), et de manière générale tout le code LaTex, n’est pas interprété par la compilation avec MakeIndex. Conséquence : je me retrouve avec deux entrées « Augustin ».
Alors comment faire ? Une solution m’a été donnée sur le chat IRC francophone de LaTex : utilisé un script externe, non-LaTex, pour produire un fichier intermédiaire, qui sera ensuite compilé par LaTex.
J’ai donc écrit un script Python, qui me modifiera mon fichier auxiliaire .sox.
pour l’arranger à ma sauce. Afin de faciliter le travail de ce script, j’ai décidé de lui fournir un fichier .sox
le plus simple, en indiquant simplement la clef d’entrée bibliographique.
Ce qui donne finalement
\DeclareIndexFieldFormat{biblio}{%
\iffieldequalstr{usera}{1}{%
\index[sources]{#1}%
}%
{\index[secondaires]{#1}%
}
}
Pour ce qui est du script, je renvoie à mon prochain article.
Vos commentaires
# Le 22 août 2012 à 22:49, par Paul Stanley En réponse à : Un index des sources primaires (1)
Further to our discussion on TexSX, I’m posting a commented example which shows you how you could, if you wished, set about doing something like this without using Python, if you wish.
I hope it makes sense with the comments. Please feel free to email me if you would like to (you can find my email address in the documentation for the oscola package on CTAN). I hope you find it useful.
It would of course be nice to have this sort of facility in biblatex ; but it’s quite hard to arrive at a workable general solution, actually, because there are so many possible use-cases.
# Le 22 août 2012 à 23:47, par Maïeul En réponse à : Un index des sources primaires (1)
thank. Maybe you could post on the github ticket, to help author to implemante in standard biblatex ?
# Le 22 août 2012 à 23:53, par Maïeul En réponse à : Un index des sources primaires (1)
Ps : I don’t like use keyword to make ≠ between primary source and secondary source. I think the keyword field should be about topics of entry, and not about status of entry.
But with biblatex 2.0, I could define new field, more specific than usera