TeX e LaTeX. Il database BibTeX

Per usare BibTeX prima di tutto bisogna creare una bibliografia, di solito un file ASCII con estensione .bib, in cui inserire i riferimenti ed una parola chiave che permetta di identificarli univocamente. Sebbene sia possibile gestire questo database usando un semplice editor di testo, è spesso più comodo e veloce usare degli strumenti appositi, come JabRef e cb2Bib. Ecco un estratto del mio file bibliodata.bib:

@ARTICLE{Agekyan_1977,
  author = {Agekyan, V. T.},
  title = {Spectroscopic properties of semiconductor
   crystals with direct forbidden energy gap},
  journal = {Physica Status Solidi (a)},
  year = {1977},
  volume = {43},
  pages = {11}
}

@ARTICLE{Baumeister_1961,
  author = {Baumeister, Philip W.},
  title = {Optical Absorption of Cuprous Oxide},
  journal = {Physical Review},
  year = {1961},
  volume = {121},
  pages = {359}
}

Come vedete c'è una sintassi particolare da rispettare. Guardate una guida di base o la documentazione di BibTeX per capire come funziona. Altrimenti affidatevi ai già citati programmi, come JabRef, che comunque lasciano sempre la possibilità di modificare direttamente il database a mano.

Ora la domanda è: quanti database tenere? Molti sono per la filosofia di un unico grande database a meno che gli argomenti siano completamente diversi. Per esempio se uno fa il ricercatore in fisica ma è appassionato di fumetti e vuole fare un file .bib per gli articoli scientifici e uno per i fumetti è chiaro che sarà bene usare due database diversi.

Altri sono invece per tenere un database per ogni macroargomento. Supponiamo che un fisico si occupi di diversi materiali o di due branche diverse della fisica. In questo caso un db per argomento va bene ma spesso ci si ritrova a usare più di un db nel proprio file .tex perché ci possono essere punti di contatto fra i vari argomenti ma anche perché a volte si deve citare un libro di testo generico, che non ha molto senso metterlo nel db di un certo materiale.

Dove posizionare il database

Sia che teniate un unico grande db, sia che ne teniate tanti, si pone la domanda di dove posizionarli. Se il vostro lavoro è un lavoro una tantum potete creare il file .bib accanto al vostro file .tex principale e la storia finisce lì. Se invece lavorate costantenmente su un certo argomento e quindi dovete riusare il db per diverse opere è meglio tenerlo in un posto universale, senza spostarlo a destra e a manca o peggio farne copie di qua e di là perdendo di vista il file più aggiornato.

Escluso quindi il caso di tenere il db accanto al file .tex principale, rimangono tre possibilità per richiamare un file .bib posizionato in una cartella generica del vostro pc:

