Le problème
Il est fréquent dans certain domaines d’avoir des bibliographies de référence, attribuant un code à des textes anciens. Ainsi pour la littérature chrétienne ancienne nous avons :
- Bibliotheca hagiographica graeca (BHG)
- Bibliotheca hagiographica latina (BHL)
- Clavis Patrum Graecorum (CPG)
- Clavis Patrum Latinorum (CPL)
- Clavis Apocryphorum Novi Testamenti (CANT)
Il est parfois plus simple de retenir un texte par son numéro dans l’une de ces claves plutôt que par son titre complet. On peut donc souhaiter afficher ce numéro dans la bibliographie.
Une solution possible est d’utiliser le champ addendum
. Cependant, on ne garanti pas ainsi une présentation uniforme, notamment lorsqu’un texte se voit attribuer plusieurs de ces numéros.
Une autre solution est de créer des champs spéciaux, puis de les utiliser. C’est ce que je vais faire ici [1].
Notre exemple
Il s’agit des Actes de Barnabé qui portent le numéro CANT 285 et le numéro BHG 225. En base de donnée, nous le stockons ainsi :
@bookinbook{BHG225,
Bhg = {225},
Cant = {285},
Editor = {Maximilien Bonnet},
Booktitle={Acta Apostolorum Apocrypha},
Year={1903},
Volume={2.2},
Publisher={Hermann Mendelssohn},
Location={Leipzig},
Pages = {292-302},
Title = {Acta Barnabae}}
En l’absence de tout réglage pour les champs bhg
et cant
, nous obtenons l’affichage suivant :
Acta Barnabae, in Acta Apostolorum Apocrypha, éd. Maximilien Bonnet, t. 2.2, Leipzig : Hermann Mendelssohn, 1903, p. 292–302
Nous souhaiterions obtenir quelque chose de la forme :
Acta Barnabae, in Acta Apostolorum Apocrypha, éd. Maximilien Bonnet, t. 2.2, Leipzig : Hermann Mendelssohn, 1903, p. 292–302 (BHG 225 ; CANT 285)
Transférer les champs
Il faut savoir que s’il est possible de déclarer des champs non standards dans biblatex, il n’est pas possible de les utiliser tels quels. Ainsi, il est pour le moment impossible d’avoir une commande de type \printfield{bhg}
.
Dès lors la solution pour se servir des champs non standards est de « transférer » leurs valeurs vers un champ standard. Ce champ pourrait être par exemple un des champs libre de type userb
. Pour ma part, j’ai choisi de les transférer mes champs vers le champs addendum
.
Pour comprendre le principe du transfert, il faut se rappeler que biblatex ne lit pas le fichier .bib
directement, mais qu’il lit le fichier .bbl
produit par Biber à partir du fichier .bib
. Par exemple, dans le cas présent, notre fichier .bbl
contient l’entrée :
\entry{BHG220}{bookinbook}{}
\name{labelname}{1}{}{%
{{hash=7cbcda25a11c69ef442ceab55eea1d41}{Bonnet}{B\bibinitperiod}{Maximilien}{M\bibinitperiod}{}{}{}{}}%
}
\name{editor}{1}{}{%
{{hash=7cbcda25a11c69ef442ceab55eea1d41}{Bonnet}{B\bibinitperiod}{Maximilien}{M\bibinitperiod}{}{}{}{}}%
}
\list{location}{1}{%
{Leipzig}%
}
\list{publisher}{1}{%
{Hermann Mendelssohn}%
}
\strng{namehash}{7cbcda25a11c69ef442ceab55eea1d41}
\strng{fullhash}{7cbcda25a11c69ef442ceab55eea1d41}
\field{sortinit}{B}
\field{labeltitle}{Acta Barnabae}
\field{booktitle}{Acta Apostolorum Apocrypha}
\field{pubstate}{submitted}
\field{title}{Acta Barnabae}
\field{usera}{1}
\field{volume}{2.2}
\field{year}{1903}
\field{pages}{292\bibrangedash 302}
Comme vous pouvez le voir, les entrées sont formatées selon une norme propre à Biber, que Biblatex va pouvoir lire. L’enjeu pour nous est de rajouter une ligne \field{addendum}{BHG 225 ; CANT 285}
.
Pour cela nous allons déclarer un mappage [2] bibliographique, c’est à dire une manière de faire correspondre des champs d’une source (par exemple un fichier .bib
ou un BDD Zotero) à des champs du fichier .bbl
.
Pour ce faire, on utilise la commande \DeclareSourcemap
. Celle-ci contient une ou plusieurs commandes \maps
, qui indique un mappage. On peut préciser dans les options de la commande \map
les conditions d’applications du mappage. Cela peut-être par exemple le type de fichier source (bibtex, zotero etc.) ou bien le type d’entrée bibliographique (@article
,@book
etc.).
Chaque commande \maps
contient une ou plusieurs commandes \map
, lues dans l’ordre d’apparition, et qui précisent la manière dont des champs sont transformés. Chaque commande \map
contient des commandes \step
, qui indiquent les étapes pour procéder à la transformation du champ.
Tout ceci semble bien abscon, un exemple sera plus parlant. Ainsi je vous propose d’analyser le code suivant, que je met dans mon préambule :
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map[overwrite]{
\step[fieldsource=bhg,final]
\step[fieldset=addendum,fieldvalue={BHG~},append]
\step[fieldset=addendum,origfieldval, append]
}
\map[overwrite]{
\step[fieldsource=cpg,final]
\step[fieldset=addendum,fieldvalue={CPG~},append]
\step[fieldset=addendum,origfieldval, append]
}
\map[overwrite]{
\step[fieldsource=bhl,final]
\step[fieldset=addendum,fieldvalue={BHL~},append]
\step[fieldset=addendum,origfieldval, append]
}
\map[overwrite]{
\step[fieldsource=cpl,final]
\step[fieldset=addendum,fieldvalue={CPL~},append]
\step[fieldset=addendum,origfieldval, append]
}
\map[overwrite]{
\step[fieldsource=cant,final]
\step[fieldset=addendum,fieldvalue={CANT~},append]
\step[fieldset=addendum,origfieldval, append]
}
}
}
- L. 1 : la commande pour déclarer des mappages [3].
- L. 2 : la commande pour déclarer un mappage particulier, ici dans le cas où la source est au format
.bib
(bibtex). - L. 3, 8, 13, 18, 23 : les règles de mappage, à lire dans l’ordre. L’option
overwrite
indique que les règles peuvent modifier des valeurs de champ déjà définies. Analysons les lignes 4, 5, 6, le principe est le même pour les lignes 9, 10, 11 ; 14, 15, 16 ; 19, 20, 21 ; 24, 25, 26. - L. 4 On indique via
fieldsource=bhg
que l’on s’intéresse au champbhg
de la source (c’est à dire dans notre cas, du fichier.bib
). Lefinal
indique que si ce champ est absent, on arrête là cette règle de mappage, pour passer à la commande\map
suivante. - L. 5 On ajoute
BHG~
dans le champaddendum
, à la suite du contenu déjà existant (optionappend
). - L. 6 Dans le champ
addendum
, à la suite du contenu déjà existant, on ajoute le contenu du champ indiqué par le précédentfieldsource
, c’est à dire dans notre cas du champbhg
. C’est l’optionorigfieldval
qui nous indique d’aller chercher le contenu dans le précédent champ indiqué parfieldsource
.
Si j’ai été clair, vous devriez comprendre qu’au final, notre champ addendum contiendra : BHG~225CANT~285
. Si nous avions en outre défini un champ addendum
dans notre fichier .bib
, son contenu sera mis au début du champ addendum
du fichier .bbl
.
On souhaiterais maintenant insérer des points-virgules entre chaque entrée. On pourrait être tenter de modifier ainsi les lignes 5, 10, 15, 20, 25 :
\step[fieldset=addendum,fieldvalue={XXX~},append]
Toutefois ceci pose deux problèmes :
- L’un assez mineur est qu’on inscrit « en dur » le séparateur de claves.
- L’autre majeure est que l’on ajoute systématiquement le point-virgule, y compris s’il n’y a rien auparavant.
Pour résoudre ces deux problèmes, nous allons définir une nouvelle commande, \multiclavesseparator
:
\newcommand{\multiclavesseparator}{\addsemicolon\ifpunct{\addspace}{}}
-
\addsemicolon
insère un point-virgule uniquement si nous n’avons pas juste avant un signe de ponctuation. Cela évite d’avoir [4]. -
\ifpunct{\addspace}{}
ajoute l’espace après le point-virgule s’il est affiché, rien sinon.
Il nous faut ajouter la commande dans nos lignes 5, 10, 15, 20, 25, ainsi :
\step[fieldset=addendum,fieldvalue={\noexpand\multiclavesseparator XXX~},append]
Le \noexpand
est là pour éviter que le \multiclavesseparator
soit interprété au moment de la lecture du fichier .tex
. Il peut par conséquent se trouver tel quel dans le fichier .bcf
[5] et par conséquent dans le fichier .bbl
.
Ceci nous produit donc pour le moment
Acta Barnabae, in : Acta Apostolorum Apocrypha, éd. Maximilien Bonnet, t. 2.2, Leipzig : Hermann Mendelssohn, 1903, p. 292–302, BHG 225 ; CANT 285
Styler le champ addendum
Maintenant que nous avons défini le contenu du champ addendum, il nous faut le modifier sa présentation, pour le mettre automatiquement entre parenthèse. On utilise pour cela la commande \DeclareFieldFormat
.
\DeclareFieldFormat{addendum}{\mkbibparens{#1}}
Rien de bien sorcier : on indique simplement, via \mkbibparens
de mettre entre parenthèse le contenu (#1
) du champ. L’avantage d’utiliser \mkbibparens
est double :
- Si notre champ est vide, nous n’avons pas de parenthèses vides pour autant.
- Si nous nous situons à l’intérieur d’une parenthèse, biblatex nous produira automatiquement des crochets.
Avec ceci, nous obtenons :
Acta Barnabae, in : Acta Apostolorum Apocrypha, éd. Maximilien Bonnet, t. 2.2, Leipzig : Hermann Mendelssohn, 1903, p. 292–302, ( BHG 225 ; CANT 285)
Cela n’est pas terrible :
- Nous avons une virgule suivi d’une parenthèse.
- Nous avons une espace après la parenthèse ouvrante, ce qui s’explique par le
\ifpunct{\addspace}{}
. La précédente ponctuation étant la virgule d’avant la parenthèse.
Que cela ne tienne, nous allons corriger ce qui est affiché avant la parenthèse. Pour cela, nous allons modifier la macro bibliographique addendum+pubstate
, qui est actuellement définie ainsi (dans le fichier standard.bbx
) :
\newbibmacro*{addendum+pubstate}{%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}}
Nous allons la modifier ainsi :
\renewbibmacro*{addendum+pubstate}{%
\iffieldundef{addendum}{}{\nopunct}%
\printfield{addendum}%
\newunit\newblock
\printfield{pubstate}}
La première ligne que nous avons ajoutée est assez simple : si nous avons un champ addendum, alors nous supprimons la ponctuation qui précède [6].
Et nous obtenons ainsi notre affichage final :
Acta Barnabae, in : Acta Apostolorum Apocrypha, éd. Maximilien Bonnet, t. 2.2, Leipzig : Hermann Mendelssohn, 1903, p. 292–302 (BHG 225 ; CANT 285)
Vos commentaires
# Le 8 avril 2013 à 17:02, par Celano
En réponse à : Gérer des champs supplémentaires
Bonjour et merci pour ce tuto. C’est très intéressant et très bien expliqué. Seulement, j’arrive à
Faut-il insérer \DeclareSourcemap dans le fichier bib ou bien dans le fichier tex ?
# Le 8 avril 2013 à 17:13, par Maïeul
En réponse à : Gérer des champs supplémentaires
Dans le préambule, donc dans le fichier
.tex
.