#Ce programme récupère toutes les référence bibliographiques d'un fichier tex,
#puis lit les bibliographies indiquées, et renvoie dans un fichier spécifique
#les références extraites, tout en tenant compte des crossref, ce qui renvoie
#à la fin du nouveau fichier bibliographique les références communes.

#Votre fichier tex:
$fichiertex="test.tex";

use locale;

#Paramètres
#Chemin et nom complet du fichier .tex
$fichiertex="test.tex";
#$fichiertex="/Users/guichard/MVT13P/LaTeX-tmp/epub/pbbib/basique.tex";
#/Users/guichard/MVT13P/LaTeX-tmp/Marseille/
#Fin Paramètres
($dossierdetravail,$fichiertexsanschemin)=$fichiertex=~/(^.*\/)(.*$)/;
$dossierdetravail="\." if $dossierdetravail eq "";
chdir $dossierdetravail;
#Ces préliminaires au cas où la biblio est référencée en local à partir du dossier où réside le .tex

$fichiertexsanschemin= $fichiertex if $fichiertexsanschemin eq "";
$finalbiblio="finalbiblio".".".$fichiertexsanschemin;
$finalbiblio=~s/.tex$/.bib/g;

open (FF,">$finalbiblio");
#Contiendra toutes les ref biblio de l'article

$regexpoptionnelle="\(?:\\[[^\\]]+\\]\)";
#Pour enlever aussi des choses du genre [\emph{op. cit}] au besoin...

open (F,$fichiertex);
while (<F>)
	{
	chop;
	last if /^\s*\\end{document}/;
	s/\%.*$//g unless $`=~/\\$/;
	while (/\\cite$regexpoptionnelle?{([^}]*)}/)
		{
		$livres=$1;		
		$_=$';
		foreach $refbib (split (", *",$livres))
			{
			$totalrefbib{$refbib}++; #pour éviter les redondances
			}
		}
#Les fichiers .bib sont supposés être décrits au début d'une ligne	
	if (/^\W*\\bibliography{([^}]*)}/)
		{
		@fichierbibtex=split(", *",$1);
		}
	}
close (F);

#On ouvre les fichiers .bib
foreach $fichierbib (@fichierbibtex)
	{
	$fichierbib.=".bib";
	open (B,$fichierbib)||die  "gal";
	while (<B>)
		{
		next if /\%/;
		#supposé être composé d'une ligne par item (auteur, titre, etc.)
		# et chaque ref se termine par un "}" 
		if (/^\W*@[^{]+{(.*),/)
			{
			$reflivre=$1;
			}
		$detaillivre{$reflivre}.=$_ ; 
		}
	close (B);
	}

#Les crossref, à mettre à la fin
foreach $u (keys %totalrefbib)
	{
	if ($detaillivre{$u}=~/\W*[cC][rR][oO][sS][sS][rR][eE][fF] *= *(.*)\n/)
		{
		$referencecroisee=$1;
		$referencecroisee=~s/\W//g;
		$totaldernieresrefbib{$referencecroisee}++;
		}
	}	

foreach $u (sort keys %totalrefbib)
	{
	print FF $detaillivre{$u},"\n" if !  defined ($totaldernieresrefbib{$u});
	#sauf si l'ouvrage est une référence croisée, à mettre à la fin de la bib
	}
foreach $u (sort keys %totaldernieresrefbib)
	{
	print FF $detaillivre{$u}, "\n";
	}
close (FF);	
print "Vos résultats sont dans le fichier $finalbiblio\n";	
exit 0;

### Documentation
# Ce programme est destiné aux utilisateurs de LaTeX qui écrivent des articles avec des références bibliographiques.

# Quand une revue demande un fichier source au format .tex, il faut l'accompagner du fichier .bib ad hoc. Ce que fait ce programme. Car il est parfois inutile ou déplaisant d'adresser à l'éditeur tous ses fichiers .bib.

# Plus précisément, le programme repère toutes les référence bibliographiques d'un fichier tex, du type \cite{xy} ou \cite[p.100]{xy}. 

# Puis il lit les bibliographies indiquées dans le fichier .tex, par exemple sous la forme:
# \bibliography{bib1,/Users/john/dossier/testbiblio}

# Il extrait les bonnes, repère les crossref et renvoie dans le fichier finalbiblio.nom-du-fichier-tex.bib les bonnes références bibliographiques, tout en renvoyant les contenus des éventuelles crossref à la fin de ce fichier bibliographique, comme demandé par bibtex.

# Les chemins d'accès sont respectés.
#Si le fichier $fichiertex s'appelle test.tex, sans précisions de chemin, cela suppose que le programme pgmcitation.pl est dans le même dossier que ce fichier. Le fichier bibliographique sera alors dans ce même dossier. S'il est défini par un chemin d'accès complet, indépendamment donc du programme, le fichier bibliographique sera dans le même dossier que ce fichier TeX.

# Usage: 
# 1. remplacer le mot "test" de la ligne 
# $fichiertex="test.tex"; 
# par le nom du fichier (sans l'extension .tex), éventuellement précédé de son chemin d'accès:
# $fichiertex="/home/john/articles/nature.tex";

# 2. lancer dans une fenêtre terminal la commande
# perl pgmcitation.pl

# * Fonctionne sur OS de type Unix/Linux (Mac inclus). 

# Enjoy!
# Eric Guichard, juillet 2012




