Latex 소스를 생성/변경할 때 자동으로 컴파일

Latex 소스를 생성/변경할 때 자동으로 컴파일

다음 스크립트는 구현하기 쉬운가요? 내 LaTeX 문서는 /home/jaakko/Documents/LaTeX 및 해당 하위 디렉터리에 있습니다. 나는 이 디렉토리와 하위 디렉토리에 있는 .tex 문서를 모니터링하는 스크립트를 갖고 싶습니다. 일부 tex 파일이 변경되면 스크립트는 가능한 한 빨리 해당 파일(pdflatex file.tex)을 컴파일하려고 시도합니다. Bash에서 이 작업을 어떻게 수행할 수 있나요?

답변1

다음 방법으로도 가능합니다FSWATCH:

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

답변2

먼저, IDE의 일반적인 작업을 수행해야 합니다. Texmaker, Latexila 또는 다른 IDE인지 여부에 관계없이 IDE를 사용하면 LaTeX 코드를 매우 빠르게 재컴파일할 수 있으며 일부 IDE에서는 지정된 간격으로 자동 재컴파일을 허용할 수도 있습니다.

이제 많은 IDE가 다음을 사용합니다.inotify(이것은 C API입니다)파일 변경을 감지합니다. 하지만 시스템 구성에 따라 시계 수가 inotify제한되어 있고... 해당 작업을 수행하기 위해 실제 bash 스크립트를 작성하는 데 도전했습니다.

어쨌든 findMD5 해시를 사용하는 작은 아이디어는 다음과 같습니다.

  • 나는 find모든 .tex파일을 찾는 데 사용합니다.
  • update_file각 파일에 대해 지난번 이후 파일이 변경되었는지 확인하고 pdflatex필요한 경우 호출하는 함수( )를 호출합니다 .
  • 변경을 통해 파일 변경을 감지합니다 md5sum. 각 파일은 MD5 해시(에서 획득 md5sum file)와 연결될 수 있습니다. 파일 내용이 변경되면 해시 값도 변경됩니다. 따라서 MD5 해시의 변경 사항을 모니터링하여 파일의 변경 사항을 모니터링할 수 있습니다.

기본적으로 저는 md5.sum파일을 사용하여 TeX 파일과 관련된 모든 MD5 해시를 저장합니다. 파일이 수정되면 해당 해시 값이 변경되어 더 이상 MD5 파일의 해시 값과 동일하지 않습니다. 이런 일이 발생하면 스크립트는 pdflatex새 MD5 해시 값을 호출하고 업데이트합니다.

여기에 코드가 있습니다. 주석에 몇 가지 정보를 추가했습니다. 자유롭게 조정하고 처음에 설정한 변수를 변경하세요. 하지만,언제나절대 경로를 사용하십시오.

#!/bin/bash

# 
# Defining a few variables...
#
LATEXCMD="/usr/bin/pdflatex"
LATEXDOC_DIR="/home/jaakko/Documents/LaTeX"
MD5SUMS_FILE="$LATEXDOC_DIR/md5.sum"

#
# This function checks whether a file needs to be updated,
# and calls LATEXCMD if necessary. It is called for each
# .tex file in LATEXDOC_DIR (see below the function).
#
update_file()
{
    [[ $# -ne 1 ]] && return;
    [[ ! -r "$1" ]] && return;

    # Old MD5 hash is in $MD5SUMS_FILE, let's get it.
    OLD_MD5=$(grep "$file" "$MD5SUMS_FILE" | awk '{print $1}')

    # New MD5 hash is obtained through md5sum.
    NEW_MD5=$(md5sum "$file" | awk '{print $1}')

    # If the two MD5 hashes are different, then the files changed.
    if [ "$OLD_MD5" != "$NEW_MD5" ]; then
        echo "$LATEXCMD" -output-directory $(dirname "$file") "$file"

        # Calling the compiler.
        "$LATEXCMD" -output-directory $(dirname "$file") "$file" > /dev/null
        LTX=$?

        # There was no "old MD5", the file is new. Add its hash to $MD5SUMS_FILE.
        if [ -z "$OLD_MD5" ]; then
            echo "$NEW_MD5 $file" >> "$MD5SUMS_FILE"
        # There was an "old MD5", let's use sed to replace it.
        elif [ $LTX -eq 0 ]; then
            sed "s|^.*\b$OLD_MD5\b.*$|$NEW_MD5 $file|" "$MD5SUMS_FILE" -i
        fi
    fi
}

# Create the MD5 hashes file.
[[ ! -f "$MD5SUMS_FILE" ]] && touch "$MD5SUMS_FILE"

IFS=$'\n'
find "$LATEXDOC_DIR" -iname "*.tex" | while read file; do
    # For each .tex file, call update_file.
    update_file "$file"
done

이제 이 스크립트를 주기적으로 실행하려면 다음을 사용할 수 있습니다 watch.

$ watch /path/to/script.sh

-n스위치를 사용하여 새로 고침 시간을 조정할 수 있습니다 .

$ watch -n 2 /path/to/script.sh

/home/jaakko/Documents/LaTeX이 스크립트를 넣고 개발하는 동안 실행할 수 있습니다.

관련 정보