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:name, 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
Second problème : pas de op. cit. si je ne cite pas le même passage
J’essaie maintenant :
\cite{ActaPetriPauli}
…
\cite{ActaPetriPauli81}J’obtiens alors
Acta Petri et Pauli, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert LIPSIUS, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 178–222
…
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.
Regardons la macro cite, toujours dans le style verbose-trad-2.
\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}}}}La solution va consister à regarder si l’élèment parent a déjà été cité. Pour ce faire, je me sert de la commande \ifentryseen{clef}{sioui}{sinon}.
Pour tester si l’élèment parent a été cité, j’utilise \thefield{crossref}
\ifentryseen{\thefield{crossref}}{sioui}{sinon}J’intègre tout cela dans la macro. Pour éviter de répeter deux fois le code, je met la parti suivante dans une macro, que j’appelle cite:manage :
\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}}Comme je ne veux appliquer le test de l’entrée parente que pour les entrées avec un champ titleaddon, je me sert aussi de la commande \iffieldundef{champ}{si champ vide}{si champ pas vide}. Je dois aussi tester si le champ crossref est défini, sinon biblatex considère que l’entrée vide a déjà été citée.
Je procède à ce test de la manière suivante :
\iffieldundef{crossref}{si champ vide}{si champ non vide}Au final, cela donne :
\renewbibmacro*{cite}{%
\usebibmacro{cite:citepages}%
\global\togglefalse{cbx:fullcite}%
\global\togglefalse{cbx:loccit}%
\bibhypertarget{cite\the\value{instcount}}{%
\iffieldundef{titleaddon}{\usebibmacro{cite:manage}}%
{\iffieldundef{crossref}{\usebibmacro{cite:manage}}%
{\ifentryseen{\thefield{crossref}}{\usebibmacro{cite:name}\usebibmacro{cite:title}}{\usebibmacro{cite:manage}}%
}}}}%
\newbibmacro{cite:manage}{%
\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}}}Et j’obtiens :
Acta Petri et Pauli, dans Acta apostolorum apocrypha, t. I, éd. Richard Aldebert LIPSIUS, Hildesheim et New York : Georg Olms Verlag, 1972 (rééd. de 1891), p. 178–222
…
Acta Petri et Pauli, op. cit., 81, p. 214–215
Troisième problème : si on ne cite pas l’entrée parente
Oui, mais supposons que je ne cite pas d’abord l’entrée mère :
\cite{ActaPetriPauli81}
…
\cite{ActaPetriPauli80}Je perd à nouveau mes op. cit. :
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, (Version longue du Ps. Marcellus, CANT 193.2)
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, (Version longue du Ps. Marcellus, CANT 193.2)
Et oui, c’est logique, vu que l’entrée mère n’a jamais été citée, le \ifciteseen{\thefield{crossref}} passe toujours sur la partie fausse.
Pour le moment je n’ai pas trouvé de manière pour éviter cela.
citepages = omit
Si j’utilise l’option citepages=omit pour éviter la duplication des pages entre le le champ pages et l’option postnote, j’obtiens avec le code suivant :
\cite{ActaPetriPauli81}
...
\cite[214]{ActaPetriPauli8}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, p. 214
Le citepages=omit n’est pris en compte. Il faut savoir que citepages=omit définit une macro
cite:full:citepages qui se charge de gérer la suppression du champ pages le cas échéant.
La solution est donc d’introduire un appel à cette macro, au début de la macro cite:title.
Ce qui donne
\renewbibmacro*{cite:title}{%
\usebibmacro{cite:full:citepages}%
\ifpunct{\addspace}{}%
\printtext[bibhyperlink]{%
\ifboolexpr{test{\ifsingletitle} and not (test {\iffieldundef{author}} and test{\iffieldequalstr{usera}{1}})}{}{\printfield[citetitle]{labeltitle}}%
\setunit{\nametitledelim}%
\bibstring[\mkibid]{opcit}}%
\iffieldequalstr{usera}{1}{%
\setunit{\bibpagespunct}%
\printfield{titleaddon}%
\iffieldundef{titleaddon}{}{\setunit{\bibpagespunct}%
\printfield{pages}}%
\newunit%
\printfield{addendum}%
}{}%
}Et j’obtiens bien à la fin :
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