Как отсортировать (по любому ключу) записи BibTex в файле `.bib`?

13

Я работаю с LaTeX и занимаюсь версионированием с Git. Для управления библиографией я использую Mendeley.

Проблема в том, что каждый раз, когда Mendeley синхронизирует .bibэкспорт, они располагаются в другом порядке, что делает библиографическое управление версиями намного сложнее.

Моя идея состоит в том, чтобы сортировать записи BibTex в .bibфайле, каждый раз перед фиксацией.

Не могли бы вы помочь мне, как сделать это умным (коротким и сладким) способом? :)

PS Я могу запустить эту процедуру вручную. Мне не нужна интеграция с Git. Я просто хочу, чтобы программа / скрипт сортировал .bibфайл.

Гжегож Вежовецкий
источник
4
Этот тип вопросов может иметь лучшую аудиторию на сайте TeX - LaTeX StackExchange.
Стефан Гименес
Не уверен, к чему это относится (StackOverflow для вопроса программирования о том, как выполнить сортировку, или (La) TeX для проблемы в целом), но я не вижу ничего, связывающего этот вопрос с * nix.
me_and
1
@me_and Он, похоже, ищет инструмент Linux или простой сценарий оболочки для сортировки записей BibTeX, так что, вероятно, здесь все хорошо
Майкл Мрозек

Ответы:

8

Как насчет 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.

Это сценарий оболочки обертывание nawktr, sortи grep) и включает в себя два предупреждения , которые , возможно , придется обратить внимание на (см источника).

( Редактировать Там также много связанных с bibtex модулей Perl ...)

Edit2 Я только что узнал, что вы хотите отсортировать по любому ключу, хотя, bibsortвидимо, сортирует только по тегам bibtex - но, возможно, его источник (он не слишком длинный) все еще полезен ...?

Sr-
источник
7

Вы можете использовать bibtool( -sопция - сортировка по ссылочному ключу) с помощью ловушки git post-commit.

Артем Клевцов
источник
Не нашел способа сортировки по годам :-(
fccoelho
4

У менеджера ссылок, jabrefпохоже, есть такая опция в настройках (см. Раздел «Порядок сортировки» на странице «Файл»). У этого также есть много интересных особенностей:

введите описание изображения здесь

enzotib
источник
Эта опция была удалена в более поздних версиях jabref
fccoelho
Нет, это не так. Он был переведен из меню «Файл» в меню «Экспорт сортировки». И более критерии сортировки доступны сейчас.
Золтан Ксати
4

У меня была точно такая же проблема, вплоть до моего выбора инструментов: использование git и Mendeley в Linux.

Мое «решение» не соответствует требованиям сценария командной строки, но тем не менее оно меня порадовало, так что вот оно:

(я также уже использовал emacs, поэтому) я делаю, открывая копию файла bibtex в emacs после того, как я выполняю какую-либо работу в Mendeley, затем я запускаю

M-x bibtex-sort-buffer

в emacs сохраните результаты и передайте эти отсортированные результаты в git.

Очевидно, bibtex-mode является стандартным в emacs, потому что мне не нужно было ничего устанавливать, и emacs автоматически распознал мой '.bib' как файл bibtex.

pestophagous
источник
1

У меня тоже была эта проблема, которая до сих пор не решена в Mendeley. Основываясь на замечательном предложении очереди, я решил свою проблему с помощью emacs, но в пакетном режиме, что позволило мне обернуть решение в сценарий оболочки.

Во-первых, я создал следующий скрипт lisp для emacs (назовем его bibsort.el):

( defun bibsort()
    ( bibtex-sort-buffer )
    ( save-buffer )
)

Это сортирует любой файл bibtex по имени ключа и затем сохраняет его. Вы можете вызвать скрипт в пакетном режиме из командной строки. Я пошел дальше в написании сценария оболочки, чтобы вызывать его для каждого файла bibtex, который Менделей переупорядочил (с новыми ссылками или без них), проверив код возврата из «git diff filename » (это экономит время, не выполняя ненужный код lisp в файлы, которые не изменились).

Вот сценарий оболочки (давайте предположительно назовем его 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 ...

Он не будет касаться дополнительных не-bibtex строк, добавленных Mendeley, и должен работать на любой установке Unix / Linux с emacs. Он также работает на консоли GIT в Windows (которую я использую), но вам придется установить сборку MINGW для emacs отдельно.

Для меня git commits теперь работает элегантно и экономно. Надеюсь это поможет ...

Atrebas
источник
Не нужно создавать отдельную bibsortфункцию, emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-bufferтоже буду это делать.
Дин Сереневы
0

emacs (и xemacs) имеют надстройку под названием AUCTeX , которая (среди других (La) сочетаний клавиш и помощников, связанных с TeX) имеет специальный режим для BibTeX, включая сортировку .bibфайлов по ключу.

vonbrand
источник
0

Если вы хотите запускать команду каждый раз, когда выполняется коммит, возможно, подойдет post-commitловушка git (см., Например, описание в книге git .

vonbrand
источник