Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » script Perl pst2pdf y pdfTeX  RESUELTO Responder al tema
Nuevo tema


Página 1 de 4  [ 51 mensajes ]  Ir a página 1, 2, 3, 4  Siguiente
 
Nota 2010-09-12 21:13 @925

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
script Perl pst2pdf y pdfTeX
Hola, mi nombre es Pablo, soy usuario de TeX/LaTeX hace bastantes años (en entornos Linux y Win32) y tengo instalado MikTeX2.8 junto a Active Perl.

El problema se me presenta con el siguiente script Perl «pst2pdf» de H.V (a cargo de mantener y desarrollar los paquetes PsTricks y compañía)

El script funciona, pero no en forma correcta, con la línea
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
print PDF "\\IncludeGraphics[scale=$Iscale]{$imageDir/$name-tmp-$IMGno$Iext}";
 

escribe en el fichero final, pero, agrega un .\ de la siguiente forma
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
\IncludeGraphics[scale=1]{images/.\test-tmp-0.pdf}

el cual produce un error en Windows y Linux.

He revisado y leído el código (varias veces) pero no logro encontrar el problema, es decir, en qué parte del script se imprime el .\

Esperando su guía y ayuda para resolver este asunto TeXnico para el mundo TeX, se despide Pablo.


Última edición por pablgonz el 2011-05-28 15:00 @667, editado 3 veces en total

Nota 2010-09-13 07:45 @365
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: script Perl pst2pdf y pdfTeX
Bienvenido a los foros de Perl en Español, pablgonz.

Esto es lo que pasa.

En la línea 47 extraemos la ruta, el nombre del fichero y su posible extensión. El nombre queda en $name, y la ruta en $path.

Si al programa le pasas, como nombre 'test', $name valdrá 'test', y la ruta valdrá '.\' (si estás en Windows).

En la línea 92, se llama a runpdfTeX("$path$name",$name);. Observa que el primer argumento es la ruta completa al fichero. Así que el primer argumento sería '.\test'. Y el segundo argumento es solo el nombre del fichero (seguramente, sin extensión) ('test').

La función runpdfTeX empieza en la 269. Lo primero que hace es

my ($name,$pdfname) = @_;

Es decir, la ruta completa pasa a la variable local $name, y el nombre de solo el fichero, pasa a la local $pdfname.

Y llegamos a las líneas 298 y 312:
print PDF "\\IncludeGraphics[scale=$Iscale]{$imageDir/$name-tmp-$IMGno$Iext}";

Estríctamente hablando, es correcto lo que pone ahí (estamos creando una ruta a un nuevo fichero), uniendo los valores de $imageDir, '/', $name, '-tmp-', $IMGno e $Iext, que sale lo que indicas: images/.\test-tmp-0.pdf.

Y el problema parece que está justamente en la presencia del '/' junto con '\'. Yo probaría a cambiar la '/' por un '\' (mejor '\\', que así queda escapado), que es el separador de ficheros en Windows/DOS.

La forma correcta, sería usando la función catfile() de File::Spec. De hecho, si quieres que un código funcione de forma portable, es indispensable el uso de este módulo, y realizar con él todas las operaciones de gestión de nombres de ficheros.

Otra opción sería cambiar $name por $pdfname, en las líneas 298 y 312, pero tendríamos problemas en caso de tener que manejar ficheros que estén en directorios o subdirectorios distintos del directorio de ejecución. Bueno, depende de lo que quiera decir la instrucción \IncludeGraphics. Si solo se trata de indicar un directorio temporal donde guardar los gráficos, sí que se podría indicar solo $pdfname. No lo sé, depende de cómo lo dejen los comandos que crean los gráficos, me parece que en la función runTeX().

_________________
JF^D Perl programming


Nota 2010-09-13 23:07 @005

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
Muchas gracias por la pronta respuesta, el problema se ha solucionado por completo con los cambios en las líneas 298 y 312 y descomentando un par de líneas más arriba para que escribiera \graphicspath{{images/}} en el fichero.

Lo de reescribir el script usando catfile()... es un poco complicado, puesto que el \ y / significan mucho (y muchas cosas) en TeX/LaTeX. Lo ideal sería detectar el SO y modificar images/ si es Win32, images\ si es Linux y images: si es Mac, puesto que en si los ficheros LaTeX ya son portátiles y el script a excepción del detalle de images\ funciona (ahora) correctamente.

En sí la función de este script es sencilla pero potente; si se tiene un archivo con imágenes creadas usando pstricks (el paquete PostScript y amigos) éstas no pueden ser procesadas directamente por pdfTeX, LuaTeX, XeTeX y ConText, el script extrae todos los entornos donde hay imágenes creadas con pstricks y los separa en ficheros individuales en una carpeta (images) en el mismo directorio, para procesarlos y convertirlos en PDF (que sí es aceptado por pdfTeX, LuaTeX , ...), generando un nuevo fichero limpio (a excepción de un par de paquetes en el preámbulo) listo para procesar y enviar, una herramienta útil para aquellos que generamos dibujos o creamos presentaciones y guías.

