TeX e LaTeX

BibTeX: bibliografie multiple

Bibliografia alla fine di ogni capitolo

Soprattutto nei libri con molti riferimenti bibliografici, la bibliografia viene divisa per capitoli, cioè alla fine di ogni capitolo ci sono tutti i riferimenti citati nel capitolo stesso. Diversi pacchetti permettono di realizzare questa cosa, primi fra tutti bibunits e chapterbib.

bibunits

Ecco un esempio molto semplice. Si suppone che il database BibTeX sia uno solo, bibliodata.bib. Ci saranno i riferimenti alla fine di ciascun capitolo in ordine di apparizione nel capitolo e una bibliografia finale in ordine alfabetico.

\documentclass{book}

% ...
	
% caricamento di bibunits
% globalcitecopy fa sì che il comando \cite produca una voce
% sia nella bibliografia locale che quella finale
% sectionbib fa sì che il titolo bibliografia sia una section
\usepackage[globalcitecopy,sectionbib]{bibunits}

% i riferimenti sono della forma, ad es. [3.4], dove
% 3 è il capitolo e 4 la quarta reference in ordine di apparizione
% in quel capitolo. Compariranno così sia nel testo, sia nella
% bibliografia locale
\makeatletter
\def\@biblabel#1{[\thechapter.#1]}
\def\@cite#1#2{[{\thechapter.#1\if@tempswa , #2\fi }]}
\makeatother

% ...

\begin{document}

% voglio che ci sia una bibliografia locale per ogni capitolo
\bibliographyunit[\chapter]
% dichiaro quale sia lo stile per le bibliografie locali
% e il database BibTeX (senza estensione .bib) comune a tutte.
% Uso uno stile che numeri i riferimenti in ordine di apparizione
\defaultbibliographystyle{unsrt}
\defaultbibliography{bibliodata}

% da qui comincia il vostro documento
% . . .

\chapter{Capitolo1}
% ...
% il comando \putbib inserisce la bibliografia locale
\putbib


\chapter{Capitolo2}
% ...
% il comando \putbib inserisce la bibliografia locale
\putbib

% ora non resta che inserire la bibliografia generale alla solita
% maniera. Uno dei pochi motivi per inserirla è quello di riordinare
% tutti i riferimenti del documento in ordine alfabetico per poter
% dare un'altra chiave di consultazione.

% supponiamo di usare la classe book, ricordatevi
% il \phantomsection nel caso usiate hyperref.
\cleardoublepage
\addcontentsline{toc}{chapter}{\bibname}

% il seguente comando fa sparire la numerazione. Nelle graffe
% si può inserire quello che volete per distinguere graficamente
% le reference (un pallino ecc...)
\makeatletter
\renewcommand{\@biblabel}[1]{}
\makeatother

% queste due righe servono per annullare la formattazione data
% finora alla bibliografia, cioè il carattere di section.
% Chiaramente la bibliografia finale dovrà avere un titolo come
% un capitolo
\bibliographyunit
\let\thebibliography\stdthebibliography

% Ora non resta che scegliere uno stile che ordini le opere in
% ordine alfabetico e infine inserire il comando per la bibliografia
% con il solito nome del database, che in questo semplice esempio,
% è lo stesso usato per le bibliografie locali.
\bibliographystyle{plain}
\bibliography{bibliodata}

% ...

\end{document} 

Purtroppo bibunits non è compatibile con hyperref. Non accade nulla ma i link alla bibliografia non sono più attivi. Per il resto tutto funziona come al solito. Per ovviare a questo problema Enrico Gregorio ha proposto il seguente escamotage:

