#!/usr/bin/perl -w use strict; my $VERSION="0.6"; print "guardpdf 0.6 (04.09.2007) for latex files and pdflatex by Georg Martius\n"; my $Dateiname=$ARGV[0]; $Dateiname or die "Dateinamen angeben!"; if($Dateiname=~/(.*)\./){ #Endung abschneiden $Dateiname=$1 if (!($1 =~//)); } $Dateiname or die "Dateinamen angeben!"; my ($i,$temp); ################################################ #default einstellungen laden # aus $HOME/.guardrc oder /etc/guardrc my $cfgfile= $ENV{"HOME"} . "/.guardrc"; if(!open(F,"< $cfgfile")){ if(open(F,"< /etc/guardrc")){ $cfgfile="/etc/guardrc"; }else{ ################### DUMP personal file system("echo -e \"editor=nedit\\ntime=1\\ngv=gv\\ngvsize=720x800\\ngvpos=500+0\" > $cfgfile"); } } close(F); ############################################# # load settings open(F,"< $cfgfile") or die "cannot load $cfgfile"; my @cfgdate=; my %Settings; close(F); foreach $temp (@cfgdate) { if($temp=~/(.*)=(.*)/){ if (!($1=~//)){ $Settings{"$1"}="$2"; } } } #Pruefen ob Tex-File da ist, ansonsten anlegen if(!(open(F,"< $Dateiname.tex"))){ if(open(F,"< template.tex")){ system("cat 'template.tex'>$Dateiname.tex"); }else{ system("touch $Dateiname.tex"); } }else{ close(F); } my $IsGV=1; my @DependFiles=&GetRecDependendies($Dateiname . ".tex"); my $DepAnzahl=$#DependFiles; my @FileData; # enthaelt jeweils letzte Daten der Datei my $MomData; # enthaelt Daten der momentanen Datei my $test=0; &printDepFiles(@DependFiles); system($Settings{"editor"} ." $Dateiname.tex & "); my $counter=0; while (1){ $counter++; for($i=0;$i<=$DepAnzahl;$i++){ $MomData= &getfiledata($DependFiles[$i]); if(!$FileData[$i] || ($MomData cmp $FileData[$i])!=0){ print("\nFile $DependFiles[$i] was modified ($MomData)"); $FileData[$i]=$MomData; $test=1; } } #aller 120 Sekunden mal schauen, # ob denn nicht eine neue Datei included wurde. if ($counter>120){ @DependFiles=&GetRecDependendies($Dateiname . ".tex"); if($DepAnzahl != $#DependFiles){ &printDepFiles(@DependFiles); }; $DepAnzahl = $#DependFiles; $counter=0; } if ($test){#Texlauf starten $test=0; system("echo -e '\nlatex now\n**********************************************************************\n**********************************************************************'"); $temp="echo \"q\" | pdflatex -interaction=errorstopmode $Dateiname.tex && pdf2ps $Dateiname.pdf $Dateiname.ps && echo -e \"\a\""; system($temp); } #pruefen ob GV schon offen und PS-File da if($IsGV && open(F,"< $Dateiname.ps")){ system($Settings{"gv"} . " -geometry " . $Settings{"gvsize"} . "+" . $Settings{"gvpos"} . " $Dateiname.ps & "); $IsGV=0; } sleep($Settings{"time"}); } ################################################################################ #gibt rekursiv alle Dependendies einer Datei zurueck (Parameter: Dateiname) sub GetRecDependendies{ my $fileName=$_[0]; my @depFiles=&GetRecDepHelper($fileName); return ($fileName,@depFiles); } sub GetRecDepHelper{ my $fileName=$_[0]; my @depFiles=&GetDependendies($fileName); my @collected=@depFiles; my $f; foreach $f (@depFiles) { @collected=(@collected,&GetRecDepHelper($f)); } return @collected; } ################################################################################ #gibt Dependendies einer Datei zurueck (Parameter: Dateiname) sub GetDependendies{ my $fileName=$_[0]; my @DependFiles; # check whether it is a tex-file or not if($fileName =~ /.*\.tex$/) { my $OpenString="< ". $fileName; open(TEXFILE,$OpenString); my @datei=; my $line; foreach $line (@datei){ if ($line =~ /^[^%].*input{(.*?)}/){ #\input ohne Kommentar $DependFiles[$#DependFiles+1]=$1 ; } if ($line =~ /^[^%].*include{(.*?)}/){ #\include ohne Kommentar $DependFiles[$#DependFiles+1]=$1; } if ($line =~ /^[^%].*includegraphics{(.*?)}/){ #\includegraphics ohne Kommentar $DependFiles[$#DependFiles+1]=$1; } if ($line =~ /^%.*GUARD{(.*?)}/){ #\expliciter Guard im Kommentar $DependFiles[$#DependFiles+1]=$1 ; } } close(TEXFILE); } # in @DependFiles stehen jetzt alle zu ueberwachenden Dateien drin return @DependFiles; #Rueckgabe } sub getfiledata { my $file; my @data; $file = $_[0]; if (!$file) { return "no file";} @data = stat("$file"); my $ending; if($data[9]){ return "$data[9],$data[12]"; }else{ # no file -> maybe with .tex,.eps or .png foreach $ending (".tex", ".eps",".png") { @data = stat($file . $ending); if($data[9]){ return "$data[9],$data[12]"; } } } return "no file"; } sub printDepFiles { print("\nI will looking for following files:\n"); my $f; foreach $f (@_){ print "#$f#\n"; } }