Comment trier (par n'importe quelle clé) les entrées BibTex dans le fichier `.bib`?

13

Je travaille avec LaTeX et je fais du versioning avec Git. Pour la gestion de la bibliographie, j'utilise Mendeley.

Le problème est que chaque fois que Mendeley synchronise ses .bibexportations, elles sont dans un ordre différent, ce qui rend le versionnement de la bibliographie beaucoup plus difficile.

Mon idée est de trier les entrées BibTex dans un .bibfichier, à chaque fois avant de les valider.

Pourriez-vous m'aider, comment faire cela de manière intelligente (courte et douce)? :)

PS Je peux exécuter cette routine manuellement. Je n'ai pas besoin d'intégration git. Je veux juste que le programme / script trie le .bibfichier.

Grzegorz Wierzowiecki
la source
4
Ce type de question pourrait avoir une meilleure audience sur le site TeX - LaTeX StackExchange.
Stéphane Gimenez
Je ne sais pas où cela appartient (StackOverflow pour la question de programmation sur la façon de faire le tri, ou (La) TeX pour le problème en général), mais je ne vois rien qui relie cette question à * nix.
me_and
1
@me_and Il semble chercher un outil Linux ou un moyen simple de script shell pour trier les entrées BibTeX, donc c'est très bien ici
Michael Mrozek

Réponses:

8

Et alors 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.

Il est un script shell emballage nawk(et tr, sortet grep) et comprend deux avertissements que vous pourriez avoir à faire attention à (voir la source).

( Modifier Il y a aussi beaucoup de modules Perl liés à bibtex ...)

Edit2 Je viens de reconnaître que vous souhaitez trier pour n'importe quelle clé, tout en bibsortapparemment triant uniquement par les balises bibtex - mais peut-être que sa source (ce n'est pas trop long) est toujours utile ...?

sr_
la source
7

Vous pouvez utiliser bibtool( -soption - trier selon la clé de référence) avec le hook git post-commit.

Artem Klevtsov
la source
N'a pas trouvé un moyen de trier par année :-(
fccoelho
4

Le gestionnaire de référence jabrefsemble avoir une telle option dans les préférences (voir la section Ordre de tri dans la page Fichier). Il possède également de nombreuses fonctionnalités intéressantes:

entrez la description de l'image ici

enzotib
la source
Cette option a été supprimée dans les versions plus récentes de jabref
fccoelho
Non, ce n'est pas le cas. Il a été placé du menu "Fichier" au menu "Exporter le tri". Et plus de critères de tri sont disponibles dès maintenant.
Zoltán Csáti
4

J'ai eu exactement le même problème, jusqu'à mon choix d'outils: utiliser git et Mendeley sur linux.

Ma «solution» est médiocre par rapport à un script de ligne de commande, mais cela m'a quand même fait plaisir, alors voici:

(J'utilisais aussi déjà emacs, donc) ce que je fais, c'est ouvrir une copie du fichier bibtex dans emacs après avoir fait un travail à Mendeley, puis je cours

M-x bibtex-sort-buffer

dans emacs, enregistrez les résultats et validez ces résultats triés dans git.

Apparemment, le mode bibtex est standard dans emacs, car je n'avais rien à installer et emacs reconnaissait automatiquement mon «.bib» comme un fichier bibtex.

pestophage
la source
1

Moi aussi, j'ai eu ce problème, qui n'est toujours pas résolu à Mendeley. Sur la base de la grande suggestion de que que, j'ai résolu mon problème en utilisant emacs, mais en mode batch, ce qui m'a permis d'envelopper la solution dans un script shell.

Tout d'abord, j'ai créé le script lisp emacs suivant (appelons-le bibsort.el):

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

Cela trie tout fichier bibtex par nom de clé, puis l'enregistre. Vous pouvez appeler le script en mode batch depuis la ligne de commande. Je suis allé plus loin en écrivant un script shell pour l'appeler pour chaque fichier bibtex que Mendeley avait réorganisé (avec ou sans nouvelles références), en vérifiant le code retour de "git diff filename " (cela fait gagner du temps en n'exécutant pas inutilement le code lisp sur fichiers qui n'ont pas changé).

Voici le script shell (appelons-le imaginativement bibsort.sh), qui suppose que les fichiers bibtex et le script lisp se trouvent dans le répertoire courant:

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

Il suffit de l'exécuter (après avoir défini les autorisations de fichier si nécessaire) avant chaque validation git:

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

Il ne touchera pas aux lignes supplémentaires non bibtex ajoutées par Mendeley et devrait fonctionner sur toute installation Unix / Linux avec emacs. Il fonctionne également sur la console GIT sous Windows (que j'utilise), mais vous devrez installer séparément la version MINGW d'emacs.

Pour moi, git commits fonctionne désormais de manière élégante et économique. J'espère que cela t'aides ...

Atrebas
la source
Pas besoin de créer la bibsortfonction séparée , le emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-bufferfera aussi.
Dean Serenevy
0

emacs (et xemacs) ont un module complémentaire appelé AUCTeX , qui (entre autres raccourcis clavier et aides liés à (La) TeX) a un mode spécial pour BibTeX, y compris le tri des .bibfichiers par clé.

vonbrand
la source
0

Si vous souhaitez exécuter une commande à chaque fois qu'une validation est effectuée, le post-commithook git peut peut-être vous aider (voir par exemple la description dans le livre git) .

vonbrand
la source