如何在 biblatex 中隐藏 .bbl 文件中的注释字段

如何在 biblatex 中隐藏 .bbl 文件中的注释字段

我想使用 biblatex 隐藏 .bbl 文件中的注释字段。我经常使用注释字段来记录关于给定论文的注释,如果我在注释字段中使用 LaTeX 命令(例如 %),这可能会带来问题。注释字段中包含 % 之类的内容不会在 .bib 文件中引起任何问题,但在 .bbl 文件中包含此类内容会导致编译失败。我尝试遵循是否可以在 biblatex 中抑制 bibtex .bbl 中的特定字段?,但这些对我来说不起作用。

这是我的最小工作示例:

\documentclass[12pt]{article}

\usepackage{biblatex}

\begin{filecontents*}{mwe.bib}
@article{Doe.J-1979a,
    Annote = {10 % strain},
    Author = {John Doe},
    Date-Added = {2020-08-27 10:54:17 -0600},
    Date-Modified = {2020-08-27 12:03:22 -0600},
    Journal = {Journal of LaTeX Issues},
    Title = {Problematic Reference Title},
    Year = {1979}}
\end{filecontents*}

\addbibresource{mwe.bib}

\AtEveryBibitem{\clearfield{annotation}}

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=annotation, null]
    }
  }
}

\begin{document}
\textcite{Doe.J-1979a}
\printbibliography
\end{document}

这将创建以下 .bbl 文件

\begingroup
\makeatletter
\@ifundefined{[email protected]}
  {\@latex@error
     {Missing 'biblatex' package}
     {The bibliography requires the 'biblatex' package.}
      \aftergroup\endinput}
  {}
\endgroup


\refsection{0}
  \datalist[entry]{nty/global//global/global}
    \entry{Doe.J-1979a}{article}{}
      \name{author}{1}{}{%
        {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{%
           family={Doe},
           familyi={D\bibinitperiod},
           given={John},
           giveni={J\bibinitperiod}}}%
      }
      \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{bibnamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authorbibnamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authornamehash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \strng{authorfullhash}{bd051a2f7a5f377e3a62581b0e0f8577}
      \field{sortinit}{D}
      \field{sortinithash}{2ef1bd9a78cc71eb74d7231c635177b8}
      \field{labelnamesource}{author}
      \field{labeltitlesource}{title}
      \field{annotation}{10 % strain}
      \field{journaltitle}{Journal of LaTeX Issues}
      \field{title}{Problematic Reference Title}
      \field{year}{1979}
    \endentry
  \enddatalist
\endrefsection
\endinput

正如您所见,%中的右括号被弄乱了\field{annotation}{10 % strain}

答案1

在 MWE 中,.bib文件包含字段annote,但在源映射中,步骤指定annotation为字段。因此,如果我们在源映射中用包含的字段替换,annotation它将annote%取消,并且不会出现在bbl文件中。因此,\DeclareSourcemap指令应如下所示:

\DeclareSourcemap{
  \maps[datatype=bibtex, overwrite]{
    \map{
      \step[fieldset=annote, null]
    }
  }
} 

答案2

圭多已经给了回答:您需要删除annote源映射中的字段。但了解原因可能会很有趣。

biblatex为向后兼容一些流行的 BibTeX 样式设置了一些字段和类型别名。一个这样的别名关系将字段变成annoteannotation使用 Biber,此别名关系通过特殊的驱动程序源图定义于biblatex.defll. 1305-1337 在 v3.15a 中

\DeclareDriverSourcemap[datatype=bibtex]{
  <...>
  \map{
    \step[fieldsource=hyphenation,   fieldtarget=langid]
    \step[fieldsource=address,       fieldtarget=location]
    \step[fieldsource=school,        fieldtarget=institution]
    \step[fieldsource=annote,        fieldtarget=annotation]
    \step[fieldsource=archiveprefix, fieldtarget=eprinttype]
    \step[fieldsource=journal,       fieldtarget=journaltitle]
    \step[fieldsource=primaryclass,  fieldtarget=eprintclass]
    \step[fieldsource=key,           fieldtarget=sortkey]
    \step[fieldsource=pdf,           fieldtarget=file]
  }
}

这只是说将annoteBiber 发现的每个 都转换为annotation。实际上,您可以说 内部biblatex只有annotation和 没有字段。因此,编写所有代码时只提及而不是 是annote很自然的。annotationannote

您遇到的问题是时间问题:此驱动程序源映射已执行您的用户级简单\DeclareSourcemap。特别是,当您的 sourcemap 执行时,尚未重命名任何字段名称,并且该字段仍称为annote

Guido 的回答中给出了一种解决问题的方法:删除该annote字段,因为在执行源映射时它仍被调用。你也可以删除,也可以不annotation删除

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldset=annote,     null]
      \step[fieldset=annotation, null]
    }
  }
}

解决该问题的另一种方法是执行源映射中已有的annote->annotation映射:因此,首先将所有annotes 映射到annotation,然后删除annotation

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=annote,  fieldtarget=annotation]
      \step[fieldset=annotation, null]
    }
  }
}

请注意,在任何情况下,这都\AtEveryBibitem{\clearfield{annotation}}无济于事,因为从文件%中读取条目数据时已经发生了从中得到的错误.bbl,而不是在参考书目中打印字段时发生的错误。此外,标准biblatex样式(除了reading)无论如何都不会显示annotation,因此\clearfield在 MWE 中不会做任何有用的事情。

答案3

添加annotation=false到设置中,例如:\usepackage[style=apa,annotation=false]{biblatex}

相关内容