• 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.

Re: script Perl pst2pdf y pdfTeX (solución parcial)

Notapor pablgonz » 2011-05-29 16:05 @712

Muchas gracias por los comentarios, aquí coloco un ejemplo para clarificar
test-pdf.tex
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \RequirePackage{graphicx}
  2. \let\IncludeGraphics\includegraphics
  3. \graphicspath{{images/}}
  4. \documentclass[10pt]{article}
  5. \usepackage[T1]{fontenc}
  6. \usepackage{lmodern}
  7. \usepackage{pstricks}
  8. \usepackage{pstricks-add}
  9. \usepackage[spanish]{babel}
  10. \usepackage{microtype}% sólo pdftex
  11. \begin{document}
  12. Este es un ejemplo creado con el siguiente código
  13. \begin{verbatim}
  14. \documentclass[10pt]{article}
  15. \usepackage[T1]{fontenc}
  16. \usepackage{lmodern}
  17. \usepackage{pstricks}
  18. \usepackage{pstricks-add}
  19. \usepackage[spanish]{babel}
  20. \usepackage{microtype}% sólo pdflatex
  21. \begin{document}
  22. \begin{pspicture}[showgrid=true](4,2)
  23. \psscaleboxto(8,2){Hola}
  24. \end{pspicture}
  25. \begin{pspicture}[showgrid=true](4,2)
  26. \psscaleboxto(4,2){foo bar}
  27. \end{pspicture}
  28. \end{document}
  29. \end{verbatim}
  30. Para obtener
  31.  
  32. \IncludeGraphics[scale=1]{test-tmp-0.pdf}
  33. y
  34. \IncludeGraphics[scale=1]{test-tmp-1.pdf}
  35. \end{document}
  36.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Con el este script
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Tie::File;
  4.  
  5. #Archivo que quieres editar
  6. my $archivo = 'test-pdf.tex';
  7.  
  8. my @coment=split(/\\begin{document}/, $archivo,2);
  9. #Usamos tie
  10. tie @coment, 'Tie::File', $archivo or die "No se comento ninguna linea: $!";
  11. #Buscamos y comentamos
  12. foreach my $line (@coment) {
  13. chomp($line);
  14. # Comenta las lineas que contienen los paquetes indicados
  15. $line =~ s/(\\usepackage){pst-graphicx}/\%\\usepackage{pst-graphicx}/i;
  16. $line =~ s/(\\usepackage){pstricks}/\%\\usepackage{pstricks}/i;
  17. $line =~ s/(\\usepackage){pstricks-add}/\%\\usepackage{pstricks-add}/i;
  18. #más lineas a comentar
  19. }
  20. #Termina la rutina
  21. untie @coment;
  22.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Resulta esto
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \RequirePackage{graphicx}
  2. \let\IncludeGraphics\includegraphics
  3. \graphicspath{{images/}}
  4. \documentclass[10pt]{article}
  5. \usepackage[T1]{fontenc}
  6. \usepackage{lmodern}
  7. %\usepackage{pstricks}
  8. %\usepackage{pstricks-add}
  9. \usepackage[spanish]{babel}
  10. \usepackage{microtype}% sólo pdftex
  11. \begin{document}
  12. Este es un ejemplo creado con el siguiente código
  13. \begin{verbatim}
  14. \documentclass[10pt]{article}
  15. \usepackage[T1]{fontenc}
  16. \usepackage{lmodern}
  17. %\usepackage{pstricks}
  18. %\usepackage{pstricks-add}
  19. \usepackage[spanish]{babel}
  20. \usepackage{microtype}% sólo pdflatex
  21. \begin{document}
  22. \begin{pspicture}[showgrid=true](4,2)
  23. \psscaleboxto(8,2){Hola}
  24. \end{pspicture}
  25. \begin{pspicture}[showgrid=true](4,2)
  26. \psscaleboxto(4,2){foo bar}
  27. \end{pspicture}
  28. \end{document}
  29. \end{verbatim}
  30. Para obtener
  31.  
  32. \IncludeGraphics[scale=1]{test-tmp-0.pdf}
  33. y
  34. \IncludeGraphics[scale=1]{test-tmp-1.pdf}
  35. \end{document}
  36.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero, también comenta las lineas después del primer \begin{document}, Con la idea de split() no debería suceder , ¿que es lo que tengo mal definido?, hice varios intentos, pero no me funcionan... creo que, solucionado eso, se acaba el problema

