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 :
- Elle ne permettait pas d’obtenir un résultat correct si l’élement parent n’avait pas été cité [1].
- 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] :
- Copier sa valeur dans une commande
\crossref, à l’aide de la commande\savefield. - 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