1

組版する直前にLaTeXドキュメントでいくつかの正規表現置換を行うPythonスクリプトを作成しようとしていますが、置換を有効にするのに問題があるようです。私のスクリプトは次のとおりです。

# -*- 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

おそらく2つの問題があります。まず、の後にreadストリームが終了位置に設定されるため、tex_file.seek(0)を呼び出す前に、ストリームを開始位置にリセットする必要がありますwrite。次に、ファイルを閉じることはなく、書き込みはおそらくバッファリングされるため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)
于 2013-01-04T07:37:25.753 に答える