• Publicidad

Modificar fichero Latex

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

Modificar fichero Latex

Notapor pablgonz » 2011-11-13 23:51 @036

Amigos del foro, tengo el siguiente dilema: tengo un archivo test.tex (fichero latex)
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks} % quiero añadir el signo % al inicio
  3. \begin{document} % aquí divido el archivo      
  4. EJEMPLO
  5. \begin{verbatim}
  6. \usepackage{pstricks}
  7. \begin{document}      
  8. \end{verbatim}
  9. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y deseo que termine así­

Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. %\usepackage{pstricks} % quiero añadir el signo % al inicio
  3. \begin{document} % aquí divido el archivo      
  4. EJEMPLO
  5. \begin{verbatim}
  6. \usepackage{pstricks}
  7. \begin{document}      
  8. \end{verbatim}
  9. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Tengo el siguiente script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my $entrada= $ARGV[0];     # el fichero como primer argumento
  4. my $salida = 'salida.tex'; # archivo de salida
  5. open (AE, '<', $entrada);  # leemos el Archivo Entrada
  6. my ($uno,$dos) = split(/\\begin\{document\}/,<AE>,2);
  7. my @coment=$uno;
  8. my @preamb;
  9. close AE;
  10. foreach my $line(@coment) { # modificamos las lineas
  11. chomp($line);
  12. $line =~ s/(\\usepackage){pst/\%\\usepackage{pst/g;
  13. push(@preamb,$line);# las unimos
  14. }
  15. my $modificado = join("\n",@preamb,"\\begin\{document\}"); #pegamos
  16. open (AS,">", $salida);# creo el Archivo Salida
  17. print AS $modificado;#imprimo uno modificado
  18. close AS;# cierro
  19. exit;# terminamos
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero, el script crea salida.tex y solo tiene lo siguiente
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \begin{document} % aquí divido el archivo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿Cómo junto las partes $uno (modificada) y $dos? Usando File::Slurp se puede de forma inmediata (script-perl-pst2pdf-y-pdftex-t5369-15.html) pero, en este caso, no puedo usarlo.

Esperando su ayuda.
Pablo
Última edición por pablgonz el 2011-11-14 21:00 @916, 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: Modificar fichero Latex

Notapor explorer » 2011-11-14 05:25 @267

Solo hay que hacer unos pocos cambios:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3.  
  4. my $entrada = $ARGV[0];     # el fichero como primer argumento
  5. my $salida  = 'salida.tex'; # archivo de salida
  6.  
  7. open (AE, '<', $entrada);   # leemos el archivo Entrada
  8. undef $/;                   # modo 'slurp'
  9. my ($uno,$dos) = split(/\\begin\{document\}/,<AE>,2);
  10. close AE;
  11.  
  12. my @coment = split /\n/, $uno;
  13. my @preamb;
  14.  
  15. foreach my $line (@coment) { # modificamos las líneas
  16.     chomp($line);
  17.     $line =~ s/(\\usepackage){pst/\%$1\{pst/g;
  18.     push(@preamb,$line);    # las unimos
  19. }
  20.  
  21. my $modificado = join("\n", @preamb, '\begin{document}' . $dos); #pegamos
  22.  
  23. open (AS,">", $salida);     # creo el Archivo Salida
  24. print AS $modificado;       # imprimo uno modificado
  25. close AS;                   # cierro
  26.  
  27. exit;                       # terminamos
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Esos cambios son:
  • Línea 8: activamos el modo "succionador", por lo que una sola llamada de lectura del fichero nos devolverá todo el fichero, y no solo la primera línea
  • Línea 12: usamos split() para dividir la primera parte, en líneas. Lo necesitamos porque luego vamos a hacer un bucle por ellas
  • Línea 21: faltaba por agregar la segunda parte del fichero.
Otra versión, un poco más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $entrada = $ARGV[0];     # el fichero como primer argumento
  7. my $salida  = 'salida.tex'; # archivo de salida
  8.  
  9. open (AE, '<', $entrada);   # leemos el archivo de entrada
  10. undef $/;                   # modo 'slurp'
  11. my $fichero = <AE>;         # le leemos entero
  12. close AE;
  13.  
  14. $fichero =~ s/^(\\usepackage)/\%$1/m; # agregar /g para cambiar todas
  15.  
  16. open (AS, '>', $salida);    # creo el archivo de salida
  17. print AS $fichero;          # imprimo uno modificado
  18. close AS;                   # cierro
  19.  
  20. exit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Lo que hacemos es leernos todo el fichero, hacer la sustitución, y grabar el nuevo fichero.
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: Modificar fichero Latex

Notapor pablgonz » 2011-11-14 13:31 @605

Gracias por la respuesta, con las modificaciones que me diste todo funciona Ok, solo me quedan un par de consultas.
1. Con la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $line =~ s/(\\usepackage){pst/\%$1\{pst/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
comento todas las líneas de la forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \usepackage{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
pero, en algunas ocasiones, las líneas serán de la forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \usepackage[opciones]{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
¿Cómo defino un «comodín» para que comente también estas líneas si es que las encuentra (dentro de "[ ]" puede ir cualquier nombre).

2. Si deseara guardar los cambios en el mismo archivo bastaría con cambiar
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (AS,">", $salida);
  2. print AS $modificado;
  3. close AS;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (AS,">", $entrada);
  2. print AS $modificado;
  3. close AS;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
¿Es correcto hacer esto? ¿O estoy dando vueltas extras?

No entendí tu solución corta (no veo dónde hace el split()), la analizaré con más detalle.

Gracias por todo.
Pablo
Última edición por pablgonz el 2011-11-14 21:01 @917, editado 1 vez en total
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Modificar fichero Latex

Notapor explorer » 2011-11-14 15:55 @705

1.- Sería algo así (no probado): /(\\usepackage)(?:\[.+?\])?{pst/

Lo que hacemos es definir un sub patrón que marcamos de forma opcional (el '?' final). Y como usamos paréntesis, y no deseamos capturar ese patrón, lo marcamos como de no-agrupación (el '?:'). Y el patrón comienza por un '[', le sigue uno o más caracteres, hasta el primer ']'.

2.- Sí.

3.- La solución corta no necesita de ningún split(). Simplemente hacemos la transformación del texto a lo largo de todo el fichero, donde pille cada '^\\usepackage...' El resto del fichero no es modificado.
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: Modificar fichero Latex

Notapor pablgonz » 2011-11-14 20:59 @916

explorer escribiste:1.- Sería algo así (no probado): /(\\usepackage)(?:\[.+?\])?{pst/
lo probé y lo que hace es comentar y eliminar lo que está dentro de [ ], por ejemplo, si encuentra
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \usepackage[opciones]{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
lo convierte en
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. %\usepackage{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
lo ideal sería convertir
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \usepackage[opciones]{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
en
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. %\usepackage[opciones]{pst-algo}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
pero, es solo un detalle.
explorer escribiste:2.- Sí.
Gracias, por fin creo que he aprendido un poco más de este maravilloso lenguaje.
3.- La solución corta no necesita de ningún split().
explorer escribiste:Simplemente hacemos la transformación del texto a lo largo de todo el fichero, donde pille cada '^\\usepackage...' El resto del fichero no es modificado.
No es lo que necesito, la primera solución es la ideal para mis necesidades, el split() es de suma importancia (en 2) puesto que solo deseo modificar el preámbulo (antes de \begin{document}) y no después de esta línea.

Una última consulta, para no tener que abrir un nuevo tema (y es una duda que tengo hace tiempo) supongamos que mi fichero de entrada test.tex es de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks}
  3. \end{document}
  4. \end{document}
  5. \usepackage{pstricks}
  6. \end{document}
  7. \end{document}
  8. \usepackage{pstricks}
  9. \end{document}
  10. \usepackage{pstricks}
  11. \begin{document} % divido el archivo      
  12. EJEMPLO
  13. \begin{verbatim}
  14. \usepackage{pstricks}
  15. \begin{document}      
  16. \end{verbatim}
  17. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
lo divido con el script y en $uno quedaría todo lo que está entes del primer \begin{document}, ahora, me gustaría leer $uno y comentar sólo la última línea en la cual aparece \end{document} y no el resto, ¿se puede hacer eso con Perl? Con sed creo que se puede, pero, ya que estoy corriendo un script Perl, y no siempre tengo Linux, ¿es posible hacer esto?

Gracias por los comentarios y ayuda.
Pablo.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Modificar fichero Latex

Notapor explorer » 2011-11-15 05:55 @288

pablgonz escribiste:
explorer escribiste:1.- Sería algo así (no probado): /(\\usepackage)(?:\[.+?\])?{pst/
lo probé y lo que hace es comentar y eliminar lo que está dentro de [ ]
No lo había probado. Es así:

/(\\usepackage(?:\[.+?\])?)\{pst/

(He movido un paréntesis de sitio. Además, he escapado '{', porque las llaves sí son significativas para los patrones.)

pablgonz escribiste:No es lo que necesito, la primera solución es la ideal para mis necesidades, el split() es de suma importancia (en 2) puesto que solo deseo modificar el preámbulo (antes de \begin{document}) y no después de esta línea.
Claro, y eso es lo que hace: solo modifica la primera vez que se encuentra '\usepackage'. Otra cosa es que le añadas la opción '/g' a la expresión regular, en cuyo caso hará el cambio en todas las líneas. Pero si no lo pones, solo hará el cambio en la primera ocasión.

pablgonz escribiste:¿se puede hacer eso con Perl? Con sed creo que se puede, pero, ya que estoy corriendo un script Perl, y no siempre tengo Linux, ¿es posible hacer esto?
Sí, claro. Perl es una herramienta perfecta para procesar texto. Se podría encontrar un patrón de expresiones regulares, o usar lo del split(), y luego usar join() o imprimir por partes... igual que antes.
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: Modificar fichero Latex

Notapor pablgonz » 2011-11-15 20:45 @906

explorer escribiste: No lo había probado. Es así:
/(\\usepackage(?:\[.+?\])?)\{pst/
(He movido un paréntesis de sitio. Además, he escapado '{', porque las llaves sí son significativas para los patrones.)
Muchas gracias, con este patrón (el cual intenté a ensayo y error varias veces) puedo hacer un sin fin de cosas dentro de este (y otros) script.

explorer escribiste: Perl es una herramienta perfecta para procesar texto. Se podría encontrar un patrón de expresiones regulares, o usar lo del split(), y luego usar join() o imprimir por partes... igual que antes.
La verdad, me demoré bastante rato en entender split() y join(). La mayor parte de los ejemplos que encontré en la red son referidos a variables creadas dentro del script (palabras, números, etc) y no a archivos externos. «split, join, ~ s/.../» son ideales para trabajar con ficheros de solo texto.

En fin, daré el tema por resuelto.

Seguiré leyendo respecto al tema de los «patrones regulares», reitero mi agradecimiento al foro y sus participantes.

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

Re: Modificar fichero Latex

Notapor pvaldes » 2011-11-18 14:41 @654

Ese fichero tex nunca funcionará tal y como lo escribes: tienes mal puestos los entornos.

¡Ah!, ya veo: el truco está en el verbatim. No he dicho nada entonces.

Una manera muy rara de escribirlo de todos modos... Eso es andar buscando problemas en el futuro.

Por otra parte escribir un script de 19 líneas para cambiar un único carácter una sola vez parece una manera muy poco eficiente de emplear tu tiempo. A veces los problemas son simples y la solución a un problema muy simple no puede ser complicada.

Yo haría la sustitución a mano o usaría un one-liner directamente si tuviera que repetir el proceso muchas veces. No veo ningún beneficio en hacerlo de otro modo, pero puedo equivocarme claro.

Salvo error u omisión por mi parte al teclearlo (no lo he comprobado) todo tu problema se resuelve en una línea de Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl -i.bak -e 's/\\usepackage\{pstricks\}/%\usepackage{pstricks}/' mifichero
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Modificar fichero Latex

Notapor pablgonz » 2011-11-18 15:57 @706

pvaldes escribiste:Yo haría la sustitución a mano o usaría un one-liner directamente si tuviera que repetir el proceso muchas veces. No veo ningún beneficio en hacerlo de otro modo, pero puedo equivocarme claro.
Lo de la línea de comando es buena idea... cuando se dispone de Perl por completo, pero, mi caso es distinto, cuando corres texlive en win32, éste corre con una versión pequeña y limitada dentro de él, es decir, cuando quieres ejecutar un script Perl registrado en texlive win32, éste corre Perl sin que tu puedas acceder a él (tiene registros propios) a diferencia de las versiones en Linux.

pvaldes escribiste:Por otra parte escribir un script de 19 líneas para cambiar un único carácter una sola vez parece una manera muy poco eficiente de emplear tu tiempo. A veces los problemas son simples y la solución a un problema muy simple no puede ser complicada.
Discrepo totalmente de eso, te daré un ejemplo:
Supongamos que queremos sacar una revista de mate mensualmente dentro de una comunidad de usuarios donde los archivos están escritos en TeX. Los artículos son enviados por distintos usuarios, y no todos ellos utilizan el mismo preámbulo y abreviaciones de comandos. Entonces tenemos el siguiente problema: ¿cómo creamos un solo gran archivo con todos los artículos? Con \include{archivo}, pero, \include{archivo} no nos permite tener preámbulo. El script (que está arriba) da una forma genérica para dividir archivos tex en preámbulo y cuerpo e imprimir la parte que deseas eliminar -del preámbulo o cuerpo- lo que da problemas, para este caso especifico, es por conversión de ficheros latex a pdflatex (que no soporta pstricks).
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Modificar fichero Latex

Notapor pvaldes » 2011-11-18 16:19 @721

> entonces tenemos el siguiente problema: ¿cómo creamos un solo gran archivo con todos los artículos?

Problema facilísimo de resolver: de entrada el comando que buscas no es include, probablemente, sino:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \input{mi_preambulo}
  2. \title{la revista que sale los martes}
  3. \begin{document}
  4. \maketitle
  5. \input{articulo1}
  6. \input{articulo2}
  7. \begin{minipage}\input{nota_breve}...\end{minipage}
  8. \input{articulo3}
  9. etc etc etc...
  10.  
  11. \end{document}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Tener más de un preámbulo para una revista es en el 99,99% de los casos absurdo. Aparte de que no compilará adecuadamente, claro. Los artículos no deberían tener preámbulo, pero eso en todo caso es un problema que resuelves en segundos a mano. No te compliques la vida. Si tu eres el editor, tu editas todo (modo hormiguita hacendosa).

Alternativa dos, (modo cigarra holgazana :lol: ) Si cada artículo tiene un preámbulo, compila cada uno aparte. Tienes que producir las páginas correspondientes en pdf por separado y pegarlas posteriormente en un pdf mayor. Con eso evitas todo el problema que tienes con los preámbulos y los paquetes que chocan entre si.

Insisto, no uses una solución compleja teniendo una sencilla disponible.

Respecto a lo de tener un Perl capado pudiendo tener uno entero gratis, pues... tu te lo pierdes :roll: :wink: nada te impide instalar un Linux junto a tu Windows, pueden convivir juntos en el mismo ordenador perfectamente, es un falso problema.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron