• Publicidad

Buscar y agregar llaves { } dentro de llaves {}

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

Buscar y agregar llaves { } dentro de llaves {}

Notapor pablgonz » 2016-04-06 22:46 @990

Hola a todos, vuelvo al foro con un dilema que no he logrado resolver usando Google y algunos hilos del foro.

Me explico: Con el siguiente script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # acotar-expresion-regular-t8380-30.html
  3. # ajustar-nueva-regla-a-script-t8698.html
  4. use v5.22;
  5. use autodie;                                            # muere si ocurre un error
  6. use File::Basename;                                     # separa el archivo de entrada
  7.  
  8. ### Argumentos ---------------------------------------------------------
  9. @ARGV == 1  or die "Uso: $0 <archivo TeX a procesar>\n";
  10. my $nombre_archivo = shift;
  11. -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
  12.  
  13. ### Arreglo de la extensión --------------------------------------------
  14. my @SuffixList = ('.tex', '', '.ltx');                  # posible extensión
  15. my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
  16. $ext = '.tex' if not $ext;                              # fijamos la extensión
  17.  
  18. ### Directorio para las imágenes
  19. my $imageDir  = "images";      
  20.  
  21. ### Abrimos el archivo de entrada a modificar --------------------------
  22. open my $ENTRADA, '<', $nombre_archivo;
  23. my $archivo;
  24. {
  25.     local $/;
  26.     $archivo = <$ENTRADA>;
  27. }
  28. close   $ENTRADA;
  29.  
  30. ## Cambios a realizar
  31. my %cambios = (
  32.         '\pspicture'                => '\TRICKS',
  33.         '\endpspicture'             => '\ENDTRICKS',
  34.  
  35.         '\begin{MYexample'          => '\begin{MYEXAMPLE',
  36.         '\end{MYexample'            => '\end{MYEXAMPLE',
  37.        
  38.         '\begin{pspicture'          => '\begin{TRICKS',
  39.         '\end{pspicture'            => '\end{TRICKS',
  40.        
  41.         '\begin{postscript}'        => '\begin{POSTRICKS}',
  42.         '\end{postscript}'          => '\end{POSTRICKS}',
  43. );
  44.  
  45.  
  46. ## Variables y constantes
  47. my $no_del = "\0";
  48. my $del    = $no_del;
  49.  
  50. ## Reglas
  51. my $llaves      = qr/\{ .+? \}                                                                  /x;
  52. my $no_corchete = qr/(?:\[ .+? \])?                                                             /x;
  53. my $delimitador = qr/\{ (?<del>.+?) \}                                                          /x;
  54. my $verb        = qr/verb [*]?                                                                  /ix;
  55. my $lst         = qr/lstinline (?!\*) $no_corchete                                              /ix;
  56. my $mint        = qr/mint      (?!\*) $no_corchete $llaves                                      /ix;
  57. my $marca       = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1}                                /x;
  58. my $comentario  = qr/^ \s* \%+ .+? $                                                            /mx;
  59. my $definedel   = qr/\\ (?:   DefineShortVerb | lstMakeShortInline  ) $no_corchete $delimitador /ix;
  60. my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves                   /ix;
  61.  
  62. ## Cambiar
  63. while ($archivo =~
  64.         /   $marca
  65.         |   $comentario
  66.         |   $definedel
  67.         |   $indefinedel
  68.         |   $del .+? $del                                                       # delimitado
  69.         /pgmx) {
  70.  
  71.         my($pos_inicial, $pos_final) = ($-[0], $+[0]);                          # posiciones
  72.         my $encontrado = ${^MATCH};                                             # lo encontrado
  73.  
  74.     if ($encontrado =~ /$definedel/){                                           # definimos delimitador
  75.                         $del = $+{del};
  76.                         $del = "\Q$+{del}" if substr($del,0,1) ne '\\';         # es necesario "escapar" el delimitador
  77.                 }
  78.     elsif($encontrado =~ /$indefinedel/) {                                      # indefinimos delimitador
  79.                  $del = $no_del;                                       
  80.         }
  81.     else {                                                                      # aquí se hacen los cambios
  82.         while (my($busco, $cambio) = each %cambios) {
  83.                        $encontrado =~ s/\Q$busco\E/$cambio/g;                   # es necesario escapar $busco
  84.                         }
  85.         substr $archivo, $pos_inicial, $pos_final-$pos_inicial, $encontrado;    # insertamos los nuevos cambios
  86.  
  87.         pos($archivo)= $pos_inicial + length $encontrado;                       # re posicionamos la siguiente búsqueda
  88.         }
  89. }
  90.  
  91. ### Divido el archivo por lineas
  92. my @lineas = split /\n/, $archivo;
  93.  
  94. ### tcbverb mintinline
  95. my $tcbverb = qr/\\(?:tcboxverb|myverb|mint(?:inline)?)/ix;
  96. my $arg_brac = qr/(?:\[.+?\])?/;
  97. my $arg_curl = qr/\{(.+)\}/;      
  98.  
  99. ### Comentamos
  100. for (@lineas) {
  101.     if (m/$tcbverb$arg_brac$arg_curl/) {
  102.         while (my($busco, $cambio) = each %cambios) {
  103.             s/\Q$busco\E/$cambio/g;
  104.         }
  105.     }
  106. } # close
  107.  
  108. # \newtcblisting[opcional]{nombre}
  109. # \renewtcblisting[opcional]{nombre}
  110. # \DeclareTCBListing[opcional]{nombre}
  111. # \NewTCBListing[opcional]{nombre}
  112. # \RenewTCBListing[opcional]{nombre}
  113. # \ProvideTCBListing[opcional]{nombre}
  114. # \newtcbexternalizeenvironment{nombre}
  115. # \renewtcbexternalizeenvironment{nombre}
  116. # \newtcbexternalizetcolorbox{nombre}
  117. # \renewtcbexternalizetcolorbox{nombre}
  118.  
  119.  
  120. ### Unimos
  121. $archivo = join("\n", @lineas);
  122.  
  123. ### Partición del documento
  124. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+?) (\\begin\{document\} .+?)(\\end\{document\}.*)\z/msx;
  125.  
  126. ### Escritura del resultado
  127. open my $SALIDA, '>', "$name-out$ext";
  128. print   $SALIDA "$cabeza$cuerpo$final";
  129. close   $SALIDA;
  130.  
  131. __END__
  132.  
