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制限されています。

とにかく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このスクリプトを入れて開発中に実行できます。

関連情報