¿Cómo ordenar (por cualquier clave) las entradas BibTex en el archivo `.bib`?

13

Trabajo con LaTeX y hago versiones con Git. Para la gestión de la bibliografía utilizo Mendeley.

El problema es que cada vez que Mendeley sincroniza sus .bibexportaciones, están en un orden diferente, lo que hace que las versiones de la bibliografía sean mucho más difíciles.

Mi idea es ordenar las entradas de BibTex en el .bibarchivo, cada vez antes de confirmar.

¿Podrías ayudarme a hacer esto de manera inteligente (corta y dulce)? :)

PD: puedo ejecutar esta rutina manualmente. No necesito la integración de git. Solo quiero que el programa / script ordene el .bibarchivo.

Grzegorz Wierzowiecki
fuente
44
Este tipo de pregunta podría tener una mejor audiencia en el sitio TeX - LaTeX StackExchange.
Stéphane Gimenez
No estoy seguro de a dónde pertenece (StackOverflow para la pregunta de programación sobre cómo hacer la clasificación, o (La) TeX para el problema en general), pero no veo nada que relacione esta pregunta con * nix.
yo_y
1
@me_and Parece estar buscando una herramienta de Linux o una forma de script de shell simple para ordenar las entradas de BibTeX, por lo que probablemente esté bien aquí
Michael Mrozek

Respuestas:

8

¿Qué tal 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 un script envoltorio nawk(y tr, sorty grep) e incluye dos advertencias que podría tener que prestar atención a (véase la fuente).

( Editar También hay muchos módulos Perl relacionados con bibtex ...)

Edit2 Acabo de reconocer que le gustaría ordenar cualquier clave, mientras que bibsortaparentemente se clasifica solo por las etiquetas bibtex , pero tal vez su origen (no es demasiado largo) sigue siendo útil ...?

sr_
fuente
7

Puede usar bibtool( -sopción - ordenar según la clave de referencia) con el gancho post-commit de git.

Artem Klevtsov
fuente
No encontré una manera de ordenar por año :-(
fccoelho
4

El administrador de referencias jabrefparece tener esa opción en las preferencias (consulte la sección Ordenar el orden en la página Archivo). También tiene muchas características interesantes:

ingrese la descripción de la imagen aquí

enzotib
fuente
Esta opción se ha eliminado en las versiones más recientes de jabref
fccoelho
No, no lo ha hecho. Se colocó del menú "Archivo" al menú "Ordenar por exportación". Y más criterios de clasificación están disponibles ahora.
Zoltán Csáti
4

Tuve exactamente el mismo problema, hasta mi elección de herramientas: usar git y Mendeley en Linux.

Mi 'solución' es inferior a la de un script de línea de comandos, pero no obstante me hizo feliz, así que aquí está:

(también estaba usando emacs, entonces) lo que hago es abrir una copia del archivo bibtex en emacs después de hacer cualquier trabajo en Mendeley, luego ejecuto

M-x bibtex-sort-buffer

en emacs, guarde los resultados y confirme esos resultados ordenados en git.

Aparentemente, el modo bibtex es estándar en emacs, porque no tuve que instalar nada, y emacs reconoció automáticamente mi '.bib' como un archivo bibtex.

pesófago
fuente
1

Yo también he tenido este problema, que aún no se soluciona en Mendeley. Basado en la gran sugerencia de que que, resolví mi problema usando emacs, pero en modo por lotes, permitiéndome envolver la solución en un script de shell.

En primer lugar, creé el siguiente script emacs lisp (llamémoslo bibsort.el):

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

Esto ordena cualquier archivo bibtex por nombre de clave y luego lo guarda. Puede llamar al script en modo por lotes desde la línea de comandos. Fui más allá al escribir un script de shell para llamarlo para cada archivo bibtex que Mendeley había reordenado (con o sin nuevas referencias), al verificar el código de retorno de "git diff filename " (esto ahorra tiempo al no ejecutar el código lisp innecesariamente en archivos que no han cambiado).

Aquí está el script de shell (imaginémoslo como bibsort.sh), que supone que tanto los archivos bibtex como el script lisp están en el directorio actual:

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

Simplemente ejecútelo (después de configurar los permisos de archivo si es necesario) antes de cada confirmación de git:

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

No tocará las líneas extra no bibtex agregadas por Mendeley, y debería funcionar en cualquier instalación de Unix / Linux con emacs. También funciona en la consola GIT en Windows (que estoy usando), pero tendría que instalar la compilación MINGW de emacs por separado.

Para mí, git commits ahora trabaja de manera elegante y económica. Espero que esto ayude ...

Atrebas
fuente
No es necesario crear la bibsortfunción separada , también emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-bufferlo hará.
Dean Serenevy
0

Los emacs (y xemacs) tienen un complemento llamado AUCTeX , que (entre otros atajos de teclado y ayudantes relacionados con (La) TeX) tiene un modo especial para BibTeX, que incluye la ordenación de .bibarchivos por tecla.

vonbrand
fuente
0

Si desea ejecutar un comando cada vez que se realiza una confirmación, tal vez el post-commitgancho de git pueda ayudar (consulte, por ejemplo, la descripción en el libro de git .

vonbrand
fuente