1

我正在尝试创建一个 python 脚本,以便在排版之前立即对 LaTeX 文档进行一些正则表达式替换,但我似乎在使替换生效时遇到了一些问题。我的脚本如下:

# -*- coding: utf-8 -*-
import os, re, sys
tex = sys.argv[-1]
tex_file = open(tex, "r+")
tex_file_data = tex_file.read()

# DO SOME REGEXES
tex_file_data = re.sub(r"\b_(.*?)_\b", r"\emph{\1}", tex_file_data)
tex_file.write(tex_file_data)

# PROCESS THE DOCUMENT
os.system("xelatex --shell-escape " + tex_file.name)

但是,每次我尝试使用此脚本处理文档时,都会遇到常见! Missing $ inserted.错误。根据正则表达式,这些下划线应该被替换为合适的语法。但是,如果我将最后一行替换为print(tex_file_data),控制台将显示更改已生效的文档。据我所知,问题似乎是编辑后的文档没有正确保存,但我不确定我做错了什么。

我该如何解决这个问题,以便脚本可以用于处理文档?

编辑:在@Yuushi 的建议下,我将脚本编辑如下:

# -*- coding: utf-8 -*-
import os, re, sys
with open(sys.argv[-1], "r+") as tex_file:
  tex_file_data = tex_file.read()
  tex_file_data = re.sub(r"\_(.*)\_", r"\\emph{\1}", tex_file_data)
  tex_file.write(tex_file_data)
os.system("xelatex --shell-escape " + tex_file.name)

但是,我仍然收到! Missing $ inserted.错误消息,这表明原始文档仍在发送到 LaTeX 编译器,而不是正则表达式。

4

1 回答 1

1

你可能有两个问题。首先,在 a 之后read,流被设置为结束位置,因此您需要tex_file.seek(0)在调用之前将其重置为 a 的开头write。其次,您永远不会关闭文件,并且写入可能会被缓冲,因此tex_file.close()最后需要 a 。更好的是使用以下with语句:

with open(sys.argv[-1], 'r+') as tex_file:
    tex_file_data - tex_file.read()
    tex_file_data = re.sub(r"\_(.*)\_", r"\\emph{\1}", tex_file_data)
    tex_file.seek(0)
    tex_file.write(tex_file_data)

os.system("xelatex --shell-escape " + tex_file.name)
于 2013-01-04T07:37:25.753 回答