En fin muchas gracias por la explicación de las líneas de código (si eso no hubiese entendido jamas lo del bendito /.\) y por la pronta respuesta al tema. Doy por cerrado el tema, a menos que alguien decida mejorar este ya grandioso script.

Gracias por todo,
Pablo


Nota 2010-09-14 04:41 @237
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: script Perl pst2pdf y pdfTeX
Precisamente lo que hace catfile() es unir los componentes de la ruta mediante '\' o '/' según sea el sistema operativo. Se podría intentar el crear la ruta antes de meterla junto con el comando LaTeX.

Para saber en qué sistema se está ejecutando el programa, se puede consultar la variable especial $^O, o usando alguno de los módulos Devel::CheckOS o Perl::OSType.

_________________
JF^D Perl programming


Nota 2011-05-23 21:01 @917

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Modificar script ...
Creo que ya encontré la solución a mi cuestión (el flojo trabaja el doble).

Tras mucho leer (y deambular por el foro) y probar (gracias sleep(time)) me he percatado dónde está mi problema (explorer me aclaró las líneas de la versión anterior de este mismo script en un post anterior).

Adaptar otro script no era la mejor solución, pero, me dio algunas ideas. Ya entiendo qué es lo que sucede, sólo necesito ayuda para encaminar la solución.

El script lee todo el fichero de una vez ($name.tex) en la línea 298; es aquí donde se necesitan eliminar algunas líneas de la primera parte del archivo (preámbulo) que causan conflicto con el compilador (pdfTeX) y que ahora ya no son necesarias.

Se me ocurren dos ideas para solucionar el problema:

1. Leer $name.tex desde la primera línea hasta \begin{document} y en ellas modificar (eliminar) las líneas que quiero y seguir con el proceso.

2. Durante el proceso el script crea filename.preamble; leerlo, eliminar las líneas, guardarlo e insertar este antes de la línea \begin{document} de $name.tex

