summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/fragmaster
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-03-23 17:31:41 +0000
committerKarl Berry <karl@freefriends.org>2009-03-23 17:31:41 +0000
commitda44abf54037ab8597fd36e09b8dc5a255acae4d (patch)
treea9896042ae70f13071b7f851723d419d0e558bdf /Master/texmf-dist/scripts/fragmaster
parent59f9d0d90a870182237f27397182f09b1a811011 (diff)
-mnew support script fragmaster (19mar09)
git-svn-id: svn://tug.org/texlive/trunk@12500 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/fragmaster')
-rwxr-xr-xMaster/texmf-dist/scripts/fragmaster/fragmaster.pl259
1 files changed, 259 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/fragmaster/fragmaster.pl b/Master/texmf-dist/scripts/fragmaster/fragmaster.pl
new file mode 100755
index 00000000000..efb4c9aa892
--- /dev/null
+++ b/Master/texmf-dist/scripts/fragmaster/fragmaster.pl
@@ -0,0 +1,259 @@
+#!/usr/bin/perl -w
+
+######################################################################
+# $Id: fragmaster.pl,v 1.3 2006/09/26 08:59:30 tvogel Exp $
+#
+# fragmaster.pl
+# creates EPS and PDF graphics from source EPS and control files
+# with \psfrag commands
+#
+# Copyright (C) 2004 Tilman Vogel <tilman vogel web de> (dot at dot)
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# IMPORTANT: ALLOW DVIPS TO MAKE _PORTRAIT_ PS WITH WIDTH > HEIGHT
+# BY ADDING
+#
+# @ custom 0pt 0pt
+#
+# TO YOUR /usr/share/texmf/dvips/config/config.pdf
+# IF THIS ENTRY IS MISSING, DVIPS WILL GUESS ORIENTATION FROM
+# WIDTH / HEIGHT RATIO. THIS STILL CAN HAPPEN IN CASE YOUR INPUT EPS
+# MATCHES A STANDARD PAPER SIZE!
+#
+# Source files:
+# <graphics>_fm.eps
+# a source EPS file
+# <graphics>_fm
+# a control file containing \psfrag commands and optionally
+# special comments:
+# % fmclass: <class>
+# use <class> instead of "article"
+# % fmclassopt: <options>
+# use <options> as class options instead of "12pt"
+# % head:
+# % <texcode>
+# % end head
+# causes <texcode> to be put into the preamble
+# % fmopt: <option>
+# causes <option> to be given to \includegraphics as
+# optional parameter
+#
+# fragmaster.pl scans the current directory for files matching the
+# pattern "*_fm" and "*_fm.eps" and converts them to the respective
+# ".eps"- and ".pdf"-files if they are outdated.
+#
+# Credits:
+#
+# This script was inspired by a posting from
+# Karsten Roemke <k roemke gmx de> (dot at dot)
+# with subject
+# "psfrag pdflatex, lange her"
+# in de.comp.text.tex on 2003-11-11 05:25:44 PST.
+#
+# Karsten Roemke was inspired for his solution by postings from
+# Thomas Wimmer.
+
+chomp($cwd = `pwd`);
+
+die "Current path contains whitespace. I am sorry, but LaTeX cannot handle this correctly, move somewhere else. Stopped"
+ if $cwd =~ /\s/;
+
+foreach $fm_file (<*_fm>) {
+ ($base = $fm_file) =~ s/_fm$//;
+ $source = "$fm_file.eps";
+
+ if(! -f $source) {
+ print "Cannot find EPS file '$source' for fragmaster file '$fm_file'! Skipped.\n";
+ next;
+ }
+
+
+ $dest_eps = "$base.eps";
+ $dest_pdf = "$base.pdf";
+
+ $do_it = 0;
+
+ $do_it = 1
+ if ! -f $dest_eps;
+ $do_it = 1
+ if ! -f $dest_pdf;
+
+ if(! $do_it) {
+ $oldest_dest = -M $dest_eps;
+ $oldest_dest = -M $dest_pdf
+ if -M $dest_pdf > $oldest_dest;
+
+ $youngest_source = -M $fm_file;
+ $youngest_source = -M $source
+ if -M $source < $youngest_source;
+ $do_it = 1
+ if $oldest_dest > $youngest_source;
+ }
+
+ if( $do_it ) {
+ print "$fm_file, $source -> $dest_eps, $dest_pdf\n";
+
+ open FMFILE, "<$fm_file"
+ or die "Cannot read $fm_file!";
+
+ $tempdir = `mktemp -d fm-$base.XXXXXX`
+ or die "Cannot make temporary directory!";
+
+ chomp($tempdir);
+
+ print "using $tempdir/\n";
+
+ open TEXFILE, ">$tempdir/fm.tex"
+ or die "Cannot write LaTeX file!";
+
+ $fmopt = "";
+ @fmfile = ();
+ @fmhead = ();
+ $fmclass = "article";
+ $fmclassopt = "12pt";
+ while (<FMFILE>) {
+ chomp;
+ $fmopt = $1 if /fmopt:(.*)/;
+ $fmclass = $1 if /fmclass:(.*)/;
+ $fmclassopt = $1 if /fmclassopt:(.*)/;
+ if (/head:/) {
+ push @fmfile, " $_%\n";
+ while(<FMFILE>) {
+ chomp;
+ last if /end head/;
+ push @fmfile, " $_%\n";
+ # Remove comment prefix
+ s/^[\s%]*//;
+ push @fmhead, "$_%\n";
+ }
+ }
+
+ push @fmfile, " $_%\n";
+ }
+
+ print TEXFILE <<"EOF";
+\\documentclass[$fmclassopt]{$fmclass}
+\\usepackage{graphicx,psfrag,color}
+\\usepackage{german}
+EOF
+ print TEXFILE
+ foreach(@fmhead);
+ print TEXFILE <<'EOF';
+\setlength{\topmargin}{-1in}
+\setlength{\headheight}{0pt}
+\setlength{\headsep}{0pt}
+\setlength{\topskip}{0pt}
+\setlength{\textheight}{\paperheight}
+\setlength{\oddsidemargin}{-1in}
+\setlength{\evensidemargin}{-1in}
+\setlength{\textwidth}{\paperwidth}
+\setlength{\parindent}{0pt}
+\special{! TeXDict begin /landplus90{true}store end }
+%\special{! statusdict /setpage undef }
+%\special{! statusdict /setpageparams undef }
+\pagestyle{empty}
+\newsavebox{\pict}
+EOF
+ print TEXFILE "\\graphicspath{{../}}\n";
+ print TEXFILE <<'EOF';
+\begin{document}
+ \begin{lrbox}{\pict}%
+EOF
+
+ print TEXFILE
+ foreach (@fmfile);
+
+ print TEXFILE " \\includegraphics[$fmopt]{$source}%\n";
+ print TEXFILE <<'EOF';
+ \end{lrbox}
+ \special{papersize=\the\wd\pict,\the\ht\pict}
+ \usebox{\pict}
+\end{document}
+EOF
+
+ close TEXFILE;
+
+ chdir($tempdir)
+ or die "Cannot chdir to $tempdir!";
+
+ system("latex fm.tex") / 256 == 0
+ or die "Cannot latex fm.tex!";
+
+ # Using -E here, causes dvips to detect
+ # the psfrag phantom stuff and to set the BoundingBox wrong
+ system("dvips -E -P pdf fm.dvi -o fm.ps") / 256 == 0
+ or die "Cannot dvips!";
+
+ chdir("..")
+ or die "Cannot chdir back up!";
+
+ open PS, "<$tempdir/fm.ps"
+ or die "Cannot read fm.ps!";
+
+ open EPS, ">$dest_eps"
+ or die "Cannot write $dest_eps!";
+
+ # Correct the bounding box by setting the left margin to 0
+ # top margin to top of letterpaper!
+ # (I hope that is general enough...)
+ $saw_bounding_box = 0;
+ while(<PS>) {
+ if(! $saw_bounding_box) {
+ # if(s/^\%\%BoundingBox:\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/\%\%BoundingBox: 0 $2 $3 $4/) {
+ if(s/^\%\%BoundingBox:\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/\%\%BoundingBox: 0 $2 $3 792/) {
+ $saw_bounding_box = 1;
+ }
+ }
+ print EPS;
+ }
+
+ # Not using -E above causes
+ # papersizes to be included into the PS
+ # Strip off the specifications.
+ # Otherwise gv doesn't show the BBox
+ # and epstopdf won't detect the correct
+ # PDF media size!
+
+ # while(<PS>) {
+ # s/^%!PS-Adobe.*/%!PS-Adobe-3.0 EPSF-3.0/;
+
+ # next if /^\%\%DocumentPaperSizes:/;
+ # if(/^\%\%BeginPaperSize:/) {
+ # while(<PS>) {
+ # last if /^\%\%EndPaperSize/;
+ # }
+ # next;
+ # }
+ # s/statusdict \/setpage known/false/;
+ # s/statusdict \/setpageparams known/false/;
+ # print EPS;
+ # }
+
+ close EPS;
+ close PS;
+
+ system("epstopdf $dest_eps --outfile=$dest_pdf") / 256 == 0
+ or die "Cannot epstopdf!";
+
+ system("rm -rf $tempdir") / 256 == 0
+ or die "Cannot remove $tempdir!";
+
+ close FMFILE;
+
+
+
+ }
+}