Como classificar (por qualquer tecla) entradas BibTex no arquivo `.bib`?

13

Eu trabalho com o LaTeX e faço versões com o Git. Para gerenciamento de bibliografia, eu uso o Mendeley.

O problema é que, toda vez que o Mendeley sincroniza suas .bibexportações, elas estão em ordem diferente, o que dificulta muito a versão da bibliografia.

Minha idéia é classificar as entradas BibTex no .bibarquivo, antes de confirmar.

Você poderia me ajudar, como fazer isso de maneira inteligente (curta e agradável)? :)

PS Eu posso executar esta rotina manualmente. Eu não preciso de integração com o git. Eu só quero que o programa / script classifique o .bibarquivo.

Grzegorz Wierzowiecki
fonte
4
Esse tipo de pergunta pode ter um público melhor no site TeX - LaTeX StackExchange.
Stéphane Gimenez
Não tenho certeza de onde isso pertence (StackOverflow para a questão de programação de como fazer a classificação ou (La) TeX para o problema em geral), mas não vejo nada que relacione essa questão ao * nix.
me_and
1
@me_and Ele parece estar à procura de uma ferramenta Linux ou maneira simples shell script para classificar entradas de BibTeX, por isso é provavelmente muito bem aqui
Michael Mrozek

Respostas:

8

Que 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.

É um pacote de scripts de shellnawk (e tr, sorte grep) e inclui dois avisos aos quais você deve prestar atenção (consulte a fonte).

( Edit Também há muitos módulos Perl relacionados ao bibtex ...)

Edit2 Acabei de reconhecer que você gostaria de classificar para qualquer chave, enquanto bibsortaparentemente classifica apenas pelas tags bibtex - mas talvez sua fonte (não seja muito longa) ainda seja útil ...?

sr_
fonte
7

Você pode usar bibtool( -sopção - classificar de acordo com a chave de referência) com o gancho pós-confirmação do git.

Artem Klevtsov
fonte
Não encontrou uma maneira de classificar por ano :-(
fccoelho 16/03/19
4

O gerenciador de referência jabrefparece ter essa opção nas preferências (consulte a seção Ordem de classificação na página Arquivo). Também possui muitos recursos interessantes:

insira a descrição da imagem aqui

enzotib
fonte
Esta opção foi removida nas versões mais recentes do jabref
fccoelho 16/18
Não, não tem. Foi colocado do menu "Arquivo" para o menu "Exportar classificação". E mais critérios de classificação estão disponíveis agora.
Zoltán Csáti 21/03/19
4

Eu tive exatamente o mesmo problema, até a minha escolha de ferramentas: usando git e Mendeley no linux.

Minha 'solução' é insignificante comparada a um script de linha de comando, mas mesmo assim me deixou feliz, então aqui está:

(eu também já estava usando o emacs, então) o que faço é abrir uma cópia do arquivo bibtex no emacs depois de fazer qualquer trabalho em Mendeley, depois corro

M-x bibtex-sort-buffer

no emacs, salve os resultados e envie esses resultados classificados para o git.

Aparentemente, o modo bibtex é padrão no emacs, porque eu não precisava instalar nada, e o emacs reconheceu automaticamente meu '.bib' como um arquivo bibtex.

pestófago
fonte
1

Eu também estou tendo esse problema, que ainda não foi corrigido em Mendeley. Com base na grande sugestão de que, resolvi meu problema usando o emacs, mas no modo em lote, permitindo que eu envolvesse a solução em um script de shell.

Primeiro, criei o seguinte script emacs lisp (vamos chamá-lo de bibsort.el):

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

Isso classifica qualquer arquivo bibtex pelo nome da chave e o salva. Você pode chamar o script no modo em lote na linha de comando. Eu fui além ao escrever um shell script para chamá-lo para cada arquivo bibtex que Mendeley havia reordenado (com ou sem novas referências), verificando o código de retorno de "git diff filename " (isso economiza tempo ao não executar o código lisp desnecessariamente em arquivos que não foram alterados).

Aqui está o script shell (vamos chamá-lo de forma criativa de bibsort.sh), que pressupõe que os arquivos bibtex e o script lisp estão no diretório atual:

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

Basta executá-lo (depois de definir as permissões do arquivo, se necessário) antes de cada confirmação do git:

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

Ele não toca nas linhas extras não-bibtex adicionadas por Mendeley e deve funcionar em qualquer instalação Unix / Linux com o emacs. Também funciona no console GIT no Windows (que estou usando), mas você teria que instalar a compilação MINGW do emacs separadamente.

Para mim, o git commit agora funciona de maneira elegante e econômica. Espero que isto ajude ...

Atrebas
fonte
Não há necessidade de criar a bibsortfunção separada , emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-buffertambém o fará.
Dean Serenevy
0

O emacs (e xemacs) possui um complemento chamado AUCTeX , que (entre outros atalhos e auxiliares de teclado relacionados ao (La) TeX e auxiliares) possui um modo especial para o BibTeX, incluindo a classificação de .bibarquivos pela tecla.

vonbrand
fonte
0

Se você quiser executar um comando sempre que uma confirmação for concluída, talvez o post-commitgancho git possa ajudar (veja, por exemplo, a descrição no livro git .

vonbrand
fonte