¿Se puede hacer esto? ¿Cuál sería la mejor opción?

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q'
  2.   if 0;
  3.  
  4. use strict;                             # to be sure, that all is safe ... :-)
  5.  
  6. # v. 0.11                               simplify the use of PSTricks with pdf
  7. # 2011-01-18    (c) Herbert Voss <hvoss@tug.org>
  8. # $Id: pst2pdf.pl 239 2010-01-01 17:23:13Z herbert $
  9. # Thanks to Pablo Gonzales Luengo
  10. #
  11. # This program is free software; you can redistribute it and/or modify
  12. # it under the terms of the GNU General Public License as published by
  13. # the Free Software Foundation; either version 2 of the License, or (at
  14. # your option) any later version.
  15. #
  16. # This program is distributed in the hope that it will be useful, but
  17. # WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  19. # See the GNU General Public License for more details.
  20. #
  21. # You should have received a copy of the GNU General Public License
  22. # along with this program; if not, write to the
  23. # Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  24. # MA  02111-1307  USA
  25. #
  26. use File::Path;                         # creating/removing dirs
  27. use File::Copy;                         # copying files
  28. use File::Basename;                     # scan argument
  29. use IO::File;                           # simple IO operation
  30. use Getopt::Long;                       # read parameter
  31.  
  32. #----------------------- User part begin ------------------------
  33. my $imageDir = "images";                # where to save the images
  34. my @imageType = ("eps","pdf");          # all image types
  35. my $machine = "Linux";
  36. if ($^O eq 'MSWin32') { $machine = "Windows"; }
  37. else                  { push (@imageType, "png"); }
  38. my $Iext = ".pdf";                      # leave empty, if not a special one
  39. my $tempDir = ".";                      # temporary directory
  40. my $verbose = 1;                        # 0 or 1, logfile  
  41. my $clear = 0;                          # 0 or 1, clears all temporary files
  42. my $DPI = 75;                           # very low value for the png's
  43. my $Iscale = 1;                         # for \includegraphics
  44. my $noImages = 0;                       # 1->create no images
  45. my $runBibTeX = 0;                      # 1->runs bibtex
  46. my $runBiber = 0;                       # 1->runs biber and sets $runBibTeX=0
  47. #----------------------- User part end ---------------------------
  48.  
  49. @ARGV == 0 && die "file name expected!\n";
  50.  
  51. my @SuffixList = (".tex","",".ltx");                    # possible extensions
  52. my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList);
  53. if ( $ext eq "" ) { $ext = ".tex"; }                    # me need the extension as well
  54. my $TeXfile = "$path$name$ext";
  55. my $Logfile = "$tempDir/$name.plog";                    # our own log file
  56. open (LOGfile, ">$Logfile") or die "cannot open $Logfile!";
  57.  
  58. my $result = GetOptions ("DPI=i"      => \$DPI,         # numeric
  59.                          "Iscale=f"   => \$Iscale,      # real
  60.                          "imageDir=s" => \$imageDir,    # string
  61.                          "tempDir=s"  => \$tempDir,     # string
  62.                          "Iext=s"     => \$Iext,        # string
  63.                          "clear"      => \$clear,       # flag
  64.                          "noImages"   => \$noImages,    # flag
  65.                          "runBibTeX"  => \$runBibTeX,   # flag
  66.                          "runBiber"   => \$runBiber,    # flag
  67.                          "verbose"    => \$verbose);    # flag
  68.  
  69. LOG ("Parameters:");
  70. LOG ("==> imageDir = $imageDir");
  71. LOG ("==> Iext     = $Iext");
  72. LOG ("==> DPI      = $DPI");
  73. LOG ("==> Iscale   = $Iscale");
  74. LOG ("==> tempDir  = $tempDir");
  75. LOG ("==> verbose  = $verbose");
  76. LOG ("==> clear    = $clear");
  77. LOG ("==> noImages = $noImages");
  78. LOG ("==> runBibTeX= $runBibTeX");
  79. LOG ("==> runBiber = $runBiber");
  80.  
  81. if ($runBibTeX && $runBiber) {
  82.   LOG ("!!! you cannot run BibTeX and Biber at the same document ...");
  83.   LOG ("!!! Assuming to run Biber");
  84.   $runBibTeX = 0;
  85. }
  86.  
  87. my $imgNo = 0;                          # internal image counter
  88. my $pstExaLoaded = 0;                   # Document loads pst-exa
  89.  
  90. LOG ("Running on [$path][$name][$ext]");
  91. open (FILE, "<$TeXfile") or die "cannot open source file $TeXfile!";    # the source
  92. if ( !$noImages ) {
  93.   if (-d $imageDir) { LOG ("$imageDir exists") }
  94.   else { mkdir("$imageDir", 0744) || die "cannot mkdir $imageDir: $!";
  95.     LOG ("Imagedir created"); }
  96.  
  97.   LOG ("go to savePreamble ... ");
  98.   savePreamble($name);
  99.   LOG ("done!\n go to runFile ...");
  100.   runFile($name);
  101.   LOG ("done!");
  102.   close FILE;                                           # close source file
  103. }# !noImages
  104.  
  105.  
  106. LOG ("runpdfTeX ... ");
  107. runpdfTeX("$path$name",$name);
  108. LOG ("all finished ... :-)");
  109. close LOGfile;
  110. if ( $clear ) {
  111.   unlink "$path$name.aux";
  112.   unlink "$path$name.log";
  113.   unlink "$path$name.preamble";
  114.   unlink "$path$name-tmp.aux";
  115.   unlink "$path$name-tmp.dvi";
  116.   unlink "$path$name-tmp.log";
  117.   unlink "$path$name-tmp.pdf";
  118.   unlink "$path$name-tmp.ps";
  119.   unlink "$path$name-tmp.tex";
  120. }
  121.  
  122. sub savePreamble {                      # create a preamble file
  123. # if we have a \input command inside the preamble, it doesn't hurt, we need
  124. # it anyway for the postscript files and the pdf one.
  125.   my $filename = pop;                   # get the file name
  126.   LOG ("----- Start Preamble -----");
  127.   open (FILEp, ">$tempDir/$filename.preamble")
  128.     or die "cannot open preamble file $tempDir/$filename.preamble!";
  129.   while (<FILE>) {                      # read all until \begin{document}
  130.     $pstExaLoaded = index($_,"usepackage{pst-exa}");
  131.     my $i = index($_,"begin{document}");
  132.     if ($i > 0) {
  133.       if ($i > 1) { print FILEp substr($_,0,--$i); }    # write all until \begin{document}
  134.       print FILEp "\n\\usepackage{pst-exa}\n";
  135.       close(FILEp);                                     # close preamble
  136.       LOG ("----- Close Preamble ------");
  137.       return;
  138.     } else {
  139.       print FILEp "$_";                                 # write into preamble
  140.       LOG ("$_");
  141.     }
  142.   }
  143.   close(FILEp);
  144.   if ( $verbose ) { LOG("<-----Preamble<----"); }
  145.   return;
  146. }
  147.  
  148. sub searchPS {                                  # search the PostScript parts
  149.   my @PS = ();                                  # single PS sequence
  150.   my @PStotal = ();                             # all PS sequences as list of arrays
  151.   my $depth = -1;                               # counts nested macros
  152.   my $type = -1;                                # -1-> none; 1->PST; 2->PS;
  153.   my $EndDocument = 0;                          # ignore all after \end{document}
  154.   my $iVerb = 0;                                # test for verbatim or lstlisting environment, must be ignored
  155.   while (<FILE>) {                              # scan the input file
  156.     if (!$EndDocument) {
  157.     chomp;                                      # delete EOL character
  158.     my $line = $_;                              # save line
  159.     if ( !$iVerb ) {
  160.       $iVerb = ((index($line,"begin{verbatim}") > 0) or (index($line,"begin{lstlisting}") > 0));
  161.     }                                           # do nothing until \end{verbatim}
  162.     if ( !$iVerb ) {
  163.       my $iPS = index($line,"begin{postscript}");
  164.       my $iPST = index($line,"begin{pspicture*}");
  165.       if ($iPST < 0) { $iPST = index($line,"begin{pspicture}"); }       # alternative
  166.       if ($iPST < 0) { $iPST = index($line,"pspicture"); }      # alternative \pspicture...
  167.       if (($iPS > 0) && ( $type == 1 )){ print "postscript environment must be of outer level!\n"; exit 1; }
  168.       if ( $type < 0 ) {                        # no active environment
  169.         if ($iPS > 0) {                         # we have \begin{postscript}
  170.           $type = 2;                   
  171.           $line = substr($line,$iPS-1);         # add rest of the line
  172.           LOG("PS-Zeile: $line");
  173.         }                              
  174.         elsif ( $iPST > 0 ) {                   # we have \begin{pspicture} or \pspicture
  175.           $type = 1;
  176.           $depth++;  
  177.           $line = substr($line,$iPST-1);        # add all unitl pspicture
  178.           LOG("PST-Zeile: $line");
  179.         }
  180.       }
  181. #       we have now \begin{pspicture} or \begin{postscript}
  182.       if ($type > 0) {                          # start Scan, we have an environment
  183.         LOG ("searchPS: set \$type=$type");
  184.         $iPST = index($line,"end{pspicture*}");
  185.         if ($iPST < 0) { $iPST = index($line,"end{pspicture}"); }       # alternative
  186.         if ($iPST < 0) { $iPST = index($line,"endpspicture"); } # alternative \endpspicture...
  187.         $iPS = index($line,"end{postscript}"); 
  188.         if ($iPST > 0) {                        # test, we can have postscript and pspicture in one line
  189.           if ( $type < 2) {                     # found end of pspicture environment
  190.             LOG ("searchPS: $line");
  191.             $depth--;
  192.             if ($depth < 0) {
  193.               $type = -1;
  194.               if (index($line,"endpspicture") > 0)              # add line, depends to type
  195.                    { push @PS,substr($line,0,$iPST+12); }       # \endpspicture
  196.               elsif (index($line,"pspicture*") > 0)
  197.                       { push @PS,substr($line,0,$iPST+15); }    # \end{pspicture}
  198.               else { push @PS,substr($line,0,$iPST+14); }       # \end{pspicture}
  199.               LOG ("searchPS: set \$type=$type");
  200.               push @PStotal,[@PS];      # add PS sequence
  201.               LOG ("---->PS---->\n@PS\n<----PS<----");
  202.               @PS = ();                 # start new PS sequence
  203.             }                           # no pspicture env left
  204.           } else { push @PS,$line; }    # pspicture inside postscript
  205.         } elsif ($iPS > 0) {            # must be type=1 -> stop Scan
  206.           LOG ("searchPS: $line");
  207.           $type = -1;
  208.           push @PS,substr($line,0,$iPS+15);# add line
  209.           LOG ("searchPS: set \$type=$type");
  210.           push @PStotal,[@PS];          # add PS sequence
  211.           LOG ("---->PS---->\n@PS\n<----PS<----");
  212.           @PS = ();                     # start new PS sequence
  213.         } else { push @PS,$line; }              # add line
  214.       }
  215.       my $i = index($line,"end{document}");
  216.       if ($i > 0) { $EndDocument++; LOG("EndDocument in searchPS"); }
  217.     } # if ( $iVerb )
  218.     if (( index($line,"end{verbatim}") > 0 ) or ( index($line,"end{lstlisting}") > 0 )) { $iVerb = 0; }
  219.   }}
  220.   if ( $verbose ) {
  221.     LOG("---->PStotal---->");
  222.     for my $aref ( @PStotal ) {
  223.       my @a = @$aref;
  224.       my $i = 0;
  225.       foreach ( @a ) { LOG ($a[$i]); $i++; }
  226.     }
  227.     LOG ("<----PStotal<----");
  228.   }
  229.   close(FILE);
  230.   return @PStotal;                      # return all PS sequences
  231. }
  232.  
  233. sub runTeX {
  234.   my $filename = pop;
  235.   system("latex $filename"); # or die "Error in the LaTeX run from file $filename!";
  236.   system("dvips $filename"); # or die "Error in the dvips run from file $filename!";
  237.   system("ps2pdf $filename.ps");# or die "Error in the ps2pdf run from file $filename!";
  238.   copy("$filename.tex", "$imageDir/$filename-$imgNo.tex") or die "Cannot copy Source file!";;
  239.   for my $Itype ( @imageType ) {
  240.     if ($Itype eq "pdf") { system("pdfcrop $filename.pdf $imageDir/$filename-$imgNo.pdf");  }
  241.     if ($Itype eq "png") {
  242.       system("pdftoppm -f 1 -l 1 -r $DPI $imageDir/$filename-$imgNo.pdf $imageDir/");
  243.       system("convert $imageDir/-1.ppm  $imageDir/$filename-$imgNo.png");
  244.       system("rm $imageDir/-1.ppm");
  245.     }
  246.     if ($Itype eq "jpg") {
  247.       system("pdftoppm -f 1 -l 1 -r $DPI $imageDir/$filename-$imgNo.pdf $imageDir/");
  248.       system("convert $imageDir/-1.ppm  $imageDir/$filename-$imgNo.jpg");
  249.       system("rm $imageDir/-1.ppm");
  250.     }
  251.     if ($Itype eq "eps") { system("pdftops -f 1 -l 1 -eps $imageDir/$filename-$imgNo.pdf $imageDir/$filename-$imgNo.eps"); }
  252.   }
  253.   $imgNo++;
  254. }
  255.  
  256. sub runFile {
  257.   my $filename = pop;
  258.   my @PSarray = searchPS();
  259.   if ( $verbose ) {
  260.     LOG("---->PSarray---->");
  261.     for my $aref ( @PSarray ) {
  262.       my @a = @$aref;
  263.       my $i = 0;
  264.       foreach ( @a ) { print LOG $a[$i]."\n"; $i++; }
  265.     }
  266.     LOG("<----PSarray<----");
  267.     my $no = @PSarray;
  268.     LOG("PS: ".$no." PS sequence(s)");
  269.   }
  270.   for my $aref ( @PSarray ) {
  271.     my @PS = @$aref;
  272.     open (FILEp, "<$tempDir/$filename.preamble") or die "cannot open $tempDir/$filename.preamble!";
  273.     open (FILEsub, ">$tempDir/$filename-tmp.tex") or die "cannot open $tempDir/$filename-tmp.tex!";
  274.     #print FILEsub "\\RequirePackage{listings}\n";
  275.     while (<FILEp>) { print FILEsub $_; }
  276.     print FILEsub "\\pagestyle{empty}\n";
  277.     print FILEsub "\\newenvironment{postscript}{}{}\n";
  278.     print FILEsub "\\providecommand\\IncludeGraphics[2][]{}\n";
  279.     print FILEsub "\\begin{document}\n";
  280.     if ( $verbose ) { LOG("\@PS: $_"); }
  281.     foreach ( @PS ) { print FILEsub "$_\n"; }
  282.     print FILEsub "\\end{document}\n";
  283.     close (FILEsub);
  284.     close (FILEp);
  285.     runTeX("$tempDir/$filename-tmp");
  286.   }
  287. }
  288.  
  289. sub runpdfTeX() {
  290.   my ($name,$pdfname) = @_;
  291.   open (PDF, ">$tempDir/$pdfname-pdf.tex") or die "cannot open $tempDir/$pdfname-pdf.tex!";
  292.   open (FILE, "<$name.tex") or die "cannot open $name!";
  293.   print PDF "\\RequirePackage{graphicx}\n";
  294.   #if ($pstExaLoaded < 1) {
  295.    print PDF "\\let\\IncludeGraphics\\includegraphics\n"; #}
  296. #  print PDF "\\setkeys{Gin}{scale=0.25}\n";
  297. #  print PDF "\\providecommand\\psset[1]{}\n";
  298.   print PDF "\\graphicspath{{$imageDir/}}\n"; #uncomment
  299.   my $ignore = 0;
  300.   my $IMGno = 0;
  301.   my $depth = -1;
  302.   my $type = -1;
  303.   my $EndDocument = 0;                  # ignore all after \end{document}
  304.   my $iVerb = 0;
  305.   while (<FILE>) {                      # scan the input file
  306.     if ( !$iVerb ) {
  307.       $iVerb = ((index($_,"begin{verbatim}") > 0) or (index($_,"begin{lstlisting}") > 0));
  308.     } # do nothing until \end{verbatim}|| \end{lstlisting}
  309.     if ( !$iVerb ) {
  310.       my $i = index($_,"end{document}");
  311.       if ($i > 0) { print PDF $_; $EndDocument++; LOG("EndDocument in runpdfTeX"); }
  312.       if ( !$EndDocument ) {
  313.         my $iPS = index($_,"begin{postscript}");
  314.         if ( $iPS > 0 ) {
  315.           $type = 2;
  316.           $ignore = 1;
  317.           if ($iPS > 1) { print PDF substr($_,0,--$iPS); }      # add preceeding text
  318.          print PDF "\\IncludeGraphics[scale=$Iscale]{$pdfname-tmp-$IMGno$Iext}"; #change name x pdfname
  319.           $IMGno++;
  320.         }               # postscript env
  321.         if ( $type < 2 ) {
  322.           my $iPST = index($_,"begin{pspicture*}");
  323.           if ($iPST < 0) { $iPST = index($_,"begin{pspicture}"); }      # alternative ...
  324.           if ($iPST < 0) { $iPST = index($_,"\\pspicture"); }   # alternative \endpspicture...
  325.           if ( $iPST >= 0 ) {                           # start Scan
  326.             $ignore = 1;
  327.             $type = 1;
  328.             $depth++;                                   # pspicture env
  329.             LOG("Increase depth: $depth");
  330.             if ( $depth == 0 ) {
  331.               if ($iPST > 1) { print PDF substr($_,0,--$iPST); }# add preceeding text
  332.          #     print PDF "\\IncludeGraphics[scale=$Iscale]{$imageDir/$pdfname-tmp-$IMGno$Iext}"; #change name x pdfname
  333.               print PDF "\\IncludeGraphics[scale=$Iscale]{$pdfname-tmp-$IMGno$Iext}";   # use \graphicspath
  334.               $IMGno++;
  335.               LOG("Increase Image counter: $IMGno");
  336.             }
  337.           }
  338.         }
  339.         if ( !$ignore ) { print PDF "$_"; }                     # default line
  340.         if ( $type == 2 ) {                                     # postscript env
  341.           my $iPS = index($_,"end{postscript}");
  342.           if ($iPS > 0) {
  343.             print PDF substr($_,$iPS+15);                       # rest of line
  344.             $ignore = 0;
  345.             $type=-1;
  346.           }                                                     # end Scan
  347.         } elsif ( $type == 1 ) {                                # pspicture env
  348.           my $iPST = index($_,"end{pspicture*}");
  349.           if ($iPST < 0) { $iPST = index($_,"end{pspicture}"); }# alternative ...
  350.           if ($iPST < 0) { $iPST = index($_,"endpspicture"); }  # alternative \endpspicture...
  351.           if ($iPST > 0) {                                      # end Scan
  352.             if (index($_,"endpspicture") > 0)           # add rest of line, depends to type
  353.                { print PDF substr($_,$iPST+12); }       # \endpspicture
  354.             elsif (index($_,"pspicture*") > 0)
  355.                     { print PDF substr($_,$iPST+15); }  # \end{pspicture*}
  356.             else    { print PDF substr($_,$iPST+14); }  # \end{pspicture}
  357.             $depth--;
  358.             LOG("Decrease depth: $depth");
  359.             if ($depth < 0) { $ignore = 0; }
  360.           }
  361.         }
  362.       } # if ( !$EndDocument )
  363.     } else { print PDF $_; } # if ( $iVerb )
  364.     if (( index($_,"end{verbatim}") > 0 ) or ( index($_,"end{lstlisting}") > 0 )) { $iVerb = 0; }
  365.   } # while (<FILE>)
  366.   close (FILE);
  367.   close (PDF);
  368.   my $runAgain = 0;
  369.   system("pdflatex $tempDir/$pdfname-pdf");
  370.   if (-e "$tempDir/$pdfname-pdf.idx") { system("makeindex $tempDir/$pdfname-pdf.idx"); $runAgain++; }
  371.   if ($runBibTeX && -e "$tempDir/$pdfname-pdf.aux") { system("bibtex $tempDir/$pdfname-pdf");  $runAgain++; }
  372.   if ($runBiber && -e "$tempDir/$pdfname-pdf.bcf") { system("biber $tempDir/$pdfname-pdf");  $runAgain++; }
  373.   if ($runAgain) { system("pdflatex $tempDir/$pdfname-pdf"); }
  374.   if ( $clear ) {
  375.     unlink "$tempDir/$pdfname-pdf.log";
  376.     unlink "$tempDir/$pdfname-pdf.aux";
  377.   }
  378. }
  379.  
  380. sub LOG() {
  381.   if ( $verbose ) { print LOGfile "@_\n"; }
  382. }
  383.  
  384. __END__
  385.  


