Accueil > LaTeX > BibLaTeX > Division de sources et op. cit. (2)

Division de sources et {op. cit.} (2)

mardi 29 novembre 2011, par Maïeul

Cet article est essentiellement une correction du précédent article portant le même nom [1].

J’avais expliqué dans un précédent article, la manière dont je gère les divisions de sources. Ce système pose cependant un problème : la gestion standards des op. cit. n’est pas idéal.

Cet article est une archive : consultez plutôt son remplaçant : Division de sources et abréviations.

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


[1Les corrections sont mineures, mais les intégrer à l’ancien article aurait été compliqué. Je vous laisse jouer au jeux de sept différences, qui ne sont que deux, et dont une est explicite.

Messages

  • Merci pour les postes sur biblatex, ils sont en train de me rendre bien des services...

    Pour la résolution du troisième problème de division de source, j’ai une ébauche de solution, beaucoup trop bidouillage pour être totalement satisfaisante... C’est de procéder avec phantom. L’idée est de mettre la commande suivante juste après la première citation :
    \phantom{\cite{ActaPetriPauli}\hspace{-0.4cm}}

    Cela pose plusieurs problèmes : le fait de qu’il faille l’insérer pour chaque première référence croisée, et le problème des ibid, étant donné que biblatex va considérer comme dernière citation celle qui n’est pas affichée.

    Je réfléchis en ce moment sur la mise en forme des citations pour une série d’ouvrages en plusieurs volumes. J’aimerais une gestion des citations sensiblement identique à \fvolcite mais en rajoutant la date du volume (voire son éditeur) à la première occurence de celui-ci. Je bloque un peu pour plusieurs raisons mais je pense qu’il faut utiliser la division de sources. Je suis preneuse de toute idée pour résoudre ce problème...

    Merci pour ce site.

    • Pour l’insertion automatique de la commande \phantom{\cite{ActaPetriPauli}…, c’est relativement aisée en utilisant la macro begentry (voir par ex Vérification des filiations avec biblatex (1) : vérifier avec les messages de compilations). Outre le problème des ibidems, j’ai peur d’avoir des ruptures dans la mise en page (j’avais déjà essayé une technique de ce type).

      Pour votre problème : vous devriez modifier le style utilisé par \fvolcite pour afficher la date / le volume. Pour conditionner son affichage, utiliser plutôt ifciteseen

    • Pour le problème, il serait plus propre d’ajouter l’entrée mère à la liste des entrées vues, mais je n’ai pas encore compris comment.

    • Bonne idée que l’utilisation de begentry, je vais essayer. Il est clair que ce serait mieux d’ajouter l’entrée mère à la liste des entrées vues, mais, même si j’y avais bien pensé, je n’ai pas la moindre idée de comment faire. A vrai dire, je ne sais même pas où sont enregistrées les entrées vues !
      Merci pour la rapidité des réponses.

    • de ce que je comprend, les entrées vues sont enregistrées dans une sorte de "tableau". Mais je n’ai pas encore compris comment y intégrer les nouvelles entrées, car il n’y a pas d’API pour cela (voir mon ticket http://sourceforge.net/tracker/index.php?func=detail&aid=3462001&group_id=244752&atid=1126005)

      Par ailleurs l’insertion d’une entrée peut poser des soucis de disparition de blanc http://sourceforge.net/tracker/index.php?func=detail&aid=3462000&group_id=244752&atid=1126005

    • Je viens d’essayer la modification de begentry, ça ne fait rien d’autre que changer la mise en page (j’utilise des footcite) et si je mets avec cite, c’est pire encore !
      Je continue à y réfléchir...

    • Pour mon problème multi-volume, la question est bien d’indiqué la date du volume concerné (6 tomes => 6 dates, et parfois 6 éditeurs) ! je ne vois pas comment entrer toutes les dates dans la seule entrée générale de mon ouvrage...
      C’est pour cela que je m’intéresse à la division des sources.

    • pour le pb multivolume, la solution la plus simple ne serait-elle pas de faire une entrée principal de type @mvbook pour l’ensemble de l’ouvrage et des sous-entrée de type book (crossref) pour chaque volume ? Regardez le manuel de biblatex pour savoir les héritages entre ces deux types d’entrées.

      Qu’avez vous mis pour begentry (entourez le code avec les balises <cadre> et </cadre>)

    • Peut être devriez conditionner à la présence du crossref...

      ne pas mettre de footcite, mais plutôt cite.

    • Dans les deux cas, ça me donne quelque chose de trop bizarre. Je crois que je vais gérer les premières entrées manuellement (en précisant la date des volumes)
      En ce qui concerne mvbook, je ne vois pas tellement ce que ça change par rapport à book, mais c’est peut-être simplement que je ne sais pas l’utiliser.
      Merci pour les conseils.

    • Je pense avoir trouver une solution qui résoudrait tout nos problèmes à la sources. Je teste, et si cela est ok, je fais un article.

    • Ce serait génial. J’attends l’article avec impatience ! Merci.

    • la solution est tellement simple que je m’étonne de ne pas l’avoir trouvée plus tôt.

    • voilà un commentaire qui me rend d’autant plus impatiente !

    • This post is very well written, also has a lot of informations.Thank you.

      Voir en ligne : http://www.youtube.com/watch?v=sCtx...

    • Bonjour,
      Je rencontre un problème dont je ne trouve pas la solution, je voudrais que lorsque je cite des passages différents d’un même livre sans utiliser le champ titleaddon, le livre référé ne soit pas mentionner avec toutes ses informations des sa deuxième mention, mais qu’il utilise les mentions idem, ibid ...
      Quelqu’un a une idée ?
      Merci

    • pour Loïs : normalement c’est le cas si vous utilisez un style de la famille verbose-trad. Rien à faire de votre côté.

    • J’utilise pourtant verbose-trad2 et après divers essais, le résultat est le même. Les termes sont utilisés correctement seulement si je cite le même extrait du livre, toutes les informations du livre sont toujours données quand je change d’extrait. J’utilise les classes @book (correspondant au livre) et @inbook (correspondant aux différents extraits, reliés au livre par crossref).

    • quand tu parle d’extrait, tu veux dire que tu cite des @inbook dans un @book ?

      Peux tu me donner :
       un exemple minimum de ce que tu cite
       un exemple de ce que tu veux obtenir ?

    • Oui, je donne un exemple précis alors :
      Les références :

      @book{genetteesthtetique,
      	editor = "Gérard Genette",
      	entrysubtype = "source",
      	location = "Paris",
      	pagetotal = "245",
      	publisher = "Seuil",
      	booktitle = "{Esthétique et poétique}",
      	year = "1992"
      }
      @inbook{genetteesthetique1,
              crossref = "genetteesthetique",
              title = "Définir l'art",
              titleaddon = "1973",
              author = "George Dickie",
              pages = "9-32"
      }

      Avec un code simple :

      \cite{genetteesthetique}
      \cite[23]{genetteesthetique1}

      Résultat :

      Gérard Genette (ed.), Esthétique et poétique, Paris, Seuil, 1992, 245p.
      George Dickie, "Définir l’art", 1973, dans : Gérard Genette (ed.), Esthétique et poétique, Paris, Seuil, 1992, p.23

      Résultat escompté pour la deuxième citation :

      George Dickie, "Définir l’art", 1973, dans : Ibid, p.23

      Ce serait tellement plus simple s’il y avait un truc pour que ça marche.
      Merci déjà pour votre intérêt !

    • ouais, en fait c’est relativement complexe, car formellement une entrée de type @inbook, lors de l’affichage, ne prend pas en compte l’entrée @book correspondante.

      Il va falloir pas mal modifier les drivers. Je fais des tests demain dans le train/bus, et je pond un article à ce sujet.

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)