Texmakerで変更が発生したときにfswatchを使用して自動コンパイルループを防ぐ方法は?

Texmakerで変更が発生したときにfswatchを使用して自動コンパイルループを防ぐ方法は?

検査後この問題受け入れられる答えではないのでテストしてみました。まず、次のコマンドを使用して推奨コマンドをテストしました。

fswatch -o report.tex | xargs -n1 -I{} pdflatex report.tex

これは無限のコンパイルループを引き起こしますが、これは少し非効率的であると考えられ、PDFにアクセスするのに十分な機会ウィンドウが生成されません。そこで、ファイルでTexMakerのコマンドを使用してfswatch無限のコンパイルループが発生する理由をデバッグしようとしました。ctrl+sreport.tex

fswatch -o report.tex | xargs -n1 -I{} echo "hello world"
hello world
hello world

そこで、私はトリガーctrl+s/保存が両方のreport.tex検出された変更をトリガーしたことを観察しましたfswatch。また、f6コマンドとコマンドについてTexMakerでテストしたところ、両方の試みで3つの変更が検出されたことがpdflatex report.texわかりました。fswatch

fswatch -o report.tex | xargs -n1 -I{} echo "hello world"
hello world
hello world
hello world

後者は無限のコンパイルループを引き起こすのに十分なようです。だから尋ねたいです。report.texTexMakerで変更を保存するときに一度だけコンパイルするにはどうすればよいですか?

有効な回答につながる可能性がある下位質問が以下にリストされていると思いましたが、満足のいく回答が見つかりませんでした。

  • n-milisecondsたとえば、fswatchには次の変更または次の変更を無視するパラメータがありますかn-changes?私の考えでは、この3.2.3 Numeric Event Flags部分fswatch 文書イベントフラグのみが許可されているようですn-th。ただし、コンパイルを抑制するために、これらのパラメータ渡しはまだ正常に実装されていません。
  • pdflatexまたは、コンパイル時に検出された3つの変更を変更なしで減らすためにレポートを渡すことはできますかreport.tex
  • report.tex保存時に変更数を2から1に減らすオプションはTexMakerにありますかctrl+s

答え1

fswatchさまざまなオペレーティングシステムに応じてさまざまなバックエンドを使用してください。全体的な動作は同じであると仮定します。

私のLinuxシステムで与えられたイベントfswatch(およびオプション)を使用しようとしても区別するのに役立ちません。-xPlatformSpecific読むイベント、書くイベント、開いているイベントと閉鎖イベントだけでなく他の多くの可能なイベント(Linuxinotify2つのタイプの終了イベント(変更なしと変更後)を区別することもここでより役立ちます。これが複数のイベントが発生する理由でもあります。

ソースから読み込むと、何よりもコンパイルの試みが始まります。もう一度読んでくださいこのソース。ループが作成されました。

これがすべての問題の原因です。あなたはトリガーする必要があります書くイベントであり、ファイルの書き込みが停止した場合にのみ発生しますが、fswatchこれらのイベントはすべて考慮されます。プラットフォーム別。イベントを区別するためのツールが必要な場合や、定期的な世論調査を実行して日付や内容を比較することができます(最後の部分はOPリンクで許可されていると思います)。

OPのリンク許可の回答と組み合わされていないモードで使用できるため、fswatch無期限に再実行されるのではなく、代わりに完了するのを待ちます。もちろん、これを行うときは、途中でイベントを見逃した場合に備えて競合状態を処理する必要があります。--one-eventxargsfswatchpdftex

結論は、すべてを調整しようとするのではなく、fswatch変更fswatchに適したツールを使用することです。


Linuxの回避策の例(これはOSごとに異なり、OPはこの例を使用するOSを指定していないため)。

inotifywait書き込みと実際に書き込みの終わりのみを監視する正しいオプションがあります(したがって、MODIFYイベントではなくCLOSE_WRITEイベントのみ)。実際にファイルを移動、削除、および置き換えるときに確認して適応する必要がある他のものがあるかもしれませんが、すべての詳細を把握するわけではありません。だから:

inotifywait -m -e CLOSE_WRITE report.tex | xargs -n1 -I{} pdflatex report.tex

良いスタートになります。

イベントループを提供するには:

inotifywait -m -r -e CLOSE_WRITE somedir | while read -r dir events filename; do
    if [ "$filename" != "${filename%.tex}" ]; then
        pdflatex "$dir/$filename"
    fi
done

良いスタートになるかもしれません。とは別に…

残念ながら、スペースや特殊文字を含むファイル名から始めると、いくつかの注意があります。これをさらに解決できます。たとえば、出力では--format許可されているようですが\0(十分ではないと思います--csv)、シェルではこれを行うことはできません。読むリングの形。すぐにビシェルツールを使用する必要があります。inotify施設はありますが、そうではありませんinotify待つコマンドがより適切になります(例:https://pypi.org/project/inotify/)。

関連情報