Script ptab

Ce petit script perl permet de générer le code LaTeX d'un tableau de valeurs d'un fichier dat, txt…

Utilisation

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
 

Fonctionnement

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 !

Options

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//
 

Modes

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

Mode math

Pour se mettre en mode math :

//code latex//

.pt math ( )

.t /mon/chemin/val.txt

//code latex//

Parenthèses -- Crochets

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.

Formatage

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.

Code

#!/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]");