Coloreado en 0.011 segundos, usando GeSHi 1.0.8.4

Logro dividir y modificar distintas palabras bajo ciertas reglas dentro del archivo de entrada, pero, ahora, se me ha presentado la siguiente problemática: Si el archivo de entrada es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{fancyvrb}
  3. \usepackage{listings}
  4. \usepackage{tcolorbox}
  5. \tcbuselibrary{many,xparse}
  6. \graphicspath{{./subdir1/}{subdir2/}{subdir3/}{subdirn/}}
  7. \begin{document}
  8. Usamos \verb|\begin{pspicture} o \begin{pspicture*}| o \verb*|\begin{pspicture} o \begin{pspicture*}| (cambia)
  9.  
  10. \begin{pspicture} o \begin{pspicture*} % no tocar
  11.  
  12. \tcboxverb{\begin{pspicture} o \begin{pspicture*}} no tocar lo siguiente \begin{pspicture} o \begin{pspicture*}
  13.  
  14. % \tcboxverb{\begin{pspicture}}  
  15. \tcboxverb[algo]{\begin{pspicture} o {algo} o \begin{pspicture*}}
  16.  
  17. \mintinline{algo}{\begin{pspicture}  }
  18.  
  19. \mintinline[opcional]{algo}{\begin{pspicture} o \begin{pspicture*}}
  20.  
  21. \mint{algo}{\begin{pspicture}  }
  22.  
  23. \mint[opcional]{algo}{\begin{pspicture} o \begin{pspicture*}}
  24.  
  25. \end{document}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Deseo obtener un archivo de salida así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{fancyvrb}
  3. \usepackage{listings}
  4. \usepackage{tcolorbox}
  5. \tcbuselibrary{many,xparse}
  6. \graphicspath{{./subdir1/}{subdir2/}{subdir3/}{subdirn/}{images/}}
  7. \begin{document}
  8. Usamos \verb|\begin{TRICKS} o \begin{TRICKS*}| o \verb*|\begin{TRICKS} o \begin{TRICKS*}| (cambia)
  9.  
  10. \begin{pspicture} o \begin{pspicture*} % no tocar
  11.  
  12. \tcboxverb{\begin{TRICKS} o \begin{TRICKS*}} no tocar lo siguiente \begin{pspicture} o \begin{pspicture*}
  13.  
  14. % \tcboxverb{\begin{TRICKS}}  
  15. \tcboxverb[algo]{\begin{TRICKS} o {algo} o \begin{TRICKS*}}
  16.  
  17. \mintinline{algo}{\begin{TRICKS}  }
  18.  
  19. \mintinline[opcional]{algo}{\begin{TRICKS} o \begin{TRICKS*}}
  20.  
  21. \mint{algo}{\begin{TRICKS}  }
  22.  
  23. \mint[opcional]{algo}{\begin{TRICKS} o \begin{TRICKS*}}
  24.  
  25. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Es decir, buscar en $cabeza si está la línea \graphicspath; si no está agregamos \graphicspath{{images/}} (con eso no tengo problema), y si está, agregamos {$imageDir/} al final.

