下面的脚本容易实现吗?我的 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
您可以在开发时放入此脚本并运行它。