Imprima o ISBN somente se o DOI não estiver definido (inclusive na entrada de referência cruzada!)

Imprima o ISBN somente se o DOI não estiver definido (inclusive na entrada de referência cruzada!)

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 doicampo não é nulo e, em caso afirmativo, limpar o isbncampo 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 @proceedingsentrada com um isbncampo e uma @inproceedingsentrada com um doicampo, bem como um crossrefcampo que faça referência à @proceedingsentrada. Neste caso, quando o @inproceedingsverbete é 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}

Resultado do documento LaTeX acima, mostrando que o artigo 4 foi impresso incorretamente com ISBN e DOI

Como a resposta de Andrew pode ser adaptada para que leve em conta isbnos doicampos 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 .bibprocesso 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 biblatexquando 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}

[1] Adam Autor, ed. Livro Um. Somente DOI. 2020. doi: 10.1000/1010.//[2] Betty Bookwriter, ed. Livro Dois. DOI e ISBN; O ISBN não deve ser exibido. 2020. doi: 10.1000/2020.//[3] Edward Editor, ed. Livro Três. Apenas ISBN. 2020. isbn: 123-456-789.//[4] Sally Scribe. “Artigo Quarto”. In: Livro Três. Ed. por Eduardo Editor. DOI do artigo, ISBN do crossref não devem ser exibidos. 2020. doi: 10:1000/4040.//[5] Walter Escritor. “Artigo Quinto”. In: Livro Três. Ed. por Eduardo Editor. O ISBN da referência cruzada deve ser exibido. 2020. isbn: 123-456-789.


Alternativamente, você pode usar o padrão \AtEveryBibitem/ \AtEveryCitekeyganchos

\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}

informação relacionada