如何检查 LaTeX 论文中的引用是否完整?

博客EasyLaTeX发布于

核对引用完整性时:正文与 .bib 各查一遍

两个方向的表现不同。正文引了而 .bib 里没有这个 key 时,日志会给出 Citation 'key' undefined,PDF 中显示 [?];反过来,.bib 里有条目但没被引用过,日志和 PDF 都不提示,这条文献只是不进参考文献列表。

.bib 放两条、正文只引其中一条时,未被引用的条目不进列表:

refs.bib:

@book{knuth1984,
  author = {Donald E. Knuth},
  title = {The TeXbook},
  publisher = {Addison-Wesley},
  year = {1984}
}
@book{lamport1994,
  author = {Leslie Lamport},
  title = {LaTeX: A Document Preparation System},
  edition = {2},
  publisher = {Addison-Wesley},
  year = {1994}
}

main.tex:

\documentclass[11pt]{article}
\usepackage[backend=biber]{biblatex}
\addbibresource{refs.bib}
\begin{document}
\cite{knuth1984}
\printbibliography
\end{document}

出现 [?] 或 undefined 提示时:在日志里定位失效的 key

日志中的提示形如 LaTeX Warning: Citation 'kingma2015' on page 3 undefined。on page 3 指向正文中 \cite 的位置,不指向 .bib,拿到 key 后回到 refs.bib 检索它,确认三件事:

  1. 拼写与大小写是否一致。引用键的拼写与大小写应和数据库保持完全一致。

  2. .bib 文件是否真的挂上了。biblatex 用 \addbibresource{refs.bib},传统 BibTeX 用 \bibliography{refs},文件名写错时所有引用都会失效。

  3. 该 key 是否写在被注释掉的行里。% \cite{...} 不产生引用,检索时会被命中,需要确认行首没有 %。

key 本身没问题的情况也有:首次编译时 .aux 中还没有引用记录,会报 undefined,在 EasyLaTeX 重新编译,等待整次任务完成;若仍未解决,检查日志中的参考文献处理错误。

.bib 里有条目没被引用时:把 key 列表与正文比一遍

这个方向没有日志可看,只能自己比对:把 .bib 里所有 key 列出来,逐个回正文检索。

在 .bib 中逐条读 key,用编辑器搜索框在正文中检索。命中为 0 的条目要么是忘了引用,要么是旧条目,两种情况都要处理。

要确认某条文献能否被样式正常渲染,可以在项目副本里用 \nocite{key} 单独调出它,或用 \nocite{*} 排进列表对照。后者会让所有条目都进参考文献,正稿里留着它,「哪些条目没被引用」就没有判断依据了。

条目字段不全时:按类型核对必填项

缺字段不中断编译,只在参考文献工具的日志里留 Warning--empty ...,输出到 PDF 时对应位置留空或显示样式定义的占位文本。

条目类型常用必填字段缺失后的表现
@articleauthor, title, journal, year年份、卷期或页码留空
@inproceedingsauthor, title, booktitle, year会议名称留空
@bookauthor, title, publisher, year出版信息不全
@misc / @onlineauthor 或 organization, title, year, urlURL 与访问日期不显示

字段名写错(把 journal 写成 journals)不会报错,表现和缺字段一样,核对时以自己样式文件里用到的字段名为准。

\includeonly 分章编译后:完整编译一次再核对参考文献

只有被包含章节里的 \cite 会写进 .aux,被排除章节的引用不参与本轮,参考文献列表可能少几条(\input 进来的内容不受 \includeonly 影响)。交付前去掉那一行做完整编译,再数一遍条目与引用是否对得上。

常见日志提示与处理

报错触发原因处理
LaTeX Warning: Citation 'x' undefinedkey 拼写或大小写与 .bib 不一致,或 .bib 未挂上在 .bib 中检索该 key;核对 \addbibresource 的文件名
LaTeX Warning: There were undefined references.存在失效引用,或上一轮产物未写入按完整顺序重跑;提示仍在则逐 key 核对
Please (re)run Biber on the file: main改过 .bib 但没重跑参考文献工具在平台重新编译并检查参考文献日志
Warning--I didn't find a database entry for "x"BibTeX 在 .bib 中找不到该 key同第一条;确认 .bib 已挂上
Warning--empty year in x条目缺 year 等字段补齐字段;此时条目通常仍会输出,只是信息不全

相关阅读:大型项目管理、编译与排错。

总结

  • 两个方向分别查:正文引不到的 key 看日志,.bib 里没人引的条目靠比对;

  • 日志只覆盖一半:Citation 'x' undefined 只提示缺条目的那一侧;

  • \nocite{*} 只在副本用:正稿里留着它就没法判断哪些条目没被引用;

  • 分章编译后补一次完整编译:被排除章节的引用不会写进 .aux。

引用条目较多、又要反复分章编译时,可以把项目和 refs.bib 一起放进 EasyLaTeX 编辑器,编译入口按 main.tex 设置。