• Publicidad

Ajustar texto usando expresión regular y /e

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

Ajustar texto usando expresión regular y /e

Notapor pablgonz » 2021-07-29 08:42 @404

Hola, estoy intentando modificar un montón de archivos que tienen más menos esta entrada en común:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. \item Texto texto texto \vfill 
  2.  
  3. \begin{minipage}[c]{0.7\linewidth} 
  4. \begin{enumerate} 
  5. \item $45^{\circ}$ 
  6. \item $50^{\circ}$ 
  7. \item $55^{\circ}$\hfill {\small fig \thefig.} 
  8. \end{enumerate} 
  9. \end{minipage}\hfill 
  10. \begin{minipage}[c]{0.3\linewidth} 
  11. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all} 
  12. \end{minipage}\vfill 


Mi idea es dejarlo de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. \item Texto texto texto \vfill 
  2.  
  3. \settowidth{\imagewidth}{\includegraphics[page=1]{pr-fig-all}} 
  4. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth} 
  5. \begin{enumerate} 
  6. \item $45^{\circ}$ 
  7. \item $50^{\circ}$ 
  8. \item $55^{\circ}$\hfill {\small fig \thefig.} 
  9. \end{enumerate} 
  10. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth} 
  11. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all} 
  12. \end{minipage}\vfill 

Básicamente deseo agregar una línea \settowidth sobre el primer minipage y ajustar lo que está dentro de la llaves en [c]{....}. El intento de script que poseo es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.32;
  3.  
  4. my $ltxfile = '
  5. \item Texto texto texto \vfill
  6.  
  7. \begin{minipage}[c]{0.7\linewidth}
  8. \begin{enumerate}
  9. \item $45^{\circ}$
  10. \item $50^{\circ}$
  11. \item $55^{\circ}$\hfill {\small fig \thefig.}
  12. \end{enumerate}
  13. \end{minipage}\hfill
  14. \begin{minipage}[c]{0.3\linewidth}
  15. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all}
  16. \end{minipage}\vfill
  17.  
  18. \item Texto texto texto \vfill
  19.  
  20. \begin{minipage}[c]{0.65\linewidth}
  21. \begin{enumerate}
  22. \item $55^{\circ}$ \hfill {\small fig \thefig.}
  23. \item $110^{\circ}$
  24. \item $140^{\circ}$
  25. \end{enumerate}
  26. \end{minipage}\hfill\begin{minipage}[c]{0.35\linewidth}
  27. \includegraphics[scale=1,page=2,valign=c,right]{pr-fig-all}
  28. \end{minipage}\vfill
  29.  
  30. \item Texto texto texto \vfill
  31.  
  32. \begin{minipage}[c]{0.7\linewidth}
  33. \begin{enumerate}
  34. \item $100^{\circ}$\hfill {\small fig \thefig.}
  35. \item $110^{\circ}$
  36. \item $150^{\circ}$
  37. \end{enumerate}
  38. \end{minipage}\hfill
  39. \begin{minipage}[c]{0.3\linewidth}
  40. \includegraphics[scale=1,page=3,valign=c,right]{pr-fig-all}
  41. \end{minipage}\vfill
  42. ';
  43.  
  44. ## Modificamos el primer minipage
  45. $ltxfile =~ s/(\\begin\{minipage\}\[c\]\{.+?\\linewidth\})
  46.               (?:.+?)
  47.               (?:\\end\{minipage\}(\n)?\\hfill)
  48.               /\\settowidth\{\\imagewidth\}\{\\includegraphics\[page=1\]\{pr-fig-all\}\}\n
  49.               \\begin\{minipage\}\[c\]\{\\dimexpr\\linewidth-1\.2\\imagewidth\}
  50.               /gmsx;
  51. # say $ltxfile;
  52.  
  53. ## Modificamos el segundo minipage
  54.  
  55. ## Ajustamos la numeración en \sbox
  56. my $n;
  57. $ltxfile =~ s/\\settowidth\{\\imagewidth\}\{\\includegraphics\[page=1\]\{pr-fig-all\}\}/'\settowidth{\imagewidth}{\includegraphics[page='.++$n.']{pr-fig-all}}'/gem;
  58. say $ltxfile;
  59.  
  60. ## Escribimos
  61. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero la expresión regular que he colocado captura más de la cuenta y modifica ambos minipage, sin contar que el uso de /e es un poco "cuestionable", mi idea es que la salida sea:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \item Texto texto texto \vfill 
  2.  
  3. \settowidth{\imagewidth}{\includegraphics[page=1]{pr-fig-all}}  
  4. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth}  
  5. \begin{enumerate} 
  6. \item $45^{\circ}$ 
  7. \item $50^{\circ}$ 
  8. \item $55^{\circ}$\hfill {\small fig \thefig.} 
  9. \end{enumerate} 
  10. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth}  
  11. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all} 
  12. \end{minipage}\vfill 
  13.  
  14. \item Texto texto texto \vfill 
  15.  
  16. \settowidth{\imagewidth}{\includegraphics[page=2]{pr-fig-all}}  
  17. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth}  
  18. \begin{enumerate} 
  19. \item $55^{\circ}$ \hfill {\small fig \thefig.} 
  20. \item $110^{\circ}$ 
  21. \item $140^{\circ}$ 
  22. \end{enumerate} 
  23. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth} 
  24. \includegraphics[scale=1,page=2,valign=c,right]{pr-fig-all} 
  25. \end{minipage}\vfill 
  26.  
  27. \item Texto texto texto \vfill 
  28.  
  29. \settowidth{\imagewidth}{\includegraphics[page=3]{pr-fig-all}}  
  30. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth}  
  31. \begin{enumerate} 
  32. \item $100^{\circ}$\hfill {\small fig \thefig.} 
  33. \item $110^{\circ}$ 
  34. \item $150^{\circ}$ 
  35. \end{enumerate} 
  36. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth}  
  37. \includegraphics[scale=1,page=3,valign=c,right]{pr-fig-all}%, 
  38. \end{minipage}\vfill 


