summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/petri-nets
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-12-21 23:32:42 +0000
committerKarl Berry <karl@freefriends.org>2015-12-21 23:32:42 +0000
commitc5e89419297f1c23c42a0c11bab9fb3c12b97f91 (patch)
treefe216e80909f3182b6341572c282812791dc7e7b /Master/texmf-dist/scripts/petri-nets
parent3b683dc6d3ccfc16f1bdeb50e6d086143f119f72 (diff)
pn2pdf script for petri-nets (Enrico Gregorio mail, 21 Dec 2015 12:35:28)
git-svn-id: svn://tug.org/texlive/trunk@39165 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/petri-nets')
-rwxr-xr-xMaster/texmf-dist/scripts/petri-nets/pn2pdf211
1 files changed, 211 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/petri-nets/pn2pdf b/Master/texmf-dist/scripts/petri-nets/pn2pdf
new file mode 100755
index 00000000000..c42f9c38f30
--- /dev/null
+++ b/Master/texmf-dist/scripts/petri-nets/pn2pdf
@@ -0,0 +1,211 @@
+#!/usr/bin/perl
+
+## This file is part of the Petri-nets packages. See file README for
+## copyright notice.
+
+use strict;
+use Digest::MD5 qw(md5_hex);
+use Getopt::Long;
+
+##
+## read options
+##
+
+Getopt::Long::Configure ("bundling");
+
+my $keep = 0;
+my $force = 0;
+my $verbose = 0;
+
+GetOptions ("k|keep" => \$keep,
+ "f|force" => \$force,
+ "v|verbose" => \$verbose,
+ "t|test" => \&Test,
+ "d|delete" => \&Delete,
+ "b|batch" => \&Batch,
+ "h|help" => \&Help);
+
+&Help if scalar @ARGV > 1;
+
+##
+## Global variables
+##
+
+my $figure = shift @ARGV;
+my $basename = $figure; $basename =~ s/\.pn$//;
+my $jobname = $basename; $jobname =~ s/-fig\d+$//;
+my $data = "";
+my %sum;
+
+##
+## Load checksums
+##
+
+if (-f "$jobname.sum") {
+ open SUM, "$jobname.sum"
+ or &Error ("could not open $jobname.sum -- $!");
+ while (<SUM>) {
+ next unless /^(.+)\s+(.+)$/;
+ $sum{$1} = $2;
+ }
+ close SUM;
+}
+
+##
+## Get preamble
+##
+
+if (-f "$jobname.pre") {
+ # read the existing preamble
+ my @lines;
+ open PRE, "$jobname.pre"
+ or &Error ("could not open $jobname.sum -- $!");
+ @lines = <PRE>;
+ close PRE;
+ $data .= join "", @lines;
+} else {
+ # create a new preamble
+ open TEX, "$jobname.tex"
+ or &Error ("could not open $jobname.tex -- $!");
+ while (<TEX>) {
+ $data .= $_;
+ last if /\\begin\{document\}/;
+ }
+ close TEX;
+ $data =~ s/(\\begin\{document\}).*$/$1\n/;
+ $data .= "\\pagestyle\{empty\}\n";
+ # save it
+ open PRE, ">$jobname.pre"
+ or &Error ("could not create $jobname.sum -- $!");
+ print PRE $data;
+ close PRE;
+}
+
+##
+## Read the figure
+##
+
+{
+ my $pre = 1;
+ open TEX, $figure or &Error ("could not open $figure -- $!");
+ open PRE, ">>$jobname.pre"
+ or &Error ("could not append $jobname.pre -- $!");
+ while (<TEX>) {
+ $pre = 0 if /^\\begin\{petrinet\}/;
+ print PRE if $pre;
+ $data .= $_;
+ }
+ close TEX;
+ close PRE;
+}
+
+##
+## Generate the EPDF
+##
+
+if (&SumChanged ($figure, "$data") or $force or (! -f "$basename.pdf")) {
+ open TEX, ">$basename.tex"
+ or &Error ("could not create file $basename.tex -- $!\n");
+ print TEX "$data\\end\{document\}\n";
+ close TEX;
+ system "latex", "$basename.tex";
+ system "dvips", "-E", "-Ppdf", "-o", "$basename.eps", "$basename";
+ system "epstopdf", "$basename.eps";
+}
+
+unlink ("$basename.tex", "$basename.log", "$basename.aux",
+ "$basename.dvi", "$basename.eps", "$basename.pn") unless $keep;
+
+##
+## Save checksums
+##
+
+open SUM, ">$jobname.sum"
+ or die "pn2pdf: could not create file $jobname.sum -- $!\n";
+foreach my $file (sort keys %sum) {
+ print SUM "$file $sum{$file}\n";
+}
+close SUM;
+
+exit 0;
+
+##
+## Sub programs
+##
+
+sub Help {
+ print <<"EOF";
+Usage: pn2pdf [OPTIONS]
+Create EPDF files for Petri net figures.
+
+ FIGURE process FIGURE
+ -b, --batch FILE process the commands in FILE
+ -k, --keep keep temporary files
+ -f, --force force the rendering of all pictures
+ -t, --test FILES create FILES for test purpose
+ -d, --delete FILES delete FILES (may be patterns)
+ -h, --help display this help and exit
+
+Report bugs to <pommereau\@univ-paris12.fr>
+EOF
+ exit 0; }
+
+sub Error {
+ foreach my $line (@_) {
+ warn "pn2pdf: $line\n";
+ }
+ exit 1;
+}
+
+sub Verbose {
+ return unless $verbose;
+ foreach my $line (@_) {
+ warn "[pn2pdf] $line\n";
+ }
+}
+
+sub SumChanged {
+ my ($file, $lines) = @_;
+ my $md5 = md5_hex ($lines);
+ if ($md5 eq $sum{$file}) {
+ return 0;
+ } else {
+ $sum{$file} = $md5;
+ return 1;
+ }
+}
+
+sub Test {
+ foreach my $file (@ARGV) {
+ open FILE, ">$file" or &Error ("could not create $file -- $!");
+ close FILE;
+ }
+ exit 0;
+}
+
+sub Delete {
+ foreach my $pattern (@ARGV) {
+ unlink glob $pattern unless $keep;
+ }
+ exit 0;
+}
+
+sub Batch {
+ my @lines;
+ foreach my $file (@ARGV) {
+ $file =~ s/(\.[a-z]{3})?$/.bpn/i;
+ open FILE, $file or &Error ("could not open $file -- $!");
+ while (<FILE>) {
+ next unless /^pn2pdf\s/;
+ s/^pn2pdf\s/pn2pdf --keep / if $keep;
+ s/^pn2pdf\s/pn2pdf --force / if $force;
+ s/^pn2pdf\s/pn2pdf --verbose / if $verbose;
+ push @lines, $_;
+ }
+ close FILE;
+ }
+ foreach (@lines) {
+ system $_;
+ }
+ exit 0;
+}