如何檢查 LaTeX 論文中的引用是否完整?

部落格EasyLaTeX 官方發布日期

核對引用完整性時:正文與 .bib 各查一遍

兩個方向的表現不同。正文引了而 .bib 裡沒有這個 key 時,日誌會給出 Citation 'key' undefined,PDF 中顯示 [?];反過來,.bib 裡有條目但沒被引用過,日誌和 PDF 都不提示,這條文獻只是不進參考文獻列表。

.bib 放兩條、正文只引其中一條時,未被引用的條目不進列表:

refs.bib:

bibtex
@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:

LaTeX
\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 設定。