Lumen

Lumen

Eager to know more, about the world, about the intelligence, and about myself.
github

More Elegant Citation Keys

我一直在用 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}

简洁了不少,同时我也能大致猜到是哪几篇文章。算是一个折腾之后有很好结果的问题。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。