Форматировать пары пакетов Latex [option] в \usepackage[option]{package}

Форматировать пары пакетов Latex [option] в \usepackage[option]{package}

В настоящее время у меня есть набор пакетов LaTeX по умолчанию, которые я часто использую, отформатированный следующим образом:

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

Я хотел бы иметь возможность преобразовать это в стандартную нотацию LaTeX \usepackage[options]{package} или \usepackage{package} в зависимости от того, есть ли у пакета дополнительные опции. Я успешно создал команду sed/regex для преобразования строк с опциями, но она пропускает пакеты без опций.

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

Если запустить этот код на строке, содержащей только пакет, он даст сбой (как я и ожидал).

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

Является ли это проблемой регулярных выражений, и если да, то как мне к ней подойти?

решение1

Проверьте, подходит ли вам этот вариант:

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

Я заменил .*на , ^чтобы соответствовать началу строки, и добавил , \?чтобы сделать скобки необязательными.

решение2

Этот двухэтапный подход кажется более простым:

$ printf '%s\n' 'package1' '[options]package2' | sed -e 's/[^]]*$/{&}/' -e 's/^/\\usepackage/'
\usepackage{package1}
\usepackage[options]{package2}
  • Первый шаг, s/[^]]*$/{&}/, помещает имя проекта в фигурные скобки, сопоставляя максимально длинную строку символов, отличных от ], до конца строки.
  • Второй шаг, s/^/\\usepackage/просто добавляется \usepackageк началу строки.

Связанный контент