1

変更のたびにラテックス ドキュメントを自動的にコンパイルする使い捨てスクリプトを作成しようとしています。

関連するコード:

class LatexCompiler(FileSystemEventHandler):
    def on_modified(self, event):
        if isinstance(event, watchdog.events.FileModifiedEvent):
            print event
            os.system("pdflatex Thesis.tex")

if __name__ == "__main__":
    path = sys.argv[1] if len(sys.argv) > 1 else '.'

    os.chdir("/path/to/my/tex/file")
    observer = Observer()
    observer.schedule(LatexCompiler(), path, recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

os.system(...) 行を追加するとすぐに、 on_modified() メソッドがトリガー後に永遠にループし始めます。on_modified() が 1 回だけ呼び出されるようにするために、os.system() の呼び出しを省略しました。イベントを説明する 1 行だけが表示されます。

それで、何がうまくいかないのですか?

4

1 に答える 1

2

イベント ハンドラーは、監視対象のディレクトリ内既存のファイルが変更さon_modified()れるたびに呼び出されます。

私は推測していますが、pdflatex中間ファイルを作成してから変更する可能性があります。または、出力 pdf ファイルが以前の実行から存在し、その後 によって変更されている可能性がありますpdflatex。いずれにせよon_modified()、これによりハンドラーがトリガーされ、ハンドラーが再度実行pdflatexされ (ファイルを変更)、別の呼び出しがトリガーされてon_modified().... のアイデアが得られます。

特定のファイル セット、入力 tex ファイルを監視し、pdflatexそれらのファイルの 1 つが変更された場合にのみトリガーすることができます。クリーンアップする必要のある詳細がいくつかありますが、以下でアイデアが得られるはずです。

import os, time, sys
import watchdog.events
from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer


class LatexCompiler(FileSystemEventHandler):
    def __init__(self, files, *args, **kwargs):
        super(LatexCompiler, self).__init__(*args, **kwargs)
        self._files = files
        print "LatexCompiler(): monitoring files %r" % self._files

    def on_modified(self, event):
        if (isinstance(event, watchdog.events.FileModifiedEvent) and
                event.src_path in self._files):
            print event
            os.system("pdflatex %s" % event.src_path)

if __name__ == "__main__":
    path = sys.argv[1] if len(sys.argv) > 1 else '.'

    observer = Observer()
    files = [os.path.join(path, f) for f in ['Thesis.tex', 'Resume.tex']]
    observer.schedule(LatexCompiler(files), path, recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()
于 2014-07-29T13:15:15.020 に答える