Formatee los pares de paquetes Latex [opción] en \usepackage[opción]{paquete}

Formatee los pares de paquetes Latex [opción] en \usepackage[opción]{paquete}

Actualmente tengo un conjunto de paquetes LaTeX predeterminados que uso con frecuencia formateados de la siguiente manera:

package1
[options]package2
[options]package3
package4
...

Me gustaría poder convertir esto a la notación LaTeX estándar de \usepackage[options]{package} o \usepackage{package} dependiendo de si el paquete tiene opciones adicionales. Creé con éxito un comando sed/regex para convertir las líneas con opciones, pero omite los paquetes sin opciones.

echo "[option]package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> \usepackage[option]{package}

Cuando esto se ejecuta en una línea con solo un paquete, falla (como era de esperar).

echo "package" | sed 's/.*\(\[[^]]*\]\)\(.*\)/\\usepackage\1{\2}/'
>> package

¿Es esto un problema de expresiones regulares y, de ser así, cómo debo abordarlo?

Respuesta1

Por favor verifique si esto funciona para usted:

$ echo -e "[options]package3\npackage4" | sed 's/^\(\[[^]]*\]\)\?\(.*\)/\\usepackage\1{\2}/'
\usepackage[options]{package3}
\usepackage{package4}

Reemplacé .*con ^para que coincidiera con el inicio de la línea y agregué \?para que los corchetes sean opcionales.

Respuesta2

Este enfoque de dos pasos parece ser más simple:

$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
  • El primer paso, s/[^]]*$/{&}/coloca el nombre del proyecto entre llaves haciendo coincidir la cadena de caracteres más larga posible distinta de ], hasta el final de la línea.
  • El segundo paso, s/^/\\usepackage/simplemente se antepone \usepackageal principio de la línea.

información relacionada