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아니면 컴파일 타임에 감지된 세 가지 변경 사항을 변경 사항이 없는 상태로 줄이기 위해 보고서를 전달할 수 있습니까 report.tex?
  • report.tex저장할 때 변경 횟수를 2에서 1로 줄이는 옵션이 TexMaker에 있습니까 ctrl+s?

답변1

fswatch다양한 운영 체제에 따라 다양한 백엔드를 사용하세요. 전반적인 동작은 동일하다고 가정합니다.

내 Linux 시스템에서 주어진 이벤트 fswatch(및 옵션 )를 사용하려고 해도 구별하는 데 도움이 되지 않습니다.-xPlatformSpecific읽다이벤트, 에쓰다이벤트, 에열려 있는이벤트와폐쇄이벤트뿐만 아니라 다른 많은 가능한 이벤트(Linux'inotify두 가지 유형의 종료 이벤트(변경 없음 후와 변경 후)를 구별하는 것도 여기서 더 도움이 될 것입니다. 이것이 여러 이벤트가 발생하는 이유이기도 합니다.

소스에서 읽으면 무엇보다도 컴파일 시도가 시작됩니다.다시 읽어보세요이 소스. 루프가 생성되었습니다.

이것이 모든 문제의 원인입니다. 당신은 트리거해야쓰다이벤트이며 파일 쓰기가 중지된 경우에만 발생하지만 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/).

관련 정보