• Publicidad

script Perl pst2pdf y pdfTeX

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Autorización para crear un nuevo tema (o mover este)

Notapor pablgonz » 2011-05-31 21:08 @922

Estimado Explorer, ya que el problema, después de leer y hacer pruebas se reduce a dividir un archivo de texto en dos (antes y después del primer \begin{document}), modificar una parte y salvar los cambios en el mismo fichero, lo cual no tiene que ver directamente con pst2pdf, ¿se podría mover el tema a uno nuevo? (sólo la segunda parte), de titulo «Dividir texto en dos y modificar sólo una parte» (por ejemplo), una vez que pueda resolver esto, veo la forma de insertarlo dentro pst2pdf.

Gracias de tus comentarios y el de todos los usuarios del foro
¡Aaah!, y obvio, si me puedes prestar ayuda con el script te lo agradecería.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: script Perl pst2pdf y pdfTeX

Notapor explorer » 2011-06-01 04:54 @246

En la expresión regular del split(), hay que "escapar" el significado de las llaves, por sí tienen significado en el patrón.

Con este programa, se muestra como se puede realizar esa partición:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp 'slurp';
  3.  
  4. my $tex_file = slurp('test-pdf.tex');
  5.  
  6. my($primera_parte, $segunda_parte) = split /\\begin\{document\}/, $tex_file, 2;
  7.  
  8. print "[$primera_parte]\n";
  9. print "[$segunda_parte]\n";
  10.  
  11. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-06-01 22:21 @973

Eres un genio, trate de dividir el archivo, escapando las llaves y todo (muchos, muchos intentos), pero no me funcionaba, logre el cometido (adaptando tu código e instalando File::Slurp) con el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp qw( :all );
  3.  
  4. my $tex_file = slurp('test-pdf.tex');
  5. my ( $preamble, $body ) = split /\\begin\{document\}/, $tex_file,
  6.     2;                                 #dividimos en dos
  7. my @coment = $preamble;                #
  8.  
  9. #Buscamos y comentamos
  10. foreach my $comentline (@coment) {
  11.  
  12.     # comentamos las líneas
  13.     $comentline =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;
  14. }
  15. push( @coment, "\\begin\{document\} ", "$body" );    #unimos
  16. write_file( 'test-pdf.tex', @coment ); #escribimos el modificado
  17. exit;                                  # echo
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Una mezcla perfecta de las ideas de pvaldes y tus comentarios y las ideas que surgieron en el camino, con esto doy por solucionado el «sub problema».

Ahora, retomo el problema original (vuelta con el dolor de cabeza), el script pst2pdf.

En la línea 289 empieza sub runpdfTeX(), se crea $tempDir/$pdfname-pdf.tex, este fichero $pdfname-pdf.tex es el que deseo poner de entrada $tex_file para efectuar los cambios y que el script continué su llamada al sistema para pdflatex, compile y cierre.

¿Cómo llamo a $pdfname-pdf.tex antes de que empiece la rutina de compilación?

Solucionado esta problemática, daré por cerrado y solucionado el tema (por eso el titulo temporal de adaptar un script dentro de otro, el problema era que no existía dicho script)

Muchas, Muchas, muchas gracias a todos.
Esperando solucionar el último dilema, se despide Pablo.
Última edición por explorer el 2011-06-02 04:27 @227, editado 1 vez en total
Razón: Formatear el código con Perltidy
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: script Perl pst2pdf y pdfTeX

Notapor explorer » 2011-06-02 05:35 @274

Comentarios al código:

Al hacer el split(), la primera parte es un escalar ($preamble), al hacer luego my @coment = $preamble;, estás definiendo un array con un solo elemento, que es el valor de $preamble.

Entonces, el bucle foreach() solo se ejecuta una vez. $comentline contendrá el valor de $preamble, sacado de @coment.

Luego viene la expresión regular, que, ahora sí, con la opción /g, hará la sustitución de $comentline, que, como es un alias del primer valor de @coment, queda también modificado.

Luego, unes las partes y las sacas al fichero.

Estás dando un par de vueltas de más... :)

Queda más corto y claro así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp ':all';
  3.  
  4. my $tex_file = slurp('test-pdf.tex');                                # leemos
  5.  
  6. my ($preamble, $body) = split /\\begin\{document\}/, $tex_file, 2;   # dividimos en dos
  7.  
  8. $preamble =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;              # modificación
  9.  
  10. write_file( 'test-pdf.tex', $preamble, '\begin{document} ', $body);  # escribimos el cambio
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Puedes llamar a este programa, desde el principal, con system(), por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-06-02 23:51 @035