Nota 2011-05-27 19:59 @874

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
Creo que tengo una solución parcial, va así
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #Archivo que quieres editar
  2. my $archivo = '$pdfname';
  3. #Definimos el array que vamos a usar
  4. my @dellines; #  array para eliminar lineas de paquetes
  5. tie @dellines, 'Tie::File', $archivo or die "No se elimino ninguna linea: $!";
  6. #para modificar las lineas
  7. foreach my $line(@dellines) {
  8. chomp($line); #  eliminamos nueva linea
  9. # Borra las lineas que contienen los paquetes indicados
  10. #$line =~ s/(\\usepackage)(\[opciones\]){nombre paquete}//gi;
  11. $line =~ s/(\\usepackage){pst-graphicx}//gi;
  12. $line =~ s/(\\usepackage){pstricks}//gi;
  13. $line =~ s/(\\usepackage){pstricks-add}//gi;
  14. #muchas más lineas
  15. }
  16. #Termina la rutina
  17. untie @dellines;
  18. ########## terminamos
  19.  

El problema es que la inserto en el script y éste corre , pero no hace lo que pido (sigue creando el pdf con las líneas no deseadas), y no me genera los archivos dentro de la carpeta images/ .
Las interrogantes que me surgen ahora son
1.¿Cómo llamo al archivo pdf que se creó ? para poder modificarlos
2.¿Cómo utilizo las las líneas que he creado para que tengan efecto entre las líneas 1 y \begin{document}
3.¿ Es esta la mejor forma de lograr lo que busco?

