Ce petit script perl permet de générer le code LaTeX d'un tableau de valeurs d'un fichier dat, txt…
Supposons qu'on veuille créer un tableau avec les valeurs d'un fichier externe val.txt.
Alors dans notre document LaTeX monfichier.tex, on insert la ligne suivante :
.t /mon/chemin/val.txt
On execute alors ptab :
$ ptab monfichier.tex
Lors de l'utilisation de ptab, il se crée un fichier val.tex contenant le code tex du tableau uniquement, puis dans le fichier maître tex, les lignes de commandes sont commentées et une ligne d'inclusion est rajoutée. La notation acceptée des nombres est celle qu'accepte perl (la notation avec E pour les puissances de 10 est correctement traitée). Exemple
On a le fichier de valeurs dat.dat suivant :
1.001 2 3.7 4.34 5.0 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
et le fichier test.tex suivant :
\documentclass[a4paper]{article} \usepackage[latin1]{inputenc} \usepackage[frenchb]{babel} \usepackage{amsmath} \begin{document} Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... \section{Une section} .pt formatage 2 .t /fichiers/programation/perl/dat.dat \end{document}
On execute ptab :
$ ptab test.tex
Alors le fichier dat.tex est créé au niveau de test.tex :
\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} \hline 1.00&2.00&3.70&4.34&5.00&6.00&7.00&8.00&9.00&10.00\\\hline 11.00&12.00&13.00&14.00&15.00&16.00&17.00&18.00&19.00&20.00\\\hline 21.00&22.00&23.00&24.00&25.00&26.00&27.00&28.00&29.00&30.00\\\hline \end{tabular} et le fichier test.tex est devenu : \documentclass[a4paper]{article} \usepackage[latin1]{inputenc} \usepackage[frenchb]{babel} \usepackage{amsmath} \begin{document} Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... Du text qui se répète... \section{Une section} %@patb .pt formatage 2 %@ptab .t /fichiers/programation/perl/dat.dat \include{dat} \end{document}
Il reste alors à faire une compilation LaTeX !
De manière générale, pour définir des paramètres on utilise la ligne suivante dans le document LaTeX :
.pt <les paramètres>
La définition des paramètres n'est pas valable pour le document entier, elle n'est valable que jusqu'à une prochaine définition de paramètres. Par exemple, on peut très bien faire :
//code latex// .pt math ( ) .t /mon/chemin/dat1.dat //code latex// .pt tableau .t /mon/chemin/dat2.dat //code latex//
Il existe deux modes, tableau classique avec l'environnement tabular, et tableau mathématiques avec l'environnement array.
Le mode classique est le mode par défaut, il n'y a pas d'option particulière…
Remarque Pour revenir en mode tableau, on utilise la commande :
.pt tableau
Pour se mettre en mode math :
//code latex//
.pt math ( )
.t /mon/chemin/val.txt
//code latex//
On règle, en plus de passé en mode math, les délimiteurs. Ceci se fait après l'indication math en rentrant le délimiteur gauche et le droit séparés par un espace. Ci-dessus, on a choisi les parenthèses, on obtiendra donc une matrice avec parenthèse.
Cette option permet de formater l'affichage des décimales des valeurs dans le tableau.
Par exemple :
//code latex//
.pt formatage 3
.pt math [ ]
.t /mon/chemin/val.txt
//code latex//
permet d'afficher les nombres avec trois chiffres après la virgule.
#!/usr/bin/perl # ----------------------------------------------------------------------------- # PTAB 05/11/08 # Maxime Chupin # ----------------------------------------------------------------------------- # version 1.0 use Cwd; # récupération du chemin d'exécution ------------------------------------------ my $chemin = cwd(); #------------------------------------------------------------------------------ # nom du fichier de travail --------------------------------------------------- ($nomw =$ARGV[0]) =~ s/.tex/.w/; #------------------------------------------------------------------------------ # paramètres par défaut ------------------------------------------------------- $type="tabular"; $deliml=""; $delimr=""; $inter="|"; $separvert="\\hline"; $formatdec = 2; #------------------------------------------------------------------------------ # lecture du fichier de travail .w -------------------------------------------- open(WORK,,"$chemin/$ARGV[0]") or die "Impossible d'ouvrir $ARGV[0]"; #on ouvre le fichier tex original contenant les commandes ptab open(WTEX, ">$chemin/$nomw"); # ouverture en ecriture d'un fichier .w (de travail) while (<WORK>){ #pour chaque ligne du document original @ligne = split /\s+/; # on séparer chaque mots de chaque ligne if($ligne[0] eq ".pt"){ # on lit le paramétrage if($ligne[1] eq "math"){ # si math $type="array"; $deliml="\\[\\left$ligne[2]"; $delimr="\\right$ligne[3]\\]"; $inter=""; $separvert=""; } if($ligne[1] eq "tableau"){ # si tableau $type="tabular"; $deliml=""; $delimr=""; $inter="|"; $separvert="\\hline"; } if($ligne[1] eq "formatage"){ $formatdec = $ligne[2]; } print(WTEX "%\@patb $_"); # on laisse une trace de la commande de paramerage dans le document final } elsif($ligne[0] eq ".t"){ # la command ptab .t $toutligne = $_; @chemindat = split('/', $ligne[1]); $fichierdat = $chemindat[-1]; #on recupere le nom complet du fichier dat, txt... @tabpref = split('\.', $chemindat[-1]); $prefixe = $tabpref[0]; #on recupere le prefixe open(DAT, "$ligne[1]") or die "Impossible d'ouvrir $ligne[1]"; #on ouvre ce fichier open(DATTEX, ">$chemin/$prefixe\.tex"); # on cree un fichier $prefixe.tex dans lequel il y aura le tableau en latex $taille = split/\s+/, <DAT>; #on recupere le nombre de colonne close(DAT); open(DAT, "$ligne[1]"); for($i=1;$i<=$taille;$i++){$c.="c$inter";} #on concatene des c autant que de colonne print(DATTEX "$deliml\\begin\{$type\}\{$inter$c\}\n$separvert\n"); # on commence notre tableau (ca depend des options) while(<DAT>){ @lignedat= split/\s+/; $tail= @lignedat; for($i=0;$i<$tail;$i++){ $format = sprintf("%.${formatdec}f",$lignedat[$i]); # on format les nombres apres la virgule print(DATTEX "$format"); if($i!=($tail-1)){ print(DATTEX '&'); } } print(DATTEX "\\\\$separvert\n"); } print(DATTEX "\\end\{$type\}$delimr\n"); #on ferme le tableau close(DAT); print(WTEX "%\@ptab $toutligne \n"); # on commente la ligne ou se trouve l'instruction .t print(WTEX "\\include{$prefixe}\n"); # et on inclut le fichier creer tex } else{ print(WTEX $_); # sinon on recopie normalement le fichier dans lui meme... } } close(WTEX); close(WORK); rename($nomw, "$ARGV[0]");