\nocite{*} 用于 biblatex/biber 的单个 bibdatasources

\nocite{*} 用于 biblatex/biber 的单个 bibdatasources

一个 tex 文档中使用了多个参考书目资源。这些资源已使用以下方式添加:\addbibresource{}。现在我想使用命令\nocite{*}打印其中一个参考书目资源的所有参考资料。但是,\nocite{*}确实考虑了所有资源,而不仅仅是单个来源(在本例中,它应该是资源 2)。有没有办法用 来指定它\nocite{*}

\RequirePackage{filecontents}
\begin{filecontents*}{\jobname-resource1.bib}
@article{A2014,
author={First Author},
journal={Journal A},
title={First Paper},
year={2014}
}
\end{filecontents*}
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname-resource2.bib}
@article{B2014,
author={Another Author},
journal={Journal B},
title={Second Paper},
year={2014}
}
@article{C2014,
author={Next Author},
journal={Journal C},
title={Third Paper},
year={2014}
}
\end{filecontents*}

\documentclass{article}         


%bib
\usepackage[backend=biber,style=authoryear]{biblatex} % load the package
\addbibresource{\jobname-resource1.bib}
\addbibresource{\jobname-resource2.bib}

%%%%%%%%%%%%%%%
\begin{document}

This is a citation \cite{C2014}
\nocite{*}

\printbibliography 

\end{document}

答案1

您可以使用绑定数据源的参考部分轻松完成此操作:

\documentclass{article}
\usepackage[style=authoryear]{biblatex}
\addbibresource{resource1.bib}
\begin{document}
\begin{refsection}[resource2.bib]
\nocite{*}
\printbibliography
\end{refsection}
\nocite{*}
\printbibliography
\end{document}

这里,第一个\nocite只添加来自的引用,resource2.bib因为它是引用节的本地引用。第二个\nocite只从中选取内容,resource1.bib因为两者都在引用节“'0”中。\printbibliography如果它没有参数,则它位于引用节的本地section

这是对此问题的另一种思考方式,以及为什么它通常很难。biblatex在语义上与书目一起工作,因此引用事物的方式是通过适用于书目的语义信息 - 引用键、条目类型、参考部分等。biber知道如何将这些映射到语义上较低级别的事物,如文件、XML 文件中的标签 ( .bcf) 等。问题是,需要的是一种biblatex在低于“书目”的语义级别(例如“文件”)指定引用键的方法。biblatex在其代码中没有这类事物的概念,而且很难实现(而且会非常混乱)。它可以通过这样的外来概念,例如文件名但这biber对于这种情况还不够,因为biblatex内部数据结构需要在“文件”语义级别跟踪引用和排序列表,而这是不可能的。简而言之,在“一个或多个引用键”和“引用部分中的所有引用键”之间需要有一个书目语义组件,这是\nocite目前所有人都能理解的。由于上述原因,“文件”已被排除。

答案2

以下方法并不完全令人满意,因为从技术上讲,biblatex所有条目都将是\nocited,这导致biblatex应用不必使用的消歧义技术。

主要思想是使用限制于\jobname-resource2.bib

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \perdatasource{\jobname-resource2.bib}
      \step[fieldset=keywords, fieldvalue={, nocitethis}, append]
    }
  }
}

nocitethis为该文件的所有条目添加关键字。

我们还定义\bibcheck

\defbibcheck{mynocite}{%
  \ifboolexpr{test {\ifciteseen} or test {\ifkeyword{nocitethis}}}
    {}
    {\skipentry}
}

此项检查将仅打印参考书目中之前被引用过的条目,或者具有nocitethis只有来自的条目才具有的特定关键字的条目\jobname-resource2.bib

仍需发布\nocite{*}(因此从技术上讲,所有条目都由\nocitedbiber 处理)。

你必须使用bibcheck参考书目中的

\printbibliography[check=mynocite]

我们还需要加载biblatex启用citetracker才能\ifciteseen工作

\usepackage[backend=biber,style=authoryear,citetracker=true]{biblatex}

平均能量损失