En este último punto es donde tengo el problema: No he podido dar con la expresión regular adecuada para cazar \graphicspath{{a}{b}{c}} y agregar la linea que deseo al final.

Revisé en la red algo sobre expresiones recursivas e hice un par de intentos con algunas tomadas de problemas parecidos al mio en stackoverflow, pero no he logrado nada concreto, es más, me percaté de que el script falla en la línea 11 de mi archivo de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
\tcboxverb{\begin{pspicture} o \begin{pspicture*}} no tocar lo siguiente \begin{pspicture} o \begin{pspicture*}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y recordé que hace algún tiempo hice el intento usando expresiones regulares y fallé por el mismo motivo, las llaves estilo {{}{}{}}.

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

Publicidad

Re: Buscar y agregar llaves { } dentro de llaves {}

Notapor explorer » 2016-04-07 09:19 @430

En la siguiente versión verás que se puede hacer una exp. reg. que detecte esos casos de llaves incluidas unas dentro de otras, pero... para el caso de tcboxverb, es más complicado, ya que el contenido que puede ir entre llaves tiene un formato mucho más complicado que un simple conjunto de elementos embutidos entre llaves. Puede parecer lo mismo, pero no lo es.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # acotar-expresion-regular-t8380-30.html
  3. # ajustar-nueva-regla-a-script-t8698.html
  4. use v5.18.2;
  5. use autodie;                                            # muere si ocurre un error
  6. use File::Basename;                                     # separa el archivo de entrada
  7.  
  8. ### Argumentos ---------------------------------------------------------
  9. @ARGV == 1  or die "Uso: $0 <archivo TeX a procesar>\n";
  10. my $nombre_archivo = shift;
  11. -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
  12.  
  13. ### Arreglo de la extensión --------------------------------------------
  14. my @SuffixList = ('.tex', '', '.ltx');                  # posible extensión
  15. my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
  16. $ext = '.tex' if not $ext;                              # fijamos la extensión
  17.  
  18. ### Directorio para las imágenes
  19. my $imageDir  = "images";      
  20.  
  21. ### Abrimos el archivo de entrada a modificar --------------------------
  22. open my $ENTRADA, '<', $nombre_archivo;
  23. my $archivo;
  24. {
  25.     local $/;
  26.     $archivo = <$ENTRADA>;
  27. }
  28. close   $ENTRADA;
  29.  
  30. ## Cambios a realizar
  31. my %cambios = (
  32.         '\pspicture'                => '\TRICKS',
  33.         '\endpspicture'             => '\ENDTRICKS',
  34.  
  35.         '\begin{MYexample'          => '\begin{MYEXAMPLE',
  36.         '\end{MYexample'            => '\end{MYEXAMPLE',
  37.        
  38.         '\begin{pspicture'          => '\begin{TRICKS',
  39.         '\end{pspicture'            => '\end{TRICKS',
  40.        
  41.         '\begin{postscript}'        => '\begin{POSTRICKS}',
  42.         '\end{postscript}'          => '\end{POSTRICKS}',
  43. );
  44.  
  45.  
  46. ## Variables y constantes
  47. my $no_del = "\0";
  48. my $del    = $no_del;
  49.  
  50. ## Reglas
  51. my $llaves      = qr/\{ .+? \}                                                                  /x;
  52. my $corchetes   = qr/\[ .+? \]                                                                  /x;
  53. my $no_corchete = qr/(?: $corchetes )?                                                          /x;
  54. my $delimitador = qr/\{ (?<del>.+?) \}                                                          /x;
  55. my $verb        = qr/verb [*]?                                                                  /ix;
  56. my $graphicspath= qr/\\ graphicspath \{ ((?: $llaves )+) \}                                     /ix;
  57. my $lst         = qr/lstinline (?!\*) $no_corchete                                              /ix;
  58. my $mint        = qr/mint (?!\*) $no_corchete $llaves                                           /ix;
  59. my $marca       = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1}                                /x;
  60. my $comentario  = qr/^ \s* \%+ .+? $                                                            /mx;
  61. my $definedel   = qr/\\ (?:   DefineShortVerb | lstMakeShortInline  ) $no_corchete $delimitador /ix;
  62. my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves                   /ix;
  63.  
  64. ## Cambiar
  65. while ($archivo =~
  66.         /   $marca
  67.         |   $comentario
  68.         |   $graphicspath
  69.         |   $definedel
  70.         |   $indefinedel
  71.         |   $del .+? $del                                                       # delimitado
  72.         /pgmx) {
  73.  
  74.     my($pos_inicial, $pos_final) = ($-[0], $+[0]);                              # posiciones
  75.     my $encontrado = ${^MATCH};                                                 # lo encontrado
  76.  
  77.     if ($encontrado =~ /$definedel/) {                                          # definimos delimitador
  78.         $del = $+{del};
  79.         $del = "\Q$+{del}" if substr($del,0,1) ne '\\';                         # es necesario "escapar" el delimitador
  80.     }
  81.     elsif ($encontrado =~ /$indefinedel/) {                                     # indefinimos delimitador
  82.         $del = $no_del;                                
  83.     }
  84.     elsif ($encontrado =~ /$graphicspath/) {
  85.         my $argumento = $1;
  86.         if ($argumento !~ /\{images\\\}/) {
  87.             $argumento .= '{images/}';
  88.  
  89.             my $cambio = "\\graphicspath{$argumento}";
  90.  
  91.             substr $archivo, $pos_inicial, $pos_final-$pos_inicial, $cambio;
  92.            
  93.             pos($archivo) = $pos_inicial + length $cambio;
  94.         }
  95.     }
  96.     else {                                                                      # aquí se hacen los cambios
  97.         while (my($busco, $cambio) = each %cambios) {
  98.             $encontrado =~ s/\Q$busco\E/$cambio/g;                              # es necesario escapar $busco
  99.         }
  100.  
  101.         substr $archivo, $pos_inicial, $pos_final-$pos_inicial, $encontrado;    # insertamos los nuevos cambios
  102.  
  103.         pos($archivo) = $pos_inicial + length $encontrado;                      # re posicionamos la siguiente búsqueda
  104.     }
  105. }
  106.  
  107. ### Divido el archivo por líneas
  108. my @lineas = split /\n/, $archivo;
  109.  
  110. ### tcbverb mintinline
  111. my $tcbverb  = qr/\\(?:tcboxverb|myverb|mint(?:inline)?)/ix;
  112. my $arg_brac = qr/(?:\[.+?\])?/;
  113. my $arg_curl = qr/\{(.+?)\}/;      
  114.  
  115. ### Comentamos
  116. for (@lineas) {
  117.     if (m/$tcbverb$arg_brac$arg_curl/) {
  118.             while (my($busco, $cambio) = each %cambios) {
  119.                 s/\Q$busco\E/$cambio/g;
  120.             }
  121.     }
  122. }
  123.  
  124. # \newtcblisting[opcional]{nombre}
  125. # \renewtcblisting[opcional]{nombre}
  126. # \DeclareTCBListing[opcional]{nombre}
  127. # \NewTCBListing[opcional]{nombre}
  128. # \RenewTCBListing[opcional]{nombre}
  129. # \ProvideTCBListing[opcional]{nombre}
  130. # \newtcbexternalizeenvironment{nombre}
  131. # \renewtcbexternalizeenvironment{nombre}
  132. # \newtcbexternalizetcolorbox{nombre}
  133. # \renewtcbexternalizetcolorbox{nombre}
  134.  
  135.  
  136. ### Escritura del resultado
  137. open my $SALIDA, '>', "$name-out$ext";
  138. print   $SALIDA join("\n", @lineas);
  139. close   $SALIDA;
  140.  
  141. __END__
  142.  
