.png)
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 doi
Feld ungleich null ist, und wenn ja, das isbn
Feld 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 @proceedings
Eintrag mit einem isbn
Feld und einen @inproceedings
Eintrag mit einem doi
Feld sowie ein crossref
Feld, das auf den @proceedings
Eintrag verweist. In diesem Fall @inproceedings
werden 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}
Wie kann Andrews Antwort so angepasst werden, dass sie isbn
die doi
Felder 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 .bib
Analyseprozess 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, biblatex
wenn 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}
Alternativ können Sie auch die Standard \AtEveryBibitem
-/- \AtEveryCitekey
Hooks 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}