He dado mil vueltas (y aprendí varias cosas cosas sobre cómo modificar texto, es una pregunta recurrente en ingles y español)

Saludos y gracias por la ayuda.


Última edición por pablgonz el 2011-05-31 20:54 @912, editado 1 vez en total

Nota 2011-05-28 14:41 @653

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: script Perl pst2pdf y pdfTeX
El tema es denso pero interesante, no me lo he leído todo a fondo e igual digo una tontería pero...

> Leer $name.tex desde la primera línea hasta \begin{document} y en ellas modificar (eliminar) las líneas que quiero y seguir con el proceso.

O alternativamente sustituir ^ por ^% en esas líneas con una simple expresión regular, en cuyo caso tex simplemente las ignorará como comentarios. No se verán en el resultado final.

> El problema es que la inserto en el script y éste corre, pero no hace lo que pido...

Estás eliminando la carga de esos paquetes en tex... ¿para qué? lo lógico es que no corra si necesita alguno de ellos. Esos paquetes necesitan cargarse en un determinado orden para que funcionen bien. Mucho mejor comentarlos.

> 3.¿ Es esta la mejor forma de lograr lo que busco?

No :roll: Lo veo innecesariamente complicado. Simplemente pon todos los paquetes en la misma línea y comenta y descomenta la línea desde un editor de texto o Perl cuando lo necesites. Si borras los paquetes necesarios en el texto y necesitas volver a cargarlos, ¿cómo sabrás qué paquetes necesitabas?


