• 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

Notapor pablgonz » 2011-05-28 15:33 @689

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
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-28 15:37 @692

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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $preambulo = '\include{mipreambulo.tex}';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y luego, volviendo al centrarte en el archivo,

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open DOCUMENTO "<test.tex";
  2. my $documentoentero = <DOCUMENTO>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ($basura,$documento) = split (/\\begin\{document\}/ $documentoentero);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open SALIDATEX, ">archivo.tex";
  2. print SALIDATEX "$preambulo\n '\\begin{document}' $documento";
  3. system{'pdftex SALIDATEX'}
  4. close SALIDATEX;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: script Perl pst2pdf y pdfTeX

Notapor pablgonz » 2011-05-28 16:08 @714

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.
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-05-28 18:17 @803

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 & 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 pvaldes » 2011-05-29 07:21 @348

> ¿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.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

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.001 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)

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)

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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