Respecto al tratamiento de imágenes, estoy totalmente de acuerdo, solo son líneas de texto para TeX. El tema es, TeXlive 2010 y MikTeX 2.9, al actualizar sus versiones de pdfTeX a 1.40.11 se agregó un warning que antes no estaba, el cual aparece cada vez que encuentra un paquete pstricks... lo cual impide que se compile el archivo al ser llamado por pst2pdf. Por eso la idea era "limpiar" el código de esos paquetes antes de compilarlo.

¿POR QUÉ TANTO FANATISMO CON EL SCRIPT? Por muchos motivos: en el universo TeX existen varias soluciones de conversión de formatos entre pstricks y pdf, pero ninguna como esta: limpia todo (a excepción del preámbulo) de código pstricks, genera una carpeta con todas las imágenes creadas en formato pdf y el original .tex, con lo cual me permite trabajar no solo con pdfTeX sino también con LuaTeX y XeTeX, para publicaciones (en algunas imprentas piden las imágenes por separado) sin contar que puedo modificar todas las imágenes (tamaño, posición, etc) sin tener que mover tantas líneas de código.

Muchas gracias.
Última edición por pablgonz el 2011-05-31 20:56 @914, editado 4 veces en total
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 pvaldes » 2011-05-29 17:51 @785

bien, de entrada todo ésto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $line =~ s/(\\usepackage){pst-graphicx}//gi;
  2. $line =~ s/(\\usepackage){pstricks}//gi;
  3. $line =~ s/(\\usepackage){pstricks-add}//gi;
  4. $line =~ s/(\\usepackage){pst-barcode}//gi;
  5. $line =~ s/(\\usepackage){pst-tvz}//gi;
  6. $line =~ s/(\\usepackage){pst2pdf}//gi;
  7. $line =~ s/(\\usepackage){pst-bspline}//gi;
  8. $line =~ s/(\\usepackage){pst-math}//gi;
  9. $line =~ s/(\\usepackage){pst-solides3d}//gi;
  10. $line =~ s/(\\usepackage){pst-circ}//gi;
  11. $line =~ s/(\\usepackage){pst-am}//gi;
  12. $line =~ s/(\\usepackage){pst-optic}//gi;
  13. $line =~ s/(\\usepackage){pst-sigsys}//gi;
  14. $line =~ s/(\\usepackage){pst-magneticfield}//gi;
  15. $line =~ s/(\\usepackage){pst-fun}//gi;
  16. $line =~ s/(\\usepackage){pst-node}//gi;
  17. $line =~ s/(\\usepackage){pst-gantt}//gi;
  18. $line =~ s/(\\usepackage){pst-jtree}//gi;
  19. $line =~ s/(\\usepackage){pst-asr}//gi;
  20. $line =~ s/(\\usepackage){pst-3dplot}//gi;
  21. $line =~ s/(\\usepackage){pst-fractal}//gi;
  22. $line =~ s/(\\usepackage){pst-coil}//gi;
  23. $line =~ s/(\\usepackage){pst-exa}//gi;
  24. $line =~ s/(\\usepackage){pst-platon}//gi;
  25. $line =~ s/(\\usepackage){pst-thick}//gi;
  26. $line =~ s/(\\usepackage){pst-mirror}//gi;
  27. $line =~ s/(\\usepackage){pst-knot}//gi;
  28. $line =~ s/(\\usepackage){pst-optexp}//gi;
  29. $line =~ s/(\\usepackage){pst-support}//gi;
  30. $line =~ s/(\\usepackage){pst-bezier}//gi;
  31. $line =~ s/(\\usepackage){pst-calendar}//gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Yo lo simplificaría en una sóla línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $line =~ s/\\usepackage\{pst/\#\\usepackage\{pst/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