Última edición por pvaldes el 2011-05-28 14:51 @660, editado 1 vez en total

Nota 2011-05-28 14:50 @660

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
Ese es el gran problema... cómo leo pdfname.tex y elimino lo que necesito antes de que lo compile pdflatex...

El problema es que no sé cómo llamar a pdfname.tex después de creado, pero, antes de ser compilado, para efectuar los cambios, tie hace esa función, lee y guarda los cambios en el mismo fichero... pero no lo puedo hacer funcionar.

Cualquier ayuda se agradece.


Nota 2011-05-28 14:57 @665

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
pvaldes escribió:
> Leer $name.tex desde la primera línea hasta \begin{document} y en ellas modificar (eliminar) las líneas que quiero y seguir con el proceso.

O alternativamente sustituir ^ por ^% en esas líneas con una simple expresión regular, en cuyo caso tex simplemente las ignorará como comentarios. No se verán en el resultado final

> El problema es que la inserto en el script y éste corre, pero no hace lo que pido...
Citar:
estás eliminando la carga de esos paquetes en tex... ¿para qué? lo lógico es que no corra si necesita alguno de ellos. Esos paquetes necesitan cargarse en un determinado órden para que funcionen bien. Mucho mejor comentarlos


Comentarlos o eliminarlos da igual, ¿para qué? los paquetes son de pstricks para compilar latex>dvips>ps2pdf y como estamos creando un fichero para compilar con pdflatex... crea conflictos (dará un aviso en pantalla que estás tratando de compilar paquetes que no funciona en pdflatex) y el script se detendrá
Citar:
> 3.¿ Es esta la mejor forma de lograr lo que busco?
lo veo innecesariamente complicado. Simplemente pon todos los paquetes en la misma línea y comenta y des comenta la línea desde un editor de texto o perl cuando lo necesites. Si borras los paquetes necesarios en el texto y necesitas volver a cargarlos, ¿como sabrás que paquetes necesitabas?

La idea es no editar a mano el archivo generado (por eso el script) y SÍ sé cuáles son los paquetes a eliminar (o comentar) siempre.


Nota 2011-05-28 15:16 @678

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: script Perl pst2pdf y pdfTeX
> ¿Cómo llamo al archivo pdf que se creó ? para poder modificarlos
> como leo pdfname.tex y elimino lo que necesito antes de que lo compile pdflatex...

Vaya lío que me estás montando... empezaste con una pregunta, ahora has pasado a otra, o otras totalmente distintas...

Lo primero puedes cargarlo en una variable simplemente si sabes manipular pdf en crudo, pero el archivo pdf es el resultado final, no debes modificarlo con una llamada a tex desde Perl, eso es trabajo del archivo de texto .tex, lo segundo ídem, es un texto... slurp a una variable, mucho mejor camino.

¿Puedes explicar que significa exactamente que "no hace lo que quieres"?


Nota 2011-05-28 15:33 @689

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
Me explico...

El script lee el siguiente archivo test.tex y crea test-pdf.tex y compila pdflatex test-pdf.tex...

Lo que deseo es que antes de compilar test-pdf.tex, elimine (comente) algunos paquetes...

La idea es añadir un código (como el del ejemplo) que elimine esas líneas y guarde en el mismo fichero (test-pdf) dentro del script para luego compilarlo.

No hace lo que quiero (en realidad hace nada...) si inserto ese código en la linea 367-368 del script, pero de manera local sí...

¡aaah!, no es que empiece preguntando una cosas y luego otra... abrí un nuevo tema con esto... pero lo agregaron acá (puesto que se trata del mismo script).

Gracias por tus comentarios.


Última edición por pablgonz el 2011-05-28 15:37 @692, editado 1 vez en total

Nota 2011-05-28 15:37 @692

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: script Perl pst2pdf y pdfTeX
Lo más lógico, en pseudocódigo sería:

crear una variable $preambulo con el preámbulo deseado que cargue los paquetes que necesitas y sólo esos (una simple cadena de texto) o mejor aún un archivo aparte con el preámbulo que va a ser común a todos.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $preambulo = '\include{mipreambulo.tex}';


y luego, volviendo al centrarte en el archivo,

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. open DOCUMENTO "<test.tex";
  2. my $documentoentero = <DOCUMENTO>;


pasar completamente de todo lo que esté antes de \begin{document} y tomar el resto en una variable distinta; ahí habría que, por ejemplo usar split() y partir usando como marca de corte la cadena \begin{document} que normalmente sólo puede aparecer una vez en un documento tex (no es imposible pero sería rarísimo que lo haga más de una vez).

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my ($basura,$documento) = split (/\\begin\{document\}/ $documentoentero);


y luego simplemente imprimes al fichero de salida devolviendo lo que quitaste al partir:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. open SALIDATEX, ">archivo.tex";
  2. print SALIDATEX "$preambulo\n '\\begin{document}' $documento";
  3. system{'pdftex SALIDATEX'}
  4. close SALIDATEX;


es sólo un esquema, sucio y rápido, seguramente habré cometido errores, pero la idea básica es esa, un archivo tex no es más que un archivo de texto con dos partes claramente separadas, preámbulo y documento; si la primera parte da problemas simplemente descártala y cámbialo por otra que sea estándar y se ajuste a tus necesidades.


Nota 2011-05-28 16:08 @714

Perlero Nuevo
Registrado: 2010-09-08 21:03 @919
Mensajes: 61
Re: script Perl pst2pdf y pdfTeX
Gracias por tu respuesta, pero implicaría crear otro script y la idea es no hacer eso (con el ejemplo que tengo arriba funciona).

Lo de leer el preámbulo lo pensé, de hecho, el script crea test.preamble con sólo las líneas del preámbulo, pero, caía en el problema de leerlo, comentar (o borrar), luego abrir test-pdf.tex, borrar todo lo que estuviera antes de \begin{document} e insertar test.preamble (modificado), si bien \begin{document} aparece sólo una vez, porque tex lo entiende como instrucción y sólo se puede usar una vez, pero ¿qué pasa cuando estamos dentro de verbatim?, tendría que leer el archivo hacia atrás (Perl no sabe TeX).

No sé si split() lo dividirá al primer \begin{document} y todo eso DENTRO del mismo script.

Por el momento, sólo me queda comentar la línea que llama a pdflatex y editar a mano (o con otro script de ejemplo gracias a Tie::) test-pdf.tex, pero todavía no sé cómo leer el archivo al revés, para que encuentre el primer \begin{document} y desde ahí empieza a comentar o eliminar.

Saludos.


Nota 2011-05-28 18:17 @803
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: script Perl pst2pdf y pdfTeX
Tie::File te permite tratar el fichero como si fuera un array.

Entonces, si quieres ir hacia atrás a partir de una línea, solo tienes que ir reduciendo el índice de acceso a esa línea.

_________________
JF^D Perl programming


Nota 2011-05-29 07:21 @348

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: script Perl pst2pdf y pdfTeX
> ¿qué pasa cuando estamos dentro de verbatim?

Nada, que lo que lee seguirá siendo un trozo de una cadena pero los caracteres especiales te darán problemas. Puedes hacer los ajustes necesarios al final con unas líneas ~s o ~t. Sigue siendo un documento de texto.

> Gracias por tu respuesta, pero implicaría crear otro script y la idea es no hacer eso (con el ejemplo que tengo arriba funciona).

Si tu script ya funciona y no quieres cambiarlo por otro, pues entonces, genial, entiendo que podemos dedicarnos a otras cosas.

Si no es así lo mejor es que pongas un ejemplo del código tex que te da problemas dentro del documento y que digas qué cambios estás dispuesto a admitir en tu script y cuales no.

> caía en el problema de leerlo, comentar (o borrar), luego abrir test-pdf.tex, borrar todo lo que estuviera antes de \begin{document} e insertar test.preamble (modificado)

Problema que se resuelve de modo natural con
print "$preambulo\n $documento";

Mi consejo es que si tienes una solución sencilla no busques una complicada.

> No sé si split() lo dividirá al primer \begin{document}

split (/patron_de_corte/, cadena_a_cortar, "dividir 1 sola vez"); revisa el manual de split().

Lo normal es que los entornos documento de los gráficos asociados al texto nunca lleguen a causar problemas porque nunca se invocarán desde el script principal, sólo entran como un producto final, en forma de pdf.

Para que entendamos lo que significa esto: para Tex una imagen cargada en un texto es un objeto acabado que se incrusta simplemente. Tex no la modifica, le da exactamente igual lo que contenga ese fichero (de hecho ni siquiera es capaz de verlo), simplemente crea un hueco en el texto del tamaño adecuado para que dvips, ps2pdf o pdftex la interpreten. Siempre que la imagen sea un archivo gráfico correctamente formado y de una extensión conocida, los comandos que hayamos usado para crearla son irrelevantes para el compilador (igual que debería serlo cualquier comando que esté escondido dentro de la propia imagen).

Un pdf es igual: si hay un problema al compilarlo el problema no está en Tex, sino en los programas que toman el relevo.


Responder al tema  [ 51 mensajes ]  Ir a página 1, 2, 3, 4  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO