Élément indésirable dans la liste de référence lors de l'utilisation de crossref avec biber

Aug 30 2020

Je viens de commencer à utiliser biber / biblatex et j'ai du mal à comprendre certains de ses comportements. Je ne peux pas imaginer que je suis le premier à avoir rencontré ce problème, mais je n'ai pas pu trouver une question en double.

Je cite plusieurs articles publiés dans la même revue. Pour m'assurer que les informations du journal sont cohérentes tout au long des citations, j'ai créé une entrée distincte contenant uniquement les informations du journal. Je crois ensuite cette entrée à partir des entrées d'article. Un exemple de references.bibfichier:

@article{myjournal,
    journaltitle={Journal of Interesting Things},
    publisher={Someone}
}

@article{myarticle1,
    crossref={myjournal},
    title={That thing},
    author={Martypants, Susan},
    year={2019},
}

@article{myarticle2,
    crossref={myjournal},
    title={That other thing},
    author={Rofessor, Peter},
    year={2020}
}

Maintenant, quand je cite les deux myarticle1et myarticle2dans mon document, la liste de référence contient une ligne supplémentaire sans nom, et juste les informations du journal:

Un exemple de travail minimal qui produit cette sortie est:

\documentclass{article}

\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{references.bib}

\begin{document}
    
\cite{myarticle1,myarticle2}
    
\printbibliography{}
    
\end{document}

Fait intéressant, si je cite un seul des deux articles, l'élément de journal «vide» n'apparaît pas. (c'est-à-dire, remplacer \cite{myarticle1,myarticle2}par des \cite{myarticle1}résultats dans une liste de référence d'un élément au lieu de trois.)

