2
0
Fork 0

modif script Perl/genere_catalogue_tests.pl : meilleure gestion des pb de compilation pdflatex

This commit is contained in:
troufflard 2016-02-12 15:02:51 +00:00
parent 5cb63f3c2f
commit e9f68f886f

View file

@ -19,8 +19,9 @@ my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
# disponibles (recopie des rubriques "But du test" et "Description du calcul" du
# fichier README de chaque repertoire de test)
#
#
#--------------------------
# Notes a tout le monde :
#--------------------------
# une rubrique est un bloc contenu dans un fichier README sous la forme :
# une ligne de tirets
# nom de la rubrique
@ -38,7 +39,9 @@ my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
# pour l instant ecrite de maniere a reperer une ligne de tirets).
#
#
#--------------------------
# Notes aux utilisateurs :
#--------------------------
# - les repertoires de tests sont recherches dans toute l arborescence depuis l endroit ou
# ce script est lance (recherche de tous les repertoires commencant par Test_R ou Test_L)
# A noter que si un des repertoires ne contient pas de fichier README, le script s arrete sans
@ -50,8 +53,14 @@ my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?';
# ils sont vides, il n y a pas de README d ou l arret du programme. Pour supprimer,
# ces repertoires vides, il suffit de faire "cvs update -dP" ou bien utiliser l option -P a l import du
# projet "cvs co -P Verif_Herezh"
# - en cas d erreur de compilation Latex, le fichier .tex est fourni pret a la compilation, ainsi qu un fichier
# de l historique de compilation. Ces 2 fichiers permettent de cerner le probleme.... et pourquoi pas aussi essayer
# de finaliser la compilation manuellement plutot que de rester bloque (sans oublier tout de meme de signaler
# le probleme aux developpeurs de ce script)
#
#--------------------------
# Notes aux developpeurs :
#--------------------------
# - le choix de ne pas generer de pdf a la moindre defaillance d un fichier README a pour
# but de forcer a rendre conforme les fichiers README. Une ecriture partielle du fichier
# pdf en omettant les README defaillants pourrait conduire a un oubli de certains tests.
@ -154,12 +163,14 @@ verif_commande('pdflatex') or die "\nErreur (prog:$NOM_PROG) : commande pdflatex
#-verif validite de l option -halt-on-error de la commande pdflatex
@_ = qx(pdflatex -help | grep -- -halt-on-error);
($#_ > -1) or die "\nErreur (prog:$NOM_PROG) : commande pdflatex => option -halt-on-error non existante...\n\n";
#-verif validite de l option -interaction de la commande pdflatex
@_ = qx(pdflatex -help | grep -- -interaction);
($#_ > -1) or die "\nErreur (prog:$NOM_PROG) : commande pdflatex => option -interaction non existante...\n\n";
#verif validite de la commande makeindex
verif_commande('makeindex') or die "\nErreur (prog:$NOM_PROG) : commande makeindex introuvable...\n\n";
#########################################################################################################
# liste des repertoires de test
#########################################################################################################
@ -200,7 +211,7 @@ if($is_absence_README) {
#on va creer un repertoire temporaire qui est sense s effacer automatiquement grace a l utilisation de File::Temp->newdir
# le probleme est que si un signal d interruption est envoye (ctrl-c par exemple), le repertoire ne sera pas efface.
# donc, on va capturer certains signaux pour faire un appel a la subroutine sortie_programme()
# donc, on va egalement capturer certains signaux pour faire un appel a la subroutine sortie_programme()
$SIG{INT} = \&sortie_programme;#INT => capture signal : ctrl-c ou kill -2
$SIG{TERM} = \&sortie_programme;#TERM => capture signal : kill -15
#remarque : par essence, le signal kill -9 ne peut pas etre capture
@ -253,78 +264,124 @@ print $HANDLE_TEX "\\end{document}\n";
close($HANDLE_TEX);
#
#
#
# a ce stade, le fichier .tex est cree et pret a la compilation
#
#
#
#------------------------------------------------------------------------------------------
#compilation pdflatex (avec index)
# en trois temps :
# 1- premier pdflatex (generation du .pdf et du .idx)
# 2- makeindex (creation de l index)
# 3- deuxieme pdflatex (table des matieres et index)
# on compile 2 fois :
# 1- premier pdflatex (generation du .pdf et des fichiers index .idx, .ilg (makeindex lance automatiquement))
# 2- deuxieme pdflatex (table des matieres et index)
#
# a chaque fois, on utilise des options qui empechent pdflatex d attendre une reponse interactive en cas d erreur de compilation
# option -halt-on-error => forcer a quitter a la moindre erreur
# option -interaction=nonstopmode => desactiver les demandes interactives (par exemple si un fichier est introuvable, comme par exemple un package .sty inconnu)
#------------------------------------------------------------------------------------------
#-declaration prealable d une subroutine qui sera execute en cas d erreur latex
# => a la moindre erreur, on fournira a l utilisateur le moyen de cerner les bugs et de pourquoi pas finir la compilation par lui-meme
sub traitement_erreur_latex {
#fichier .tex
(my $tex_catalogue = $NOM_PDF_CATALOGUE) =~ s/\.pdf$/.tex/;
#fichier .log de la compilation
(my $errlog_catalogue = $NOM_PDF_CATALOGUE) =~ s/\.pdf$/.error_log/;
warn " Les fichiers suivants ont ete crees pour chercher manuellement la source de l erreur :\n";
warn " - $tex_catalogue (fichier .tex pret a la compilation)\n";
warn " - $errlog_catalogue (affichage renvoye par pdflatex)\n";
warn "\n";
warn " (vous pouvez essayer de compiler vous-meme le fichier .tex pour\n";
warn " finaliser la creation du catalogue)\n";
warn "\n";
#recopie du .tex mais en supprimant le retour d un cran dans le path du fichier figure des includegraphics (sinon l utilisateur ne pourra pas tester par lui-meme la compilation du fichier $tex_catalogue)
open(FTEX1, "<$racine_fic_latex.tex");
open(FTEX2, ">../$tex_catalogue");
while(<FTEX1>) {
s/\{\.\.\//\{/ if(/^\s*\\includegraphics/);#suppression retour d un cran dans le path du fichier figure
print FTEX2;
}
close(FTEX1);
close(FTEX2);
system("mv -f toto.log ../$errlog_catalogue");#recopie du .log latex pour debuggage par l utilisateur
#affichage des eventuelles erreurs presentes dans le fichier $errlog_catalogue
chdir "..";
my @err_log = qx(grep -i error $errlog_catalogue | grep -v 'no output PDF');#on recupere les lignes qui contiennent le mot 'error' (sauf les lignes qui contiennent 'no output PDF' car on sait bien que le pdf n a pas ete cree!!!!)
#si il existe au moins une ligne contenant le mot 'error', on produit un affichage
if($#err_log > -1) {
warn " Notamment, le fichier $errlog_catalogue contient les erreurs :\n";
afficher_ligne_tirets('warn');
warn " > $_" for @err_log;
afficher_ligne_tirets('warn');
warn "\n";
}
}#sub traitement_erreur_latex
#---
#-1ere compilation pdflatex en utilisant des options qui empechent les demandes interactives :
# option -halt-on-error => forcer a quitter a la moindre erreur
# option -interaction=nonstopmode => desactiver les demandes interactives (par exemple en cas d absence d un package du preambule)
#---
print "\n";
afficher_ligne_tirets('print');
print "compilation pdflatex (1ere fois)\n";
afficher_ligne_tirets('print');
sleep 1;#petite pause pour laisser a l utilisateur le temps de voir l affichage precedent
#---
#-1ere comilation (pdflatex avec option -halt-on-error pour forcer a quitter a la moindre erreur)
#---
system("pdflatex -halt-on-error $racine_fic_latex.tex > toto.log");
system("pdflatex -halt-on-error -interaction=nonstopmode $racine_fic_latex.tex > toto.log");
#-verif presence .pdf
if(not -e "$racine_fic_latex.pdf") {
warn "\nErreur (prog:$NOM_PROG) : erreur a l execution de pdflatex.\n";
warn " Les fichiers suivants ont ete cree a des fins de debug :\n";
warn " - $NOM_PDF_CATALOGUE.tex (fichier .tex donne en argument de pdflatex)\n";
warn " - $NOM_PDF_CATALOGUE.error_log (affichage renvoye par pdflatex)\n";
warn "\n";
system("mv -f $racine_fic_latex.tex ../$NOM_PDF_CATALOGUE.tex");
system("mv -f toto.log ../$NOM_PDF_CATALOGUE.error_log");
chdir "..";
warn "\nErreur (prog:$NOM_PROG) : erreur a l execution de pdflatex\n";
traitement_erreur_latex();
sortie_programme();
}
#-verif presence des fichiers d index (fichiers .idx et .ilg)
if(not -e "$racine_fic_latex.idx" or not -e "$racine_fic_latex.ilg") {
warn "\nErreur (prog:$NOM_PROG) : le fichier index .idx ou .ilg n a pas ete cree apres compilation avec pdflatex\n";
traitement_erreur_latex();
sortie_programme();
}
#---
#-generation de l index
#---
afficher_ligne_tirets('print');
print "compilation index (makeindex)\n";
afficher_ligne_tirets('print');
sleep 1;#petite pause pour laisser a l utilisateur le temps de voir l affichage precedent
#-verif presence .idx
if(not -e "$racine_fic_latex.idx") {
warn "\nErreur (prog:$NOM_PROG) : le fichier index .idx n a pas ete cree\n";
warn " Les fichiers suivants ont ete cree a des fins de debug :\n";
warn " - $NOM_PDF_CATALOGUE.tex (fichier .tex donne en argument de pdflatex)\n";
warn " - $NOM_PDF_CATALOGUE.error_log (affichage renvoye par pdflatex)\n";
warn "\n";
system("mv -f $racine_fic_latex.tex ../$NOM_PDF_CATALOGUE.tex");
system("mv -f toto.log ../$NOM_PDF_CATALOGUE.error_log");
chdir "..";
sortie_programme();
}
system("makeindex $racine_fic_latex.idx > toto.log");
#---
#-2eme compilation (pdflatex avec option -halt-on-error pour forcer a quitter a la moindre erreur)
#-2eme compilation pdflatex en utilisant des options qui empechent les demandes interactives :
# option -halt-on-error => forcer a quitter a la moindre erreur
# option -interaction=nonstopmode => desactiver les demandes interactives (par exemple en cas d absence d un package du preambule)
#---
afficher_ligne_tirets('print');
print "compilation pdflatex (2eme fois)\n";
afficher_ligne_tirets('print');
sleep 1;#petite pause pour laisser a l utilisateur le temps de voir l affichage precedent
system("rm -f $racine_fic_latex.pdf");
system("pdflatex -halt-on-error $racine_fic_latex.tex > toto.log");
system("pdflatex -halt-on-error -interaction=nonstopmode $racine_fic_latex.tex > toto.log");
#-verif presence .pdf
if(not -e "$racine_fic_latex.pdf") {
warn "\nErreur (prog:$NOM_PROG) : erreur a l execution de pdflatex.\n";
warn " Les fichiers suivants ont ete cree a des fins de debug :\n";
warn " - $NOM_PDF_CATALOGUE.tex (fichier .tex donne en argument de pdflatex)\n";
warn " - $NOM_PDF_CATALOGUE.error_log (affichage renvoye par pdflatex)\n";
warn "\n";
system("mv -f $racine_fic_latex.tex ../$NOM_PDF_CATALOGUE.tex");
system("mv -f toto.log ../$NOM_PDF_CATALOGUE.error_log");
chdir "..";
warn "\nErreur (prog:$NOM_PROG) : erreur a l execution de pdflatex\n";
traitement_erreur_latex();
sortie_programme();
}
#
#
#
# si on atteint cet endroit du script, c est que tout s est bien passe
# il ne reste plus qu a deplacer le .pdf hors du repertoire temporaire (et le repertoire temporaire s effacera tout seul)
#
#
#
#deplacement du catalogue final vers le repertoire de depart sous le nom prevu par la variable $NOM_PDF_CATALOGUE
system("mv -f $racine_fic_latex.pdf ../$NOM_PDF_CATALOGUE");
@ -1056,7 +1113,8 @@ citecolor= green %couleur citation biblio
%\pagestyle{arabic}
\pagenumbering{arabic}
%remarque : le package makeidx doit etre place apres \usepackage{hyperref} pour beneficier des liens hyperef dans l index
%remarque 1 : le package makeidx doit etre place apres \usepackage{hyperref} pour beneficier des liens hyperef dans l index
%remarque 2 : le package makeidx appelle la commande makeindex (donc executer makeindex dans un shell apres la premiere compilation pdflatex ne sert a rien)
\usepackage{imakeidx}
%-- nouvelles commandes pour que ce soit des numeros de section (et non des pages) qui apparaissent dans l index
% selon astuce (2015-06-26) : http://www.latex-community.org/forum/viewtopic.php?f=51&t=14334