다음 스크립트는 구현하기 쉬운가요? 내 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 스크립트를 작성하는 데 도전했습니다.
어쨌든 find
MD5 해시를 사용하는 작은 아이디어는 다음과 같습니다.
- 나는
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
이 스크립트를 넣고 개발하는 동안 실행할 수 있습니다.