Coloreado en 0.004 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: Buscar y agregar llaves { } dentro de llaves {}

Notapor pablgonz » 2016-04-07 15:55 @705

Muchas gracias, explorer.
explorer escribiste:... para el caso de tcboxverb, es más complicado, ya que el contenido que puede ir entre llaves tiene un formato mucho más complicado que un simple conjunto de elementos embutidos entre llaves. Puede parecer lo mismo, pero no lo es.

Tienes razón, en un principio pensé que no era tan complicado si uno conocía las reglas de cómo se comportaría la cadena que deseaba buscar, en mi caso una llave de apertura siempre va emparejada con una llave de cierre así: {{}{}{}} o {{{}}} o así {{{}{}}{}}.

Hice intentos con varias expresiones que tomé de la red, como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. \\tcboxverb(?:\[.+?\])?(\{(?>[^\{\}]+|(?1))*\})
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y claro, no funcionaban. El tema de los "paréntesis balanceados" es algo mucho más complicado de lo que parece. ¿Se necesitará un nuevo script para llevar a cabo la tarea? o (teóricamente hablando) ¿se puede agregar el código dentro de este mismo script?

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

Re: Buscar y agregar llaves { } dentro de llaves {}

Notapor explorer » 2016-04-07 16:06 @712

En perlre o perlretut, no lo recuerdo bien, se comenta el caso de buscar expresiones con paréntesis embutidos, y se construye para el caso una exp. reg. recursiva, no muy diferente de la que has puesto, que no resulta muy complicada de entender.

