一个 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
所有条目都将是\
(no
)cite
d,这导致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{*}
(因此从技术上讲,所有条目都由\nocited
biber 处理)。
你必须使用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, % ...
}
使用grep
、sed
和tr
,我们可以轻松做到这一点(而更擅长使用正则表达式的人可能会更轻松/有效地做到这一点):
# 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
这样做的目的是:
- 找到每一行包含‘@’的行;
- 丢弃任何包含“@string”的行(可选);
- 丢弃任何包含“\@”的行(可选;我的
.bib
文件需要这个); - 从每一行中删除
@<entrytype>{
(例如,变成@Book{entry1
)entry1
; - 将所有新行变成以空格分隔的单行(可选);
\nocite{%
将输入键移至下一行,同时将其添加到文件 a 的前面;}
在文件末尾附加一个结束符;- 将所有这些转换写入名为 的文件中
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}