\RequirePackage{filecontents}
\begin{filecontents*}{\jobname-resource1.bib}
@article{A2014,
author={First Author},
journal={Journal A},
title={First Paper},
note = {should appear in bib, because it was cited},
year={2014}
}
@article{D2014,
author={First Author},
journal={Journal A},
title={First Paper},
note = {should not be seen in bib},
year={2014}
}
\end{filecontents*}
\begin{filecontents*}{\jobname-resource2.bib}
@article{B2014,
author={Another Author},
journal={Journal B},
title={Second Paper},
note = {should appear in bib, b/c it is in \jobname-resource2 and nocite was issued},
year={2014}
}
@article{C2014,
author={Next Author},
journal={Journal C},
title={Third Paper},
note = {should appear in bib, b/c it is in \jobname-resource2 and nocite was issued},
year={2014}
}
\end{filecontents*}

\documentclass{article}         

\usepackage[backend=biber,style=authoryear,citetracker=true]{biblatex}
\addbibresource{\jobname-resource1.bib}
\addbibresource{\jobname-resource2.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \perdatasource{\jobname-resource2.bib}
      \step[fieldset=keywords, fieldvalue={, nocitethis}, append]
    }
  }
}

\defbibcheck{mynocite}{%
  \ifboolexpr{test {\ifciteseen} or test {\ifkeyword{nocitethis}}}
    {}
    {\skipentry}
}

\nocite{*}
\begin{document}
  This is a citation \cite{A2014}

  \printbibliography[check=mynocite]
\end{document}

在此处输入图片描述

您会注意到有“(2014a)”但没有“(2014b)”,因为 Biber“(2014b)”存在 - 它是D2014- 并且已经被引用(因为\nocite{*}),我们只是通过检查在参考书目中将其抑制住。

答案3

我赞同这样的建议,即能够“引用”特定.bib文件中的所有条目会很有用,但在此之前,快速一次性获取所有引用并不困难。

假设我们想要用文件中的所有输入键填充单个文件.bib,因此我们可以简单地添加一个

\input{nocites}

这意味着我们需要一个名为的文件nocites.tex,其中包含类似

% nocites.tex
\nocite{%
 entrykey1, entrykey2, entrykey3, entrykey4, % ...
}

使用grepsedtr,我们可以轻松做到这一点(而更擅长使用正则表达式的人可能会更轻松/有效地做到这一点):

# assuming a .bib file called `bibliography.bib`
grep @ bibliography.bib | grep -v '@string' | grep -v '\\\@' | sed 's/@.*{//g' | tr '\n' ' ' | sed 's/^/\\nocite{%\n/' | sed '$a}' > nocites.tex

这样做的目的是:

  1. 找到每一行包含‘@’的行;
  2. 丢弃任何包含“@string”的行(可选);
  3. 丢弃任何包含“\@”的行(可选;我的.bib文件需要这个);
  4. 从每一行中删除@<entrytype>{(例如,变成@Book{entry1entry1
  5. 将所有新行变成以空格分隔的单行(可选);
  6. \nocite{%将输入键移至下一行,同时将其添加到文件 a 的前面;
  7. }在文件末尾附加一个结束符;
  8. 将所有这些转换写入名为 的文件中nocites.tex

答案4

此解决方案改编自https://groups.google.com/forum/#!topic/comp.text.tex/WKaSUTrvAV8对我有用。

它使用“段”方法,允许引用一个书目中的所有参考文献,而只引用另一个书目中真正引用的参考文献。有趣的是,这仍然保留了从两个书目中的任何位置引用任何参考文献的能力(这在 refsection 环境中是不可能的)。

这是我的 MWE(从我的代码缩减而来,希望它能起作用),假设你有两个.bib 文件,persobiblio.bib 和 biblio.bib:

\documentclass{article}

\usepackage[utf8]{inputenc}

\usepackage[    
%    style=authoryear,   
    natbib=true,     
    firstinits=true,
    sorting=ydnt,
    defernumbers,
    maxnames=50
]{biblatex}

% First, personal, bibliography. Contains the keyword "own"
\addbibresource{persobiblio.bib} 

% Second, external bibliography (without "own" in keywords)
\addbibresource{biblio.bib}

\begin{document}
% cite something from biblio.bib 
\cite{key}    

% Printing external bibliography (only contains "key")
\printbibliography[segment=0,notkeyword=own,title={External Bibliography},resetnumbers]

% Printing personal bibliography (print all references inside), 
% with a prefix to possibly distinguish them from external ones
\newrefsegment 
\nocite{*}
\printbibliography[keyword=own,title={Personal Publications}, prefixnumbers={{P}-},resetnumbers]

\end{document}

相关内容