创建/更改时自动编译 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您可以在开发时放入此脚本并运行它。

相关内容