Me explico: Con el siguiente script:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- # acotar-expresion-regular-t8380-30.html
- # ajustar-nueva-regla-a-script-t8698.html
- use v5.22;
- use autodie; # muere si ocurre un error
- use File::Basename; # separa el archivo de entrada
- ### Argumentos ---------------------------------------------------------
- @ARGV == 1 or die "Uso: $0 <archivo TeX a procesar>\n";
- my $nombre_archivo = shift;
- -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
- ### Arreglo de la extensión --------------------------------------------
- my @SuffixList = ('.tex', '', '.ltx'); # posible extensión
- my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
- $ext = '.tex' if not $ext; # fijamos la extensión
- ### Directorio para las imágenes
- my $imageDir = "images";
- ### Abrimos el archivo de entrada a modificar --------------------------
- open my $ENTRADA, '<', $nombre_archivo;
- my $archivo;
- {
- local $/;
- $archivo = <$ENTRADA>;
- }
- close $ENTRADA;
- ## Cambios a realizar
- my %cambios = (
- '\pspicture' => '\TRICKS',
- '\endpspicture' => '\ENDTRICKS',
- '\begin{MYexample' => '\begin{MYEXAMPLE',
- '\end{MYexample' => '\end{MYEXAMPLE',
- '\begin{pspicture' => '\begin{TRICKS',
- '\end{pspicture' => '\end{TRICKS',
- '\begin{postscript}' => '\begin{POSTRICKS}',
- '\end{postscript}' => '\end{POSTRICKS}',
- );
- ## Variables y constantes
- my $no_del = "\0";
- my $del = $no_del;
- ## Reglas
- my $llaves = qr/\{ .+? \} /x;
- my $no_corchete = qr/(?:\[ .+? \])? /x;
- my $delimitador = qr/\{ (?<del>.+?) \} /x;
- my $verb = qr/verb [*]? /ix;
- my $lst = qr/lstinline (?!\*) $no_corchete /ix;
- my $mint = qr/mint (?!\*) $no_corchete $llaves /ix;
- my $marca = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1} /x;
- my $comentario = qr/^ \s* \%+ .+? $ /mx;
- my $definedel = qr/\\ (?: DefineShortVerb | lstMakeShortInline ) $no_corchete $delimitador /ix;
- my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves /ix;
- ## Cambiar
- while ($archivo =~
- / $marca
- | $comentario
- | $definedel
- | $indefinedel
- | $del .+? $del # delimitado
- /pgmx) {
- my($pos_inicial, $pos_final) = ($-[0], $+[0]); # posiciones
- my $encontrado = ${^MATCH}; # lo encontrado
- if ($encontrado =~ /$definedel/){ # definimos delimitador
- $del = $+{del};
- $del = "\Q$+{del}" if substr($del,0,1) ne '\\'; # es necesario "escapar" el delimitador
- }
- elsif($encontrado =~ /$indefinedel/) { # indefinimos delimitador
- $del = $no_del;
- }
- else { # aquí se hacen los cambios
- while (my($busco, $cambio) = each %cambios) {
- $encontrado =~ s/\Q$busco\E/$cambio/g; # es necesario escapar $busco
- }
- substr $archivo, $pos_inicial, $pos_final-$pos_inicial, $encontrado; # insertamos los nuevos cambios
- pos($archivo)= $pos_inicial + length $encontrado; # re posicionamos la siguiente búsqueda
- }
- }
- ### Divido el archivo por lineas
- my @lineas = split /\n/, $archivo;
- ### tcbverb mintinline
- my $tcbverb = qr/\\(?:tcboxverb|myverb|mint(?:inline)?)/ix;
- my $arg_brac = qr/(?:\[.+?\])?/;
- my $arg_curl = qr/\{(.+)\}/;
- ### Comentamos
- for (@lineas) {
- if (m/$tcbverb$arg_brac$arg_curl/) {
- while (my($busco, $cambio) = each %cambios) {
- s/\Q$busco\E/$cambio/g;
- }
- }
- } # close
- # \newtcblisting[opcional]{nombre}
- # \renewtcblisting[opcional]{nombre}
- # \DeclareTCBListing[opcional]{nombre}
- # \NewTCBListing[opcional]{nombre}
- # \RenewTCBListing[opcional]{nombre}
- # \ProvideTCBListing[opcional]{nombre}
- # \newtcbexternalizeenvironment{nombre}
- # \renewtcbexternalizeenvironment{nombre}
- # \newtcbexternalizetcolorbox{nombre}
- # \renewtcbexternalizetcolorbox{nombre}
- ### Unimos
- $archivo = join("\n", @lineas);
- ### Partición del documento
- my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+?) (\\begin\{document\} .+?)(\\end\{document\}.*)\z/msx;
- ### Escritura del resultado
- open my $SALIDA, '>', "$name-out$ext";
- print $SALIDA "$cabeza$cuerpo$final";
- close $SALIDA;
- __END__
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í:
Using latex Syntax Highlighting
- \documentclass{article}
- \usepackage{fancyvrb}
- \usepackage{listings}
- \usepackage{tcolorbox}
- \tcbuselibrary{many,xparse}
- \graphicspath{{./subdir1/}{subdir2/}{subdir3/}{subdirn/}}
- \begin{document}
- Usamos \verb|\begin{pspicture} o \begin{pspicture*}| o \verb*|\begin{pspicture} o \begin{pspicture*}| (cambia)
- \begin{pspicture} o \begin{pspicture*} % no tocar
- \tcboxverb{\begin{pspicture} o \begin{pspicture*}} no tocar lo siguiente \begin{pspicture} o \begin{pspicture*}
- % \tcboxverb{\begin{pspicture}}
- \tcboxverb[algo]{\begin{pspicture} o {algo} o \begin{pspicture*}}
- \mintinline{algo}{\begin{pspicture} }
- \mintinline[opcional]{algo}{\begin{pspicture} o \begin{pspicture*}}
- \mint{algo}{\begin{pspicture} }
- \mint[opcional]{algo}{\begin{pspicture} o \begin{pspicture*}}
- \end{document}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Deseo obtener un archivo de salida así:
Using latex Syntax Highlighting
- \documentclass{article}
- \usepackage{fancyvrb}
- \usepackage{listings}
- \usepackage{tcolorbox}
- \tcbuselibrary{many,xparse}
- \graphicspath{{./subdir1/}{subdir2/}{subdir3/}{subdirn/}{images/}}
- \begin{document}
- Usamos \verb|\begin{TRICKS} o \begin{TRICKS*}| o \verb*|\begin{TRICKS} o \begin{TRICKS*}| (cambia)
- \begin{pspicture} o \begin{pspicture*} % no tocar
- \tcboxverb{\begin{TRICKS} o \begin{TRICKS*}} no tocar lo siguiente \begin{pspicture} o \begin{pspicture*}
- % \tcboxverb{\begin{TRICKS}}
- \tcboxverb[algo]{\begin{TRICKS} o {algo} o \begin{TRICKS*}}
- \mintinline{algo}{\begin{TRICKS} }
- \mintinline[opcional]{algo}{\begin{TRICKS} o \begin{TRICKS*}}
- \mint{algo}{\begin{TRICKS} }
- \mint[opcional]{algo}{\begin{TRICKS} o \begin{TRICKS*}}
- \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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:
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
Agradecido de antemano,
Pablo