如何对 `.bib` 文件中的 BibTex 条目进行排序(按任何键)?

如何对 `.bib` 文件中的 BibTex 条目进行排序(按任何键)?

我使用 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(和trsortgrep)并包含两个您可能需要注意的警告(请参阅源代码)。

编辑还有很多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 提交现在可以优雅且经济地工作。希望这可以帮助 ...

相关内容