Formate pares de pacotes Latex [option] em \usepackage[option]{package}

Formate pares de pacotes Latex [option] em \usepackage[option]{package}

Atualmente tenho um conjunto de pacotes LaTeX padrão que uso frequentemente formatados da seguinte forma:

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

Eu gostaria de poder converter isso para a notação LaTeX padrão de \usepackage[options]{package} ou \usepackage{package} dependendo se o pacote possui opções adicionais. Criei com sucesso um comando sed/regex para converter as linhas com opções, mas faltam os pacotes sem opções.

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

Quando isso é executado em uma linha com apenas um pacote, ele falha (como seria de esperar).

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

Este é um problema de regex e, em caso afirmativo, como devo abordá-lo?

Responder1

Verifique se isso funciona para você:

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

Substituí .*por ^para corresponder ao início da linha e adicionei \?para tornar os colchetes opcionais.

Responder2

Esta abordagem em duas etapas parece ser mais simples:

$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
  • A primeira etapa s/[^]]*$/{&}/, coloca o nome do projeto entre chaves, combinando a sequência de caracteres mais longa possível ], exceto , até o final da linha.
  • A segunda etapa, s/^/\\usepackage/, simplesmente precede \usepackageo início da linha.

informação relacionada