検査後この問題受け入れられる答えではないのでテストしてみました。まず、次のコマンドを使用して推奨コマンドをテストしました。
fswatch -o report.tex | xargs -n1 -I{} pdflatex report.tex
これは無限のコンパイルループを引き起こしますが、これは少し非効率的であると考えられ、PDFにアクセスするのに十分な機会ウィンドウが生成されません。そこで、ファイルでTexMakerのコマンドを使用してfswatch
無限のコンパイルループが発生する理由をデバッグしようとしました。ctrl+s
report.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.tex
TexMakerで変更を保存するときに一度だけコンパイルするにはどうすればよいですか?
有効な回答につながる可能性がある下位質問が以下にリストされていると思いましたが、満足のいく回答が見つかりませんでした。
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
(およびオプション)を使用しようとしても区別するのに役立ちません。-x
PlatformSpecific
読むイベント、書くイベント、開いているイベントと閉鎖イベントだけでなく他の多くの可能なイベント(Linuxinotify2つのタイプの終了イベント(変更なしと変更後)を区別することもここでより役立ちます。これが複数のイベントが発生する理由でもあります。
ソースから読み込むと、何よりもコンパイルの試みが始まります。もう一度読んでくださいこのソース。ループが作成されました。
これがすべての問題の原因です。あなたはトリガーする必要があります書くイベントであり、ファイルの書き込みが停止した場合にのみ発生しますが、fswatch
これらのイベントはすべて考慮されます。プラットフォーム別。イベントを区別するためのツールが必要な場合や、定期的な世論調査を実行して日付や内容を比較することができます(最後の部分はOPリンクで許可されていると思います)。
OPのリンク許可の回答と組み合わされていないモードで使用できるため、fswatch
無期限に再実行されるのではなく、代わりに完了するのを待ちます。もちろん、これを行うときは、途中でイベントを見逃した場合に備えて競合状態を処理する必要があります。--one-event
xargs
fswatch
pdftex
結論は、すべてを調整しようとするのではなく、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/)。