summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/ltximg/ltximg.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/ltximg/ltximg.pl')
-rwxr-xr-xMaster/texmf-dist/scripts/ltximg/ltximg.pl516
1 files changed, 516 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/ltximg/ltximg.pl b/Master/texmf-dist/scripts/ltximg/ltximg.pl
new file mode 100755
index 00000000000..ccb7f92fe2d
--- /dev/null
+++ b/Master/texmf-dist/scripts/ltximg/ltximg.pl
@@ -0,0 +1,516 @@
+#!/usr/bin/perl
+use v5.14;
+use strict; # to be sure, that all is safe ... :-)
+use File::Path;
+use File::Copy;
+use File::Basename;
+use IO::File;
+use Getopt::Long;
+use autodie;
+
+my $tempDir = "."; # temporary directory
+my $clear = 0; # 0 or 1, clears all temporary files
+my $DPI = "300"; # value for ppm
+my $margins = "0"; # margins for pdf crop
+my $imageDir = "images"; # directorio de imágenes (images por defecto)
+my $skip = "skip"; # skip environment
+my $latex = 0; # 1->create all images using latex
+my $xetex = 0; # 1->create all images using xelatex
+my $luatex = 0; # 1->create all images using lualatex
+my $IMO = ""; # 1->Options for ImageMagick
+my $GSCMD = "gs"; # Ghostscript name
+my $other = "other"; # search other environment for export
+my $pdf = 0; # 1->create .pdf using ghostscript
+my $png = 0; # 1->create .png
+my $jpg = 0; # 1->create .jpg
+my $eps = 0; # 1->create .eps using pdftops
+my $ppm = 0; # 1->create .ppm using pdftoppm
+my $useppm = 0; # 1->create jpg/png using mogrify and ppm
+my $usemog = 0; # 1->create jpg/png using mogrify
+my $all = 0; # 1->create all images and files for type
+
+#----------------------- User part end ---------------------------
+#-----------------program identification, options and help--------
+my $program = "ltximg";
+my $ident = '$Id: ltximg v1.0, 2013-03-12 pablo $';
+my $copyright = <<END_COPYRIGHT ;
+Copyright 2013-01-12 (c) Pablo Gonzalez L <pablgonz\@yahoo.com>
+END_COPYRIGHT
+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 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
+END_LICENSE
+my $title = "$program $ident\n";
+my $usage = <<"END_OF_USAGE";
+${title}Usage: $program file.tex [options]
+ltximg create a copy for TeX source whit all TiKZ|Pstricks environments
+ and convert all environments into single images (pdf/png/eps/jpg).
+ By default search and extract TiKZ environments using (pdf)LaTeX
+ and ghostscript (gs).
+
+Options:
+
+ --h|help - display this help and exit
+ --v|version - display version information and exit
+ --li|license - display license information and exit
+ --imageDir= - the dir for the created images (default images)
+ --d|DPI= - dots per inch for gs, pdftoppm and mogrify (default 300)
+ --IMO="..." - aditional options for mogrify (need double quotes)
+ --c|clear - delete all temp files
+ --xe|xetex - create all image using xelatex (tikz and pstricks)
+ --lu|luatex - create all image using lualatex (tikz)
+ --la|latex - create all image using latex (pstricks)
+ --up|useppm - create jpg and png using mogrify and ppm
+ --um|usemog - create jpg and png (transparent) using mogrify and pdf
+ --m|margins= - margins for pdfcrop (default 0)
+ --pdf - create .pdf files using gs
+ --ppm - create .ppm files (need pdftoppm)
+ --eps - create .eps files (need pdftops)
+ --jpg - create .jpg files (deafult use gs)
+ --png - create .png files (deafult use gs)
+ --s|skip= - name for skip environmet in input file (default skip)
+ --o|other= - name for other export environmet (default other)
+ --a|all - create pdf/jpg/png/eps image type
+
+Example:
+* $program test.tex --xe -eps -jpg -c
+* produce test-fig-1.pdf, test-fig-2.pdf, test-fig-3.pdf,...
+* and test-fig-1.eps, test-fig-2.eps, test-fig-3.eps,... and
+* test-fig-1.jpg, test-fig-2.jpg, test-fig-3.jpg,... for all
+* TiKZ|Pst environments in image dir using gs and (Xe)latex.
+END_OF_USAGE
+
+# Options
+my $result = GetOptions ("imageDir=s" => \$imageDir,
+ "s|skip=s" => \$skip,
+ 'h|help' => \$::opt_help,
+ 'v|version' => \$::opt_version,
+ 'li|license' => \$::opt_license,
+ 'd|DPI=i' => \$DPI,
+ "tempDir=s" => \$tempDir,
+ 'c|clear' => \$clear,
+ "la|latex" => \$latex,
+ "xe|xetex" => \$xetex,
+ "lu|luatex" => \$luatex,
+ "o|other=s" => \$other,
+ "m|margins=s" => \$margins,
+ "GSCMD=s" => \$GSCMD,
+ "IMO=s" => \$IMO,
+ "png" => \$png,
+ "jpg" => \$jpg,
+ "eps" => \$eps,
+ "ppm" => \$ppm,
+ "up|useppm" => \$useppm,
+ "um|usemog" => \$usemog,
+ "pdf" => \$pdf,
+ "a|all" => \$all
+ ) or die $usage;
+
+# help functions
+sub errorUsage { die "Error: @_ (try --help for more information)\n"; }
+
+# options for command line
+if ($::opt_help) {
+ print $usage;
+ exit(0);
+}
+if ($::opt_version) {
+ print $title;
+ print $copyright;
+ exit(0);
+}
+if ($::opt_license) {
+ print $licensetxt;
+ exit(0);
+}
+# General options
+if ($latex) {
+ $latex = 1;
+}
+if ($xetex) {
+ $xetex = 1;
+}
+if ($luatex) {
+ $luatex = 1;
+}
+if ($pdf) {
+ $pdf = 1;
+}
+if ($eps) {
+ $pdf =$eps = 1;
+}
+if ($jpg) {
+ $jpg = 1;
+}
+if ($png) {
+ $png = 1;
+}
+if ($ppm) {
+ $ppm = 1;
+}
+if ($^O eq 'MSWin32'){
+ $GSCMD = "gswin32c";
+}
+if ($^O eq 'MSWin64'){
+ $GSCMD = "gswin64c";
+}
+if ($useppm){
+ $ppm = $useppm = 1;
+}
+if ($usemog){
+ $pdf = $usemog = 1;
+}
+if ($all){
+ $pdf =$eps = $png = $jpg = 1;
+}
+## Create image dir
+if (! -e $imageDir) {
+ mkdir($imageDir,0744) or die "Can't create $imageDir";
+}
+
+# open file
+my $InputFilename = "";
+@ARGV > 0 or errorUsage "Input filename missing";
+@ARGV < 2 or errorUsage "Unknown option or too many input files";
+$InputFilename = $ARGV[0];
+
+# end open file
+my @SuffixList = ( ".tex", "", ".ltx" ); # possible extensions
+my ( $name, $path, $ext ) = fileparse( $ARGV[0], @SuffixList );
+if ( $ext eq "" ) { $ext = ".tex"; } # me need the extension as well
+my $TeXfile = "$path$name$ext";
+
+# Define in file
+my $archivo_entrada = shift;
+
+# Read in file
+open my $ENTRADA, '<', $archivo_entrada;
+my $archivo;
+{
+ local $/;
+ $archivo = <$ENTRADA>;
+}
+close $ENTRADA;
+## cambiar
+$archivo =~
+s/(?<inicio>\\begin\{)(?<verb>verbatim|verbatim\*|lstlisting|LTXexample|Verbatim|comment|alltt|minted|tcblisting|xcomment|$skip) (?:\})
+/\\begin\{nopreview}
+$+{inicio}$+{verb}\}/gmxs;
+
+$archivo =~
+s/(?<fin>\\end\{)(?<verb>verbatim|verbatim\*|lstlisting|LTXexample|Verbatim|comment|alltt|minted|tcblisting|xcomment|$skip) (?:\})
+/$+{fin}$+{verb}\}
+\\end\{nopreview}/gmxs;
+# Save
+open my $SALIDA, '>', "$tempDir/$name-tmp.tex";
+print $SALIDA $archivo;
+close $SALIDA;
+
+# Add preview in preamble
+
+open my $INFILE,'<', "$tempDir/$name-tmp.tex";
+open my $OUTFIlE,'>',"$tempDir/$name-fig.tex";
+print $OUTFIlE "\\AtBeginDocument\{\n";
+ if($xetex){
+ print $OUTFIlE "\\RequirePackage\[xetex,active,tightpage\]\{preview\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{tikzpicture\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{pspicture\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{$other\}\}\n";
+ }
+ elsif($latex){
+ print $OUTFIlE "\\RequirePackage\[active,tightpage\]\{preview\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{pspicture\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{$other\}\}\n";
+ }
+ else {
+ print $OUTFIlE "\\RequirePackage\[pdftex,active,tightpage\]\{preview\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{tikzpicture\}\n";
+ print $OUTFIlE "\\PreviewEnvironment\{$other\}\}\n";
+ }
+
+ while ( my $line = <$INFILE> ) {
+ print $OUTFIlE $line;
+ }
+close $INFILE;
+close $OUTFIlE;
+
+if ($clear) {unlink "$tempDir/$name-tmp.tex";}
+
+# Parser inline verbatim
+
+## Lectura del archivo
+open my $PARSER, '<', "$tempDir/$name-fig.tex";
+undef $/; # read al file
+my $file_PARSER = <$PARSER>;
+close $PARSER;
+
+## Partición del documento
+my($cabeza,$cuerpo,$final) = $file_PARSER =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
+
+## Cambios a realizar
+my %cambios = (
+ '\pspicture' => '\TRICKS',
+ '\endpspicture' => '\ENDTRICKS',
+
+ '\begin{pspicture' => '\begin{TRICKS',
+ '\end{pspicture' => '\end{TRICKS',
+
+ '\begin{postscript}' => '\begin{POSTRICKS}',
+ '\end{postscript}' => '\end{POSTRICKS}',
+
+ '\begin{tikzpicture' => '\begin{TIKZPICTURE',
+ '\end{tikzpicture' => '\end{TIKZPICTURE',
+
+ "\\begin\{$other" => '\begin{OTHER',
+ "\\end\{$other" => '\end{OTHER',
+);
+
+
+## Variables y constantes
+my $no_del = "\0";
+my $del = $no_del;
+
+## Reglas
+my $llaves = qr/\{ .+? \} /x;
+my $no_corchete = qr/(?:\[ .+? \])? /x;
+my $delimitador = qr/\{ (?<del>.+?) \} /x;
+my $verb = qr/verb [*]? /ix;
+my $lst = qr/lstinline (?!\*) $no_corchete /ix;
+my $mint = qr/mint (?!\*) $no_corchete $llaves /ix;
+my $marca = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1} /x;
+my $comentario = qr/^ \s* \%+ .+? $ /mx;
+my $definedel = qr/\\ (?: DefineShortVerb | lstMakeShortInline ) $no_corchete $delimitador /ix;
+my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves /ix;
+
+
+# Changes
+
+while ($cuerpo =~
+ / $marca
+ | $comentario
+ | $definedel
+ | $indefinedel
+ | $del .+? $del # delimitado
+ /gimx) {
+
+ my($pos_inicial, $pos_final) = ($-[0], $+[0]); # posiciones
+ my $encontrado = ${^MATCH}; # lo encontrado
+
+ given ($encontrado) {
+ when (/$definedel/) { # definimos delimitador
+ $del = $+{del};
+ $del = "\Q$+{del}" if substr($del,0,1) ne '\\'; # es necesario "escapar" el delimitador
+ }
+ when (/$indefinedel/) { # indefinimos delimitador
+ $del = $no_del;
+ }
+ default { # Aquí se hacen los cambios
+ while (my($busco, $cambio) = each %cambios) {
+
+ $encontrado =~ s/\Q$busco\E/$cambio/g; # es necesario escapar $busco, ya que contiene caracteres extraños
+ }
+
+ substr $cuerpo, $pos_inicial, $pos_final-$pos_inicial, $encontrado; # insertamos los nuevos cambios
+
+ pos($cuerpo)= $pos_inicial + length $encontrado; # reposicionamos la siguiente búsqueda
+ }
+ }
+}
+
+# Write
+
+open my $OUTPARSER, '>', "$tempDir/$name-fig.tex";
+print $OUTPARSER "$cabeza\n$cuerpo\n$final\n";
+close $OUTPARSER;
+
+# Compiling files...
+
+# Using LaTeX
+
+if($latex){
+ print "Compiled using LaTeX\n";
+ system("latex -interaction=batchmode $tempDir/$name-fig.tex");
+ system("dvips -q -Ppdf $tempDir/$name-fig.dvi");
+ system("ps2pdf -dPDFSETTINGS=\/prepress $tempDir/$name-fig.ps $tempDir/$name-fig.pdf");
+if ($clear) {
+ unlink "$tempDir/$name-fig.dvi";
+ unlink "$tempDir/$name-fig.ps";
+ unlink "$tempDir/$name-fig.log";
+ unlink "$tempDir/$name-fig.aux";
+ unlink "$tempDir/$name-fig.tex";
+ }
+ }
+
+# Using XeLaTeX
+
+elsif($xetex){
+ print "Compiled using (Xe)LaTeX\n";
+ system("xelatex -interaction=batchmode $tempDir/$name-fig.tex");
+if ($clear) {
+ unlink "$tempDir/$name-fig.log";
+ unlink "$tempDir/$name-fig.aux";
+ unlink "$tempDir/$name-fig.tex";
+ }
+ }
+
+# Using LuaLaTeX
+
+elsif($luatex){
+ print "Compiled using (lua)LaTeX\n";
+ system("lualatex -interaction=batchmode $tempDir/$name-fig.tex");
+if ($clear) {
+ unlink "$tempDir/$name-fig.log";
+ unlink "$tempDir/$name-fig.aux";
+ unlink "$tempDir/$name-fig.tex";
+ }
+ }
+
+# Using pdfLaTeX (default)
+
+else{
+ print "Compiled using (pdf)LaTeX\n";
+ system("pdflatex -interaction=batchmode $tempDir/$name-fig.tex");
+if ($clear) {
+ unlink "$tempDir/$name-fig.log";
+ unlink "$tempDir/$name-fig.aux";
+ unlink "$tempDir/$name-fig.tex";
+ }
+ }
+
+# Croping
+
+print "Done, $name-fig.pdf need croping, using pdfcrop whit margin $margins\n";
+system("pdfcrop --margins $margins $tempDir/$name-fig.pdf $tempDir/$name-fig.pdf");
+
+# Gs for split file
+
+if ($pdf) {
+print "Create pdf figs in $imageDir dir using Ghostscript \($GSCMD\)\n";
+system("$GSCMD -q -sDEVICE=pdfwrite -dPDFSETTINGS=\/prepress -dNOPAUSE -dBATCH -sOutputFile=$imageDir/$name-fig-%d.pdf $tempDir/$name-fig.pdf");
+
+# Delete last pdf (bug from gs)
+
+my $i = 1;
+while (-e "$imageDir/$name-fig-${i}.pdf") { # if exisit search
+ $i++; # next
+} # search end
+
+$i--; # back the last
+
+unlink "$imageDir/$name-fig-${i}.pdf";
+
+}
+
+# Fix pdftops error message in windows
+
+if ($^O eq 'MSWin32' || $^O eq 'MSWin64'){
+open my $ppmconf, '>', "$tempDir/xpd";
+print $ppmconf <<'EOH';
+errQuiet yes
+EOH
+close $ppmconf;
+ }
+
+# Create eps files using pdftops
+
+if ($eps) {
+print "Create eps figs in $imageDir dir using pdftops\n";
+# Search pdf in $imageDir
+ for my $image_pdf (<$imageDir/*.pdf>) {
+
+if ($^O eq 'MSWin32' || $^O eq 'MSWin64'){
+ system("pdftops -cfg $tempDir/xpd -q -level3 -eps $image_pdf");
+ }
+else{
+ system("pdftops -level3 -eps $image_pdf");
+ }
+ }
+ }
+
+# Create ppm files and renamig files
+
+if($ppm){
+print "Create ppm figs in $imageDir dir using pdftoppm\n";
+if ($^O eq 'MSWin32' || $^O eq 'MSWin64'){
+ system("pdftoppm -cfg $tempDir/xpd -q -r $DPI $tempDir/$name-fig.pdf $imageDir/$name-fig");
+ }
+else{
+ system("pdftoppm -r $DPI $tempDir/$name-fig.pdf $imageDir/$name-fig");
+ }
+
+# Renaming .ppm (only need in windows)
+
+if ($^O eq 'MSWin32' || $^O eq 'MSWin64'){
+my $dren = "$tempDir/$imageDir";
+my $fichero = '';
+my $ppmren = '';
+my $renNo = 1;
+if(opendir(DIR,$dren)){
+foreach (readdir DIR){
+ $fichero = $_;
+ if ( $fichero =~ /($name-fig-)(\d+|\d+[-]\d+).ppm/) {
+ my $renNo = int($2);
+ my $newname="$1$renNo.ppm";
+ $ppmren = rename("$dren/$fichero","$dren/$newname");
+ }
+ }
+ }
+closedir DIR;
+ }
+ }
+
+# Change dir and create png/jpg formats using mogrify and ppm
+
+if($usemog){
+chdir ($imageDir) or die "$imageDir not exist\n";
+if ($png) {
+print "Create png transparent in $imageDir dir using mogrify and pdf\n";
+system("mogrify $IMO -define png:format=png32 -define png:compression-filter=4 -quality 100 -transparent white -density $DPI -format png \*\.pdf");
+ }
+if ($jpg) {
+print "Create jpg figs in $imageDir dir using mogrify and pdf\n";
+system("mogrify $IMO -quality 100 -density $DPI -format jpg \*\.pdf");
+ }
+}
+elsif($useppm){
+chdir ($imageDir) or die "$imageDir not exist\n";
+if ($png) {
+print "Create png figs in $imageDir dir using mogrify and ppm\n";
+system("mogrify $IMO -quality 100 -define png:format=png32 -define png:compression-filter=4 -density $DPI -format png \*\.ppm");
+ }
+if ($jpg) {
+print "Create jpg figs in $imageDir dir using mogrify and ppm\n";
+system("mogrify $IMO -quality 100 -density $DPI -format jpg \*\.ppm");
+ }
+}
+else{
+
+# Create png using gs (default)
+
+if ($png) {
+print "Create png figs in $imageDir dir using Ghostscript \($GSCMD\)\n";
+system("$GSCMD -q -sDEVICE=png16m -r$DPI -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dNOPAUSE -dBATCH -sOutputFile=$imageDir/$name-fig-%d.png $tempDir/$name-fig.pdf");
+ }
+
+if ($jpg) {
+print "Create jpg figs in $imageDir dir using Ghostscript \($GSCMD\)\n";
+system("$GSCMD -q -sDEVICE=jpeg -r$DPI -dJPEGQ=100 -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dNOPAUSE -dBATCH -sOutputFile=$imageDir/$name-fig-%d.jpg $tempDir/$name-fig.pdf");
+ }
+ }
+
+
+print "Finish, all figures are in $imageDir dir\n";
+
+__END__