僅當未定義 DOI 時才列印 ISBN(包括在交叉引用條目中!)

僅當未定義 DOI 時才列印 ISBN(包括在交叉引用條目中!)

之前的問題在這裡詢問 Biblatex 是否可以僅在條目尚未包含 DOI 時列印條目的 ISBN。 接受的答案經過安德魯·斯旺就是利用Biblatex的源重映射功能來檢查該doi字段是否為非空,如果是,則清除該isbn字段,使其不被打印。

該解決方案的問題在於它不適用於交叉引用條目。例如,假設您有一個帶有欄位@proceedings的條目isbn,還有一個@inproceedings帶有欄位的條目 doi以及crossref引用該條@proceedings目的欄位。在這種情況下,當@inproceedings條目列印在參考文獻清單中時,DOI 和 ISBN 都會顯示。

這是一個最小的範例和輸出:

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

上述 LaTeX 文件的輸出,顯示article4 錯誤地列印了 ISBN 和 DOI

如何調整安德魯的答案,以便它能夠解釋交叉引用條目中的欄位isbndoi或者如果失敗了,是否有其他解決方案(除了手動編輯參考書目條目)可以實現此目的?

答案1

.bib在應用欄位別名和資料繼承之前,來源映射在解析過程中相當早地執行。這意味著您的來源映射根本不知道條目是否會繼承某個欄位。

最好僅在所有biblatex資料可用時才抑制該欄位。概念上最好的方法可能是通過\AtDataInput,但它需要一個新的輔助巨集。

\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] 亞當作者,編輯。書一。僅限 DOI。 2020.doi: 10.1000/1010.//[2] Betty Bookwriter,編。第二冊。 DOI 和 ISBN;不應顯示 ISBN。 2020.doi: 10.1000/2020.//[3] 愛德華編輯,編輯。第三冊。僅 ISBN。 2020.isbn: 123-456-789.//[4] 莎莉·斯克里布。 「第四條」。參見:第三冊。埃德。愛德華編輯。不應顯示文章中的 DOI、交叉引用中的 ISBN。 2020.doi:10:1000/4040.//[5]沃爾特·作家。 「第五條」。參見:第三冊。埃德。愛德華編輯。應顯示來自交叉引用的 ISBN。 2020。


或者,您可以使用標準\AtEveryBibitem/\AtEveryCitekey鉤子

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

相關內容