Я пытаюсь создать скрипт 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.
! Missing $ inserted.
ошибка. Согласно регулярному выражению, эти подчеркивания должны были быть заменены подходящим синтаксисом. Однако, если я подстановлю окончательную строку для print(tex_file_data)
, консоль отобразит документ с вступлением в силу изменений. Насколько я могу судить, проблема заключается в том, что отредактированный документ не сохраняется правильно, но я не уверен, что я делаю неправильно.
Как я могу исправить эту проблему, чтобы скрипт мог использоваться для обработки документов?
EDIT: В предложении @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.
! Missing $ inserted.
ошибка, которая предполагает, что исходный документ все еще отправляется в компилятор LaTeX, а не в регулярное выражение.
У вас, вероятно, есть две проблемы. Во-первых, после read
поток устанавливается в конечную позицию, поэтому перед вызовом write
вам нужно сбросить его до начала с tex_file.seek(0)
. Во-вторых, вы никогда не закрываете файл, и записи, вероятно, буферизованы, поэтому вам нужно tex_file.close()
в конце. Еще лучше было бы использовать оператор 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)
seek
. Я отредактировал свой ответ с полным примером.