我一直在使用 Obsidian 的 Markdown 來寫自己的學術筆記,在 Zotero 中管理我的文獻。連接這兩個應用的就是 Obsidian 裡面的 Zotero Integration 插件。這個插件很好,滿足了我大部分的日常需求,我將想到的有關的文獻以 citation key 的形式插入文本中,然後之後當我需要在 latex 上工作的時候,只需要導入我的 bibtex 就可以自動的將在 Markdown 中嵌入的 citation 直接在 Latex 中使用。
Citation key 的最主要作用就是用一個獨特的字串指向文獻庫內的一篇文章。所以往往在 Citation Key 中會加入很多的論文相關資訊來防止出現一模一樣的 key。同時這種 key 不同於隨機生成的一個 id,它是帶有一定的語義資訊的,最常見的就是作者名字,發布年份,和論文標題,一個例子就是 LearningFineGrainedBimanualManipulationZhao2023
指的就是 “Learning Fine-Grained Bimanual Manipulation with Low-Cost Hardware” 這篇發布於 2023 年的文章,它的第一作者是 “Tony Z. Zhao”。
但這樣的 Citation Key 也是有問題的,最大的問題就是他們太長了。比如 LearningFineGrainedBimanualManipulationZhao2023
作為一個長單詞,嵌入在 Markdown 文本中時很多時候就要額外占一行,這本來就已經在美觀上值得商榷了。而在一個句子需要引用多篇文章的時候,這個問題就變得更加嚴重了,比如下面這串就是我引用的三篇文章。
\cite{bousmalisRoboCatSelfImprovingFoundation2023,brohanRT2VisionLanguageActionModels,reedGeneralistAgent2022}
這極大的破壞了筆記的美感,讓前後句不能同時出現在我的注意範圍內,黏連的標題需要額外的精力分割單詞,這些都破壞了可讀性。雖然 Zotero Integration 提供了很多種 Cite 的方式,包括以論文中正常的方式呈現,但這樣的方法都不利於我之後轉移到 Latex 上的步驟,所以我在嘗試之後還是打算以 Citation Key 的方式進行引用。我想保證在 Citation Key 包含一定的可讀性,讓我能從 Key 中大致猜到是哪篇文章,同時讓它足夠短,又保證它大概率不會重疊。
在閱讀了 Better BibTex 的 文檔 之後,我發現 Better BibTex 的 Citation Key Generator 提供了非常豐富的工具,其實有很好的辦法來定制我們的 CitationKey。下面是我最後選擇的規則。
Title.skipWords(true).abbr(3).substring(1,8) + shortyear + postfix
拆分開來,我們從標題開始,SkipWrods
忽略掉那些常見的功能詞 (of, from, A) 並且移除符號。這樣我們就獲得了一個相對乾淨的標題,然後 abbr(3)
將每個詞的前三個字母拿出來,substring(1,8)
保證我們最後只使用前八個字符,最後再加上兩位數的年限。
其實走到這一步已經很難有重名的可能了,畢竟每年我也讀不了多少文章,新的一年之後又有了新的命名空間。但文檔中還提供了額外的保證唯一性的 postfix
函數,其描述如下:
a pseudo-function that sets the citekey disambiguation postfix using an sprintf-js format spec for when a key is generated that already exists. Does not add any text to the citekey otherwise. You must include exactly one of the placeholders %(n)s (number), %(a)s (alpha, lowercase) or %(A)s (alpha, uppercase). For the rest of the disambiguator you can use things like padding and extra text as sprintf-js allows. With start set to 1 the disambiguator is always included, even if there is no need for it when no duplicates exist. The default format is %(a)s.
簡單的來說就是檢查文獻庫中是否有重名的 key,沒有的話什麼都不做,有的話則會按照一定的規則再加一些後綴保證唯一。這樣就在理論上徹底保證了 Citation key 的唯一性。
對比之前同樣引用的三篇文章,這樣的規則下產生了 Key 就變成了這樣:
\cite{RobSelFo23,RT2VisMo,GenAge22}
簡潔了不少,同時我也能大致猜到是哪幾篇文章。算是一個折騰之後有很好結果的問題。