La soluzione più semplice è quella di creare un link simbolico. In linux è banale: ln -s link file. Su Windows 2000 e Xp non so come si faccia mentre su Windows Vista e 7 è possibile usando il comando mklink link file (purtroppo non c'è la possibilità di farlo dalla shell grafica).

Mettere invece il file .bib in una posizione "visibile" dalla propria distribuzione TeX è un pochino più complicato ma ha vantaggi maggiori. A me però piace molto come soluzione. Ora spiegherò come usarla al meglio.

Innanzitutto conviene scegliere un posto predefinito dove mettere tutti i nostri file .bib. Nel mio caso tutti gli articoli, libri, ecc... si trovano nella directory Biblioteca, divisi per cartelle. All'interno della cartella Biblioteca ho messo i file .bib. Ecco uno schema:

Biblioteca -|
            |
            |- Database.bib
            |- Argomento1\
            |- Argomento1\
            |- Argomento3\
            |- ...
            |- ...

Ora non resta che far capire a MiKTeX o TeXLive che il nostro file.bib "fa parte" della distribuzione, in modo che tutto il suo contenuto sia visibile da tutti gli eseguibili, tra cui latex, pdflatex, bibtex, ecc... Supponendo che il vostro albero locale sia C:\Programmi\MiKTeX_localtexmf\, dovete creare la cartella C:\Programmi\MiKTeX_localtexmf\bibtex\bib\. Dentro di questa create poi un link simbolico al file .bib:

mklink Database.bib ...\Biblioteca\Database.bib

Ora per richiamare un qualsiasi file .bib contenuto nella cartella bibtex-dbs sarà sufficiente specificare il suo nome, indipendentemente da dove si trova il vostro sorgente sul vostro pc.

Gestione collaborativa di un database BibTeX

Spesso in ambiente scientifico ci sono gruppi di persone che lavorano insieme su un certo argomento ed è quindi sensato che usino lo stesso db BibTeX. Un modo semplice è che una sola persona se ne occupi e poi lo distribuisca in qualche modo agli altri (eventualmente anche in maniera automatica con dei programmi di sincronizzazione ecc...).

Una situazione più flessibile è però che tutti i componenti del gruppo possano modificare il db. Per fare ciò in maniera professionale si ha bisogno di un software di controllo revisione come SVN. Tali software però non sono così banali da gestire a meno che già ne facciate uso per altri motivi (per esempio siete dei programmatori). Una soluzione più semplice è quella di usare una semplice cartella sincronizzata con una cloud. Per esempio Dropbox, Google Drive e così via. Una persona del gruppo deve essere il proprietario del db e fare un link simbolico al db nel proprio spazio condiviso. Ognuno deve avere una sincronizzazione con il proprio pc di quel file e i permessi di scrittura. Gli altri del gruppo faranno i link simbolici a quel file sincronizzato nel posto che più gli piace. Esempio:

== PC PROPRIETARIO DEL DB ==
Biblioteca -|
            |- database.bib (reale)
            |- ...
			
GoogleDrive -|
             |- database.bib (link)
             |- ...

MiKTeX_localtexmf\bibtex\bib -|
                              |- database.bib (link)
                              |- ...

== PC UTENTE ==
Biblioteca -|
            |- database.bib (link)
            |- ...
			
GoogleDrive -|
             |- database.bib (reale)
             |- ...

MiKTeX_localtexmf\bibtex\bib -|
                              |- database.bib (link)
                              |- ...

Sia il proprietario del db che i vari utenti dovranno sempre e solo aprire il file che si trova nella cartella Biblioteca. Questo perché si presume che la struttura di molte cartelle all'interno di Biblioteca sia uguale per tutti gli utenti di modo che funzionino i link ai file pdf.

Questo approccio funziona fintanto che le modifiche al db sono sporadiche e fatte sostanzialmente da una persona alla volta. JabRef gestisce bene questa situazione ricaricando automaticamente il database nel caso si accorga che è stato cambiato.

Se il gruppo è estremamente numeroso l'unica soluzione è usare SVN oppure rinunciare a tenere un db direttamente in formato BibTeX. Esistono infatti strumenti appositi come Mendeley, Qiqqa, Zotero oppure gestori web di database bibliografici come CiteULike, ecc... che nascono principalmente con l'idea della collaborazione. Mendeley e Qiqqa permettono anche di avere uno spazio web dove mettere gli articoli in modo che possano essere condivisi direttamente con gli altri appartenenti al progetto.

L'unico problema con questi programmi è che ogni volta che si deve usare il db per un file LaTeX, c'è bisogno di esportare il database in formato .bib e copiarlo in una cartella utile. Il processo di conversione però porta spesso problemi o quantomento una perdita di tempo sebbene sia molto veloce.

Quali convenzioni usare per le chiavi bibliografiche

Quando si crea un database, la chiave bibliografica deve essere creata con delle regole ben precise per una facile gestione futura del database e per un facile uso nei documenti LaTeX. Inoltre è bene che queste regole generino possibilmente chiavi univoche e allo stesso tempo contenenti informazioni sull'opera a cui si riferiscono. Esistono molti diversi modi di creare una chiave bibliografica a partire dalle informazioni del lavoro in questione. Lo schema più diffuso è

cognomeANNO

Purtroppo questo schema può facilmente creare dei conflitti. Si potrebbero introdurre le iniziali del o dei nomi degli autori ma lo schema diventerebbe troppo complesso, forse inutilmente. Anche l'introduzione di più cognomi oltre a quello del primo autore è sconsigliabile.

Per diminuire la probabilità di casi duplicati si usa a volte uno schema di questo tipo:

cognomeANNOparola/e

dove parola/e è la prima o le prime parole non banali del titolo dell'opera (questo è il metodo adottato da Google Scholar). Spesso però, in un determinato campo di studio, gli articoli possono cominciare frequentemente con la stessa parola. Soprattutto, appunto, se sono dello stesso autore.

Un altro metodo è quello di aggiungere l'abbreviazione del nome della rivista:

cognomeANNOrivista

Ma anche questo non garantisce l'univocità della chiave.

Un altro metodo "più univoco" è quello di usare il numero di pagina della rivista:

cognomeANNOpagina

Infatti, al contrario del nome della rivista, avere lo stesso numero di pagina è molto più difficile.

Tutti questi schemi non garantiranno però mai una vera unicità delle chiavi. Per ovviare a questo problema si usa aggiungere delle lettere o dei numeri progressivi alla fine delle chiavi uguali per poterle distinguere. Le chiavi, in quest'ultimo caso, anche se meno facili da ricordare hanno il vantaggio di essere univoche. Lo svantaggio di questa convenzione risiede principalmente nel fatto che la lettera non dà alcuna informazione aggiuntiva sull'opera. Ecco un esempio applicato allo schema autoreANNO:

cognomeANNOlettera

In linea di principio quindi, come chiavi, sarebbe sufficiente usare solamente dei numeri consecutivi. In realtà sebbene questa soluzione sia molto semplice, non viene mai adottata. Anzi! I programmi per la gestione delle bibliografie non la prevedono mai! Questo secondo me è un male.

Per motivi di leggibilità spesso si inseriscono degli underscore o dei trattini o due punti per separare le varie parti della chiave (gli underscore sono caratteri attivi in LaTeX, ma fino a ora non hanno mai creato problemi, se non per un pacchetto per il controllo delle citazioni, non ricordo quale, ma comunque sostituibile con un altro simile e comunque solo con certe opzioni). Per esempio:

cognome_ANNO
cognome-ANNO
cognome:ANNO

Bisogna notare che se proprio si vuole mettere un separatore, è meglio usare l'underscore o i due punti perché molti cognomi contengono già il trattino! E questo confonderebbe le cose. I due punti si possono usare, anche se a volte danno problemi se si converte il database in altri formati.

Ovviamente in un database non si hanno solo articoli ma anche altri tipi di opere. Per esempio libri. In questo caso io preferisco aggiungere la parola book alla chiave per distinguerla da un semplice articolo. Aggiungo book anche per singoli capitoli interni a un libro (tipo inbook). Aggiungo invece PhDthesis per le tesi di dottorato, Mthesis per le tesi di laurea, err nel caso degli errata, tr per i rapporti tecnici e proc per i proceedings nel loro complesso e per gli articoli contenuti nei proceedings (inproceedings). Ovviamente questo schema ha senso per un db dove la maggior parte dei record sono articoli.

Se un'opera è divisa in più articoli, chiamati "Parte I", "Parte II", e simili tendo ad aggiungere il suffisso I, II, ecc... In realtà questo modo di procedere credo non sia molto valido. Ci devo pensare. Il fatto è che non è facilmente gestibile da un generatore di chiavi.

Supponiamo di adottare lo schema cognome_ANNO_pagina. L'indicazione della pagina dovrà essere obbligatoria oppure dovrà essere usata solo per casi di chiavi uguali? Questo è un bel problema. Normalmente si tenderebbe a optare per la seconda ipotesi per ovvi motivi di semplicità. Difatti sono propenso anche io per questa scelta ma bisogna tener presente che nel momento che abbiamo già chiamato la chiave di un articolo Pippo_1999, se per caso trovassimo un altro articolo di Pippo del 1999 come lo chiameremo? Pippo_1999_ppp (dove ppp è la pagina)? In questo modo avremo una asimmetria Pippo_1999, Pippo_1999_ppp. Se però cambiassimo la chiave all'articolo precedente aggiungendo il numero di pagina, tutti i documenti LaTeX che facevano riferimento a quell'articolo non riuscirebbero più a trovare la citazione se ricompilati. Quindi si capisce che parti opzionali nella chiave non ci devono essere.

Un altro aspetto da considerare è che spesso i programmi che gestiscono i db, possono collegare il pdf sul vostro hard disk con il record bibliografico. Per farlo comparano il nome del file, senza estensione, alla chiave del record bibliografico. Semplificare la chiave bibliografica aiuta anche a rinominare i pdf.

Per concludere ritengo che lo schema migliore da adottare sia il semplice cognome_ANNO con eventuali lettere a, b, ecc... per i duplicati. Introdurre il numero di pagina potrebbe aiutare ma si tratterebbe comunque di una cosa da aggiungere sempre, rispetto alle lettere a, b, c ecc... che vengono aggiunte in automatico quando serve. La cosa da ricordare è quella di spuntare l'opzione "Non sovrascrivere le chiavi bibliografiche di JabRef". In questo modo eventuali chiavi particolari che sono state inserite a mano non verranno modificate da una successiva generazione automatica delle chiavi. (Basti pensare alle voci "misc", dove un qualsiasi pattern molto probabilmente fallirà!)

Default pattern   [auth]_[year]
Article           [auth]_[year]
Book              [auth]_[year]_book
Inbook            [auth]_[year]_book
Inproceedings     [auth]_[year]_proc
Masterthesis      [auth]_[year]_Mth
Misc              [auth]_[year]
Patent            [auth]_[year]_patent
Periodical        [auth]_[year]
Phdthesis         [auth]_[year]_PhDthesis
Proceedings       [auth]_[year]_proc
Techreport        [auth]_[year]_tr
Unpublished       [auth]_[year]

Quale codifica usare per il database BibTeX

Un database più portabile possibile deve essere ovviamente scritto in ASCII. L'integrazione di BibTeX con altri programmi e la continua migrazione di tutte le applicazioni verso la codifica utf-8 fa però propendere per l'uso di UTF-8 (almeno per i caratteri comuni: lettere accentate, lettere di alfabati non latini, ecc...).

Purtroppo però bibtex o bibtex8 non sanno gestire bibliografie in utf-8. Questa gestione riguarda però il solo processamento delle voci bibliografiche, per esempio nel caso dell'ordinamento alfabetico. Pertanto se usate i comandi bibtex o bibtex8 -8 e il vostro database è in utf-8 non avrete comunque grossi problemi perché questi programmi non faranno altro che copiare byte per byte i vari campi. Chiaramente falliranno nell'ordinamento alfabetico se il cognome del primo autore contiene caratteri non ASCII.

Esistono varie reimplementazioni del programma BibTeX. Oltre il già citato bibtex8 esiste BibTeXu e CL-BibTeX.

bibtex8 non gestisce unicode ma solo le vecchie codifiche regionali (iso-8859-1, ecc...). È però usatissimo con il comando bibtex -8 per aumentare le capacità di memoria di BibTeX (se dovete citare molte opere, bibtex va in errore).

bibtexu è un progetto di Yannis Haralambous per modificare bibtex8 in modo che supporti l'Unicode, mantenendo inalterate, almeno per il momento, tutte le altre opzioni. La pagina del progetto è purtroppo vuota. Il programma è però compreso nella TeXLive 2010.

CL-BibTeX è una riscrittura di bibtex nel linguaggio Common Lisp. Supporta Unicode. È stato scritto principalmente per permettere l'uso di un nuovo formato per la definizione degli stili, al posto del vecchio bst. Necessita di un compilatore Lisp installato sul proprio sistema.

Comandi nella bibliografia

Spesso si ha bisogno di inserire dei comandi per comporre dei nomi particolarmente strani oppure all'interno dei titolo degli articoli. Nel database si possono usare tutti i comandi che si vuole. Se usati comandi non basilari di LaTeX dovrete assicurarvi che poi chi richiamerà quella voce bibliografica abbia caricato i pacchetti necessari. È quindi consigliabile usare meno comandi possibile che non siano comandi standard. Stesso discorso per la codifica dei caratteri usata per la bibliografia. Soprattutto se la dovete dare in giro è consigliabile scriverla in ASCII. Inserendo quindi lettere accentate con i comandi appositi ecc...
BibTeX elimina tutte le maiuscole a parte all'inizio del titolo. Per mantenere le maiuscole nel titolo bisogna racchiudere il testo all'interno di parentesi graffe.

Le direttive COMMENT, PREAMBLE e STRING

COMMENT è inutile perché praticamente in un file .bib tutto ciò che è fuori a un record bibliografico o a STRING e PREAMBLE è considerato un commento. Sconsigliato l'uso di COMMENT.

@COMMENT{questo è un commento
....}

STRING permette di definire delle variabili che poi possono essere riusate in seguito. Tutto ciò che si trova nelle chiavi senza essere circondato da doppi apici o graffe oppure tutto ciò che si trova in PREAMBLE viene considerato come una variabile definita con STRING. Sconsigliato l'uso di STRING.

@STRING{PRL = {Phys. Rev. Lett.}}
@STRING{RMP = {Rev. Mod. Phys.}}

Infine c'è la direttiva più importante, PREAMBLE. Il suo contenuto viene inserito così com'è (purché, come dicevamo, racchiuso da doppi apici) in cima alla bibliografia (cioè in cima al file .bbl). Utilissimo quando nella bibliografia ci sono dei comandi (direttamente in essa o inseriti dal file di stile) che non sono comandi standard di LaTeX. Basti pensare al comando \url{...}. Oppure a del testo in lingua straniera o addirittura in caratteri non latini, per esempio cirillici (useremo il comando \cyrillic{...}). La direttiva PREAMBLE sarà allora così:

@PREAMBLE{"\makeatletter
\@ifundefined{url}{\newcommand{\url}[1]{\texttt{#1}}}{}
\@ifundefined{cyrillic}{\newcommand{\cyrillic}[1]{---}}{}
\makeatother"}

Lasciare ogni tanto degli spazi e non fare le righe troppo lunghe!!! Per esempio dopo \makeatletter e prima di \makeatother lasciare uno spazio (o andare a capo come ho fatto io). Se non si fa così, quando bibtex compone la bibliografia, ricopia male la direttiva PREAMBLE.

Gli indirizzi internet

Accade sempre più spesso che si abbiano dei riferimenti verso indirizzi internet. BibTeX non ha una voce apposita per gli URL. È però sufficiente usare il campo note di una voce qualsiasi, a cui aggiungere il comando url per avere un link cliccabile. Per usare quest'ultimo si ha bisogno del pacchetto hyperref o del pacchetto url. Ecco un esempio di link come voce bibliografica (ricordo che il campo note funziona dappertutto, non solo in MISC).

@MISC{chiave,
  title={titolo opzionale},
  note={\url{http://...}}
}

L'abbreviazione dei nomi delle riviste

Spesso nel database della bibliografia si usa scrivere il nome completo della rivista per motivi di completezza. Nella bibliografia vera e propria però, difficilmente si avrà bisogno del nome completo.

Con i file di stile, come vedremo, si possono manipolare le informazioni contenute in un record bibliografico prima di stamparlo nella bibliografia. Ad esempio è possibile scegliere tra il nome completo o solo l'iniziale del nome di un autore, oppure sostituire i restati autori con l'abbreviazione "et al.", e così via. Purtroppo una delle cose più importanti, e cioè l'abbreviazione automatica dei nomi delle riviste, non è possibile o lo è solo in parte.

Con BibTeX ci sono 3 modi di gestire per poter scegliere di abbreviare o meno i nomi delle riviste quando si compone un documento.

Il primo modo è usare uno stile della bibliografia che si occupi di questa trasformazione. Vedi jabbrv.

Un altro modo è quello di usare nel campo journal una stringa che poi verrà settata al nome completo o al nome abbreviato in base a quale file esterno di definizione si sceglie. Vediamo un esempio. Questo è il recordo bibliografico dove al posto del nome della rivista è stata usata una sigla, PSSa.

@ARTICLE{Agekyan_1977,
  author = {Agekyan, V. T.},
  title = {Spectroscopic properties of semiconductor
   crystals with direct forbidden energy gap},
  journal = PSSa,
  year = {1977},
  volume = {43},
  pages = {11}
}

Ora si creano due file a parte, chiamati, per esempio, short.bib e long.bib dove vengono usate le direttivi viste prima per settare la variabile in questione.

# Contenuto del file short.bib
@string{PSSA="Phys. Status Solidi (a)"}

# Contenuto del file long.bib
@string{PSSA="Physica Status Solidi (a)"}

Ora quando scriverete un documento, nella riga per richiamare il db bibligrafico, se volete i nomi completi, scriverete

\bibliography{long,bibliografia}

se invece volete quelli abbreviati, scriverete

\bibliography{short,bibliografia}

Infine l'ultimo metodo per poter scegliere tra nomi abbreviati o nomi completi è creare un altro campo apposito nel proprio db bibligrafico. Si può usare il campo journal per il nome abbreviato mentre si userà il campo longjournal per il nome completo della rivista (oppure journal per il completo e shortjournal per l'abbreviato, insomma come volete). Ovviamente nel momento che vorrete usare il nome completo dovrete modificare lo stile bibliografico facendo sì che il campo usato sia longjournal e non journal (questo è un tipico caso in cui la modifica a mano del bst è meglio dell'usare makebst). Esempio:

@ARTICLE{Agekyan_1977,
  author = {Agekyan, V. T.},
  title = {Spectroscopic properties of semiconductor
   crystals with direct forbidden energy gap},
  journal = {Phys. Status Solidi (a)},
  longjournal = {Physica Status Solidi (a)},
  year = {1977},
  volume = {43},
  pages = {11}
}

Un'ultima possibilità è usare le funzioni avanzate del vostro gestore della bibliografia. JabRef ad esempio permette di abbreviare, usando una lista di corrisponenze nome completo - nome abbreviato, i nomi delle riviste di tutta la bibliografia in un sol colpo.

Note varie

Spesso i titoli sono molto noiosi da scrivere nella bibliografia, soprattutto se si sa che spesso non verrano usati. A volte si fa copia e incolla dal titolo dell'articolo; così facendo si rischia di inserire caratteri che poi daranno strani errori nella compilazione! A me è capitato copiando titoli di articoli che avevano la parola "film" nel titolo. La copia sembrava perfetta ma la compilazione dava errore di caratteri non riconosciuti. Ebbene il problema era dovuto al fatto che la "f" e la "i" non erano quello che sembravano ma formavano una legatura e quindi io avevo copiato un carattere singolo, "fi" che non è definito in LaTeX (ma viene correttamente composto mettendo una "f" e una "i" vicine nel sorgente).