我使用LaTeX,并使用Git进行版本控制。对于书目管理,我使用Mendeley。
问题在于,每次Mendeley同步其.bib
出口时,它们的输出顺序都不同,这使书目版本控制变得更加困难。
我的想法是.bib
每次提交前对文件中的BibTex条目进行排序。
您能帮我吗,如何以灵巧(简短)的方式做到这一点?:)
PS我可以手动运行此例程。我不需要git集成。我只希望程序/脚本对.bib
文件进行排序。
我使用LaTeX,并使用Git进行版本控制。对于书目管理,我使用Mendeley。
问题在于,每次Mendeley同步其.bib
出口时,它们的输出顺序都不同,这使书目版本控制变得更加困难。
我的想法是.bib
每次提交前对文件中的BibTex条目进行排序。
您能帮我吗,如何以灵巧(简短)的方式做到这一点?:)
PS我可以手动运行此例程。我不需要git集成。我只希望程序/脚本对.bib
文件进行排序。
Answers:
怎么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模块 ...)
Edit2我刚刚认识到您想对任何键进行排序,而bibsort
显然仅按bibtex标签进行排序-但也许它的来源(不太长)仍然很有帮助...?
我也一直有这个问题,在Mendeley中仍然没有解决。基于que que的很好建议,我使用emacs解决了我的问题,但是以批处理方式,很好地允许我将解决方案包装在shell脚本中。
首先,我创建了以下emacs lisp脚本(我们称其为bibsort.el):
( defun bibsort()
( bibtex-sort-buffer )
( save-buffer )
)
这将根据关键字名称对所有bibtex文件进行排序,然后将其保存。您可以从命令行以批处理方式调用脚本。我进一步编写了一个shell脚本,以检查Mendeley重新排序的每个bibtex文件(有或没有新引用),方法是检查“ git diff filename ” 的返回代码(这样可以节省时间,因为不必在不需要的情况下运行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 commit之前运行它(如果需要,在设置文件权限之后):
chmod a+x bibsort.sh
./bibsort.sh
git commit ...
它不会碰到Mendeley添加的额外的非bibtex行,并且可以在任何带有emacs的Unix / Linux安装上使用。它也可以在Windows(我正在使用)的GIT控制台上运行,但是您必须单独安装emacs的MINGW构建。
对我来说,git commits现在可以优雅,经济地工作。希望这可以帮助 ...
bibsort
功能,emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-buffer
也将这样做。