Gérer des champs supplémentaires

mardi 5 mars 2013, mise à jour jeudi 10 avril 2014, par Maïeul
Suivre la vie du site RSS 2.0 Forum

Les champs par défaut de BibLaTeX sont en général largement suffisants. Cependant on pourrait avoir envie d’en utiliser d’autres, personnalisés. Voici un petit tutoriel sur le sujet.

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 :

  • 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 champ bhg de la source (c’est à dire dans notre cas, du fichier .bib). Le final 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 champ addendum, à la suite du contenu déjà existant (option append).
  • L. 6 Dans le champ addendum, à la suite du contenu déjà existant, on ajoute le contenu du champ indiqué par le précédent fieldsource, c’est à dire dans notre cas du champ bhg. C’est l’option origfieldval qui nous indique d’aller chercher le contenu dans le précédent champ indiqué par fieldsource.

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 :

  1. L’un assez mineur est qu’on inscrit « en dur » le séparateur de claves.
  2. 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 :

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)

Notes

[1Je conseille d’avoir lu les chapitres de mon livre concernant la personnalisation des styles biblatex pour comprendre certaines notions.

[2Si quelqu’un trouve une meilleure traduction de « mapping », je suis preneur.

[3Il existe des commandes spécifiques si vous souhaitez déclarer le mappage dans un fichier de style bibliographique plutôt que dans un fichier .tex.

[5Ce fichier, qui est produit lors de la compilation (Xe)LaTeX par le package biblatex, décrit les réglages que Biber devra utiliser.

[6La documentation indique pour \nopunct : « Ajoute un marqueur interne qui aura pour conséquence que la commande suivante de ponctuation n’imprimera rien. » Il faut bien comprendre que les commandes de ponctuations sont interprétées \emphaprès les autres commandes (pour gérer notamment les unités bibliographiques). Par conséquence la commande suivante de ponctuation correspond à la ponctuation qui précéde.

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 à

     ! Undefined control sequence. l.100 \DeclareSourcemap

    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.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Acheter XeLaTeX appliqué aux sciences humaines

À propos

Titulaire d’un doctorat en théologie et d’un doctorat en histoire, sous la direction conjointe de Frédéric Amsler et d’Élisabeth_Malamut, je commence à partir du 1er août 2017 un travail d’édition critique des Actes de Barnabé.

Dans le cadre de la rédaction de mon mémoire de master puis de ma thèse de doctorat, j’ai été emmené à utiliser LaTeX, et j’ai donc décider de partager mes techniques. En effet, au cours de mes premiers apprentissages, j’ai découvert que les ressources indiquant les outils pour l’utilisation de LaTeX en sciences humaines étaient rares. Ceci m’a conduit à maintenir ou créer plusieurs packages LaTeX et à donner plusieurs formations.

J’ai reçu en 2018 le prix DANTE e.V pour mon travail autour de LaTeX, en particulier autour de reledmac et reledpar.

Par ailleurs, je suis membre actif de la communauté SPIP, au sein de laquelle j’administre le site Spip-Contrib. Je propose sur ce site quelques notes sur SPIP, en général à destination de webmestre.

Il m’arrive également de faire un petit peu de Python, de temps en temps.

Enfin, je tiens un blog de réflexions politiques et religieuses.

Maïeul