TeX e LaTeX. BibTeX

BibTeX è un sistema di gestione della bibliografia per LaTeX. Consiste nell'avere uno o più database di opere bibliografiche, ognuna identificata da una chiave che può essere richiamata nel vostro file LaTeX per citare quell'opera, e da un programma che riesca, guardando le opere citate nel vostro documento, a creare il codice per la bibliografia in modo che possa essere facilmente usata da LaTeX. Inizialmente questo sistema è più difficile da usare ma con il tempo si capisce quanto questo strumento sia potente, soprattutto per una persona che scrive spesso sullo stesso argomento e quindi cita molte volte, in diverse opere, gli stessi articoli, a volte dovendo usare anche stili diversi.

Il database 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:

Sconsiglio di usare il percorso completo. 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). Questa soluzione ha l'ulteriore vantaggio che se copiate i sorgenti del vostro documento su una pennetta o ne fate un file zip da inviare a qualcuno ecc... il link simbolico al file .bib non verrà mantenuto ma semplicemente verrà copiato il file .bib originale. In questo modo i sorgenti saranno compilabili anche su un altro pc!

La terza soluzione, quella di mettere il file .bib in una posizione "visibile" dalla propria distribuzione TeX è abbastanza semplice ma necessita di qualche accortezza e oltretutto non ha il vantaggio che il file .bib venga copiato quando copiate il vostro progetto da qualche altra parte. 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 creato la cartella bibtex-dbs e ho messo i file .bib là dentro.

Ora non resta che far capire a MiKTeX o TeXLive che la cartella bibtex-dbs "fa parte" della distribuzione in modo che tutto il suo contenuto sia visibile da tutti gli eseguibili, tra cui latex, pdflatex, bibtex, ecc... Purtroppo non possiamo aggiungere direttamente la cartella bibtex-dbs a quelle della distribuzione perché si possono aggiungere solo cartelle che rispettano una certa struttura, chiamata TDS, come già dovreste sapere. Supponendo che il vostro albero locale sia C:\Programmi\MiKTeX_localtexmf, dovete creare la cartella C:\Programmi\MiKTeX_localtexmf\bibtex. Dentro di questa create poi un link simbolico chiamato bib alla cartella bibtex-dbs:

mklink /D bib bibtex-dbs

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.

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://...}}
}

Uso minimale di BibTeX

I comandi per inserire dei riferimenti nel testo rimangono gli stessi di prima, ~\cite{chiave}, ecc...

La bibliografia va inserita di solito alla fine del documento ma prima dell'indice analitico. Se usate i comandi \mainmatter, ecc..., mettetela sempre nel backmatter. Il codice per inserire la bibliografia è il seguente:

% obbligatorio per book e report,
%facoltativo per article
\cleardoublepage
% se usate book o report e caricate hyperref usate
% anche questo comando per far sì che i link dell'indice
% puntino correttamente alla bibliografia.
\phantomsection

% per le classi book e report
% bibliografia nell'indice come capitolo
% (personalizzare a piacimento)
\addcontentsline{toc}{chapter}{\bibname}

% altrimenti per la classe article
% bibliografia nell'indice come section
% (personalizzare a piacimento)
\addcontentsline{toc}{section}{\refname}

% scegliete lo stile della della bibliografia
% (vedi le guide per gli esempi)
\bibliographystyle{stile}
% ed infine il comando più importante che inserisce
% fisicamente la bibliografia ed ha come argomento il nome
% (eventualmente con il percorso) del file .bib,
% senza però l'estensione .bib
\bibliography{file della bibliografia}

Per risolvere i riferimenti bisogna compilare il documento una prima volta e poi eseguire il comando bibtex su di esso (bibtex ciao_mondo.tex). Infine ricompilaretre volte il documento.
Ricordatevi che se cambiate lo stile della bibliografia, dovete dare il comando bibtex e poi ricompilare il vostro documento. È bibtex infatti che si occupa della formattazione della bibliografia secondo lo stile che gli avete indicato.

Il pacchetto tocbibind

Aggiunge automaticamente la bibliografia e l'indici analitico all'indice, eliminando così la necessità di dover scrivere \addcontentsline{toc}{...}{...}. Inoltre si preoccupa anche dell'inserimento del comando \phantomsection dove necessario. Di default tocbibind include nell'indice anche l'indice stesso. Questa cosa è abbastanza brutta! Si toglie facilmente con le opportune opzioni:

\usepackage[nottoc,notlof,notlot,chapter]{tocbibind}

Con chapterbib potrebbe sorgere qualche piccolo problema se si vuole non solo una bibliografia per capitolo ma anche una finale. Il motivo è che tocbibind guarda l'opzione sectionbib di chapterbib e quindi compone la bibliografia finale come se fosse una sezione e non un capitolo. Per ovviare a questo problema basta dire a tocbibind che la bibliografia successiva deve essere come un capitolo:

\tocotherhead{chapter}
\bibliography{...}

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