Un index des sources primaires (1)

vendredi 14 janvier 2011, mise à jour mercredi 8 août 2012, par Maïeul
Suivre la vie du site RSS 2.0 Forum

Cet article est obsolète. Soit qu’il existe une manière plus « moderne » de procéder, soit que j’ai trouvé une autre méthode plus appropriée.
Voyez plutôt la nouvelle version : Un index des sources primaires (3).

LaTex possède des outils pour fabriquer des index, grâce au paquet index et au logiciel auxiliaire Makeindex.

Pourquoi ne pas s’en servir pour faire un index des sources primaires citées ? Après un certain nombre de tests, voici la solution que j’ai trouvée. Tout n’est pas encore parfait. J’attends l’avis de tous utilisateurs LaTex.

[Mise à jour : cette contribution est obsolète. J’ai trouvée une solution bien meilleur. En revanche vous pouvez toujours lire les trois premières parties de cet article.]

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.

P.-S.

Comme tout cela peut paraître bien compliqué, je vous propose une fois encore mon fichier .bbx.

Documents joints

Notes

[1On peut passer l’argument true à indexing, cela indexera aussi dans la bibliographie finale. Mais je ne vois pas trop l’intérêt.

[2Dans une précédente note je faisais part de ma méthode avec le champs keywords. Le problème est que ce champ peut contenir d’autres informations, et pour vérifier sa valeur, il faudrait utiliser une expression régulière. Je n’ai pas trouvé comment faire en LaTex. Pour le moment j’ai donc un dédoublement de l’information. J’utilise des groupes intelligents dans Bibdesk pour éviter les erreurs. Je vais essayer de trouver une autre solution, en inventant un filtre de bibliographie selon le champ usera.

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.

    \documentclass[a4paper]{article}
    \usepackage{filecontents}
    
    % I'm not certain how your commands like \incipit work -- so I've guessed. I doubt
    % it matters. I have however used the keywords field rather than usera to distinguish
    % between primary and secondary literature
    
    \begin{filecontents}{\jobname.bib}
    @book{pseudoa,
      author = {{Pseudo-Augustin}},
      title  = {Sermon \incipit{Fratres carissimi, unum rei documentum} (Caillau \cRM{2}, 27)},
      indexsorttitle = {Sermon fratres carissimi, unum rei documentum (Caillau 2, 27)},
      pages  = {4},
      keywords = {primary},
    }
    @book{secondary,
      author = {Author, A. N.},
      title  = {A Title},
      keywords = {secondary},
      date  = {2012},
    }
    \end{filecontents}
    
    \usepackage[style=verbose, indexing=cite]{biblatex}
    
    \addbibresource{\jobname.bib}
    
    \usepackage{index}
    
    \newindex{sources}{sox}{sod}{Index of Sources}
    
    % This is a convenience: we can redefine \sourceindex if
    % we want to use a differently named index
    \newcommand{\sourceindex}{sources}
    
    % These are dummies to simulate the commands I see in your
    % bibfile
    \newcommand{\incipit}[1]{\emph{#1}}
    \newcommand{\cRM}[1]{#1}
    
    % We renew citeindex so that it does nothing unless we're looking
    % at a primary source, and then indexes either author or namea, depending
    % on which is set. We then use a newly defined IndexFieldFormat called primarysource
    % to actually do the work
    \renewbibmacro*{citeindex}{%
      \ifciteindex
        {\ifkeyword{primary}
          {\ifnameundef{namea}
            {\indexnames[primarysource]{author}}
            {\indexnames[primarysource]{namea}}}
          {}}
        {}}
    
    % This "prepares the ground", depending on whether
    % there is a postnote or not. We assume there is always
    % a title. We don't need to check for indexsorttitle o
    % indextitle, because these will be automatically set for
    % us the same as title
    \DeclareIndexNameFormat{primarysource}{%
        \iffieldundef{postnote}
          {\usebibmacro{index:source}
           {#1}%
           {#3}%
           {#5}%
           {#7}%
           {\thefield{indexsorttitle}}%
           {\thefield{indextitle}}%
           {\thefield{pages}}%
          }
          {\usebibmacro{index:source}
           {#1}
           {#3}%
           {#5}%
           {#7}%
           {\thefield{indexsorttitle}}%
           {\thefield{indextitle}}%
           {\thefield{postnote}}}}
    
    \makeatletter
    % And this actually does the work: #1,#2,#3,#4 are different
    % parts of the name. #5 is the indexsorttitle. #6 is the indextitle.
    % #7 is the postnote or pages.
    \newbibmacro*{index:source}[7]{%
      \begingroup
      \ifuseprefix
        {\protected@edef\theindexentry{%
           \unexpanded{\index}[\sourceindex]{%
             \ifblank{#3}{}{#3 }%
             \@firstofone #1% remove spurious braces
             \ifblank{#4}{}{ #4}%
             \ifblank{#2}{}{, #2}%
             \actualoperator
             \ifblank{#3}{}{\MakeCapital{#3} }%
             #1%
             \ifblank{#4}{}{ #4}%
             \ifblank{#2}{}{, #2}%
             !#5%
             \actualoperator
             #6%
             !#7}}}
        {\protected@edef\theindexentry{%
           \unexpanded{\index}[\sourceindex]{%
             \@firstofone #1% remove spurious braces
             \ifblank{#4}{}{ #4}%
             \ifblank{#2#3}{}{,}%
             \ifblank{#2}{}{ #2}%
             \ifblank{#3}{}{ #3}%
             !#5%
             \actualoperator
             #6%
             !#7}}}
      \theindexentry
      \endgroup}
    \makeatother
    
    \begin{document}
    \cite{pseudoa}
    
    \cite[10]{pseudoa}
    
    \cite{secondary}
    
    \newpage
    
    \cite[6]{pseudoa}
    
    \printindex[sources]
    
    \end{document}
  • 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

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Acheter XeLaTeX appliqué aux sciences humaines

À propos

Titulaire d’un doctorat en théologie et d’un doctorat en histoire, sous la direction conjointe de Frédéric Amsler et d’Élisabeth_Malamut, je commence à partir du 1er août 2017 un travail d’édition critique des Actes de Barnabé.

Dans le cadre de la rédaction de mon mémoire de master puis de ma thèse de doctorat, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares. Ceci m’a conduit à maintenir ou créer plusieurs packages LaTeX et à donner plusieurs formations.

J’ai reçu en 2018 le prix DANTE e.V pour mon travail autour de LaTeX, en particulier autour de reledmac et reledpar.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul