Biblatex:2 个自定义字段,只有一个有效

Biblatex:2 个自定义字段,只有一个有效

关注此问题BibLaTeX/BibTeX 自定义字段显示文件链接使用 Biber 和 biblatex 对参考书目条目进行注释我让它工作了(好吧,或多或少)。在下面的代码中,我定义了一个字段filemynote。它对 有效file,但对 无效mynote。我不明白为什么!

\documentclass[%
    a4paper,
    english,
    11pt,
]{article}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@article{Padial:2010,
    title={The integrative future of taxonomy},
    author={José M.~Padial and Aurélien Miralles and Ignacio De la Riva and Miguel Vences},
    journal={Frontiers in Zoology},
    year=2010,
    month=may,
    volume=7,
    number=16,
    pages={1--14},
    doi={10.1186/1742-9994-7-16},
    issn={1742-9994},
    mynote={Very good book!},
    file={./article/2010_Wang.pdf},
    keywords={biology, taxonomy},
}
\end{filecontents*}

\usepackage{fixltx2e}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{type1ec}
%\usepackage{lmodern}
\usepackage{microtype}

\usepackage[%
    left=5cm,
    right=2cm,
    %showframe,
    ]{geometry}

\usepackage[color,notref,notcite]{showkeys}

\usepackage[strict,autostyle]{csquotes}

\usepackage[%
    backend=biber,
    style=ieee,
]{biblatex}
\DeclareRangeChars{~,;-+/{}} % add '{}' as page range delimiter
\addbibresource{\jobname.bib}

\DeclareFieldFormat{mynote}{\textbf{#1}}
\DeclareFieldFormat{file}{\href{file:#1}{\textbf{Open file}}}
\AtEveryBibitem{%
    \csappto{blx@bbx@\thefield{entrytype}}{% put at end of entry
        \iffieldundef{file}{\space \textbf{No file!}}{%
        \space \printfield{file}}
        \iffieldundef{mynote}{\space \textbf{No annotation!}}{\space\printfield{mynote}}
    }
}

\usepackage[%
    colorlinks,
    unicode,
    breaklinks,
]{hyperref}

\begin{document}

\nocite{*} % list all entries

\printbibliography
%\printbibliography[keyword=taxonomy]

\end{document}

答案1

这是因为file已经是 biblatex 的一个字段,尽管标准样式未使用该字段,但mynote不是。您必须先 (通过DeclareSourcemap)将mynote字段重新映射为 字段之一,user[a-f]然后才能使用它们。

\documentclass{article}

\usepackage{filecontents}

\begin{filecontents*}{\jobname.bib}
@article{Padial:2010,
    title={The integrative future of taxonomy},
    author={José M.~Padial and Aurélien Miralles and Ignacio De la Riva and Miguel Vences},
    journal={Frontiers in Zoology},
    year=2010,
    month=may,
    volume=7,
    number=16,
    pages={1--14},
    doi={10.1186/1742-9994-7-16},
    issn={1742-9994},
    mynote={Very good book!},
    file={./article/2010_Wang.pdf},
    keywords={biology, taxonomy},
}
\end{filecontents*}

\usepackage[utf8]{inputenc}
\usepackage[color,notref,notcite]{showkeys}

\usepackage[%
    backend=biber,
    style=ieee,
]{biblatex}

\DeclareRangeChars{~,;-+/{}} % add '{}' as page range delimiter

\addbibresource{\jobname.bib}

\DeclareFieldFormat{file}{\href{file:#1}{\textbf{Open file}}}

\AtEveryBibitem{%
    \csappto{blx@bbx@\thefield{entrytype}}{% put at end of entry
        \iffieldundef{file}{\space \textbf{No file!}}{%
        \space \printfield{file}
      }
    }
  }

\DeclareSourcemap{
    \maps[datatype=bibtex]{
      \map{
        \step[fieldsource=mynote]
        \step[fieldset=usera,origfieldval]
    }
  }
}

\DeclareFieldFormat{usera}{\textbf{#1}}

\AtEveryBibitem{%
    \csappto{blx@bbx@\thefield{entrytype}}{% put at end of entry
        \iffieldundef{usera}{%
          \space \textbf{No annotation!}}{%
          \space\printfield{usera}
        }
    }
}

\usepackage[%
    colorlinks,
    unicode,
    breaklinks,
]{hyperref}

\begin{document}

\nocite{*} % list all entries

\printbibliography

\end{document}

在此处输入图片描述

答案2

Biblatex 为该file字段提供内置支持(即使它不是标准字段)。用户可以通过创建新字段来扩展数据模型,但必须在配置文件中声明它们。根据手册(第 175 页),它们的顺序如下:

blx-dm.def→
‘datamodel option’.dbx →
‘style option’.dbx →
‘citestyle option’.dbx and ‘bibstyle option’.dbx →
biblatex-dm.cfg

因此,您可以biblatex-dm.cfg 在工作目录中创建一个文件并使用

\DeclareDatamodelFields[type=field, datatype=literal, skipout=false]{mynote}

filecontents可以使用包和在文件中创建文件

\begin{filecontents}{biblatex-dm.cfg}
    \DeclareDatamodelFields[type=field, datatype=literal, skipout=false]{mynote}
\end{filecontents}

答案3

我注意到的一件事,可能很明显,但我忽略了它,那就是数据模型定义必须在 biblatex 加载之前。正常工作的顺序是:

  1. 使用包文件内容:
\usepackage{filecontents}
  1. 详细说明'biblatex-dm.cfg'所需的内容
\begin{filecontents}{biblatex-dm.cfg}
    \DeclareDatamodelFields[type=field, datatype=literal, skipout=false]{mynote}
    DeclareDatamodelEntryfields{mynote}
\end{filecontents}
  1. 使用以下选项加载 biblatex:
\usepackage[backend=biber,style=ieee,sorting=none]{biblatex}

非常感谢大家的提问和回答!biblatex 的强大功能让我非常惊讶。

相关内容