\usepackage{bibunits}
\usepackage[square]{natbib}
\usepackage{hyperref}
\renewcommand{\bibnumfmt}[1]{[#1]} % per correggere il baco

Purtroppo rimangono degli errori di puntamento del link nel caso in cui una stessa citazione venga ripetuta in diversi capitoli.

chapterbib

Meno sofisticato ed automatico di bibunits ma più semplice e soprattutto compatibile con hyperref è il pacchetto chapterbib. Può esistere solo una bibliografia per ogni file incluso con il comando include. Non è quindi così flessibile come bibunits, anche se questa flessibilità di bibunits è usata molto raramente.

Caricate chapterbib sempre prima di babel e sempre dopo il pacchetto cite.

Ecco alcuni esempi d'uso:

BIBLIOGRAFIA SOLO ALLA FINE DI OGNI CAPITOLO
<main.tex>
\documentclass[a4paper]{book}
\usepackage[sectionbib]{chapterbib}
\begin{document}
\include{cap1}
\include{cap2}
\end{document}

<cap1.tex>
\chapter{Primo}
Riferimento nel primo capitolo~\cite{Pippo_1980} 
\bibliographystyle{...} % stile bibliografia cap 1
\bibliography{...} % db bibliografia dove si trova Pippo_1980

<cap2.tex>
\chapter{Secondo}
Riferimento nel secondo capitolo~\cite{Pluto_1977} 
\bibliographystyle{...} % stile bibliografia cap 2
\bibliography{...} % db bibliografia dove si trova Pluto_1977

PER COMPILARE
latex main
bibtex cap1, bibtex cap2
latex main, latex main

Il seguente codice funziona solo se scrivete il percorso del database nella stessa identica maniera nei file inclusi e nel file principale. Se avete i file .tex da includere in una cartella apposita, o addirittura in più cartelle come spesso accade, questo significa che il percorso del file .bib o deve essere assoluto oppure dovete avere una copia (o un link simbolico) del database in ogni cartella dove sono presenti file da includere. Richiamerete allora il database solo con il suo nome. Se invece volete avere solo una copia o un solo link simbolico accanto al file principale e richiamare il db nel file principale con il nome del db stesso mentre negli altri file con un percorso relativo, allora leggete l'esempio successivo.

BIBLIOGRAFIA GLOBALE E ALLA FINE DI OGNI CAPITOLO 
<main.tex>
\documentclass[a4paper]{book}
\usepackage[sectionbib]{chapterbib}
\begin{document}
\bibliographystyle{alpha} % stile globale da mettere PRIMA di tutti
\include{cap1}
\include{cap2}
\bibliography{...} % db bibliografia
\end{document}

<cap1.tex>
\chapter{Primo}
Riferimento nel primo capitolo~\cite{Pippo_1980} 
\bibliographystyle{...} % stile bibliografia cap 1
\bibliography{...} % db bibliografia dove si trova Pippo_1980

<cap2.tex>
\chapter{Secondo}
Riferimento nel secondo capitolo~\cite{Pluto_1977} 
\bibliographystyle{...} % stile bibliografia cap 2
\bibliography{...} % db bibliografia dove si trova Pluto_1977

PER COMPILARE
latex main
bibtex main, bibtex cap1, bibtex cap2
latex main, latex main

BIBLIOGRAFIA GLOBALE E ALLA FINE DI OGNI CAPITOLO 
<main.tex>
\documentclass[a4paper]{book}
\usepackage[sectionbib]{chapterbib}
\begin{document}

\include{cap1}
\include{cap2}

\bibliographystyle{alpha}
\bibliography{nome_db} % db bibliografia
\end{document}

<cap1.tex>
\chapter{Primo}
Riferimento nel primo capitolo~\cite{Pippo_1980} 
\bibliographystyle{...} % stile bibliografia cap 1
\bibliography{../nome_db} % db bibliografia dove si trova Pippo_1980

<cap2.tex>
\chapter{Secondo}
Riferimento nel secondo capitolo~\cite{Pluto_1977} 
\bibliographystyle{...} % stile bibliografia cap 2
\bibliography{../nome_db} % db bibliografia dove si trova Pluto_1977

PER COMPILARE
inserire l'opzione rootbib in chapterbib
latex main
bibtex main
togliere l'opzione rootbib in chapterbib
latex main
bibtex cap1, bibtex cap2
latex main, latex main

BIBLIOGRAFIA GLOBALE FINALE DIVISA PER CAPITOLI
<main.tex>
\documentclass[a4paper]{book}
\usepackage[gather,sectionbib]{chapterbib}
\begin{document}
\include{cap1}
\include{cap2}
\bibliography{...} % ripetere il db dove volete  
                   % che compaia la bibliogragia globale
\end{document}

<cap1.tex>
\chapter{Primo}
Riferimento nel primo capitolo~\cite{Pippo_1980} 
\bibliographystyle{...} % stile bibliografia cap 1
\bibliography{...} % db bibliografia dove si trova Pippo_1980

<cap2.tex>
\chapter{Secondo}
Riferimento nel secondo capitolo~\cite{Pluto_1977} 
\bibliographystyle{...} % stile bibliografia cap 2
\bibliography{...} % db bibliografia dove si trova Pluto_1977

PER COMPILARE
latex main
bibtex cap1, bibtex cap2
latex main, latex main

BIBLIOGRAFIA PER CAPITOLO E GLOBALE DIVISA PER CAPITOLI
<main.tex>
\documentclass[a4paper]{book}
\usepackage[duplicate,sectionbib]{chapterbib}
\begin{document}
\include{cap1}
\include{cap2}
\bibliography{...} % ripetere il db dove volete  
                   % che compaia la bibliogragia globale
\end{document}

<cap1.tex>
\chapter{Primo}
Riferimento nel primo capitolo~\cite{Pippo_1980} 
\bibliographystyle{...} % stile bibliografia cap 1
\bibliography{...} % db bibliografia dove si trova Pippo_1980

<cap2.tex>
\chapter{Secondo}
Riferimento nel secondo capitolo~\cite{Pluto_1977} 
\bibliographystyle{...} % stile bibliografia cap 2
\bibliography{...} % db bibliografia dove si trova Pluto_1977

PER COMPILARE
latex main
bibtex cap1, bibtex cap2
latex main, latex main

Ecco alcuni comandi che possono risultare utili.

% RINOMINARE LE SINGOLE BIBLIOGRAFIE
\renewcommand{\bibname}{Bibliography for chapter \thechapter}
% questo comando può essere dato ovunque e più volte nel documento
% Per esempio all'inizio per scrivere "chapter" e dopo \appendix
% per cambiare "chapter" in "appendix"
% e infine una terza volta alla fine se si ha anche una bibliografia
% finale.

% SOLO SE USATE L'OPZIONE GATHER O DUPLICATE
% potete modificare i titoli delle bibliografie
%\newcommand\FinalBibTitles{References for Chapter \thechapter}

% CAMBIARE LO STILE DI CITAZIONE NEL TESTO
% il comando \citeform è messo a disposizione da chapterbib
% questo è il modo per avere 1.2 1.3 ecc...
% \renewcommand\citeform[1]{\thechapter.#1}
%
% per cambiarlo automaticamente nel testo e nella bibliofragia
% si può usare
% \CitationPrefix{\thechapter.}
% ma a me non funziona
%
% poi c'è questo altro modo che però se usate più riferimenti
% insieme esempio [1,2,3] lui aggiunge il numero del capitolo
% solamente al primo [1.1,2,3] (molti libri fanno così)
%
\makeatletter
\def\@cite#1#2{[{\thechapter.#1\if@tempswa , #2\fi }]}
\makeatother

% CAMBIARE LO STILE DI CITAZIONE NELLA BIBLIOGRAFIA
\makeatletter \def\@biblabel#1{[\thechapter.#1]} \makeatother
% spesso si ha bisogno di eliminare o resettare questa impostazione
% se si ha anche una bibliografia finale:
\makeatletter \def\@biblabel#1{} \makeatother

% METTERE A POSTO LE TESTATINE DI FANCYHDR
% purtroppo chapterbib le incasina.
% per ogni bibliografia va aperto e chiuso un
% group in cui si modificano le testatine
\begingroup
\renewcommand{\sectionmark}[1]{\markright{#1}}
\bibliographystyle{...}
\bibliography{...}
\endgroup

Infine un ultimo avvertimento. Spesso se si includono dei file, si è soliti tenerli in una directory situata nella stessa del file principale. Nel mio caso main.tex si trova vicino alla directory included all'interno della quale si trovano tutti i file inclusi. I file .bib richiamati dai file inclusi possono trovarsi ovunque, ad esempio nella directory radice vicino al file principale. Tanto vale però metterli nella stessa directory dei file inclusi.

Per inserire un .bib da una directory a livello inferiore usare la sintassi Linux dei percorsi, così come già sapete per le figure: \bibliography{../biblio.bib}

Ci sono però problemi se volete avere una bibliografia globale insieme a quelle parziali. In questo caso DOVETE avere i file della bibliografia duplicati (consiglio sempre dei symlink). Una copia nella cartella dove si trovano i file inclusi e un'altra copia nella cartella principale.

Bibliografie multiple

Pacchetto multibib. Ecco un esempio.

\documentclass[a4paper]{book}

\usepackage[labeled,resetlabels]{multibib}
\newcites{web}{Sitografia}

\usepackage{hyperref}

\begin{document}

Come diceva Pippo~\cite{Pippo1980} ci sono tante cose da sapere.

Molte di queste si trovano nel mio sito web~\citeweb{miosito}.

\renewcommand{\bibname}{Bibliografia}
\bibliographystyle{unsrt}
\bibliography{bibliografia}
\bibliographystyleweb{unsrt}
\bibliographyweb{bibliografia}

\end{document}

Questo il file bibliografia.bib richiamato dal documento:

@ARTICLE{Pippo1980,
  author = {Pippo, P.},
  title = {Cose da sapere},
  journal = {Journal of Pippo},
  year = {1980},
  volume = {34},
  pages = {381}
}

@MISC{miosito,
  title={Sito personale di Francesco Biccari},
  note={\url{http://biccari.altervista.org/}}
}

E infine i comandi per compilare:

pdflatex main.tex
bibtex main.tex
bibtex web.tex
pdflatex main.tex
pdflatex main.tex
pdflatex main.tex