Quizás, lo más importante que hay que saber, es qué puede haber dentro de las llaves de \tcboxverb{...}, y eso definirá qué es lo que hay que hacer o cómo tiene que ser la exp. reg.

Otras cosas también pueden ayudar, como por ejemplo saber si la línea donde está esto es única (solo existe la entrada \tcboxverb en una línea, y solo hay eso en una línea. Si se da este caso, encontrar la última llave es algo trivial :)
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: Buscar y agregar llaves { } dentro de llaves {}

Notapor pablgonz » 2016-04-08 15:24 @683

Leí la documentación en http://search.cpan.org/dist/POD2-ES/lib ... extendidos y busque por la red información del tema... y sí es complicado... Intenté con los ejemplos descritos y solo obtuve Infinite recursion in regex at.

Ahora estoy sumamente interesado en conocer la expresión regular exacta para estos casos y conozco como opera tcboxverb. Lo describo:
  • La palabra siempre inicia con \, le sigue un [...] opcional y luego una llave de apertura { y una de cierre } como mínimo.
  • Aparece siempre en una línea y dentro de ésta puede aparecer más de una vez, pero nunca tantas como 10, por ejemplo.
  • Los caracteres incluidos dentro de {...} pueden ser cualquiera incluido {...} siempre y cuando estén emparejadas las llaves de apertura con las de cierre, {{}{}{}} o {{{}}{}} como caso extremo.