he eliminado el "()" de usepackage, no veo que sirva de mucho realmente, por otra parte no recuerdo ahora si el { hay que escaparlo con \{ pero es probable que lo lleve, le pongo barras por si acaso, comprueba ambos puntos

Una buena razón para comentar la línea en vez de eliminarla es que es más eficaz para eliminar problemas, ten en cuenta que tu estrategia tal y como está planteada ahora fallará en numerosas ocasiones, por ejemplo, imagina que te encuentras lo siguiente:

\usepackage{pst-optexp,pst-bezier,pst-calendar}
Última edición por pvaldes el 2011-05-29 18:13 @800, editado 1 vez en total
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-05-29 18:06 @796

pvaldes escribiste:bien, de entrada todo ésto:
............................................................
Yo lo simplificaría en una sóla línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $line =~ s/(\\usepackage){pst/\#\\usepackage){pst/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Muchas gracias
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $line =~ s/(\\usepackage){pst/\%\\usepackage{pst/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Los comentarios en TeX son % (# es sólo de Perl, ¡je,je!), pero, sigo con el problema del ejemplo... creo que mi split() no está bien definido, por eso recorre todo el archivo.
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 pvaldes » 2011-05-29 18:14 @801

ups, es verdad :mrgreen: %

...
Uso de split:

split /PATRON/,EXPRESION,LIMITE

si limite = 2 sólo separa en dos campos, o sea una vez (ignorará todas las marcas de corte salvo la primera)

y ojo que la sustitucion hay que aplicarla a la primera variable solo, si divides en $preambulo y $documento con split luego

$preambulo =~ s/(\\usepackage){pst-calendar}//gi;
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-05-29 18:29 @812

pvaldes escribiste:Uso de split:
split /PATRON/,EXPRESION,LIMITE
sí límite = 2 sólo separa en dos campos, o sea una vez (ignorará todas las marcas de corte salvo la primera)
$preambulo =~ s/(\\usepackage){pst-calendar}//gi;

Muchas gracias, pero si cambio a
Sintáxis: [ Descargar ] [ Ocultar ]
  1. my @coment=split(/\\begin{document}/, $archivo,2);  

El problema persiste. El problema está en como defino el split()
y ojo que la sustitución hay que aplicarla a la primera variable solo, si divides en $preambulo y $documento con split luego

Leyendo perlfaq5 y revisando por los foros en inglés, me percato de que mis script está mal, funciona, pero está mal.

No tengo bien definido el script en la entrada (o variables, no lo sé :cry: ) para que haga el split() en $preambulo y $documento y efectué los cambios antes del primer \begin{document} (es decir en $preambulo), pero aun así, comenta las líneas (pero en todo el archivo).

Por ahora creo que el problema a resolver es la división y separación en $preambulo donde se quiere comentar y $documento donde no quiero comentar. De no ser factible con split(), quizás pueda leer el bloque de texto entre \RequirePackage{graphicx} y \begin{document} que siempre están presentes en test-pdf.tex y efectuar los cambios ahí (encontré algo en expresion-regular-para-identificar-una-linea-t5641.html?hilit=split), pero, creo que tendía que crear dos ficheros, y la idea es realizar los cambios y guardarlos en el mismo archivo. Se agradece el tiempo y dedicación a este "sub problema".

Cualquier ayuda, comentario y demás para arreglar el script, se agradece.

El script que utilizo (por ahora) es este:
pdfclean.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Tie::File;
  4. #Archivo que quieres editar
  5. my $archivo = 'test-pdf.tex';
  6. my ($preambulo,$documento) =split(/\\begin{document}/,$archivo,2);
  7. my @coment=$preambulo;
  8. #Usamos tie
  9. tie @coment, 'Tie::File', $preambulo or die "No se comento ninguna linea: $!";
  10. #Buscamos y comentamos
  11. foreach my $preambulo (@coment) {
  12. # Comenta las líneas que contienen los paquetes indicados
  13. $preambulo =~ s/(\\usepackage){pst/\%\\usepackage{pst/i;
  14. }#Termina la rutina
  15. untie @coment;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos y muchas, pero, muchas gracias (en especial a pvaldes por sus ideas y comentarios).
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

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)

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.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: 14480
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: 14480
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)

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron