ISBN nur drucken, wenn DOI nicht angegeben ist (auch im CrossRef-Eintrag!)

ISBN nur drucken, wenn DOI nicht angegeben ist (auch im CrossRef-Eintrag!)

Eine vorherige Frage hierfragt, ob es für Biblatex möglich ist, die ISBN eines Eintrags nur dann zu drucken, wenn dieser nicht bereits eine DOI enthält. Die akzeptierte AntwortvonAndrew Swannbesteht darin, die Quellneuzuordnungsfunktionen von Biblatex zu verwenden, um zu prüfen, ob das doiFeld ungleich null ist, und wenn ja, das isbnFeld zu löschen, sodass es nicht gedruckt wird.

Das Problem bei dieser Lösung ist, dass sie bei Einträgen mit Querverweisen nicht funktioniert. Angenommen, Sie haben einen @proceedingsEintrag mit einem isbnFeld und einen @inproceedingsEintrag mit einem doiFeld sowie ein crossrefFeld, das auf den @proceedingsEintrag verweist. In diesem Fall @inproceedingswerden beim Drucken des Eintrags in der Referenzliste sowohl die DOI als auch die ISBN angezeigt.

Hier ist ein Minimalbeispiel und die Ausgabe:

\documentclass{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
  \maps[datatype=bibtex]{
     \map{
        \step[fieldsource=doi,final]
        \step[fieldset=isbn,null]
        }
      }
}

\begin{filecontents}{\jobname.bib}
@proceedings{book1,
  editor = {Adam Author},
  title = {Book One},
  year = 2020,
  doi = {10.1000/1010},
  note = {DOI only},
}

@proceedings{book2,
  editor = {Betty Bookwriter},
  title = {Book Two},
  year = 2020,
  doi = {10.1000/2020},
  isbn = {123-456-789},
  note = {DOI and ISBN; ISBN should not be displayed},
}

@proceedings{book3,
  editor = {Edward Editor},
  title = {Book Three},
  year = 2020,
  isbn = {123-456-789},
  note = {ISBN only},
}

@inproceedings{article4,
  author =   {Sally Scribe},
  title =    {Article Four},
  doi =      {10:1000/4040},
  crossref = {book3},
  note = {DOI from article, ISBN from crossref should not be displayed},
}

@inproceedings{article5,
  author =   {Walter Writer},
  title =    {Article Five},
  crossref = {book3},
  note = {ISBN from crossref should be displayed},
}
\end{filecontents}

\begin{document}
\nocite{book1,book2,book3,article4,article5}
\printbibliography
\end{document}

Ausgabe des obigen LaTeX-Dokuments, die zeigt, dass Artikel 4 fälschlicherweise sowohl mit einer ISBN als auch einer DOI gedruckt ist

Wie kann Andrews Antwort so angepasst werden, dass sie isbndie doiFelder in den Querverweiseinträgen berücksichtigt? Oder gibt es, falls dies nicht möglich ist, eine andere Lösung (abgesehen von der manuellen Bearbeitung der Bibliografieeinträge), mit der dies erreicht werden kann?

Antwort1

Sourcemaps werden ziemlich früh im .bibAnalyseprozess ausgeführt, lange bevor Feldaliasing und Datenvererbung angewendet wurden. Das bedeutet, dass Ihre Sourcemap einfach nicht weiß, ob ein Eintrag ein bestimmtes Feld erben wird oder nicht.

Es ist wahrscheinlich am besten, das Feld erst zu unterdrücken, biblatexwenn alle Daten verfügbar sind. Der konzeptionell beste Weg geht wahrscheinlich über \AtDataInput, aber es wird ein neues Hilfsmakro benötigt.

\documentclass{article}
\usepackage[backend=biber]{biblatex}

\makeatletter
\newcommand*{\ClearFieldAtDataInput}[1]{%
  \csxappto\blx@bbl@data{%
    \undef\expandafter\noexpand\csname abx@field@#1\endcsname}}
\makeatother

\AtDataInput{%
  \iffieldundef{doi}
    {}
    {\ClearFieldAtDataInput{isbn}}}

\begin{filecontents}{\jobname.bib}
@proceedings{book1,
  editor = {Adam Author},
  title  = {Book One},
  year   = 2020,
  doi    = {10.1000/1010},
  note   = {DOI only},
}
@proceedings{book2,
  editor = {Betty Bookwriter},
  title  = {Book Two},
  year   = 2020,
  doi    = {10.1000/2020},
  isbn   = {123-456-789},
  note   = {DOI and ISBN; ISBN should not be displayed},
}
@proceedings{book3,
  editor = {Edward Editor},
  title  = {Book Three},
  year   = 2020,
  isbn   = {123-456-789},
  note   = {ISBN only},
}
@inproceedings{article4,
  author   = {Sally Scribe},
  title    = {Article Four},
  doi      = {10:1000/4040},
  crossref = {book3},
  note     = {DOI from article, ISBN from crossref should not be displayed},
}
@inproceedings{article5,
  author   = {Walter Writer},
  title    = {Article Five},
  crossref = {book3},
  note     = {ISBN from crossref should be displayed},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\nocite{book1,book2,book3,article4,article5}
\printbibliography
\end{document}

[1] Adam Author, Hrsg. Buch Eins. Nur DOI. 2020. doi: 10.1000/1010.//[2] Betty Bookwriter, Hrsg. Buch Zwei. DOI und ISBN; ISBN sollte nicht angezeigt werden. 2020. doi: 10.1000/2020.//[3] Edward Editor, Hrsg. Buch Drei. Nur ISBN. 2020. ISBN: 123-456-789.//[4] Sally Scribe. „Artikel Vier“. In: Buch Drei. Hrsg. von Edward Editor. DOI aus Artikel, ISBN aus Crossref sollte nicht angezeigt werden. 2020. doi: 10:1000/4040.//[5] Walter Writer. „Artikel Fünf“. In: Buch Drei. Hrsg. von Edward Editor. ISBN aus Crossref sollte angezeigt werden. 2020. ISBN: 123-456-789.


Alternativ können Sie auch die Standard \AtEveryBibitem-/- \AtEveryCitekeyHooks verwenden.

\documentclass{article}
\usepackage[backend=biber]{biblatex}

\newcommand*{\clearisbn}{%
  \iffieldundef{doi}
    {}
    {\clearfield{isbn}}}

\AtEveryBibitem{\clearisbn}
\AtEveryCitekey{\clearisbn}

\begin{filecontents}{\jobname.bib}
@proceedings{book1,
  editor = {Adam Author},
  title  = {Book One},
  year   = 2020,
  doi    = {10.1000/1010},
  note   = {DOI only},
}
@proceedings{book2,
  editor = {Betty Bookwriter},
  title  = {Book Two},
  year   = 2020,
  doi    = {10.1000/2020},
  isbn   = {123-456-789},
  note   = {DOI and ISBN; ISBN should not be displayed},
}
@proceedings{book3,
  editor = {Edward Editor},
  title  = {Book Three},
  year   = 2020,
  isbn   = {123-456-789},
  note   = {ISBN only},
}
@inproceedings{article4,
  author   = {Sally Scribe},
  title    = {Article Four},
  doi      = {10:1000/4040},
  crossref = {book3},
  note     = {DOI from article, ISBN from crossref should not be displayed},
}
@inproceedings{article5,
  author   = {Walter Writer},
  title    = {Article Five},
  crossref = {book3},
  note     = {ISBN from crossref should be displayed},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\nocite{book1,book2,book3,article4,article5}
\printbibliography
\end{document}

verwandte Informationen