¿Alguna manera de conseguir esto?
Saludos
Última edición por pablgonz el 2021-07-30 10:28 @478, 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: Ajustar texto usando expresión regular y /e

Notapor explorer » 2021-07-29 09:44 @447

La opción /g en la línea 50 es la que hace que se modifiquen los dos minipage.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ajustar texto usando expresión regular y /e

Notapor pablgonz » 2021-07-29 09:54 @454

Hola, gracias por la respuesta. Entiendo que el uso de '/g' es para hacer los cambios en TODOS los minipage, pero si lo quito solo modificaría el primero y no me daría la salida esperada... Quizás comenzar al revés sea una opción, modificando los que empiecen por '\hfill'... Hummm.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Ajustar texto usando expresión regular y /e

Notapor pablgonz » 2021-07-29 11:59 @541

Creo que por aquí va la cosa. He modificado el código a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.32;
  3.  
  4. my $ltxfile = '
  5. \item Texto texto texto \vfill
  6.  
  7. \begin{minipage}[c]{0.7\linewidth}
  8. \begin{enumerate}
  9. \item $45^{\circ}$
  10. \item $50^{\circ}$
  11. \item $55^{\circ}$\hfill {\small fig \thefig.}
  12. \end{enumerate}
  13. \end{minipage}\hfill
  14. \begin{minipage}[c]{0.3\linewidth}
  15. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all}
  16. \end{minipage}\vfill
  17.  
  18. \item Texto texto texto \vfill
  19.  
  20. \begin{minipage}[c]{0.65\linewidth}
  21. \begin{enumerate}
  22. \item $55^{\circ}$ \hfill {\small fig \thefig.}
  23. \item $110^{\circ}$
  24. \item $140^{\circ}$
  25. \end{enumerate}
  26. \end{minipage}\hfill\begin{minipage}[c]{0.35\linewidth}
  27. \includegraphics[scale=1,page=2,valign=c,right]{pr-fig-all}
  28. \end{minipage}\vfill
  29.  
  30. \item Texto texto texto \vfill
  31.  
  32. \begin{minipage}[c]{0.7\linewidth}
  33. \begin{enumerate}
  34. \item $100^{\circ}$\hfill {\small fig \thefig.}
  35. \item $110^{\circ}$
  36. \item $150^{\circ}$
  37. \end{enumerate}
  38. \end{minipage}\hfill
  39. \begin{minipage}[c]{0.3\linewidth}
  40. \includegraphics[scale=1,page=3,valign=c,right]{pr-fig-all}
  41. \end{minipage}\vfill
  42. ';
  43.  
  44. ## Modificamos el segundo minipage
  45. $ltxfile =~ s/(\\hfill)(?:\n)?(\\begin\{minipage\}\[c\])(\{.+?\\linewidth\})
  46.              /$1$2\{\\imagewidth\}/gmsx;
  47.  
  48. ## Modificamos el primer minipage
  49. $ltxfile =~ s/(?<!\\hfill)(\\begin\{minipage\}\[c\]\{.+?\\linewidth\})
  50.               /\\settowidth\{\\imagewidth\}\{\\includegraphics\[page=1\]\{pr-fig-all\}\}\n\\begin\{minipage\}\[c\]\{\\dimexpr\\linewidth-1\.2\\imagewidth\}/gmsx;
  51.  
  52. ## Ajustamos la numeración en \sbox
  53. my $n;
  54. $ltxfile =~ s/\\settowidth\{\\imagewidth\}\{\\includegraphics\[page=1\]\{pr-fig-all\}\}/'\settowidth{\imagewidth}{\includegraphics[page='.++$n.']{pr-fig-all}}'/gem;
  55.  
  56. say $ltxfile;
  57.  
  58. ## Escribimos
  59. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La salida obtenida es la esperada:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. \item Texto texto texto \vfill 
  2.  
  3. \settowidth{\imagewidth}{\includegraphics[page=1]{pr-fig-all}} 
  4. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth} 
  5. \begin{enumerate} 
  6. \item $45^{\circ}$ 
  7. \item $50^{\circ}$ 
  8. \item $55^{\circ}$\hfill {\small fig \thefig.} 
  9. \end{enumerate} 
  10. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth} 
  11. \includegraphics[scale=1,page=1,valign=c,right]{pr-fig-all} 
  12. \end{minipage}\vfill 
  13.  
  14. \item Texto texto texto \vfill 
  15.  
  16. \settowidth{\imagewidth}{\includegraphics[page=2]{pr-fig-all}} 
  17. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth} 
  18. \begin{enumerate} 
  19. \item $55^{\circ}$ \hfill {\small fig \thefig.} 
  20. \item $110^{\circ}$ 
  21. \item $140^{\circ}$ 
  22. \end{enumerate} 
  23. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth} 
  24. \includegraphics[scale=1,page=2,valign=c,right]{pr-fig-all} 
  25. \end{minipage}\vfill 
  26.  
  27. \item Texto texto texto \vfill 
  28.  
  29. \settowidth{\imagewidth}{\includegraphics[page=3]{pr-fig-all}} 
  30. \begin{minipage}[c]{\dimexpr\linewidth-1.2\imagewidth} 
  31. \begin{enumerate} 
  32. \item $100^{\circ}$\hfill {\small fig \thefig.} 
  33. \item $110^{\circ}$ 
  34. \item $150^{\circ}$ 
  35. \end{enumerate} 
  36. \end{minipage}\hfill\begin{minipage}[c]{\imagewidth} 
  37. \includegraphics[scale=1,page=3,valign=c,right]{pr-fig-all} 
  38. \end{minipage}\vfill 


