From e9f68f886fa145c23dfc45cd30dfe11257c41d52 Mon Sep 17 00:00:00 2001 From: troufflard <> Date: Fri, 12 Feb 2016 15:02:51 +0000 Subject: [PATCH] modif script Perl/genere_catalogue_tests.pl : meilleure gestion des pb de compilation pdflatex --- Perl/genere_catalogue_tests.pl | 158 ++++++++++++++++++++++----------- 1 file changed, 108 insertions(+), 50 deletions(-) diff --git a/Perl/genere_catalogue_tests.pl b/Perl/genere_catalogue_tests.pl index a85b157..acd43d0 100755 --- a/Perl/genere_catalogue_tests.pl +++ b/Perl/genere_catalogue_tests.pl @@ -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() { + 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