Latex

在創建/更改時自動編譯 Latex 源

  • September 1, 2019

做下面的腳本容易嗎?我在 /home/jaakko/Documents/LaTeX 及其子目錄中有我的 LaTeX 文件。我想讓一個腳本監視該目錄及其子目錄中的 .tex 文件,如果某些 tex 文件發生更改,該腳本會嘗試盡快編譯它(pdflatex file.tex)。我怎樣才能在 Bash 中做到這一點?

首先,您要做的是 IDE 的正常工作。無論是 Texmaker、Latexila 還是其他 IDE,IDE 都可以讓您以極快的速度重新編譯 LaTeX 程式碼,並且有些可能允許在給定的時間間隔內自動重新編譯。

現在許多 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並執行它。

也可以使用fswatch來完成:

fswatch -o filename.tex | xargs -n1 -I{} pdflatex filename.tex

引用自:https://unix.stackexchange.com/questions/163211