Lo que deseo es capturar las llave de apertura obligatoria { y la de cierre } obligatoria y buscar en todo ese bloque para hacer los cambios, no deseo extraer lo que está en cada {} dentro de los obligatorios.

Creo que esta expresión regular está muy por encima de mis conocimientos (momentáneamente) pero, la dificultad de ella la hace 100% interesante.

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

Re: Buscar y agregar llaves { } dentro de llaves {}

Notapor pablgonz » 2016-04-09 17:47 @783

explorer escribiste:En perlre o perlretut, no lo recuerdo bien, se comenta el caso de buscar expresiones con paréntesis embutidos, y se construye para el caso una exp. reg. recursiva, no muy diferente de la que has puesto, que no resulta muy complicada de entender.

A mi se me hizo más complicada de lo que parecía :( En fin, encontré la solución. Al menos en los casos que he probado funciona correctamente
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #### tcbverb,minted,mintline
  2. my $tcbxverb    = qr/\\ (?: tcboxverb | myverb ) $no_corchete                                   /ix;
  3. my $mintverb    = qr/\\ (?:mint(?:inline)?) $no_corchete $llaves                                /ix;
  4. my $anidado     = qr/(\{(?:[^\{\}]++|(?1))*\})                                                  /x;
  5. my $tcbxline    = qr/$tcbxverb $anidado                                                         /x;
  6. my $mintline    = qr/$mintverb $anidado                                                         /x;
  7. ### Cambiar
  8. while ($archivo =~ /$tcbxline|$mintline/pgmx) {
  9.  
  10.         my($pos_inicial, $pos_final) = ($-[0], $+[0]);                          # posiciones
  11.         my $encontrado = ${^MATCH};                                             # lo encontrado
  12.  
  13.         while (my($busco, $cambio) = each %cambios) {
  14.                        $encontrado =~ s/\Q$busco\E/$cambio/g;                   # es necesario escapar $busco
  15.                         }
  16.         substr $archivo, $pos_inicial, $pos_final-$pos_inicial, $encontrado;    # insertamos los nuevos cambios
  17.  
  18.         pos($archivo)= $pos_inicial + length $encontrado;                       # re posicionamos la siguiente búsqueda
  19. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
No logré hacerla funcionar dentro del primer while del script y es casi seguro que se puede optimizar y reducir un poco el código, pero, estoy conforme :D

Y como es habitual en mi persona, un par de consultas para cerrar el tema:
1. En una parte más adelante del script necesitaré la línea de \graphicspath{....}, ¿cómo la guardo para usarla más adelante?
2. Esta es más complicada: sé que puedo dividir el archivo usando
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+?) (\\begin\{document\} .+?)(\\end\{document\}.*)\z/msx;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
en $cabeza deseo buscar la línea \usepackage{minted} o la línea \usepackage[...]{minted} y hacer dos cosas:
a) Si no están presentes [...] agregar [outdir=images/] y dejar la línea \usepackage[outdir=images/]{minted}, esta parte la puedo hacer con una expresión regular.
b) Si están presentes [...] buscar si está presente outdir=... si no está agregarlo al final (con la solución de más arriba creo que puedo hacerlo) y si está presente cambiar outdir=... a outdir=images, aquí es donde empieza mi dilema, la línea de entrada puede ser:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. \usepackage[outdir=dir]{minted} 
  2. \usepackage[algo,outdir=dir,algo]{minted} 
  3. \usepackage[algo,outdir=dir]{minted} 
  4. \usepackage[algo, 
  5.       ,outdir=dir 
  6.       ,algo]{minted} 
donde dir es una ruta absoluta o relativa a un directorio y al igual que con \graphicspath{....} deseo guardar la original para su posterior uso.

Agradecido,
Pablo.
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 0 invitados