如何檢查 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 設定。