.png)
Uma pergunta anterior aquipergunta se é possível ao Biblatex imprimir o ISBN de uma entrada apenas se ela ainda não contiver um DOI. A resposta aceitaporAndré Swanné usar os recursos de remapeamento de origem do Biblatex para verificar se o doi
campo não é nulo e, em caso afirmativo, limpar o isbn
campo para que não seja impresso.
O problema com esta solução é que ela não funciona para entradas com referência cruzada. Por exemplo, digamos que você tenha uma @proceedings
entrada com um isbn
campo e uma @inproceedings
entrada com um doi
campo, bem como um crossref
campo que faça referência à @proceedings
entrada. Neste caso, quando o @inproceedings
verbete é impresso na lista de referências, são exibidos tanto o DOI quanto o ISBN.
Aqui está um exemplo mínimo e a saída:
\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}
Como a resposta de Andrew pode ser adaptada para que leve em conta isbn
os doi
campos nas entradas com referências cruzadas? Ou, na sua falta, existe alguma outra solução (além de editar manualmente as entradas da bibliografia) que irá conseguir isso?
Responder1
Os mapas de origem são executados bem no início do .bib
processo de análise, antes que o alias de campo e a herança de dados sejam aplicados. Isso significa que seu mapa de origem simplesmente não sabe se uma entrada herdará um determinado campo ou não.
Provavelmente é melhor suprimir o campo apenas biblatex
quando todos os dados estiverem disponíveis. A maneira conceitualmente mais agradável provavelmente passa por \AtDataInput
, mas precisa de uma nova macro auxiliar.
\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}
Alternativamente, você pode usar o padrão \AtEveryBibitem
/ \AtEveryCitekey
ganchos
\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}