如何检查 LaTeX 论文中的引用是否完整?
核对引用完整性时:正文与 .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 检索它,确认三件事:
-
拼写与大小写是否一致。引用键的拼写与大小写应和数据库保持完全一致。
-
.bib文件是否真的挂上了。biblatex用\addbibresource{refs.bib},传统 BibTeX 用\bibliography{refs},文件名写错时所有引用都会失效。 -
该 key 是否写在被注释掉的行里。
% \cite{...}不产生引用,检索时会被命中,需要确认行首没有%。
key 本身没问题的情况也有:首次编译时 .aux 中还没有引用记录,会报 undefined,在 EasyLaTeX 重新编译,等待整次任务完成;若仍未解决,检查日志中的参考文献处理错误。
.bib 里有条目没被引用时:把 key 列表与正文比一遍
这个方向没有日志可看,只能自己比对:把 .bib 里所有 key 列出来,逐个回正文检索。
在 .bib 中逐条读 key,用编辑器搜索框在正文中检索。命中为 0 的条目要么是忘了引用,要么是旧条目,两种情况都要处理。
要确认某条文献能否被样式正常渲染,可以在项目副本里用 \nocite{key} 单独调出它,或用 \nocite{*} 排进列表对照。后者会让所有条目都进参考文献,正稿里留着它,「哪些条目没被引用」就没有判断依据了。
条目字段不全时:按类型核对必填项
缺字段不中断编译,只在参考文献工具的日志里留 Warning--empty ...,输出到 PDF 时对应位置留空或显示样式定义的占位文本。
| 条目类型 | 常用必填字段 | 缺失后的表现 |
|---|---|---|
| @article | author, title, journal, year | 年份、卷期或页码留空 |
| @inproceedings | author, title, booktitle, year | 会议名称留空 |
| @book | author, title, publisher, year | 出版信息不全 |
| @misc / @online | author 或 organization, title, year, url | URL 与访问日期不显示 |
字段名写错(把 journal 写成 journals)不会报错,表现和缺字段一样,核对时以自己样式文件里用到的字段名为准。
\includeonly 分章编译后:完整编译一次再核对参考文献
只有被包含章节里的 \cite 会写进 .aux,被排除章节的引用不参与本轮,参考文献列表可能少几条(\input 进来的内容不受 \includeonly 影响)。交付前去掉那一行做完整编译,再数一遍条目与引用是否对得上。
常见日志提示与处理
| 报错 | 触发原因 | 处理 |
|---|---|---|
| LaTeX Warning: Citation 'x' undefined | key 拼写或大小写与 .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 设置。