Bagaimana cara mengurutkan (dengan tombol apa saja) entri BibTex dalam file `.bib`?

13

Saya bekerja dengan LaTeX dan melakukan versi dengan Git. Untuk manajemen bibliografi saya menggunakan Mendeley.

Masalahnya adalah bahwa setiap kali Mendeley menyinkronkan .bibekspornya, mereka berada dalam urutan yang berbeda, yang membuat versi bibliografi jauh lebih sulit.

Ide saya adalah untuk mengurutkan entri BibTex dalam .bibfile, setiap kali sebelum melakukan.

Bisakah Anda membantu saya, bagaimana melakukan ini dengan cara yang cerdas (pendek & manis)? :)

PS Saya bisa menjalankan rutin ini secara manual. Saya tidak perlu integrasi git. Saya hanya ingin program / skrip mengurutkan .bibfile.

Grzegorz Wierzowiecki
sumber
4
Pertanyaan semacam ini mungkin memiliki audiens yang lebih baik di situs TeX - LaTeX StackExchange.
Stéphane Gimenez
Tidak yakin di mana ini termasuk (StackOverflow untuk pertanyaan pemrograman tentang bagaimana melakukan penyortiran, atau (La) TeX untuk masalah secara umum), tapi saya tidak melihat apa pun yang menghubungkan pertanyaan ini dengan * nix.
me_and
1
@me_and Dia sepertinya mencari alat Linux atau cara skrip shell sederhana untuk mengurutkan entri BibTeX, jadi mungkin tidak masalah di sini
Michael Mrozek

Jawaban:

8

Bagaimana dengan 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.

Ini adalah pembungkus skrip shellnawk (dan tr, sortdan grep) dan mencakup dua peringatan yang mungkin harus Anda perhatikan (lihat sumbernya).

( Sunting Ada juga banyak modul Perl terkait bibtex ...)

Sunting2 Saya baru saja mengenali Anda ingin mengurutkan untuk kunci apa saja , sementara bibsorttampaknya hanya mengurutkan berdasarkan tag bibtex - tapi mungkin sumbernya (tidak terlalu lama) masih membantu ...?

sr_
sumber
7

Anda dapat menggunakan bibtool( -sopsi - urutkan sesuai dengan kunci referensi) dengan hook git post-commit.

Artem Klevtsov
sumber
Tidak menemukan cara untuk mengurutkan berdasarkan tahun :-(
fccoelho
4

Manajer referensi jabreftampaknya memiliki opsi seperti itu di preferensi (lihat bagian Urutkan urutan di halaman File). Ini juga memiliki banyak fitur menarik:

masukkan deskripsi gambar di sini

enzotib
sumber
Opsi ini telah dihapus dalam versi terbaru dari jabref
fccoelho
Tidak, belum. Itu dimasukkan dari "File" ke menu "Ekspor penyortiran". Dan lebih banyak kriteria penyortiran tersedia sekarang.
Zoltán Csáti
4

Saya memiliki masalah yang sama persis, sampai ke pilihan alat saya: menggunakan git dan Mendeley di linux.

'Solusi' saya di bawah rata-rata dibandingkan dengan skrip baris perintah, tapi tetap saja itu membuat saya senang, jadi ini dia:

(saya juga sudah menggunakan emacs, jadi) yang saya lakukan adalah membuka salinan file bibtex di emacs setelah saya melakukan pekerjaan di Mendeley, lalu saya jalankan

M-x bibtex-sort-buffer

di emacs, simpan hasilnya, dan komit hasil yang diurutkan itu ke git.

Rupanya bibtex-mode adalah standar dalam emacs, karena saya tidak perlu menginstal apa pun, dan emacs secara otomatis mengenali '.bib' saya sebagai file bibtex.

pestophagous
sumber
1

Saya juga mengalami masalah ini, yang masih belum diperbaiki di Mendeley. Berdasarkan saran besar que que, saya memecahkan masalah saya menggunakan emacs, tetapi dalam mode batch, memungkinkan saya untuk membungkus solusi dalam skrip shell.

Pertama, saya membuat skrip emacs lisp berikut (sebut saja bibsort.el):

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

Ini mengurutkan semua file bibtex dengan nama kunci dan kemudian menyimpannya. Anda dapat memanggil skrip dalam mode batch dari baris perintah. Saya melangkah lebih jauh dalam menulis skrip shell untuk memanggilnya untuk setiap file bibtex yang telah Mendeley ulang (dengan atau tanpa referensi baru), dengan memeriksa kode kembali dari "git diff nama file " (ini menghemat waktu dengan tidak menjalankan kode lisp yang tidak perlu pada file yang belum berubah).

Inilah skrip shell (mari kita sebut bibsort.sh), yang mengasumsikan bahwa kedua file bibtex dan skrip lisp ada di direktori saat ini:

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

Jalankan saja (setelah mengatur izin file jika perlu) sebelum setiap git melakukan:

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

Itu tidak akan menyentuh garis non-bibtex tambahan yang ditambahkan oleh Mendeley, dan akan bekerja pada instalasi Unix / Linux dengan emacs. Ini juga berfungsi pada konsol GIT di Windows (yang saya gunakan), tetapi Anda harus menginstal build MINGW dari emacs secara terpisah.

Bagi saya, git commit sekarang bekerja dengan elegan dan ekonomis. Semoga ini membantu ...

Atrebas
sumber
Tidak perlu membuat bibsortfungsi yang terpisah , emacs Bibliography.bib --batch -f bibtex-sort-buffer -f save-bufferakan melakukannya juga.
Dean Serenevy
0

emacs (dan xemacs) memiliki add-on yang disebut AUCTeX , yang (antara lain (La) TeX pintasan terkait kunci dan pembantu) memiliki mode khusus untuk BibTeX, termasuk menyortir .bibfile dengan kunci.

vonbrand
sumber
0

Jika Anda ingin menjalankan perintah setiap kali komit dilakukan, mungkin git post-commithook dapat membantu (lihat misalnya deskripsi di buku git .

vonbrand
sumber