我想使用 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 样式设置了一些字段和类型别名。一个这样的别名关系将字段变成annote
。annotation
使用 Biber,此别名关系通过特殊的驱动程序源图定义于biblatex.def
(ll. 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]
}
}
这只是说将annote
Biber 发现的每个 都转换为annotation
。实际上,您可以说 内部biblatex
只有annotation
和 没有字段。因此,编写所有代码时只提及而不是 是annote
很自然的。annotation
annote
您遇到的问题是时间问题:此驱动程序源映射已执行后您的用户级简单\DeclareSourcemap
。特别是,当您的 sourcemap 执行时,尚未重命名任何字段名称,并且该字段仍称为annote
。
Guido 的回答中给出了一种解决问题的方法:删除该annote
字段,因为在执行源映射时它仍被调用。你也可以删除,也可以不annotation
删除
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldset=annote, null]
\step[fieldset=annotation, null]
}
}
}
解决该问题的另一种方法是执行源映射中已有的annote
->annotation
映射:因此,首先将所有annote
s 映射到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}