![未使用的参考书目条目 - 如何检查哪些条目未使用?](https://linux22.com/image/245488/%E6%9C%AA%E4%BD%BF%E7%94%A8%E7%9A%84%E5%8F%82%E8%80%83%E4%B9%A6%E7%9B%AE%E6%9D%A1%E7%9B%AE%20-%20%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E5%93%AA%E4%BA%9B%E6%9D%A1%E7%9B%AE%E6%9C%AA%E4%BD%BF%E7%94%A8%EF%BC%9F.png)
这个问题导致了一个新的方案的出现:
checkcites
在阅读论文时,我会将我想参考或提及的内容放在自定义.bib
文件中(.bib
每篇论文一个文件)。(感谢门德利它非常简单和直接 - 他们称之为“收藏”。
我的意图是.bib
文件中的所有条目都应在文中提及。
如何检查我尚未参考过哪些书目条目?
答案1
另一种方法是使用refcheck
包并添加\nocite{*}
到您的文档中。此包将警告您(除其他事项外)未使用的引用。我的 MWE:
\begin{filecontents}{\jobname.bib}
@BOOK{foo:2012a,
title = {My Title One},
publisher = {My Publisher One},
year = {2012},
editor = {My Editor One},
author = {Author One}
}
@BOOK{foo:2012b,
title = {My Title Two},
publisher = {My Publisher Two},
year = {2012},
editor = {My Editor Two},
author = {Author Two}
}
@BOOK{foo:2012c,
title = {My Title Three},
publisher = {My Publisher Three},
year = {2012},
editor = {My Editor Three},
author = {Author Three}
}
\end{filecontents}
\documentclass{article}
\usepackage{refcheck}
\begin{document}
Hello world \cite{foo:2012a,foo:2012b}.
\nocite{*}
\bibliographystyle{plain}
\bibliography{\jobname}
\end{document}
输出:
文档中未引用的参考文献关键字将显示在 之间?...?
。此外,refcheck
将以下行添加到您的.log
文件中:
<Info by RefCheck> Unused bibitem `foo:2012c' on page 1.
希望能帮助到你。:)
更新:基于这个问题,埃格尔我写了一个名为checkcites
。该脚本的目的是从 LaTeX 辅助文件 ( .aux
) 或参考书目 ( .bib
) 文件中检测未使用或未定义的引用。
请考虑以下示例:document.tex
\begin{filecontents}{\jobname.bib}
@BOOK{foo:2012a,
title = {My Title One},
publisher = {My Publisher One},
year = {2012},
editor = {My Editor One},
author = {Author One}
}
@BOOK{foo:2012b,
title = {My Title Two},
publisher = {My Publisher Two},
year = {2012},
editor = {My Editor Two},
author = {Author Two}
}
@BOOK{foo:2012c,
title = {My Title Three},
publisher = {My Publisher Three},
year = {2012},
editor = {My Editor Three},
author = {Author Three}
}
@BOOK{foo:2012d,
title = {My Title Four},
publisher = {My Publisher Four},
year = {2012},
editor = {My Editor Four},
author = {Author Four}
}
\end{filecontents}
\documentclass{article}
\begin{document}
Hello world \cite{foo:2012a,foo:2012c},
how are you \cite{foo:2012e}, and
goodbye \cite{foo:2012d,foo:2012a}.
\bibliographystyle{plain}
\bibliography{\jobname}
\end{document}
编译后document.aux
会生成一个辅助文件,现在我们使用texlua
(MiKTeX 和 TeX Live 发行版中都有)来运行checkcites
该.aux
文件:
$ texlua checkcites.lua document.aux
该脚本将查找所有未使用和未定义的引用。输出将是:
如果您只想查找.bib
文件中未使用的引用,则可以添加--unused
标志:
$ texlua checkcites.lua --unused document.aux
参数顺序无关紧要,因此您也可以调用:
$ texlua checkcites.lua document.aux --unused
类似地,使用
$ texlua checkcites.lua --undefined foo.aux
将使脚本仅在.tex
文件中查找未定义的引用。
要查找未使用和未定义的引用,您还可以使用标志--all
。如果没有提供标志,checkcites
则将表现得像--all
已提供一样。
该脚本现已可用在 CTAN并将tlmgr
在 TeX Live 2011(或更高版本)上安装它。希望你们喜欢我们的简陋脚本。:)
更新:正如checkcites
现在在 CTAN 和 TeX Live 上可用的那样,不需要显式调用texlua
,也不需要原始checkcites.lua
文件;只需简单调用
$ checkcites --unused document.aux
就足够了,因为脚本已经被正确包装了。:)
答案2
这个问题值得一个简短的回答,以说明它是多么简单checkcites
确实是。在提示符下只需输入...
$ checkcites my_document.aux
...它会打印出格式良好的未使用+未定义的引用列表。
如果您已完整安装最新的 TeX-Live 发行版 (2011+),则此命令可立即使用,其中该命令checkcites
应已包含在您的路径中。这是一个简单的命令行工具;无需对您的文档进行任何修改(例如usepackage
)。
我希望我的回答可以阻止其他人手动从 CTAN 下载脚本、研究文档,只是为了发现在这种情况下 RTFM 是多余的:)。
答案3
一种可能性如下:
- 将 bibtex 书目样式切换为
unsrt
(使用 biblatex 传递sorting=none
选项) - 编译您的文档 --> 带有引用参考文献的 PDF
- 在文档的最末尾(命令之前
\bibliography
)添加一个\nocite{*}
- 编译您的文档 --> 包含所有参考资料的 PDF
- 比较两个 PDF 的参考书目。末尾的“额外”条目是您尚未引用的条目。
但是,如果您在类似 UNIX 的环境中工作,我可能会使用 grep 和 sed 之类的工具从 .aux 文件和 .bib 文件中提取密钥并对其进行区分:
cat paper.aux | grep '\\citation' | sed -e 's/\\citation{\(.*\)}/\1/g' -e 's/ *\(.*\) */\1/g' | tr ',' '\012' | sort -u > paper.keys
cat paper.bib | grep "@.*{.*," | sed -e 's/.*{\(.*\),/\1/' | sort -u > bib.keys
grep -v -f paper.keys bib.keys
第一行将\citation{key1[,key2 ...]}
aux 文件中命令中给出的所有键提取到不同的行中,对它们进行排序和统一(每个条目包含一次)并将结果重定向到文件paper.keys
。第二行对 bib 文件中行中包含的键执行相同操作@<some type>{key,
。第三行打印出bib.keys
不包含在中的每一行paper.keys
,这是您感兴趣的增量。
答案4
这个答案会给你一个线索,但我相信只适用于 biblatex。(我不会在这里重复)
它允许您将\nocite{*}
所有未引用的.bib
文件条目放在参考书目的单独部分中。
通常,人们可能会将其发布为“附加阅读内容”,但在您的情况下,您可以使用它来帮助修剪您的.bib
文件。