Claro, me quedo con la duda de si fallará en algún caso y si puedo hacerle el quite al uso de /e. No es que no me guste, pero de seguro hay una mejor forma de hacerlo.

PD: Igual me pregunto el porqué no funcionó mi primer intento. He revisado y el uso de 'g' era correcto, pero mi expresión regular no está correcta :(
Última edición por pablgonz el 2021-07-30 10:30 @479, 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: Ajustar texto usando expresión regular y /e

Notapor explorer » 2021-07-29 19:24 @850

Pero es que el problema no se entiende...

Dices que hay que poner \settowidth delante de \begin{minipage}, pero resulta que eso no pasa en todos los casos, como cuando los \begin{minipage} siguen a \end{minipage}. Por eso te respondí con lo de la opción '/g'. Creí que te referías "sólo al primero del texto".

El uso de la opción '/e' es necesaria porque en la parte de sustitución estás usando código Perl (++$n).

Se podría sustituir con una interpolación entrecomillada doble de una referencia a un array anónimo. Algo así como "... @{[ ++$n ]} ...", pero el resultado es lo mismo: ejecución de ++$n.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ajustar texto usando expresión regular y /e

Notapor pablgonz » 2021-07-30 10:41 @487

explorer escribiste:Pero es que el problema no se entiende...

Dices que hay que poner \settowidth delante de \begin{minipage}, pero resulta que eso no pasa en todos los casos, como cuando los \begin{minipage} siguen a \end{minipage}. Por eso te respondí con lo de la opción '/g'. Creí que te referías "sólo al primero del texto".


Mil disculpas por esto, no debí haber colocado mi primer ejemplo (era lo que estaba haciendo en el terminal) y mi explicación no fue muy clara.

explorer escribiste:El uso de la opción '/e' es necesaria porque en la parte de sustitución estás usando código Perl (++$n).

Se podría sustituir con una interpolación entrecomillada doble de una referencia a un array anónimo. Algo así como "... @{[ ++$n ]} ...", pero el resultado es lo mismo: ejecución de ++$n.


¿Lees la mente?... A eso me refería :) en varias respuestas que me has dado en el pasado te las has arreglado para hacerle el quite a '/e' usando "... @{[ expp ]} ..." y pensé que eso era lo más correcto en este caso (la verdad uso muy poco o nada '/e', no estoy acostumbrado).

Igual me quedé con la duda por la expresión regular que puse en primera instancia, no debería modificar los dos minipage seguidos, es decir, debería capturar y modificar solo el primero, saltar el que está seguido y luego volver a modificar (eso era lo que esperaba que pasara).

Consulta aparte, creo que olvidé como colorear en el foro, no me funciona [syntax lang="TeX"] o [syntax lang="LaTeX"] y estoy casi seguro de que se colocaba eso en los ejemplos.

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


Volver a Básico

¿Quién está conectado?

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