Al hacer el split(), la primera parte es un escalar ($preamble), al hacer luego my @coment = $preamble;, estás definiendo un array con un solo elemento, que es el valor de $preamble.
explorer, tienes toda la razón: daba unas vueltas extras (trataba de adaptar uno de los tantos intentos que hice con Tie::File). Lo cambie por tu código (que es el correcto), ahora, inserto el script en pst2pdf con la línea
Sintáxis: [ Descargar ] [ Ocultar ]
  1. #----------------------- Coment pdfname-pdf.tex ------------------------ 
  2. system("perl cleanslp $tempDir/$pdfname-pdf"); 
  3. #------------------------- Close pdfname-pdf.tex ------------------------- 

(antes de invocar a pdflatex) donde cleanspl es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp ':all';
  3.  
  4. my $tex_file = slurp('$tempDir/$pdfname-pdf');                                # leemos
  5. my ($preamble, $body) = split /\\begin\{document\}/, $tex_file, 2;   # dividimos en dos
  6. $preamble =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;              # modificación
  7. write_file( '$tempDir/$pdfname-pdf', $preamble, '\begin{document} ', $body);  # escribimos el cambio
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero, no me funciona, ¿estoy indicando mal la forma de abrir el fichero? o ¿se debe adaptar el código para insertarlo en pst2pdf? o el error está en otra parte.

Muchas gracias por la ayuda, seguiré probando...
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: script Perl pst2pdf y pdfTeX

Notapor explorer » 2011-06-03 06:54 @329

El problema es que el programa cleanslp no "recoge" el valor de $tempDir/$pdfname-pdf cuando se lo pasas como argumento.

Además, en la línea 4, has puesto las variables entre comillas simples, impidiendo su interpolación, así que

my $tex_file = slurp('$tempDir/$pdfname-pdf');

está intentando leer un fichero que se llama $tempDir/$pdfname-pdf (incluidos los caracteres '$').

Debes cambiar el programa cleanslp a esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::Slurp ':all';
  3.  
  4. my $fichero = $ARGV[0];    # el fichero se lo pasamos en el primer argumento
  5.  
  6. my $tex_file = slurp($fichero);                                      # leemos
  7. my ($preamble, $body) = split /\\begin\{document\}/, $tex_file, 2;   # dividimos en dos
  8. $preamble =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;              # modificación
  9. write_file($fichero, $preamble, '\begin{document} ', $body);         # escribimos el cambio
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-06-03 16:49 @742

Muy agradecido...
con la línea
Sintáxis: [ Descargar ] [ Ocultar ]
  1. #----------------------- Coment pdfname-pdf.tex ------------------------ 
  2. system("perl cleanslp.pl $tempDir/$pdfname-pdf.tex"); 
  3. #------------------------- Close pdfname-pdf.tex ------------------------- 


Y con la modificación dada, el script funciona perfectamente. Es increíble el poder de Perl para manejar ficheros de texto, el script quedo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #Thanks to http://perlenespanol.com for the help given.
  3. use File::Slurp ':all';
  4.  
  5. my $filemod = $ARGV[0];    
  6.  
  7. my $tex_file = slurp($filemod);                                    # reed
  8. my ($preamble, $body) = split /\\begin\{document\}/, $tex_file, 2; # split in two
  9. $preamble =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;            # modified
  10. write_file($filemod, $preamble, '\begin{document} ', $body);       # save
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sólo un par de preguntas para terminar con el tema:
1. ¿Se pude «silenciar» la salida de un comando de sistema, es decir, que no se llenara la pantalla mostrando lo que hace con un programa externo (latex por ejemplo) mientras llama a este script?
2. Se podría, escribir el código cleanslp dentro del mismo pst2pdf y que ejecutara la misma acción, sin tener que reescribir todo pst2pdf.

Son sólo un par de interrogantes, por mi parte, espero sus comentarios y escribiré a Herbert Voss, luego, daré por cerrado el tema.

Agradecimientos infinitos a todos, en especial a pvaldes y explorer.
Pablo
Última edición por pablgonz el 2011-06-03 21:50 @951, editado 2 veces en total
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: script Perl pst2pdf y pdfTeX

Notapor explorer » 2011-06-03 16:57 @748

En vez de ejecutarlo con system(), puedes hacerlo con qx(). Entonces, estarás ejecutando el programa externo, pero además estarás capturando su salida (en algunas casos necesitamos de esa salida).

my $salida = qx(perl cleanslp.pl $tempDir/$pdfname-pdf.tex);
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-06-03 21:54 @954

Hecho, en winxp con ActivePerl, funciona a la perfección, en Fedora 15, también.

salu2
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: script Perl pst2pdf y pdfTeX

Notapor explorer » 2011-06-04 04:29 @228

pablgonz escribiste:2. Se podría, escribir el código cleanslp dentro del mismo pst2pdf y que ejecutara la misma acción, sin tener que reescribir todo pst2pdf.
Sí... no es más que un split(), una sustitución con una expresión regular, y luego un join().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados