Division de sources et abréviations

, par Maïeul

Cet article annule et remplace mon article de novembre sur les divisions de sources et les op. cit. J’ai en effet trouvé une méthode beaucoup plus simple et généraliste pour résoudre les problèmes qui y étaient soulevés.

Rappelons le problème : j’utilise un système se basant sur le mécanisme des références croisées et du champ titleaddon pour gérer la division des sources.

Ce système fonctionne bien, mais la gestion des abréviations de type op. cit. et ibid. pose problème. Il nous faut donc modifier les macros standard de biblatex.

Je tiens à remercier Ratatouille pour m’avoir relancer sur le sujet ce qui m’a permis de trouver une solution satisfaisante.

Les exemples

Pour cet article, je me base sur les entrées suivantes :

@bookinbook{ActaPetriPauli,
	Address = {Hildesheim and New York},
	Booktitle = {Acta apostolorum apocrypha},
	Editor = {Richard Aldebert Lipsius},
	Entrysubtype = {apocryphes},
	Pages = {178-222},
	Publisher = {Georg Olms Verlag},
	Title = {Acta Petri et Pauli},
	Usera = {1},
	Volume = {I},
	Year = {1972 (rééd. de 1891)}}

@bookinbook{ActaPetriPauli80,
	Crossref = {ActaPetriPauli},
	Pages = {213-214},
	Title = {Acta Petri et Pauli},
	Titleaddon = {80},
	Usera = {1}}

@bookinbook{ActaPetriPauli81,
	Crossref = {ActaPetriPauli},
	Pages = {214-215},
	Title = {Acta Petri et Pauli},
	Titleaddon = {81},
	Usera = {1}}

Premier problème : perte de la division de source

Soit le code suivant :

\cite{ActaPetriPauli81}

…

\cite{ActaPetriPauli81}

J’obtiens par défaut :

Acta Petri et Pauli, 81, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert Lipsius, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 214–215

Acta Petri et Pauli, op. cit.

Pour rétablir la division de source, il me faut modifier la manière dont sont affichées les versions abrégées. Cela se passe via la macro cite:title, qui par défaut est définie ainsi, dans le style verbose-trad-2 :

\newbibmacro*{cite:title}{%
  \printtext[bibhyperlink]{%
    \printfield[citetitle]{labeltitle}%
    \setunit{\nametitledelim}%
    \bibstring[\mkibid]{opcit}}}

Il suffit de la modifier pour lui indique d’imprimer le champ titleaddon et le champ pages :

\renewbibmacro*{cite:title}{%
  \printtext[bibhyperlink]{%
    \printfield[citetitle]{labeltitle}%
    \setunit{\nametitledelim}%
    \bibstring[\mkibid]{opcit}%
    \setunit{\bibpagespunct}%
    \printfield{titleaddon}%
    \setunit{\bibpagespunct}%
    \printfield{pages}%
    }}

J’obtiens alors :

Acta Petri et Pauli, 81, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert Lipsius, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 214–215

Acta Petri et Pauli, op. cit., 81, p. 214-215

De même, pour gérer le cas où nos deux références se suivent immédiatement, et donc où la deuxième est remplacée par idem, il me faut modifier la macro cite:idem, qui par défaut est ainsi définie :

\newbibmacro*{cite:ibid}{%
  \printtext{%
    \bibhyperlink{cite\csuse{cbx@lastcite@\thefield{entrykey}}}{%
      \bibstring[\mkibid]{ibidem}}}%
  \ifloccit
    {\global\toggletrue{cbx:loccit}}
    {}}

Il suffit de la redéfinir ainsi :

\renewbibmacro*{cite:ibid}{%
  \printtext{%
    \bibhyperlink{cite\csuse{cbx@lastcite@\thefield{entrykey}}}{%
      \bibstring[\mkibid]{ibidem}}}%
      \setunit{\bibpagespunct}%
  	\printfield{titleaddon}%
	\iffieldundef{titleaddon}{}{\setunit{\bibpagespunct}%
  	\printfield{pages}}%
  \ifloccit
    {\global\toggletrue{cbx:loccit}}
    {}}

Second problème : pas de op. cit. si je ne cite pas le même passage

J’essaie maintenant :

\cite{ActaPetriPauli80}

…

\cite{ActaPetriPauli81}

J’obtiens alors

Acta Petri et Pauli, 80, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert LIPSIUS, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 213–214

Acta Petri et Pauli, 81, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert LIPSIUS, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 214–215

Pas très joli, joli ! Et puis cela prend de la place, ce n’est pas très écolo, donc pas non plus Joly.

Dans mon précédent article, c’est ici que les j’avais en effet opté pour une solution peut satisfaisante, qui consistait à tester si l’élément parent avait été cité. Cette solution était peu satisfaisante pour deux raisons :

  1. Elle ne permettait pas d’obtenir un résultat correct si l’élement parent n’avait pas été cité [1].
  2. Elle ne permettait pas d’utiliser des ibid de manière correcte [2].

La solution que j’ai désormais adoptée est plus efficace. Elle se comprend à partir de la manière dont biblatex gère les abréviations de type op. cit. : en stockant dans des tableaux et variables (au sens des langages de programmations) les valeurs du champ entrykey du l’entrée courante. Comme son nom l’indique, ce champ a pour valeur par défaut la clef de citation de l’entrée courante : par exemple ActaPetriPauli81. Toutefois, il est possible, comme pour tout les champs, de modifier temporairement cette valeur au sein d’une macro bibliographique. Nous allons nous servir de cette possibilité pour lui affecter la valeur du champ crossref. Par conséquent, lorsque je citerais une sous-entrée de ActaPetriPauli, j’indiquerais à biblatex de retenir l’entrée ActaPetriPauli dans sa liste des entrées à abréger.

Pour mettre la valeur du champ crossref dans le champ entrykey, il faut procéder en deux temps [3] :

  1. Copier sa valeur dans une commande \crossref, à l’aide de la commande \savefield.
  2. Copier la commande \crossref, à l’aide de la commande \restorefield.
    Ce qui donne :
    \savefield{crossref}{\crossref}\restorefield{entrykey}{\crossref}

Bien sûr, il faut également conditionner cette copie :

  • À la présence d’un champ crossref, sinon on risque d’avoir des problèmes.
  • À la présence d’un champ titleaddon, car les crossrefs ne sont pas systématiquement pour des divisions de sources.
    On utilise pour cela la commande bien connue \iffieldundef :
    \iffieldundef{crossref}{}{\iffieldundef{titleaddon}{}{\savefield{crossref}{\crossref}\restorefield{entrykey}{\crossref}}}

Reste à choisir où mettre ces commandes ! Il faut savoir que la gestion des versions abrégées des références se fait au niveau d’une macro cite qui est la première macro appelée par les commandes \XXXcite. Dans le style verbose-trad-2 cette macro est définie ainsi :

\newbibmacro*{cite}{%
  \usebibmacro{cite:citepages}%
  \global\togglefalse{cbx:fullcite}%
  \global\togglefalse{cbx:loccit}%
  \bibhypertarget{cite\the\value{instcount}}{%
    \ifciteseen
      {\iffieldundef{shorthand}
         {\ifciteibid
            {\usebibmacro{cite:ibid}}
            {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
               {\usebibmacro{cite:idem}}
               {\usebibmacro{cite:name}}%
             \usebibmacro{cite:title}}%
	  \usebibmacro{cite:save}}
         {\usebibmacro{cite:shorthand}}}
      {\usebibmacro{cite:full}%
       \usebibmacro{cite:save}}}}

Il suffit donc d’insérer notre code de « recopie » en début de macro :

\renewbibmacro*{cite}{%
\iffieldundef{crossref}{}{\iffieldundef{crossref}{}{\iffieldundef{titleaddon}{}{\savefield{crossref}{\crossref}\restorefield{entrykey}{\crossref}}}}%
  \usebibmacro{cite:citepages}%
  \global\togglefalse{cbx:fullcite}%
  \global\togglefalse{cbx:loccit}%
  \bibhypertarget{cite\the\value{instcount}}{%
    \ifciteseen
      {\iffieldundef{shorthand}
         {\ifciteibid
            {\usebibmacro{cite:ibid}}
            {\ifthenelse{\ifciteidem\AND\NOT\boolean{cbx:noidem}}
               {\usebibmacro{cite:idem}}
               {\usebibmacro{cite:name}}%
             \usebibmacro{cite:title}}%
	  \usebibmacro{cite:save}}
         {\usebibmacro{cite:shorthand}}}
      {\usebibmacro{cite:full}%
       \usebibmacro{cite:save}}}}

J’obtiens correctement :

Acta Petri et Pauli, 80, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert LIPSIUS, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 213–214

Acta Petri et Pauli, 81, op. cit., p. 214–215

P.-S.

La précédente version de cet article contenait une astuce concernant les pages référencées avec la commande \cite. Cette astuce n’avait à vrai dire rien à voir avec le problème qui nous occupe : je l’ai reproduite dans un article dédié.

Notes

[1C’était là mon troisième problème, que je n’arrivais pas à résoudre.

[2Je ne m’étais pas aperçu de ce problème

[3Je renvoie au manuel de biblatex pour plus de détails.