diff options
Diffstat (limited to 'support/ltximg/ltximg.pl')
-rw-r--r-- | support/ltximg/ltximg.pl | 1814 |
1 files changed, 0 insertions, 1814 deletions
diff --git a/support/ltximg/ltximg.pl b/support/ltximg/ltximg.pl deleted file mode 100644 index 3b61635e42..0000000000 --- a/support/ltximg/ltximg.pl +++ /dev/null @@ -1,1814 +0,0 @@ -#!/usr/bin/env perl -use v5.26; -use File::Basename; -use Getopt::Long qw(:config bundling_values require_order no_ignore_case); -use File::Temp qw(tempdir); -use File::Copy; -use Config; -use File::Spec::Functions qw(catfile devnull); -use File::Find; -use IO::Compress::Zip qw(:all); -use Archive::Tar; -use POSIX qw(strftime); -use Cwd; -use autodie; -#use Data::Dumper; - -### Directory for work and temp files -my $tempDir = tempdir( CLEANUP => 1); -my $workdir = cwd; -my $null = devnull(); - -### Program identification -my $program = "LTXimg"; -my $nv = 'v1.7'; -my $copyright = <<END_COPYRIGHT ; -[2019-08-24] (c) 2013-2019 by Pablo Gonzalez, pablgonz<at>yahoo.com -END_COPYRIGHT - -### Default values -my $prefix = 'fig'; # defaul prefix for extract files -my $skiptag = 'noltximg'; # internal tag for regex -my $extrtag = 'ltximg'; # internal tag for regex -my $imageDir = "images"; # dir for images -my $verbcmd = "myverb"; # set \myverb command -my $margins = "0"; # margins for pdfcrop -my $DPI = "150"; # dpi for image formats -my $zip = 0; # zip images dir -my $tar = 0; # tar.gz images dir -my $arara = 0; # use arara to compiler -my $force = 0; # force capture \psset|\tikzset -my $latex = 0; # compiling all images using latex -my $dvips = 0; # compiling output using dvips>ps2pdf -my $dvipdf = 0; # compiling all images using dvipdfmx -my $xetex = 0; # compiling all images using xelatex -my $luatex = 0; # compiling all images using lualatex -my $noprew = 0; # don't use preview packpage -my $srcenv = 0; # create src code for environments -my $subenv = 0; # create sub document for environments -my @extr_env_tmp; # save extract environments -my @skip_env_tmp; # save skip some environments -my @verb_env_tmp; # save verbatim environments -my @verw_env_tmp; # save verbatim write environments -my @delt_env_tmp; # save delete environments in output file -my @clean; # clean options -my $pdf = 1; # create a PDF image file -my $run = 1; # run mode compiler -my $crop = 1; # croped pdf image files -my $gray = 0; # create a gray scale images -my $output; # set output name for outfile -my $outfile = 0; # write output file -my $outsrc = 0; # enable write src env files -my $debug = 0; # debug -my $PSTexa = 0; # extract PSTexample environment -my $STDenv = 0; # extract standart environments -my $verbose = 0; # verbose - -### Search Ghostscript -# The next code it's part of pdfcrop adapted from TexLive 2014 -# Windows detection -my $Win = 0; -$Win = 1 if $^O =~ /mswin32/i; -$Win = 1 if $^O =~ /cygwin/i; - -my $archname = $Config{'archname'}; -$archname = 'unknown' unless defined $Config{'archname'}; - -# get Ghostscript command name -my $gscmd = ''; -sub find_ghostscript () { - return if $gscmd; - if ($debug) { - print "* Perl executable: $^X\n"; - if ($] < 5.006) { - print "* Perl version: $]\n"; - } - else { - printf "* Perl version: v%vd\n", $^V; - } - if (defined &ActivePerl::BUILD) { - printf "* Perl product: ActivePerl, build %s\n", ActivePerl::BUILD(); - } - printf "* Pointer size: $Config{'ptrsize'}\n"; - printf "* Pipe support: %s\n", - (defined($Config{'d_pipe'}) ? 'yes' : 'no'); - printf "* Fork support: %s\n", - (defined($Config{'d_fork'}) ? 'yes' : 'no'); - } - my $system = 'unix'; - $system = "dos" if $^O =~ /dos/i; - $system = "os2" if $^O =~ /os2/i; - $system = "win" if $^O =~ /mswin32/i; - $system = "cygwin" if $^O =~ /cygwin/i; - $system = "miktex" if defined($ENV{"TEXSYSTEM"}) and - $ENV{"TEXSYSTEM"} =~ /miktex/i; - print "* OS name: $^O\n" if $debug; - print "* Arch name: $archname\n" if $debug; - print "* System: $system\n" if $debug; - my %candidates = ( - 'unix' => [qw|gs gsc|], - 'dos' => [qw|gs386 gs|], - 'os2' => [qw|gsos2 gs|], - 'win' => [qw|gswin32c gs|], - 'cygwin' => [qw|gs gswin32c|], - 'miktex' => [qw|mgs gswin32c gs|] - ); - if ($system eq 'win' or $system eq 'cygwin' or $system eq 'miktex') { - if ($archname =~ /mswin32-x64/i) { - my @a = (); - foreach my $name (@{$candidates{$system}}) { - push @a, 'gswin64c' if $name eq 'gswin32c'; - push @a, $name; - } - $candidates{$system} = \@a; - } - } - my %exe = ( - 'unix' => '', - 'dos' => '.exe', - 'os2' => '.exe', - 'win' => '.exe', - 'cygwin' => '.exe', - 'miktex' => '.exe' - ); - my $candidates_ref = $candidates{$system}; - my $exe = $Config{'_exe'}; - $exe = $exe{$system} unless defined $exe; - my @path = File::Spec->path(); - my $found = 0; - foreach my $candidate (@$candidates_ref) { - foreach my $dir (@path) { - my $file = File::Spec->catfile($dir, "$candidate$exe"); - if (-x $file) { - $gscmd = $candidate; - $found = 1; - print "* Found ($candidate): $file\n" if $debug; - last; - } - print "* Not found ($candidate): $file\n" if $debug; - } - last if $found; - } - if (not $found and $Win) { - $found = SearchRegistry(); - } - if ($found) { - print "* Autodetected ghostscript command: $gscmd\n" if $debug; - } - else { - $gscmd = $$candidates_ref[0]; - print "* Default ghostscript command: $gscmd\n" if $debug; - } -} - -sub SearchRegistry () { - my $found = 0; - eval 'use Win32::TieRegistry qw|KEY_READ REG_SZ|;'; - if ($@) { - if ($debug) { - print "* Registry lookup for Ghostscript failed:\n"; - my $msg = $@; - $msg =~ s/\s+$//; - foreach (split /\r?\n/, $msg) { - print " $_\n"; - } - } - return $found; - } - my $open_params = {Access => KEY_READ(), Delimiter => '/'}; - my $key_name_software = 'HKEY_LOCAL_MACHINE/SOFTWARE/'; - my $current_key = $key_name_software; - my $software = new Win32::TieRegistry $current_key, $open_params; - if (not $software) { - print "* Cannot find or access registry key `$current_key'!\n" - if $debug; - return $found; - } - print "* Search registry at `$current_key'.\n" if $debug; - my %list; - foreach my $key_name_gs (grep /Ghostscript/i, $software->SubKeyNames()) { - $current_key = "$key_name_software$key_name_gs/"; - print "* Registry entry found: $current_key\n" if $debug; - my $key_gs = $software->Open($key_name_gs, $open_params); - if (not $key_gs) { - print "* Cannot open registry key `$current_key'!\n" if $debug; - next; - } - foreach my $key_name_version ($key_gs->SubKeyNames()) { - $current_key = "$key_name_software$key_name_gs/$key_name_version/"; - print "* Registry entry found: $current_key\n" if $debug; - if (not $key_name_version =~ /^(\d+)\.(\d+)$/) { - print " The sub key is not a version number!\n" if $debug; - next; - } - my $version_main = $1; - my $version_sub = $2; - $current_key = "$key_name_software$key_name_gs/$key_name_version/"; - my $key_version = $key_gs->Open($key_name_version, $open_params); - if (not $key_version) { - print "* Cannot open registry key `$current_key'!\n" if $debug; - next; - } - $key_version->FixSzNulls(1); - my ($value, $type) = $key_version->GetValue('GS_DLL'); - if ($value and $type == REG_SZ()) { - print " GS_DLL = $value\n" if $debug; - $value =~ s|([\\/])([^\\/]+\.dll)$|$1gswin32c.exe|i; - my $value64 = $value; - $value64 =~ s/gswin32c\.exe$/gswin64c.exe/; - if ($archname =~ /mswin32-x64/i and -f $value64) { - $value = $value64; - } - if (-f $value) { - print "EXE found: $value\n" if $debug; - } - else { - print "EXE not found!\n" if $debug; - next; - } - my $sortkey = sprintf '%02d.%03d %s', - $version_main, $version_sub, $key_name_gs; - $list{$sortkey} = $value; - } - else { - print "Missing key `GS_DLL' with type `REG_SZ'!\n" if $debug; - } - } - } - foreach my $entry (reverse sort keys %list) { - $gscmd = $list{$entry}; - print "* Found (via registry): $gscmd\n" if $debug; - $found = 1; - last; - } - return $found; -} # end GS search - -### If windows -if ($Win and $gscmd =~ /\s/) { $gscmd = "\"$gscmd\"";} - -### Call GS -find_ghostscript(); - -### Program identification, options and help for command line - -my $licensetxt = <<END_LICENSE ; - 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 3 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. -END_LICENSE - -my $title = "$program $nv $copyright"; -my $usage = <<"END_OF_USAGE"; -${title}** Description ** - LTXimg is a "perl" script that automates the process of extracting and - converting "environments" provided by tikz, pstricks and other packages - from LaTeX file to image formats in "individual files" using ghostscript - and poppler-utils. Generates a one file with only extracted environments - and other with all extracted environments converted to \\includegraphics. - -** Syntax ** - \$ ltximg [<compiler>] [<options>] [--] <filename>.<tex|ltx> - -** Usage ** - \$ ltximg --latex [<options>] <file.tex> - \$ ltximg --arara [<options>] <file.tex> - \$ ltximg [<options>] <file.tex> - \$ ltximg <file.tex> - - If used without [<compiler>] and [<options>] the extracted environments - are converted to pdf image format and saved in the "/images" directory - using "pdflatex" and "preview" package. Relative or absolute paths for - directories and files is not supported. If the last option take a list - separated by commas, you need -- at the end. - -** Default environments extract ** - pspicture tikzpicture pgfpicture psgraph postscript PSTexample - -** Options ** - [default] --h, --help Display command line help and exit [off] --l, --license Display GPL license and exit [off] --v, --version Display current version ($nv) and exit [off] --t, --tif Create .tif files using ghostscript [$gscmd] --b, --bmp Create .bmp files using ghostscript [$gscmd] --j, --jpg Create .jpg files using ghostscript [$gscmd] --p, --png Create .png files using ghostscript [$gscmd] --e, --eps Create .eps files using poppler-utils [pdftops] --s, --svg Create .svg files using poppler-utils [pdftocairo] --P, --ppm Create .ppm files using poppler-utils [pdftoppm] --g, --gray Gray scale for images using ghostscript [off] --f, --force Capture "\\psset" and "\\tikzset" to extract [off] --n, --noprew Create images files whitout "preview" package [off] --d <integer>, --dpi <integer> - Dots per inch resolution for images [150] --m <integer>, --margin <integer> - Set margins for pdfcrop [0] ---imgdir <dirname> Set name of directory to save images [images] ---zip Compress files generated in .zip format [off] ---tar Compress files generated in .tar.gz format [off] --o <filename>, --output <filename> - Create output file [off] ---verbose Verbose printing [off] ---srcenv Create files whit only code environment [off] ---subenv Create files whit preamble and code [off] ---latex Using latex>dvips>ps2pdf for compiler input - and pdflatex for compiler output [off] ---dvips Using latex>dvips>ps2pdf for compiler input - and latex>dvips>ps2pdf for compiler output [off] ---arara Use arara for compiler input and output [off] ---xetex Using xelatex for compiler input and output [off] ---dvipdf Using dvipdfmx for compiler input and output [off] ---luatex Using lualatex for compiler input and output [off] ---prefix <string> Set prefix append to each image file [off] ---norun Run script, but no create images files [off] ---nopdf Don't create a ".pdf" image files [off] ---nocrop Don't run pdfcrop [off] ---verbcmd <cmdname> Set "\\cmdname" verbatim command [myverb] ---clean (doc|pst|tkz|all|off) - Removes specific text in output file [doc] ---extrenv <env1,...> Add new environments to extract [empty] ---skipenv <env1,...> Skip environments to extract [empty] ---verbenv <env1,...> Add verbatim environments [empty] ---writenv <env1,...> Add verbatim write environments [empty] ---deltenv <env1,...> Delete environments in output file [empty] - -** Example ** - \$ ltximg --latex -e -p --srcenv --imgdir=mypics -o test-out test-in.ltx - \$ ltximg --latex -ep --srcenv --imgdir mypics -o test-out test-in.ltx - - Create a "/mypics" directory whit all extracted environments converted to - image formats (.pdf, .eps, .png), individual files whit source code (.tex) - for all extracted environments, a file "test-out.ltx" whit all extracted - environments converted to \\includegraphics and file "test-in-fig-all.tex" - with only the extracted environments using latex>dvips>ps2pdf and preview - package for <input file> and pdflatex for <output file>. - -** Documentation ** - For extended documentation use: - \$ texdoc ltximg -END_OF_USAGE - -### Error in command line -sub errorUsage { die "@_ (try ltximg --help for more information)\n"; } - -### Getopt::Long configuration for command line -my %opts_cmd; - -my $result=GetOptions ( -# short and long options - 'h|help' => \$opts_cmd{help}, # help - 'v|version' => \$opts_cmd{version}, # version - 'l|license' => \$opts_cmd{license}, # license - 'd|dpi=i' => \$DPI, # numeric - 'm|margin=i' => \$margins, # numeric - 'b|bmp' => \$opts_cmd{bmp}, # gs - 't|tif' => \$opts_cmd{tif}, # gs - 'j|jpg' => \$opts_cmd{jpg}, # gs - 'p|png' => \$opts_cmd{png}, # gs - 's|svg' => \$opts_cmd{svg}, # pdftocairo - 'e|eps' => \$opts_cmd{eps}, # pdftops - 'P|ppm' => \$opts_cmd{ppm}, # pdftoppm - 'g|gray' => \$gray, # gray (bolean) - 'f|force' => \$force, # force (bolean) - 'n|noprew' => \$noprew, # no preview (bolean) - 'o|output=s{1}' => \$output, # output file name (string) -# bolean options - 'subenv' => \$subenv, # subfile environments (bolean) - 'srcenv' => \$srcenv, # source files (bolean) - 'arara' => \$arara, # arara compiler - 'xetex' => \$xetex, # xelatex compiler - 'latex' => \$latex, # latex compiler - 'luatex' => \$luatex, # lualatex compiler - 'dvips' => \$dvips, # dvips compiler - 'dvipdf' => \$dvipdf, # dvipdfmx compiler - 'zip' => \$zip, # zip images dir - 'tar' => \$tar, # tar images dir -# string options from command line - 'extrenv=s{1,9}' => \@extr_env_tmp, # extract environments - 'skipenv=s{1,9}' => \@skip_env_tmp, # skip environment - 'verbenv=s{1,9}' => \@verb_env_tmp, # verbatim environment - 'writenv=s{1,9}' => \@verw_env_tmp, # verbatim write environment - 'deltenv=s{1,9}' => \@delt_env_tmp, # delete environment -# string options - 'imgdir=s{1}' => \$imageDir, # images dir name - 'verbcmd=s{1}' => \$verbcmd, # \myverb inline (string) - 'prefix=s{1}' => \$prefix, # prefix -# negated options - 'crop!' => \$crop, # run pdfcrop - 'pdf!' => \$pdf, # pdf image format - 'clean=s{1}' => \@clean, # clean output file - 'run!' => \$run, # run compiler - 'debug!' => \$debug, # debug mode - 'verbose!' => \$verbose, # debug mode, - ) or die $usage; - -### Remove white space and '=' in array captured from command line -s/^\s*(\=):?|\s*//mg foreach @extr_env_tmp; -s/^\s*(\=):?|\s*//mg foreach @skip_env_tmp; -s/^\s*(\=):?|\s*//mg foreach @verb_env_tmp; -s/^\s*(\=):?|\s*//mg foreach @verw_env_tmp; -s/^\s*(\=):?|\s*//mg foreach @delt_env_tmp; - -### Split comma separte list options from command line -@extr_env_tmp = split(/,/,join('',@extr_env_tmp)); -@skip_env_tmp = split(/,/,join('',@skip_env_tmp)); -@verb_env_tmp = split(/,/,join('',@verb_env_tmp)); -@verw_env_tmp = split(/,/,join('',@verw_env_tmp)); -@delt_env_tmp = split(/,/,join('',@delt_env_tmp)); - -### Validate input string options -if (grep( /(^\-|^\.).*?/, @extr_env_tmp )) { - die errorUsage "Invalid argument for --extrenv option"; -} -if (grep( /(^\-|^\.).*?/, @skip_env_tmp )) { - die errorUsage "Invalid argument for --skipenv option"; -} -if (grep( /(^\-|^\.).*?/, @verb_env_tmp )) { - die errorUsage "Invalid argument for --verbenv option"; -} -if (grep( /(^\-|^\.).*?/, @verw_env_tmp )) { - die errorUsage "Invalid argument for --writenv option"; -} -if (grep( /(^\-|^\.).*?/, @delt_env_tmp )) { - die errorUsage "Invalid argument for --deltenv option"; -} - -### Help -if (defined $opts_cmd{help}) { - find_ghostscript(); - print $usage; - exit(0); -} - -### Version -if (defined $opts_cmd{version}) { - print $title; - exit(0); -} - -### Licence -if (defined $opts_cmd{license}) { - print $licensetxt; - exit(0); -} - -### Set tmp random name for name-fig-tmp (temp files) -my $tmp = "$$"; - -### Check --srcenv and --subenv option from command line -if ($srcenv && $subenv) { - die errorUsage "--srcenv and --subenv options are mutually exclusive"; -} - -### Check the input file from command line -@ARGV > 0 or errorUsage "Input filename missing"; -@ARGV < 2 or errorUsage "Unknown option or too many input files"; - -### Check input file extention -my @SuffixList = ('.tex', '', '.ltx'); # posibles -my ($name, $path, $ext) = fileparse($ARGV[0], @SuffixList); -$ext = '.tex' if not $ext; - -### Read input file in memory (slurp), need :crlf for windows/linux -open my $INPUTfile, '<:crlf', "$name$ext"; -my $ltxfile; - { - local $/; - $ltxfile = <$INPUTfile>; - } -close $INPUTfile; - -### Funtion uniq -sub uniq { - my %seen; - grep !$seen{$_}++, @_; -} - -### Funtion array_minus -sub array_minus(\@\@) { - my %e = map{ $_ => undef } @{$_[1]}; - return grep( ! exists( $e{$_} ), @{$_[0]} ); -} - -### Funtion to create hash begin -> BEGIN, end -> END -sub crearhash { - my %cambios; - for my $aentra(@_){ - for my $initend (qw(begin end)) { - $cambios{"\\$initend\{$aentra"} = "\\\U$initend\E\{$aentra"; - } - } - return %cambios; -} - -### Default environment to extract -my @extr_tmp = qw ( - postscript tikzpicture pgfpicture pspicture psgraph - ); - -push (@extr_env_tmp, @extr_tmp); - -### Default verbatim environment -my @verb_tmp = qw ( - Example CenterExample SideBySideExample PCenterExample PSideBySideExample - verbatim Verbatim BVerbatim LVerbatim SaveVerbatim PSTcode - LTXexample tcblisting spverbatim minted listing lstlisting - alltt comment chklisting verbatimtab listingcont boxedverbatim - demo sourcecode xcomment pygmented pyglist program programl - programL programs programf programsc programt - ); - -push (@verb_env_tmp, @verb_tmp); - -### Default verbatim write environment -my @verbw_tmp = qw ( - scontents filecontents tcboutputlisting tcbexternal tcbwritetmp extcolorbox extikzpicture - VerbatimOut verbatimwrite PSTexample filecontentsdef filecontentshere filecontentsdefmacro - ); - -push (@verw_env_tmp, @verbw_tmp); - -### Rules to capture in regex -my $braces = qr/ (?:\{)(.+?)(?:\}) /msx; -my $braquet = qr/ (?:\[)(.+?)(?:\]) /msx; -my $no_corchete = qr/ (?:\[ .*? \])? /msx; - -### Capture new verbatim environments defined in input file -my @new_verb = qw ( - newtcblisting DeclareTCBListing ProvideTCBListing NewTCBListing - lstnewenvironment NewListingEnvironment NewProgram specialcomment - includecomment DefineVerbatimEnvironment newverbatim newtabverbatim - ); - -### Regex to capture names for new verbatim environments from input file -my $newverbenv = join "|", map quotemeta, sort { length $a <=> length $b } @new_verb; - $newverbenv = qr/\b(?:$newverbenv) $no_corchete $braces/msx; - -### Capture new verbatim write environments defined in input file -my @new_verb_write = qw ( - renewtcbexternalizetcolorbox renewtcbexternalizeenvironment - newtcbexternalizeenvironment newtcbexternalizetcolorbox - ); - -### Regex to capture names for new verbatim write environments from input file -my $newverbwrt = join "|", map quotemeta, sort { length $a <=> length $b } @new_verb_write; - $newverbwrt = qr/\b(?:$newverbwrt) $no_corchete $braces/msx; - -### Regex to capture MINTED related environments -my $mintdenv = qr/\\ newminted $braces (?:\{.+?\}) /x; -my $mintcenv = qr/\\ newminted $braquet (?:\{.+?\}) /x; -my $mintdshrt = qr/\\ newmint $braces (?:\{.+?\}) /x; -my $mintcshrt = qr/\\ newmint $braquet (?:\{.+?\}) /x; -my $mintdline = qr/\\ newmintinline $braces (?:\{.+?\}) /x; -my $mintcline = qr/\\ newmintinline $braquet (?:\{.+?\}) /x; - -### Pass input file to @array and remove % and comments -my @filecheck = $ltxfile; -s/%.*\n//mg foreach @filecheck; # del comments -s/^\s*|\s*//mg foreach @filecheck; # del white space -my $filecheck = join '', @filecheck; - -### Capture \newverbatim write names in input file -my @newv_write = $filecheck =~ m/$newverbwrt/xg; - -### Add @newv_write defined in input file to @verw_env_tmp -push (@verw_env_tmp, @newv_write); - -### Capture \newminted{$mintdenv}{options} (for) -my @mint_denv = $filecheck =~ m/$mintdenv/xg; - -### Capture \newminted[$mintcenv]{lang} (for) -my @mint_cenv = $filecheck =~ m/$mintcenv/xg; - -### Capture \newmint{$mintdshrt}{options} (while) -my @mint_dshrt = $filecheck =~ m/$mintdshrt/xg; - -### Capture \newmint[$mintcshrt]{lang}{options} (while) -my @mint_cshrt = $filecheck =~ m/$mintcshrt/xg; - -### Capture \newmintinline{$mintdline}{options} (while) -my @mint_dline = $filecheck =~ m/$mintdline/xg; - -### Capture \newmintinline[$mintcline]{lang}{options} (while) -my @mint_cline = $filecheck =~ m/$mintcline/xg; - -### Capture \newverbatim environments in input file (for) -my @verb_input = $filecheck =~ m/$newverbenv/xg; - -### Add new verbatim environment defined in input file to @vrbenv -push (@verb_env_tmp,@mint_denv,@mint_cenv,@verb_input); - -### Append "code" (minted) -if (!@mint_denv == 0) { - $mintdenv = join "\n", map { qq/$_\Qcode\E/ } @mint_denv; - @mint_denv = split /\n/, $mintdenv; -} - -### Append "inline" (minted) -if (!@mint_dline == 0) { - $mintdline = join "\n", map { qq/$_\Qinline\E/ } @mint_dline; - @mint_dline = split /\n/, $mintdline; -} - -### Join all minted inline/short and lstinline in @array -my @mintline; -my @mint_tmp = qw ( mint mintinline lstinline); -push (@mintline,@mint_dline,@mint_cline,@mint_dshrt,@mint_cshrt,@mint_tmp); - @mintline = uniq(@mintline); - -### Create a regex using @mintline -my $mintline = join "|", map quotemeta, sort { length $a <=> length $b } @mintline; - $mintline = qr/\b(?:$mintline)/x; - -### Options from input file -# % ltximg : extrenv : {extrenv1, extrenv2, ... , extrenvn} -# % ltximg : skipenv : {skipenv1, skipenv2, ... , skipenvn} -# % ltximg : verbenv : {verbwrt1, verbwrt2, ... , verbwrtn} -# % ltximg : writenv : {verbwrt1, verbwrt2, ... , verbwrtn} -# % ltximg : deltenv : {deltenv1, deltenv2, ... , deltenvn} -# % ltximg : options : {opt1=arg, opt2=arg, ... , bolean} - -### Regex to capture before preamble $readoptfile, %opt_from_file; -my $readoptfile = qr/ - ^ %+ \s* ltximg (?&SEPARADOR) (?<clave>(?&CLAVE)) (?&SEPARADOR) \{ (?<argumentos>(?&ARGUMENTOS)) \} - (?(DEFINE) - (?<CLAVE> \w+ ) - (?<ARGUMENTOS> .+? ) - (?<SEPARADOR> \s* : \s* ) - ) -/mx; - -### Split input file, $atbegindoc contain % ltximg : <argument> -my ($atbegindoc, $document) = $ltxfile =~ m/\A (\s* .*? \s*) (\\documentclass.*)\z/msx; - -### Process options from input file -my %opts_file; - -while ($atbegindoc =~ /$readoptfile/g) { - my ($clave, $argumentos) = @+{qw(clave argumentos)}; - my @argumentos = split /\s*,\s*?/, $argumentos; - for (@argumentos) { s/^ \s* | \s* $//gx; } - if ($clave eq 'options') { - for my $argumento (@argumentos) { - if ($argumento =~ /(?<key>\S+) \s* = \s* (?<valor>\S+)/x) { - $opts_file{$clave}{$+{'key'}} = $+{'valor'}; - } # close for - else { - $opts_file{$clave}{$argumento} = 1; - } - } # close for - } # close if - else { - push @{ $opts_file{ $clave } }, @argumentos; - } -} # close while - -### Validate clean -my %clean = map { $_ => 1 } @clean; - -### By default clean = doc -$clean{doc} = 1 ; - -### Set clean options from input file -$clean{doc} = 1 if ($opts_file{options}{clean} eq 'doc'); -$clean{off} = 1 if ($opts_file{options}{clean} eq 'off'); -$clean{pst} = 1 if ($opts_file{options}{clean} eq 'pst'); -$clean{tkz} = 1 if ($opts_file{options}{clean} eq 'tkz'); -$clean{all} = 1 if ($opts_file{options}{clean} eq 'all'); - -### Set clean options for script -if ($clean{pst} or $clean{tikz}) { $clean{doc} = 1; } -if ($clean{all}) { @clean{qw(pst doc tkz)} = (1) x 3; } -if ($clean{off}) { undef %clean; } - -### Add extract options from input file -if (exists $opts_file{extract}) { - push @extr_env_tmp, @{ $opts_file{extract} }; -} - -### Add skipenv options from input file -if (exists $opts_file{skipenv}) { - push @skip_env_tmp, @{ $opts_file{skipenv} }; -} - -### Add verbenv options from input file -if (exists $opts_file{verbenv}) { - push @verb_env_tmp, @{ $opts_file{verbenv} }; -} - -### Add writenv options from input file -if (exists $opts_file{writenv}) { - push @verw_env_tmp, @{ $opts_file{writenv} }; -} - -### Add deltenv options from input file -if (exists $opts_file{deltenv}) { - push @delt_env_tmp, @{ $opts_file{deltenv} }; -} - -### Set \myverb|<code>| options from input file -if (exists $opts_file{options}{verbcmd}) { - $verbcmd = $opts_file{options}{verbcmd}; -} - -### Create @env_all_tmp contain all environments -my @env_all_tmp; -push(@env_all_tmp,@extr_env_tmp,@skip_env_tmp,@verb_env_tmp,@verw_env_tmp,@delt_env_tmp); -@env_all_tmp = uniq(@env_all_tmp); - -### Create @no_env_all_tmp contain all No extracted environments -my @no_env_all_tmp; -push(@no_env_all_tmp,@skip_env_tmp,@verb_env_tmp,@verw_env_tmp,@delt_env_tmp); -@no_env_all_tmp = uniq(@no_env_all_tmp); - -### The operation return @extract environment -my @extract = array_minus(@env_all_tmp,@no_env_all_tmp); - @extract = uniq(@extract); - -### The operation return @no_extract -my @no_extract = array_minus(@env_all_tmp,@extract); -my @no_skip; -push(@no_skip,@verb_env_tmp,@verw_env_tmp,@delt_env_tmp); -my @skipped = array_minus(@no_extract,@no_skip); - @skipped = uniq(@skipped); - -### The operation return @delte_env environment -my @no_ext_skip = array_minus(@no_extract,@skipped); -my @no_del; -push(@no_del,@verb_env_tmp,@verw_env_tmp); -my @delete_env = array_minus(@no_ext_skip,@no_del); - @delete_env = uniq(@delete_env); - -### The operation return @verbatim environment -my @no_ext_skip_del = array_minus(@no_ext_skip,@delete_env); -my @verbatim = array_minus(@no_ext_skip_del,@verw_env_tmp); - -### The operation return @verbatim write environment -my @verbatim_w = array_minus(@no_ext_skip_del,@verbatim); - -### Create @env_all for hash and replace in while -my @no_verb_env; -push(@no_verb_env,@extract,@skipped,@delete_env,@verbatim_w); -my @no_verw_env; -push(@no_verw_env,@extract,@skipped,@delete_env,@verbatim); - -### Reserved words in verbatim inline (while) -my %changes_in = ( -# ltximg tags - '%<*ltximg>' => '%<*LTXIMG>', - '%</ltximg>' => '%</LTXIMG>', - '%<*noltximg>' => '%<*NOLTXIMG>', - '%</noltximg>' => '%</NOLTXIMG>', - '%<*remove>' => '%<*REMOVE>', - '%</remove>' => '%</REMOVE>', - '%<*ltximgverw>' => '%<*LTXIMGVERW>', - '%</ltximgverw>' => '%</LTXIMGVERW>', -# pst/tikz set - '\psset' => '\PSSET', - '\tikzset' => '\TIKZSET', -# pspicture - '\pspicture' => '\TRICKS', - '\endpspicture' => '\ENDTRICKS', -# pgfpicture - '\pgfpicture' => '\PGFTRICKS', - '\endpgfpicture' => '\ENDPGFTRICKS', -# tikzpicture - '\tikzpicture' => '\TKZTRICKS', - '\endtikzpicture' => '\ENDTKZTRICKS', -# psgraph - '\psgraph' => '\PSGRAPHTRICKS', - '\endpsgraph' => '\ENDPSGRAPHTRICKS', -# some reserved - '\usepackage' => '\USEPACKAGE', - '{graphicx}' => '{GRAPHICX}', - '\graphicspath{' => '\GRAPHICSPATH{', - ); - -### Changues \begin... \end in verbatim inline -my %init_end = ( -# begin{ and end{ - '\begin{' => '\BEGIN{', - '\end{' => '\END{', - ); - -### Changues for \begin{document} ... \end{document} -my %document = ( -# begin/end document for split - '\begin{document}' => '\BEGIN{document}', - '\end{document}' => '\END{document}', - ); - -### Reverse for extract and output file -my %changes_out = ( -# ltximg tags - '\begin{nopreview}' => '%<*noltximg>', - '\end{nopreview}' => '%</noltximg>', -# pst/tikz set - '\PSSET' => '\psset', - '\TIKZSET' => '\tikzset', -# pspicture - '\TRICKS' => '\pspicture', - '\ENDTRICKS' => '\endpspicture', -# pgfpicture - '\PGFTRICKS' => '\pgfpicture', - '\ENDPGFTRICKS' => '\endpgfpicture', -# tikzpicture - '\TKZTRICKS' => '\tikzpicture', - '\ENDTKZTRICKS' => '\endtikzpicture', -# psgraph - '\PSGRAPHTRICKS' => '\psgraph', - '\ENDPSGRAPHTRICKS' => '\endpsgraph', -# some reserved - '\USEPACKAGE' => '\usepackage', - '{GRAPHICX}' => '{graphicx}', - '\GRAPHICSPATH{' => '\graphicspath{', -# begin{ and end{ - '\BEGIN{' => '\begin{', - '\END{' => '\end{', - ); - -### Reverse tags, need back in all file to extract -my %reverse_tag = ( -# ltximg tags - '%<*LTXIMG>' => '%<*ltximg>', - '%</LTXIMG>' => '%</ltximg>', - '%<*NOLTXIMG>' => '%<*noltximg>', - '%</NOLTXIMG>' => '%</noltximg>', - '%<*REMOVE>' => '%<*remove>', - '%</REMOVE>' => '%</remove>', - '%<*LTXIMGVERW>' => '%<*ltximgverw>', - '%</LTXIMGVERW>' => '%</ltximgverw>', - ); - -### Creatate a hash for changues -my %extract_env = crearhash(@extract); -my %skiped_env = crearhash(@skipped); -my %verb_env = crearhash(@verbatim); -my %verbw_env = crearhash(@verbatim_w); -my %delete_env = crearhash(@delete_env); -my %change_verbw_env = crearhash(@no_verw_env); -my %change_verb_env = crearhash(@no_verb_env); - -### Join changues in new hash -my %cambios = (%changes_in, %init_end); - -### Variables y constantes -my $no_del = "\0"; -my $del = $no_del; - -### Rules -my $llaves = qr/\{ .+? \} /x; -my $no_llaves = qr/(?: $llaves )? /x; -my $corchetes = qr/\[ .+? \] /x; -my $nestedbr = qr/(\{(?>[^\{\}\\]++|\\.|(?R))*+\}) /x; -my $delimitador = qr/\{ (?<del>.+?) \} /x; -my $scontents = qr/Scontents [*]? $no_corchete /ix; -my $verb = qr/(?:((spv|(?:q|f)?v|V)erb|$verbcmd)[*]?) /ix; -my $lst = qr/(?:(lst|pyg)inline)(?!\*) $no_corchete /ix; -my $mint = qr/(?: $mintline |SaveVerb) (?!\*) $no_corchete $no_llaves $llaves /ix; -my $no_mint = qr/(?: $mintline) (?!\*) $no_corchete /ix; -my $marca = qr/\\ (?:$verb | $lst |$scontents | $mint |$no_mint) (?:\s*)? (\S) .+? \g{-1} /sx; -my $comentario = qr/^ \s* \%+ .+? $ /mx; -my $definedel = qr/\\ (?: DefineShortVerb | lstMakeShortInline| MakeSpecialShortVerb ) [*]? $no_corchete $delimitador /ix; -my $indefinedel = qr/\\ (?: (Undefine|Delete)ShortVerb | lstDeleteShortInline) $llaves /ix; - -### Changues in input file (in memory) -while ($document =~ - / $marca - | $comentario - | $definedel - | $indefinedel - | $del .+? $del - /pgmx) { - my ($pos_inicial, $pos_final) = ($-[0], $+[0]); - my $encontrado = ${^MATCH}; - if ($encontrado =~ /$definedel/) { - $del = $+{del}; - $del = "\Q$+{del}" if substr($del,0,1) ne '\\'; - } - elsif ($encontrado =~ /$indefinedel/) { - $del = $no_del; - } - else { - while (my($busco, $cambio) = each %cambios) { - $encontrado =~ s/\Q$busco\E/$cambio/g; - } # close while - substr $document, $pos_inicial, $pos_final-$pos_inicial, $encontrado; - pos ($document) = $pos_inicial + length $encontrado; - } -} - -### Regex for verbatim inline whit braces {...} -my $fvextra = qr /\\ (?: (Save|Esc)Verb [*]?) $no_corchete /x; -my $mintedbr = qr /\\ (?:$mintline|pygment) (?!\*) $no_corchete $no_llaves /x; -my $tcbxverb = qr /\\ (?: tcboxverb [*]?| Scontents [*]? |$verbcmd [*]?|lstinline) $no_corchete /x; -my $verb_brace = qr / (?:$tcbxverb|$mintedbr|$fvextra) (?:\s*)? $nestedbr /x; - -### Changue \verb*{code} for verbatim inline -while ($document =~ /$verb_brace/pgmx) { - my ($pos_inicial, $pos_final) = ($-[0], $+[0]); - my $encontrado = ${^MATCH}; - while (my($busco, $cambio) = each %cambios) { - $encontrado =~ s/\Q$busco\E/$cambio/g; - } # close while - substr $document, $pos_inicial, $pos_final-$pos_inicial, $encontrado; - pos ($document) = $pos_inicial + length $encontrado; -} # close while - -### Changue <*TAGS> to <*tags> -my $ltxtags = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %reverse_tag; - $document =~ s/^($ltxtags)/$reverse_tag{$1}/gmsx; - -### Define environments Verbatim standart -my $verbatim = join "|", map quotemeta, sort { length $a <=> length $b } @verbatim; - $verbatim = qr/$verbatim/x; - -### Define environments Verbatim write -my $verbatim_w = join "|", map quotemeta, sort { length $a <=> length $b } @verbatim_w; - $verbatim_w = qr/$verbatim_w/x; - -### Define environments to skip -my $skipenv = join "|", map quotemeta, sort { length $a <=> length $b } @skipped; - $skipenv = qr/$skipenv/x; - -### Define environments to extract -my $environ = join "|", map quotemeta, sort { length $a <=> length $b } @extract; - $environ = qr/$environ/x; - -### Define environments to delete -my $delenv = join "|", map quotemeta, sort { length $a <=> length $b } @delt_env_tmp; - $delenv = qr/$delenv/x; - -### Split file by lines -my @lineas = split /\n/, $document; - -### Hash and Regex for changues -my %replace = (%change_verb_env,%changes_in,%document); -my $find = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace; - -### Change in $verbatim and $verbatim_w -my $DEL; -for (@lineas) { - if (/\\begin\{($verbatim\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) { - s/($find)/$replace{$1}/g; } - if (/\\begin\{($verbatim_w\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) { - my %replace = (%change_verbw_env,%changes_in,%document); - my $find = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace; - s/($find)/$replace{$1}/g; } -} # close for - -### Join lines in $document -$document = join("\n", @lineas); - -### Split input file -my ($preamble,$bodydoc,$enddoc) = $document =~ m/\A (.+?) (\\begin\{document\} .+?)(\\end\{document\}.*)\z/msx; - -### Regex for delete environment -my $delt_env = qr / - ( - (?: - \\begin\{$delenv\*?\} - (?: - (?>[^\\]+)| - \\ - (?!begin\{$delenv\*?\}) - (?!end\{$delenv\*?\})| - (?-1) - )* - \\end\{$delenv\*?\} - ) - ) - /x; - -### Regex for verbatim write environment -my $verb_wrt = qr / - ( - (?: - \\begin\{$verbatim_w\*?\} - (?: - (?>[^\\]+)| - \\ - (?!begin\{$verbatim_w\*?\}) - (?!end\{$verbatim_w\*?\})| - (?-1) - )* - \\end\{$verbatim_w\*?\} - ) - ) - /x; - -### Pass $verb_wrt to %<*ltximgverw> ... %</ltximgverw> -$bodydoc =~ s/($verb_wrt)/\%<\*ltximgverw>\n$1\n\%<\/ltximgverw>/gmsx; - -### Regex for skip environment -my $skip_env = qr / - ( - (?: - \\begin\{$skipenv\*?\} - (?: - (?>[^\\]+)| - \\ - (?!begin\{$skipenv\*?\}) - (?!end\{$skipenv\*?\})| - (?-1) - )* - \\end\{$skipenv\*?\} - ) - ) - /x; - -### Pass %<*noltximg> ... %</noltximg> to \begin{nopreview} ... \end{nopreview} -$bodydoc =~ s/^\%<\*$skiptag>(.+?)\%<\/$skiptag>/\\begin\{nopreview\}$1\\end\{nopreview\}/gmsx; - -### Pass $skip_env to \begin{nopreview} .+? \end{nopreview} -$bodydoc =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - ($skip_env)/\\begin\{nopreview\}\n$1\n\\end\{nopreview\}\n/gmsx; - -### Regex to extract environments -my $extr_env = qr / - ( - (?: - \\begin\{$environ\*?\} - (?: - (?>[^\\]+)| - \\ - (?!begin\{$environ\*?\}) - (?!end\{$environ\*?\})| - (?-1) - )* - \\end\{$environ\*?\} - ) - ) - /x; - -### Set bolean options from input file -$zip = 1 if exists $opts_file{options}{zip}; -$tar = 1 if exists $opts_file{options}{tar}; -$force = 1 if exists $opts_file{options}{force}; -$run = 0 if exists $opts_file{options}{norun}; -$pdf = 0 if exists $opts_file{options}{nopdf}; -$crop = 0 if exists $opts_file{options}{nocrop}; -$noprew = 1 if exists $opts_file{options}{noprew}; -$force = 1 if exists $opts_file{options}{force}; -$arara = 1 if exists $opts_file{options}{arara}; -$xetex = 1 if exists $opts_file{options}{xetex}; -$latex = 1 if exists $opts_file{options}{latex}; -$dvips = 1 if exists $opts_file{options}{dvips}; -$dvipdf = 1 if exists $opts_file{options}{dvipdf}; -$luatex = 1 if exists $opts_file{options}{luatex}; -$srcenv = 1 if exists $opts_file{options}{srcenv}; -$subenv = 1 if exists $opts_file{options}{subenv}; - -### Check plain TeX syntax -my %special = map { $_ => 1 } @extract; # anon hash - -### Convert \pspicture to LaTeX syntax -if (exists($special{pspicture})) { - $bodydoc =~ s/ - \\pspicture(\*)?(.+?)\\endpspicture/\\begin{pspicture$1}$2\\end{pspicture$1}/gmsx; -} - -### Convert \psgraph to LaTeX syntax -if (exists($special{psgraph})) { - $bodydoc =~ s/ - \\psgraph(\*)?(.+?)\\endpsgraph/\\begin{psgraph$1}$2\\end{psgraph$1}/gmsx; -} - -### Convert \tikzpicture to LaTeX syntax -if (exists($special{tikzpicture})) { - $bodydoc =~ s/ - \\tikzpicture(.+?)\\endtikzpicture/\\begin{tikzpicture}$1\\end{tikzpicture}/gmsx; -} - -### Convert \pgfpicture to LaTeX syntax -if (exists($special{pgfpicture})) { - $bodydoc =~ s/ - \\pgfpicture(.+?)\\endpgfpicture/\\begin{pgfpicture}$1\\end{pgfpicture}/gmsx; -} - -### Pass %<*ltximg> (.+?) %</ltximg> to \begin{preview} (.+?) \end{preview} -$bodydoc =~ s/^\%<\*$extrtag>(.+?)\%<\/$extrtag>/\\begin\{preview\}$1\\end\{preview\}/gmsx; - -### $force mode for pstricks/psgraph/tikzpiture -if ($force) { -if (exists($special{pspicture}) or exists($special{psgraph})) { # pspicture or psgraph found -$bodydoc =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - \\begin\{preview\}.+?\\end\{preview\}(*SKIP)(*F)| - \\begin\{postscript\}.+?\\end\{postscript\}(*SKIP)(*F)| - (?<code> - (?:\\psset\{(?:\{.*?\}|[^\{])*\}.+?)? # if exist ...save - \\begin\{(?<env> pspicture\*?| psgraph)\} .+? \\end\{\k<env>\} - ) - /\\begin\{preview\}\n$+{code}\n\\end\{preview\}/gmsx; - } # close pspicture -if (exists($special{tikzpicture})) {# tikzpicture found -$bodydoc =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - \\begin\{preview\}.+?\\end\{preview\}(*SKIP)(*F)| - \\begin\{postscript\}.+?\\end\{postscript\}(*SKIP)(*F)| - (?<code> - (?:\\tikzset\{(?:\{.*?\}|[^\{])*\}.+?)? # if exist ...save - \\begin\{(?<env> tikzpicture)\} .+? \\end\{\k<env>\} - ) - /\\begin\{preview\}\n$+{code}\n\\end\{preview\}/gmsx; - } # close tikzpicture -} # close $force mode - -### Pass $extr_env to \begin{preview} .+? \end{preview} -$bodydoc =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - \\begin\{preview\}.+?\\end\{preview\}(*SKIP)(*F)| - ($extr_env)/\\begin\{preview\}\n$1\n\\end\{preview\}/gmsx; - -### The extract environments need back words to original -%replace = (%changes_out,%reverse_tag); - $find = join "|", map {quotemeta} sort { length($a)<=>length($b) } keys %replace; - -### Split $preamble by lines -@lineas = split /\n/, $preamble; - -### Changues in verbatim write -for (@lineas) { - if (/\\begin\{($verbatim_w\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) { - s/($find)/$replace{$1}/g; } -} # close for - -### Join lines in $preamble -$preamble = join("\n", @lineas); - -### Change back betwen \begin{preview} ... \end{preview} -@lineas = split /\n/, $bodydoc; - -for (@lineas) { - if (/\\begin\{(preview)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) { # range operator - s/($find)/$replace{$1}/g; } - if (/\\begin\{($verbatim_w\*?)(?{ $DEL = "\Q$^N" })\}/ .. /\\end\{$DEL\}/) { - s/($find)/$replace{$1}/g; } -} # close for - -### Join lines in $bodydoc -$bodydoc = join("\n", @lineas); - -### preview environment for extract -my $BP = '\\\\begin\{preview\}'; -my $EP = '\\\\end\{preview\}'; - -my @env_extract = $bodydoc =~ m/(?<=$BP)(.+?)(?=$EP)/gms; -my $envNo = scalar @env_extract; - -### PSTexample environment for extract -my $BE = '\\\\begin\{PSTexample\}'; -my $EE = '\\\\end\{PSTexample\}'; - -my @exa_extract = $bodydoc =~ m/(?<=$BE)(.+?)(?=$EE)/gms; -my $exaNo = scalar @exa_extract; - -### Check if PSTexample environment found, 1 = run script -if ($exaNo!=0) { $PSTexa = 1; } - -### Check if standart environment found, , 1 = run script -if ($envNo!=0) { $STDenv=1; } - -### PSTexample environment suport -if ($PSTexa) { # append [graphic={[...]...}] -$exaNo = 1; -while ($bodydoc =~ /\\begin\{PSTexample\}(\[.+?\])?/gsm) { - my $swpl_grap = "graphic=\{\[scale=1\]$imageDir/$name-$prefix-exa"; - my $corchetes = $1; - my ($pos_inicial, $pos_final) = ($-[1], $+[1]); - if (not $corchetes) { $pos_inicial = $pos_final = $+[0]; } - if (not $corchetes or $corchetes =~ /\[\s*\]/) { - $corchetes = "[$swpl_grap-$exaNo}]"; - } - else { $corchetes =~ s/\]/,$swpl_grap-$exaNo}]/; } - substr($bodydoc, $pos_inicial, $pos_final - $pos_inicial) = $corchetes; - pos($bodydoc) = $pos_inicial + length $corchetes; -} # close while -continue { $exaNo++; } # increment counter - -### Pass PSTexample to nopreview environment -$bodydoc =~ s/\%<\*ltximgverw>\n - (?<code> - \\begin\{PSTexample\} .+? \\end\{PSTexample\} - ) - \n\%<\/ltximgverw> - /\\begin\{nopreview\}\n$+{code}\n\\end\{nopreview\}/gmsx; -} # close PSTexa - -### Command line script identification -print "$program $nv $copyright" ; - -### Check if enviroment found in input file -if ($envNo == 0 and $exaNo == 0) { - die errorUsage "ltximg can not find any environment to extract in file $name$ext"; - } -elsif ($envNo!= 0 and $exaNo!= 0) { - say "The file $name$ext contain $envNo environment to extract and $exaNo PSTexample environment to extract"; - } -elsif ($envNo == 0 and $exaNo!= 0) { - say "The file $name$ext contain $exaNo PSTexample environment to extract"; - } -else { say "The file $name$ext contain $envNo environment to extract"; } - -### Set output file name from input file -if (exists $opts_file{options}{output}){ - $output = $opts_file{options}{output}; -} - -### Validate output file name -if (defined $output) { -# Not contain - at begin -if ($output =~ /(^\-|^\.).*?/) { - die errorUsage "$output it is not a valid name for output file"; -} -# The name of the output file must be different that $name -if ($output eq "$name") { $output = "$name-out$ext"; } - -# The name of the output file must be different that $name.ext -if ($output eq "$name$ext") { $output = "$name-out$ext"; } - -# Remove .ltx or .tex extension -if ($output =~ /.*?$ext/) { $output =~ s/(.+?)$ext/$1/gms;} -} # close check - -### If output name are ok, then $outfile = 1 -if (defined($output)) { $outfile = 1; } - -### If --srcenv or --subenv option are OK then execute script -if ($srcenv) { $outsrc = 1; $subenv = 0; } -if ($subenv) { $outsrc = 1; $srcenv = 0; } - -### Set imgdir name from input file -if (exists $opts_file{options}{imgdir}) { - $imageDir = $opts_file{options}{imgdir}; -} - -### Set prefix name from input file -if (exists $opts_file{options}{prefix}) { - $prefix = $opts_file{options}{prefix}; -} - -### Set pdfcrop margins from input file -if (exists $opts_file{options}{margins}) { - $margins = $opts_file{options}{margins}; -} - -### Set DPI resolution for images from input file -if (exists $opts_file{options}{dpi}) { - $DPI = $opts_file{options}{dpi}; -} - -### Create /images dir to save image and source code --e $imageDir or mkdir($imageDir,0744) or die "Can't create $imageDir: $!\n"; - -### Options for \pagestyle{empty} ($crop) -my $opt_page = $crop ? "\n\\pagestyle\{empty\}\n\\begin\{document\}" - : "\n\\begin\{document\}" - ; - -### Add options to preamble for subfiles -my $sub_prea = "$atbegindoc$preamble$opt_page"; - -### Delete <*remove> ... </remove> in $sub_prea -$sub_prea =~ s/^\%<\*remove>\s*(.+?)\s*\%<\/remove>(?:[\t ]*(?:\r?\n|\r))?+//gmsx; - -### Options for preview packpage -my $opt_prew = $xetex ? 'xetex,' - : $latex ? '' - : 'pdftex,' - ; - -### Lines to add at begin input file -my $preview = <<"EXTRA"; -\\AtBeginDocument\{% -\\RequirePackage\[${opt_prew}active,tightpage\]\{preview\}% -\\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}\}% -EXTRA - -### Extract source $outsrc -if ($outsrc) { -my $src_name = "$name-$prefix-"; -my $srcNo = 1; - -### Source file whitout preamble for standart environment -if ($srcenv) { -if ($STDenv) { # extract standard environments in individual files - say "Creating $envNo files with source code for all environments"; - while ($bodydoc =~ m/$BP\s*(?<env_src>.+?)\s*$EP/gms) { - open my $OUTsrc, '>', "$imageDir/$src_name$srcNo$ext"; - print $OUTsrc $+{env_src}; - close $OUTsrc; - } # close while - continue { $srcNo++; } # increment counter -} # close STDenv -if ($PSTexa) { # extract PSTexample environments in individual files - say "Creating $exaNo files with source code for all PSTexample environments"; - while ($bodydoc =~ m/$BE\[.+?(?<pst_exa_name>$imageDir\/.+?-\d+)\}\]\s*(?<exa_src>.+?)\s*$EE/gms) { - open my $OUTexa, '>', "$+{'pst_exa_name'}$ext"; - print $OUTexa $+{'exa_src'}; - close $OUTexa; - } - } # close PSTexa -} # close srcenv - -### Subfile whit preamble -if ($subenv) { -if ($STDenv) { # extract standard environments (with preamble) in individual files -say "Creating a $envNo files whit source code and preamble for all environments"; -while ($bodydoc =~ m/(?<=$BP)(?<env_src>.+?)(?=$EP)/gms) { # search $bodydoc -open my $OUTsub, '>', "$imageDir/$src_name$srcNo$ext"; -print $OUTsub <<"EOC"; -$sub_prea$+{'env_src'}\\end\{document\} -EOC -close $OUTsub; - } # close while -continue { $srcNo++; } -} # close STDenv -if ($PSTexa) { # extract PSTexample environments (with preamble) in individual files -say "Creating a $exaNo files whit source code and preamble for all PSTexample environments"; -while ($bodydoc =~ m/$BE\[.+?(?<pst_exa_name>$imageDir\/.+?-\d+)\}\]\s*(?<exa_src>.+?)\s*$EE/gms) { - open my $OUTsub, '>', "$+{'pst_exa_name'}$ext"; - print $OUTsub "$sub_prea\n$+{'exa_src'}\n\\end\{document\}"; - close $OUTsub; - } # close while - } # close $PSTexa - } # close subenv -} # close $outsrc - -### Create a one file with "all" PSTexample environments extracted -if ($PSTexa) { -say "Creating the temporary file $name-$prefix-exa-$tmp$ext whit $exaNo PSTexample environments extracted"; -@exa_extract = undef; - while ( $bodydoc =~ m/$BE\[.+? $imageDir\/.+?-\d+\}\](?<exa_src>.+?)$EE/gmsx ) { # search $bodydoc - push @exa_extract, $+{exa_src}."\n\\newpage\n"; - open my $OUTfig, '>', "$name-$prefix-exa-$tmp$ext"; - print $OUTfig "$atbegindoc"."$preamble"."$opt_page"."@exa_extract\n"."\\end\{document\}"; - close $OUTfig; - }# close while -if (!$run) { # Move and rename tmp-exa-rand file to /image dir -say "Moving the file $name-$prefix-exa-$tmp$ext to /$imageDir/$name-$prefix-exa-all$ext"; -move("$workdir/$name-$prefix-exa-$tmp$ext", "$imageDir/$name-$prefix-exa-all$ext"); - } -}# close $PSTexa - -### Create a one file whit "all" standard environments extracted -if ($STDenv) { -open my $OUTfig, '>', "$name-$prefix-$tmp$ext"; - if ($noprew) { # $noprew option - say "Creating the temporary file $name-$prefix-$tmp$ext whit $envNo environments extracted"; - my @env_extract; - while ( $bodydoc =~ m/(?<=$BP)(?<env_src>.+?)(?=$EP)/gms ) { # search $bodydoc - push @env_extract, $+{env_src}."\n\\newpage\n"; - } # close while - print $OUTfig "$atbegindoc"."$preamble"."$opt_page"."@env_extract\n"."\\end{document}"; - } # close $noprew - else { # default - say "Creating the temporary file $name-$prefix-$tmp$ext whit $envNo environment extracted using preview package"; - print $OUTfig $atbegindoc.$preview.$preamble."\n".$bodydoc."\n\\end{document}"; - } -close $OUTfig; - -### Move tmp-rand file to /image dir -if (!$run) { -say "Moving the file $name-$prefix-$tmp$ext to /$imageDir/$name-$prefix-all$ext"; - move("$workdir/$name-$prefix-$tmp$ext", "$imageDir/$name-$prefix-all$ext"); - } -} # close $STDenv - -### Define --shell-escape for TeXLive and MikTeX -my $write18 = '-shell-escape'; # TeXLive - $write18 = '-enable-write18' if defined($ENV{"TEXSYSTEM"}) and - $ENV{"TEXSYSTEM"} =~ /miktex/i; - -### Define --interaction=mode for compilers -my $opt_compiler = $verbose ? "$write18 -interaction=nonstopmode -recorder" - : "$write18 -interaction=batchmode -recorder" - ; - -### Define $silence -my $silence = $verbose ? '' - : ">$null" - ; - -### Append -q to gs and poppler for system command line -my $quiet = $verbose ? '' - : '-q' - ; - -### Compilers -my $compiler = $xetex ? "xelatex $opt_compiler" - : $luatex ? "lualatex $opt_compiler" - : $latex ? "latex $opt_compiler" - : $dvips ? "latex $opt_compiler" - : $dvipdf ? "latex $opt_compiler" - : $arara ? 'arara' - : "pdflatex $opt_compiler" - ; - -### Message in command line for compilers -my $msg_compiler = $xetex ? 'xelatex' - : $luatex ? 'lualatex' - : $latex ? 'latex>dvips>ps2pdf' - : $dvips ? 'latex>dvips>ps2pdf' - : $dvipdf ? 'latex>dvipdfmx' - : $arara ? 'arara' - : 'pdflatex' - ; - -### Options for ghostscript in command line -my %opt_gs_dev = ( - pdf => "$gscmd $quiet -dNOSAFER -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress", - gray => "$gscmd $quiet -dNOSAFER -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray", - png => "$gscmd $quiet -dNOSAFER -sDEVICE=pngalpha -r$DPI", - bmp => "$gscmd $quiet -dNOSAFER -sDEVICE=bmp32b -r$DPI", - jpg => "$gscmd $quiet -dNOSAFER -sDEVICE=jpeg -r$DPI -dJPEGQ=100 -dGraphicsAlphaBits=4 -dTextAlphaBits=4", - tif => "$gscmd $quiet -dNOSAFER -sDEVICE=tiff32nc -r$DPI", - ); - -### Options for poppler-utils in command line -my %opt_poppler = ( - eps => "pdftops $quiet -eps", - ppm => "pdftoppm $quiet -r $DPI", - svg => "pdftocairo $quiet -svg", - ); - -### Option for pdfcrop in command line -my $opt_crop = $xetex ? "--xetex --margins $margins" - : $luatex ? "--luatex --margins $margins" - : $latex ? "--margins $margins" - : "--pdftex --margins $margins" - ; - -### Compiler generate file whit all environment extracted -if ($run) { -opendir(my $DIR, $workdir); -while (readdir $DIR) { -### Compiler generate file -if (/(?<name>$name-$prefix(-exa)?)(?<type>-$tmp$ext)/) { - system("$compiler $+{name}$+{type} $silence"); - say "Compiling the file $+{name}$+{type} using $msg_compiler"; - -### Compiling file using latex>dvips>ps2pdf -if ($dvips or $latex) { - system("dvips -q -Ppdf -o $+{name}-$tmp.ps $+{name}-$tmp.dvi"); - system("ps2pdf -dPDFSETTINGS=/prepress -dAutoRotatePages=/None $+{name}-$tmp.ps $+{name}-$tmp.pdf"); -} # close latex - -### Compiling file using latex>dvipdfmx -if ($dvipdf) { system("dvipdfmx -q $+{name}-$tmp.dvi"); } - -### If option gray -if ($gray) { - say "Moving the file $+{name}-$tmp.pdf to $tempDir/$+{name}-all.pdf (gray scale)"; - system("$opt_gs_dev{gray} -o $tempDir/$+{name}-all.pdf $workdir/$+{name}-$tmp.pdf"); - move("$workdir/$+{name}-$tmp.pdf","$tempDir/$+{name}-$tmp.pdf"); - } -else { - say "Moving the file $+{name}-$tmp.pdf to $tempDir/$+{name}-all.pdf"; - move("$workdir/$+{name}-$tmp.pdf", "$tempDir/$+{name}-all.pdf"); -} - -### Crop generate file -if ($crop) { - say "The file $+{name}-all.pdf need a crop, using pdfcrop $opt_crop"; - system("pdfcrop $opt_crop $tempDir/$+{name}-all.pdf $tempDir/$+{name}-all.pdf $silence"); -} - -### Move tmp-rand.tex file whit all source code for environments to /images dir -move("$workdir/$+{name}$+{type}", "$imageDir/$+{name}-all$ext"); - } # close if m/.../ - } # close while -closedir $DIR; -} # close run - -### Append image format options -$opts_cmd{pdf} = 'pdf' if $pdf; # ghostscript -$opts_cmd{eps} = 1 if exists $opts_file{options}{eps}; # pdftops -$opts_cmd{ppm} = 1 if exists $opts_file{options}{ppm}; # pdftoppm -$opts_cmd{svg} = 1 if exists $opts_file{options}{svg}; # pdftocairo -$opts_cmd{png} = 1 if exists $opts_file{options}{png}; # ghostscript -$opts_cmd{jpg} = 1 if exists $opts_file{options}{jpg}; # ghostscript -$opts_cmd{bmp} = 1 if exists $opts_file{options}{bmp}; # ghostscript -$opts_cmd{tif} = 1 if exists $opts_file{options}{tif}; # ghostscript - -### Suported format -my %format = (%opts_cmd); -my $format = join " ",grep { defined $format{$_} } keys %format; - -### Create image formats in separate files -if ($run) { -opendir(my $DIR, $tempDir); -while (readdir $DIR) { -### PDF/PNG/JPG/BMP/TIFF format suported by ghostscript -if (/(?<name>$name-$prefix(-exa)?)(?<type>-all\.pdf)/) { -for my $var (qw(pdf png jpg bmp tif)) { - if (defined $opts_cmd{$var}) { - my $ghostcmd = "$opt_gs_dev{$var} -o $workdir/$imageDir/$+{name}-%1d.$var $tempDir/$+{name}$+{type}"; - system("$ghostcmd"); - print "Create a $var image format: runing command $opt_gs_dev{$var} in $+{name}$+{type}\r\n"; - } # close defined for ghostscript - }# close for -} # close if m/.../ - -### EPS/PPM/SVG format suported by poppler-utils -if (/(?<name>$name-$prefix)(?<type>-all\.pdf)/) { -for my $var (qw(eps ppm svg)) { - if (defined $opts_cmd{$var}) { - for (my $epsNo = 1; $epsNo <= $envNo; $epsNo++) { -my $poppler = "$opt_poppler{$var} -f $epsNo -l $epsNo $tempDir/$+{name}$+{type} $workdir/$imageDir/$+{name}-$epsNo.$var"; -system("$poppler"); - } # close for C style -print "Create a $var image format: runing command $opt_poppler{$var} in $+{name}$+{type}\r\n"; - } # close defined - } # close for my $var -} # close if m/.../ - -### EPS/PPM/SVG for pst-exa package -if (/(?<name>$name-$prefix-exa)(?<type>-all\.pdf)/) { -for my $var (qw(eps ppm svg)) { - if (defined $opts_cmd{$var}) { - for (my $epsNo = 1; $epsNo <= $exaNo; $epsNo++) { -my $poppler = "$opt_poppler{$var} -f $epsNo -l $epsNo $tempDir/$+{name}$+{type} $workdir/$imageDir/$+{name}-$epsNo.$var"; -system("$poppler"); - } # close for C style -print "Create a $var image format: runing command $opt_poppler{$var} in $+{name}$+{type}\r\n"; - } # close defined - } # close for my $var - } # close if m/.../ -} # close while -closedir $DIR; #close dir - -### Renaming PPM image files -if (defined $opts_cmd{ppm}) { - opendir(my $DIR, $imageDir); - while (readdir $DIR) { - if (/(?<name>$name-fig(-exa)?-\d+\.ppm)(?<sep>-\d+)(?<ppm>\.ppm)/) { - move("$imageDir/$+{name}$+{sep}$+{ppm}", "$imageDir/$+{name}"); - } # close if m/.../ - } # close while - closedir $DIR; - } # close renaming PPM -} # close run - -### Create a output file -if ($outfile) { -say "Creating the file $output$ext, convert extracted environments to \\includegraphics"; - -### Convert extracted environments to \includegraphics -my $grap = "\\includegraphics[scale=1]{$name-$prefix-"; -my $close = '}'; -my $imgNo = 1; -$bodydoc =~ s/$BP.+?$EP/$grap@{[$imgNo++]}$close/msg; # changes - -### Constant -my $USEPACK = quotemeta('\usepackage'); -my $GRAPHICPATH = quotemeta('\graphicspath{'); - -### Precompiled regex -my $CORCHETES = qr/\[ [^]]*? \]/x; -my $PALABRAS = qr/\b (?: graphicx )/x; -my $FAMILIA = qr/\{ \s* $PALABRAS (?: \s* [,] \s* $PALABRAS )* \s* \}(\%*)?/x; - -### Regex to capture \graphicspath -my $graphix = qr/(\\ usepackage \s*\[\s* .+? \s*\] \s*\{\s* graphicx \s*\} )/ix; - -### Capture graphix package for future use -my (@graphix) = $preamble =~ m/$graphix/x; - -### Remove graphix package -$preamble =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - ^ $USEPACK (?: $CORCHETES )? $FAMILIA \s*//msxg; - -### Comment \graphicspath for order and future use -$preamble =~s /\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - ^ ($GRAPHICPATH) /%$1/msxg; - -### Regex to capture [options] for pst-exa package -my $pstexa = qr/(?:\\ usepackage) \[\s*(.+?)\s*\] (?:\{\s*(pst-exa)\s*\} ) /x; - -### Capture [option] for pst-exa package -my (@pst_exa) = $preamble =~ m/$pstexa/xg; - -### Search [option] in pst-exa package -my %pst_exa = map { $_ => 1 } @pst_exa; - -### Clean file (pst/tags) -if ($clean{pst}) { -$PALABRAS = qr/\b (?: pst-\w+ | pstricks (?: -add )? | psfrag |psgo |vaucanson-g| auto-pst-pdf )/x; -$FAMILIA = qr/\{ \s* $PALABRAS (?: \s* [,] \s* $PALABRAS )* \s* \}(\%*)?/x; - -### Remove pst packages lines -$preamble =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - ^ $USEPACK (?: $CORCHETES )? $FAMILIA \s*//msxg; - -### Delete package words -$preamble =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| -(?: ^ $USEPACK \{ | \G) [^}]*? \K (,?) \s* $PALABRAS (\s*) (,?) /$1 and $3 ? ',' : $1 ? $2 : ''/gemsx; - -### Delete \psset -$preamble =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\psset\{(?:\{.*?\}|[^\{])*\}(?:[\t ]*(?:\r?\n|\r))+//gmsx; - -### Delete \SpecialCoor -$preamble =~ s/\%<\*ltximgverw> .+?\%<\/ltximgverw>(*SKIP)(*F)| - \\SpecialCoor(?:[\t ]*(?:\r?\n|\r))+//gmsx; -} # close clean{pst} - -### Delete empty package line \usepackage{} -$preamble =~ s/^\\usepackage\{\}(?:[\t ]*(?:\r?\n|\r))+/\n/gmsx; - -### Append graphicx to end of preamble -if (!@graphix == 0) { -$preamble .= <<"EXTRA"; -@graphix -EXTRA - } else { -$preamble .= <<"EXTRA"; -\\usepackage{graphicx} -EXTRA -} - -### Regex to capture \graphicspath -my $graphicspath= qr/\\ graphicspath \{ ((?: $llaves )+) \}/ix; - -### If preamble contain \graphicspath -if ($preamble =~ m/($graphicspath)/m) { - while ($preamble =~ /$graphicspath /pgmx) { - my ($pos_inicial, $pos_final) = ($-[0], $+[0]); - my $encontrado = ${^MATCH}; - if ($encontrado =~ /$graphicspath/) { - my $argumento = $1; - if ($argumento !~ /\{$imageDir\\\}/) { - $argumento .= "\{$imageDir/\}"; - my $cambio = "\\graphicspath{$argumento}"; - substr $preamble, $pos_inicial, $pos_final-$pos_inicial, $cambio; - pos($preamble) = $pos_inicial + length $cambio; - } - } - } #close while - -### Regex to capture -my ($GraphicsPath) = $preamble =~ m/($graphicspath)/msx; - -### Append \graphicspath to end of preamble -$preamble .= <<"EXTRA"; -$GraphicsPath -\\usepackage{grfext} -\\PrependGraphicsExtensions*{.pdf} -EXTRA - } # close if ($preamble) -else { -### If preamble not contain graphicspath, append to premble -my $GraphicsPath = "\\graphicspath\{\{$imageDir/\}\}"; - -### Append graphicspath to end of preamble -$preamble .= <<"EXTRA"; -$GraphicsPath -\\usepackage{grfext} -\\PrependGraphicsExtensions*{.pdf} -EXTRA -} # close graphicspath - -### Suport for \usepackage[swpl]{pst-exa} -if (exists($pst_exa{swpl})) { -$preamble .= <<'EXTRA'; -\usepackage[swpl,pdf]{pst-exa} -EXTRA -} - -### Suport for \usepackage[tcb]{pst-exa} -if (exists($pst_exa{tcb})) { -$preamble .= <<'EXTRA'; -\usepackage[tcb,pdf]{pst-exa} -EXTRA -### Regex -$bodydoc =~ s/(graphic=\{)\[(scale=\d*)\]($imageDir\/$name-$prefix-exa-\d*)\}/$1$2\}\{$3\}/gsmx; -} # close if - -### Options for out_file (add $end to outfile) -my $out_file = $clean{doc} ? "$atbegindoc$preamble$bodydoc\n\\end\{document\}" - : "$atbegindoc$preamble$bodydoc\n$enddoc" - ; - -### Clean \psset content in output file -if ($clean{pst}) { -$out_file =~ s/\\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - \%<\*ltximgverw> .+? \%<\/ltximgverw>(*SKIP)(*F)| - \\psset\{(?:\{.*?\}|[^\{])*\}(?:[\t ]*(?:\r?\n|\r))?+//gmsx; -} # close clean - -### Clean \tikzset content in output file -if ($clean{tkz}) { -$out_file =~ s/\\begin\{nopreview\}.+?\\end\{nopreview\}(*SKIP)(*F)| - \%<\*ltximgverw> .+? \%<\/ltximgverw>(*SKIP)(*F)| - \\tikzset\{(?:\{.*?\}|[^\{])*\}(?:[\t ]*(?:\r?\n|\r))?+//gmsx; -} # close clean - -### Revert changues in all words in outfile -$out_file =~ s/\\begin\{nopreview\}\s*(.+?)\s*\\end\{nopreview\}/$1/gmsx; -$out_file =~ s/\%<\*ltximgverw>\s*(.+?)\s*\%<\/ltximgverw>/$1/gmsx; -$out_file =~ s/\%<\*noltximg>\n(.+?)\n\%<\/noltximg>/$1/gmsx; -$out_file =~ s/^\%<\*remove>\s*(.+?)\s*\%<\/remove>(?:[\t ]*(?:\r?\n|\r))+//gmsx; -$out_file =~ s/($delt_env)(?:[\t ]*(?:\r?\n|\r))?+//gmsx; -$out_file =~ s/($find)/$replace{$1}/g; - -### Write output file -open my $OUTfile, '>', "$output$ext"; - print $OUTfile "$out_file"; -close $OUTfile; - -### Process the output file -if ($run) { -### Set correct $compiler, if input use latex then output use pdflatex -$compiler = "pdflatex $opt_compiler" if $latex; -$msg_compiler = "pdflatex" if $latex; - -### Compiling output file using pdflatex or arara -say "Compiling file $output$ext using $msg_compiler"; -system("$compiler $output$ext $silence"); - -### Compiling output file using latex>dvips>ps2pdf -if ($dvips) { - system("dvips -q -Ppdf $output.dvi"); - system("ps2pdf -dPDFSETTINGS=/prepress -dAutoRotatePages=/None $output.ps $output.pdf"); -} # close dvips - -### Compiling output file using latex>dvipdfmx -if ($dvipdf) { system("dvipdfmx -q $output.dvi"); } - } # close run -} # close outfile file - -### Remove temporary files -if ($run) { -say "Deleting (most) temporary files created during the process"; -my @protected = qw(); -push (@protected,"$output$ext","$output.pdf") if defined $output; - -my $flsline = "OUTPUT"; -my @flsfile; - -if ($PSTexa) { push @flsfile,"$name-$prefix-exa-$tmp.fls"; } -if ($STDenv) { push @flsfile,"$name-$prefix-$tmp.fls"; } -push (@flsfile,"$output.fls") if defined $output; - -my @tmpfiles; -for my $filename(@flsfile){ - open my $RECtmp, '<', "$filename"; - push @tmpfiles, grep /^$flsline/,<$RECtmp>; - close $RECtmp; -} - -foreach (@tmpfiles) { s/^$flsline\s+|\s+$//g; } - -if ($latex or $dvips) { push @tmpfiles,"$name-$prefix-$tmp.ps"; } -if (-e "$name-$prefix-$tmp.ps") { push @tmpfiles,"$name-$prefix-$tmp.ps"; } -if ($PSTexa) { push @tmpfiles,"$name-$prefix-exa-$tmp.ps"; } -if (-e "$output.ps") { push @tmpfiles,"$output.ps"; } -push @tmpfiles,@flsfile,"$name-$prefix-$tmp$ext","$name-$prefix-$tmp.pdf"; - -my @delfiles = array_minus(@tmpfiles, @protected); -foreach my $tmpfile (@delfiles) { move("$tmpfile", "$tempDir"); } -} # close clean tmp files - -### Compress images dir whit generated files -if ($zip or $tar) { -my $stamp = strftime "%F", localtime; -my $archivetar = "$imageDir-$stamp"; - -my @savetozt; -find(\&zip_tar, $imageDir); -sub zip_tar{ - my $filesto = $_; - if (-f $filesto && $filesto =~ m/$name-$prefix-.+?$/) { # buscamos - push @savetozt, $File::Find::name; - } -} -# Write compressed zip file -if ($zip) { - say "Creating a file $workdir/$archivetar.zip"; - zip \@savetozt => "$archivetar.zip"; - } - -# Write compressed tar.gz file -if ($tar) { - say "Creating a file $workdir/$archivetar.tar.gz"; - my $imgdirtar = Archive::Tar->new(); - $imgdirtar->add_files( @savetozt ); - $imgdirtar->write( "$archivetar.tar.gz" , 9 ); - } -} #close compress - -### End of script process -if ($run) { say "Finish, image formats: $format are in $workdir/$imageDir/"; } - else { say "Done"; } - -__END__ |