Solutions de contournement: je peux copier-coller les informations du journal dans chaque papier et supprimer la référence croisée. Cependant, si je veux plus tard modifier certaines informations sur le journal (par exemple, ajouter une adresse de l'éditeur), je devrais parcourir toutes les entrées. Alternativement, je peux supprimer manuellement l'entrée du .bblfichier, ce qui entraîne également la sortie souhaitée. Aucune de ces solutions ne me satisfait tout à fait.

Question: Quelle est la meilleure façon de structurer le .bibafin que (a) je n'ai pas à taper et à conserver des informations de journal en double, et (b) l'entrée de journal n'apparaisse pas comme un élément distinct dans la liste des références, sauf si elle est explicitement citée ?

Merci de votre aide!

Réponses

2 moewe Aug 31 2020 at 02:43

Le crossrefdomaine ne se limite pas à l'héritage des données. Il s'agit également d'établir une certaine relation parent-enfant entre les entrées (cf. le xrefchamp, qui ne modélise que cette relation parent-enfant sans héritage des données).

Une caractéristique de cette relation parent-enfant est qu'une entrée parent est automatiquement ajoutée à la bibliographie si elle est référencée par un certain nombre d'enfants (même si elle n'est pas citée explicitement). Le nombre exact de références enfants peut être contrôlé avec l' mincrossrefsoption. Sa valeur par défaut est 2, ce qui signifie qu'une entrée parent est ajoutée à la bibliographie si elle est référencée par au moins deux entrées enfants (différentes). C'est le cas dans votre exemple: myjournalest référencé par myarticle1et myarticle2.

Une façon de contourner ce problème serait de définir mincrossrefsune valeur plus élevée (peut-être déraisonnablement élevée), 999comme suggéré par Manuel Weinkauf dans les commentaires .

\documentclass{article}

\usepackage[backend=biber, style=alphabetic, mincrossrefs=999]{biblatex}

\begin{filecontents}{\jobname.bib}
@article{myjournal,
  journaltitle = {Journal of Interesting Things},
  publisher    = {Someone},
}
@article{myarticle1,
  crossref = {myjournal},
  title    = {That thing},
  author   = {Martypants, Susan},
  year     = {2019},
}
@article{myarticle2,
  crossref = {myjournal},
  title    = {That other thing},
  author   = {Rofessor, Peter},
  year     = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\autocite{myarticle1,myarticle2}

\printbibliography
\end{document}

Une alternative serait de dire biblatexqu'il myjournalne s'agit que d'un conteneur de données et non d'une entrée qui pourrait apparaître dans la bibliographie à part entière. Cela se fait en ajoutant options = {dataonly},à l'entrée. Ce n'est pas sans rappeler la suggestion de Cicada , mais un peu plus rigoureux (car cela évitera également la création d'étiquettes, qui échoue ici de toute façon, pour être juste). Cependant, cette solution n'apparaît même pas dans la bibliographie lorsqu'elle est citée explicitement.options={skipbib=true},myjournal

\documentclass{article}

\usepackage[backend=biber, style=alphabetic]{biblatex}

\begin{filecontents}{\jobname.bib}
@article{myjournal,
  journaltitle = {Journal of Interesting Things},
  publisher    = {Someone},
  options      = {dataonly},
}
@article{myarticle1,
  crossref = {myjournal},
  title    = {That thing},
  author   = {Martypants, Susan},
  year     = {2019},
}
@article{myarticle2,
  crossref = {myjournal},
  title    = {That other thing},
  author   = {Rofessor, Peter},
  year     = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\autocite{myarticle1,myarticle2}

\printbibliography
\end{document}

Si vous ne souhaitez pas établir cette relation parent-enfant supplémentaire, il peut être préférable de choisir un autre outil pour le travail: Cicada a suggéré des @xdataconteneurs dans les commentaires . La biblatexdocumentation explique ce xdataqui suit (§2.2.3 Champs spéciaux , p. 31)

Ce champ hérite des données d'une ou plusieurs @xdataentrées. Conceptuellement, le xdatachamp est lié à crossrefet xref: crossrefétablit une relation logique parent / enfant et hérite des données; xrefétablit une relation parent / enfant logique sans hériter de données; xdatahérite des données sans établir de relation. La valeur de xdatapeut être une clé d'entrée unique ou une liste de clés séparées. Voir §3.13.6 pour plus de détails.

Et cela semble un bon ajustement: xdataest crossrefsans la relation parent-enfant qui a causé le comportement indésirable en premier lieu.

Il convient de noter, cependant, que les @xdataentrées ne peuvent pas apparaître dans la bibliographie elles-mêmes et ne peuvent pas être utilement citées. De plus, l'héritage de champ avec @crossrefpeut prendre en compte les types d'entrée des entrées parent et enfant et peut mettre en place des règles telles que le titlechamp d'un @collectionparent est hérité comme booktitleun @incollectionenfant. Cela n'est pas possible (et n'a pas de sens) pour @xdata.

\documentclass{article}

\usepackage[backend=biber, style=alphabetic]{biblatex}

\begin{filecontents}{\jobname.bib}
@xdata{myjournal,
  journaltitle = {Journal of Interesting Things},
  publisher    = {Someone},
}
@article{myarticle1,
  xdata    = {myjournal},
  title    = {That thing},
  author   = {Martypants, Susan},
  year     = {2019},
}
@article{myarticle2,
  xdata    = {myjournal},
  title    = {That other thing},
  author   = {Rofessor, Peter},
  year     = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\autocite{myarticle1,myarticle2}

\printbibliography
\end{document}

Dans ce cas particulier, tous les styles standard ignoreront le publisherchamp pour @articles, vous n'héritez donc que d'un seul champ, à savoir le journal(title). L'héritage d'un seul champ peut également être modélisé avec des @stringentrées. (Mais bien sûr, ce n'est pas une option si vous souhaitez hériter de plusieurs champs à la fois.)

\documentclass{article}

\usepackage[backend=biber, style=alphabetic]{biblatex}

\begin{filecontents}{\jobname.bib}
@string{myjournal = {Journal of Interesting Things}}
@article{myarticle1,
  journal  = myjournal,
  title    = {That thing},
  author   = {Martypants, Susan},
  year     = {2019},
}
@article{myarticle2,
  journal  = myjournal,
  title    = {That other thing},
  author   = {Rofessor, Peter},
  year     = {2020},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\autocite{myarticle1,myarticle2}

\printbibliography
\end{document}

Tous les exemples publiés produisent

1 Selinde Aug 30 2020 at 03:53

Le commentaire de Manuel Weinkauf était en effet la solution:

\usepackage[backend=biber,style=alphabetic,mincrossrefs=99]{biblatex}

Je l'ajoute comme réponse pour que la question puisse être close.