Le problème
Soit les entrées suivantes :
@book{Genette1992,
Editor = {Gérard Genette},
Location = {Paris},
Pagetotal = {245},
Publisher = {Seuil},
Title = {Esthétique et poétique},
Year = {1992}}
@inbook{Dickie1992,
Author = {George Dickie},
Crossref = {Genette1992},
Pages = {9-32},
Title = {Définir l'art},
Titleaddon = {1973}}
On suppose que la gestion des crossref se fait avec Biber.
Soit, en utilisant le style de citation verbose-trad2
, les appels suivants :
Avec les styles par défauts on obtient le résultat suivant :
Gérard Genette, ed. Esthétique et poétique. Paris : Seuil, 1992. 245 pp.
George Dickie. “Définir l’art”. 1973. In : Esthétique et poétique. Ed. by Gérard Genette. Paris : Seuil, 1992, pp. 9–32, p. 24
Le souhait de Loïs était d’obtenir :
Gérard Genette, ed. Esthétique et poétique. Paris : Seuil, 1992. 245 pp.
George Dickie. “Définir l’art”. 1973. In : ibid p. 24
Un problème d’analyse
Il faut bien comprendre que lorsque le champ crossref
est utilisé, cela ne veut pas dire, par défaut, que lors de l’affichage d’une entrée-fille on renvoie vers l’entrée mère, mais bien que les champs de l’entrée-mère sont recopiés dans l’entrée-fille. C’est ce qui permet notamment de faire passer, avec biber et non pas avec BibTeX, le champ title
de l’entrée-mère vers booktitle
de l’entrée-fille.
Ce phénomène de transfert peut être visualisé ou bien constaté en ouvrant le fichier .bbl
produit par biber. Dans notre cas, on y voit la description de l’entrée Dickie1992
:
\entry{Dickie1992}{inbook}{}
\name{labelname}{1}{}{%
{{hash=fef82f30fe2bfa35216fc92c560ae872}{Dickie}{D\bibinitperiod}{George}{G\bibinitperiod}{}{}{}{}}%
}
\name{author}{1}{}{%
{{hash=fef82f30fe2bfa35216fc92c560ae872}{Dickie}{D\bibinitperiod}{George}{G\bibinitperiod}{}{}{}{}}%
}
\name{editor}{1}{}{%
{{hash=a7761d3fd65ea36d5c84d114d588896b}{Genette}{G\bibinitperiod}{Gérard}{G\bibinitperiod}{}{}{}{}}%
}
\list{location}{1}{%
{Paris}%
}
\list{publisher}{1}{%
{Seuil}%
}
\strng{namehash}{fef82f30fe2bfa35216fc92c560ae872}
\strng{fullhash}{fef82f30fe2bfa35216fc92c560ae872}
\field{sortinit}{D}
\field{labeltitle}{Définir l'art}
\field{booktitle}{Esthétique et poétique}
\strng{crossref}{Genette1992}
\field{pagetotal}{245}
\field{title}{Définir l'art}
\field{titleaddon}{1973}
\field{year}{1992}
\field{pages}{9\bibrangedash 32}
\endentry
Le comportement par défaut ne pouvait donc pas être celui souhaité par Loïs, puisque ce serait aller à l’encontre la logique "de base" des crossref
. Cependant on peut ruser.
La solution
Le style par défaut
J’explique dans mon livre que l’affichage final des entrées se fait à l’aide de "drivers" bibliographique, par type d’entrée [1].
On trouve assez facilement le fichier les contenant, en suivant les renvois entre fichiers (voir mon intervention dans les grottes). Dans le cas des styles de la famille verbose
, les drivers sont présents dans le fichier standard.bbx
. Voici celui pour les entrées de type @inbook
:
\DeclareBibliographyDriver{inbook}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/translator+others}%
\setunit{\labelnamepunct}\newblock
\usebibmacro{title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{in:}%
\usebibmacro{bybookauthor}%
\newunit\newblock
\usebibmacro{maintitle+booktitle}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
\printfield{edition}%
\newunit
\iffieldundef{maintitle}
{\printfield{volume}%
\printfield{part}}
{}%
\newunit
\printfield{volumes}%
\newunit\newblock
\usebibmacro{series+number}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
\usebibmacro{publisher+location+date}%
\newunit\newblock
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
{\printfield{isbn}}
{}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
Sa redéfinition
C’est ce driver que nous allons redéfinir, dans notre préambule.
Dans notre affichage final, la partie que nous souhaitons modifier est comprise entre le "in" (exclu) et le numéro de page (exclu). Cela correspond, dans le driver à la partie compris entre le \usebibmacro{in:}
(l. 12) et le \usebibmacro{chapter+pages}
(l. 34).
Par ailleurs, il est possible d’avoir des entrées @inbook
sans utilisation du crossref (même si c’est à déconseiller). C’est pourquoi nous allons conserver ce code dans une macro adhoc, que l’on appellera inbookwithoutcrossref
:
\newbibmacro{inbookwithoutcrossref}{%
\usebibmacro{bybookauthor}%
\newunit\newblock
\usebibmacro{maintitle+booktitle}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
\printfield{edition}%
\newunit
\iffieldundef{maintitle}
{\printfield{volume}%
\printfield{part}}
{}%
\newunit
\printfield{volumes}%
\newunit\newblock
\usebibmacro{series+number}%
\newunit\newblock
\printfield{note}%
\newunit\newblock
\usebibmacro{publisher+location+date}%
}
Pour afficher l’entrée mère sous une forme abrégée, nous utilisons tout simplement une commande \cite
, que nous encapsulons dans une macro inbookwithcrossref
. Nous passons comme argument à la commande la valeur du champ crossref
de l’entrée-fille, qui correspond à la clef bibliographique de l’entrée-mère. Cette valeur est récupérée via \thefield{crossref}
.
Cela donne donc :
\newbibmacro{inbookwithcrossref}{%
\cite{\thefield{crossref}}%
}
Il ne nous reste plus qu’à supprimer les lignes 13 à 33 de notre driver, en appelant à la place la macro inbookwithcrossref
ou inbookwithoutcrossref
, selon que le champ crossref
est défini ou non, le test se faisant avec la commande \iffieldundef
. Ce qui donne la définition suivante de notre driver :
\DeclareBibliographyDriver{inbook}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{author/translator+others}%
\setunit{\labelnamepunct}\newblock
\usebibmacro{title}%
\newunit
\printlist{language}%
\newunit\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{in:}%
\iffieldundef{crossref}{\usebibmacro{inbookwithoutcrossref}}{\usebibmacro{inbookwithcrossref}}%
\newunit\newblock
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
{\printfield{isbn}}
{}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
Vous constatez la ligne modifiée : l. 13.
Le résultat à l’affichage est le suivant :
Gérard Genette, ed. Esthétique et poétique. Paris : Seuil, 1992. 245 pp.
George Dickie. “Définir l’art”. 1973. In : ibid., p. 24, pp. 9–32, p. 24
Affinage
La solution est presque parfaite, mais vous pouvez vous rendre compte que le numéro de page est affichée deux fois. La raison est assez subtile : lors de l’utilisation de la commande \cite
dans le driver bibliographique, pour appeler l’entrée-mère, le champ postnote
est récupéré du contexte, c’est à dire qu’il s’agit du champ postnote
de l’entrée-fille. La solution consiste à vider ce champ à l’intérieur de la macro inbookwithcrossref
, avec la commande \clearfield
. Il faut faire de même pour le champ prenote
. Ce qui donne :
\newbibmacro{inbookwithcrossref}{%
\clearfield{prenote}%
\clearfield{postnote}%
\cite{\thefield{crossref}}%
}
Notre résultat final est alors correct :
Gérard Genette, ed. Esthétique et poétique. Paris : Seuil, 1992. 245 pp.
George Dickie. “Définir l’art”. 1973. In : ibid., pp. 9–32, p. 24
Vous constaterez aisément, en faisant des tests, que ma solution fonctionne aussi avec des abréviations de type op. cit..