Wie werden BibTex-Einträge in der BIB-Datei sortiert?

13

Ich arbeite mit LaTeX und versioniere mit Git. Für die Literaturverwaltung verwende ich Mendeley.

Das Problem ist, dass Mendeley seine .bibExporte jedes Mal in einer anderen Reihenfolge synchronisiert , was die Versionierung von Bibliografien erheblich erschwert.

Meine Idee ist, BibTex-Einträge .bibjedes Mal vor dem Festschreiben in einer Datei zu sortieren .

Könntest du mir helfen, wie das auf kluge (kurze & süße) Weise geht? :)

PS Ich kann diese Routine manuell ausführen. Ich brauche keine Git-Integration. Ich möchte nur, dass das Programm / Skript die .bibDatei sortiert .

Grzegorz Wierzowiecki
quelle
4
Diese Art von Frage könnte ein besseres Publikum auf der TeX - LaTeX StackExchange - Site haben.
Stéphane Gimenez
Nicht sicher, wo dies hingehört (StackOverflow für die Programmierfrage, wie die Sortierung durchgeführt wird, oder (La) TeX für das Problem im Allgemeinen), aber ich sehe nichts, was diese Frage mit * nix in Verbindung bringt.
me_and
1
@me_and Er scheint nach einem Linux-Tool oder einer einfachen Shell-Skript-Methode zum Sortieren von BibTeX-Einträgen zu suchen, also ist es hier wahrscheinlich in Ordnung
Michael Mrozek

Antworten:

8

Wie wäre es 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.

Es ist eine Shell - Skript Verpackung nawk(und tr, sortund grep) und enthält zwei Warnungen Sie achten auf (siehe Quelle) haben könnten.

( Edit Es gibt auch viele bibtex-bezogene Perl-Module ...)

Edit2 Ich habe gerade erkannt, dass Sie nach jedem Schlüssel sortieren möchten , während Sie bibsortanscheinend nur nach den bibtex-Tags sortieren - aber vielleicht ist die Quelle (die nicht zu lang ist) immer noch hilfreich ...?

sr_
quelle
7

Sie können bibtool( -sOption - Sortieren nach dem Referenzschlüssel) mit dem Git-Post-Commit-Hook verwenden.

Artem Klevtsov
quelle
Keine Möglichkeit gefunden, nach Jahr zu sortieren :-(
fccoelho
4

Der Referenzmanager jabrefscheint eine solche Option in den Voreinstellungen zu haben (siehe Abschnitt Sortierreihenfolge auf der Seite Datei). Es hat auch viele interessante Funktionen:

Bildbeschreibung hier eingeben

Enzotib
quelle
Diese Option wurde in neueren Versionen von jabref
fccoelho am
Nein, das hat es nicht. Es wurde aus dem Menü "Datei" in das Menü "Sortierung exportieren" verschoben. Weitere Sortierkriterien sind jetzt verfügbar.
Zoltán Csáti
4

Ich hatte genau das gleiche Problem, bis auf meine Wahl der Tools: Mit Git und Mendeley unter Linux.

Meine "Lösung" ist im Vergleich zu einem Befehlszeilenskript unterdurchschnittlich, hat mich aber trotzdem glücklich gemacht.

(Ich habe auch schon Emacs benutzt, also) Ich öffne eine Kopie der Bibtex-Datei in Emacs, nachdem ich in Mendeley gearbeitet habe, und starte dann

M-x bibtex-sort-buffer

Speichern Sie in Emacs die Ergebnisse und übertragen Sie diese sortierten Ergebnisse in Git.

Anscheinend ist der Bibtex-Modus in Emacs Standard, da ich nichts installieren musste und Emacs mein '.bib' automatisch als Bibtex-Datei erkannt hat.

pestophag
quelle
1

Auch ich hatte dieses Problem, das in Mendeley immer noch nicht behoben ist. Basierend auf dem großartigen Vorschlag von que que habe ich mein Problem mit Emacs gelöst, aber im Batch-Modus, sodass ich die Lösung in ein Shell-Skript einbinden konnte.

Zuerst habe ich das folgende Emacs-Lisp-Skript erstellt (nennen wir es bibsort.el):

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

Dadurch werden alle bibtex-Dateien nach Schlüsselnamen sortiert und dann gespeichert. Sie können das Skript im Batch-Modus über die Befehlszeile aufrufen. Ich habe ein Shell-Skript geschrieben, um es für jede von Mendeley neu geordnete Bibtex-Datei (mit oder ohne neue Referenzen) aufzurufen, indem ich den Rückkehrcode von "git diff filename " überprüfte (dies spart Zeit, indem ich den Lisp-Code nicht unnötig ausführte) Dateien, die sich nicht geändert haben).

Hier ist das Shell-Skript (nennen wir es einfallsreich bibsort.sh), das davon ausgeht, dass sich sowohl die bibtex-Dateien als auch das lisp-Skript im aktuellen Verzeichnis befinden:

#!/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

Führen Sie es einfach vor jedem Git-Commit aus (nach dem Festlegen der Dateiberechtigungen, falls erforderlich):

chmod a+x bibsort.sh
./bibsort.sh
git commit ...

Es wird die von Mendeley hinzugefügten zusätzlichen Nicht-Bibtex-Zeilen nicht berühren und sollte auf jeder Unix / Linux-Installation mit Emacs funktionieren. Es funktioniert auch auf der GIT-Konsole in Windows (die ich verwende), aber Sie müssten den MINGW-Build von Emacs separat installieren.

Git commit arbeitet für mich jetzt elegant und wirtschaftlich. Hoffe das hilft ...

Atrebas
quelle
Es ist nicht erforderlich, die separate bibsortFunktion zu erstellen , emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-bufferdies wird auch durchgeführt.
Dean Serenevy
0

emacs (und xemacs) haben ein Add-On namens AUCTeX , das (neben anderen (La) TeX-bezogenen Tastaturkürzeln und -Hilfen) einen speziellen Modus für BibTeX hat, einschließlich des Sortierens von .bibDateien nach dem Schlüssel.

vonbrand
quelle
0

Wenn Sie bei jedem Commit einen Befehl ausführen möchten, post-commithilft möglicherweise der Git- Hook (siehe z. B. die Beschreibung im Git-Buch) .

vonbrand
quelle