我使用 LaTeX 并使用 Git 进行版本控制。对于书目管理,我使用 Mendeley。
问题是,每次 Mendeley 同步其.bib
导出时,它们的顺序都不同,这使得书目版本控制变得更加困难。
.bib
我的想法是每次在提交之前对文件中的 BibTex 条目进行排序。
你能帮我吗,如何以聪明(简短而甜蜜)的方式做到这一点? :)
PS 我可以手动运行这个例程。我不需要 git 集成。我只想要程序/脚本对.bib
文件进行排序。
答案1
怎么样bibsort
?
NAME
bibsort - sort a BibTeX bibliography file
SYNOPSIS
bibsort [optional sort(1) switches] < infile >outfile
DESCRIPTION
bibsort filters a BibTeX bibliography, or bibliography frag-
ment, on its standard input, printing on standard output a
sorted bibliography.
这是一个shell脚本包装nawk
(和tr
,sort
和grep
)并包含两个您可能需要注意的警告(请参阅源代码)。
(编辑还有很多bibtex相关的Perl模块...)
编辑2我刚刚发现您想要排序任何键,而bibsort
显然排序依据bibtex 标签只是——但也许它的来源(不太长)仍然有帮助......?
答案2
您可以使用bibtool
(-s
选项 - 根据参考键排序)使用 git post-commit 挂钩。
答案3
参考文献管理器jabref
似乎在首选项中有这样的选项(请参阅文件页面中的排序顺序部分)。它还具有许多有趣的功能:
答案4
我也遇到这个问题了,Mendeley 还没解决。基于 que que 的伟大建议,我使用 emacs 解决了我的问题,但是是在批处理模式下,很好地允许我将解决方案包装在 shell 脚本中。
首先,我创建了以下 emacs lisp 脚本(我们称之为 bibsort.el):
( defun bibsort()
( bibtex-sort-buffer )
( save-buffer )
)
这将按键名对任何 bibtex 文件进行排序,然后保存。您可以从命令行以批处理模式调用该脚本。我进一步编写了一个 shell 脚本,通过检查“git diff”的返回代码,为每个 Mendeley 重新排序的 bibtex 文件(有或没有新的引用)调用它文件名“(这样可以节省时间,因为不必在未更改的文件上运行 lisp 代码)。
这是 shell 脚本(我们想象一下将其称为 bibsort.sh),它假设 bibtex 文件和 lisp 脚本都位于当前目录中:
#!/bin/bash
bibliobasher() {
IFS=$( echo -en "\n" )
BIBFILES=*.bib
for bibfile in $BIBFILES
do
git diff --quiet "$bibfile" 2> /dev/null
if [ $? = 1 ]; then
emacs --batch -l bibsort.el "$bibfile" -f bibsort
fi
done
}
bibliobasher
只需在每次 git 提交之前运行它(如有必要,在设置文件权限后):
chmod a+x bibsort.sh
./bibsort.sh
git commit ...
它不会触及 Mendeley 添加的额外的非 bibtex 行,并且应该适用于任何带有 emacs 的 Unix/Linux 安装。它也可以在 Windows 中的 GIT 控制台(我正在使用)上运行,但您必须单独安装 emacs 的 MINGW 版本。
对我来说,git 提交现在可以优雅且经济地工作。希望这可以帮助 ...