次のスクリプトは実装するのは簡単ですか?私の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
制限されています。
とにかく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
このスクリプトを入れて開発中に実行できます。