Latex
在創建/更改時自動編譯 Latex 源
做下面的腳本容易嗎?我在 /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