将 Latex [option] 包对格式化为 \usepackage[option]{package}

将 Latex [option] 包对格式化为 \usepackage[option]{package}

我目前有一组经常使用的默认 LaTeX 包,格式如下:

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

我希望能够将其转换为 \usepackage[options]{package} 或 \usepackage{package} 的标准 LaTeX 表示法,具体取决于包是否有其他选项。我已经成功创建了 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到行的开头。

相关内容