運行pdflatex
一次
\documentclass{elsarticle}%%% version 3.1 from CTAN
\begin{document}
\begin{frontmatter}
\author[1]{Johann Sebastian Bach}
\author[2]{Ludwig van Beethoven\corref{cor2}}
\cortext[cor2]{Corresponding author}%
\address[1]{Thomaskirche, Leipzig}
\address[2]{Zentralfriedhof Wien}
\end{frontmatter}
\end{document}
產生以下輸出:
正如您所看到的,兩位作者的標籤都是 1,貝多芬先生後面的上標星號缺失了。您需要第二次運行來pdflatex
修正此問題。
然而,pdflatex
總是至少運行兩次並不是您想要的:它會佔用您的時間,尤其是在大型紙張上,而pdflatex
如果從先前的運行中可以獲得正確的.aux 文件,則運行一次有時可能就足夠了。我查看了 .log 檔案和控制台輸出,試圖發現一些關於是否需要第二次重新運行的提示,但我找不到任何可用的東西。我之前檢查是否需要重新運行的方法是這樣說
MESSAGE_FOR_RERUN := '(LaTeX Warning: Label\(s\) may have changed\. Rerun to get cross\-references right\.)|(LaTeX Warning: There were undefined references\.)|(LaTeX Warning: Citation [^[:cntrl:]]* on page [0-9]* undefined on)|(Package natbib Warning: There were undefined citations\.)|(\(mparhack\) *Rerun to get them right\.)'
在 makefile 的開頭和
for i in $(SOURCES); do \
$(PDFLATEX) $$i ; \
done
if (egrep $(MESSAGE_FOR_RERUN) $(OBJECTS)); then \
for i in $(SOURCES); do $(PDFLATEX) $$i ; done; \
fi
(其中變數被適當定義)在 makefile 的規則中。 (當然,在非 MWE 中,您可能還需要執行一些 sed、awk、rm、bibtex、bibtex8、biber、makeglossaries、makeindex、xindy、dvi2ps、zip、chmod 或其他一些天知道的命令,但其他程式的此類細節在這裡都是題外話。
當然,您可以擁有latexmk
或\usepackage[mainaux]{rerunfilecheck}
完成這項工作,但我想知道:您可以繼續透過 makefile 執行先前的方式嗎?
答案1
只是將我的評論收集到答案中。
不能保證直接的.log
文件解析足以檢測必要的重新運行。重新運行警告之所以.log
出現,是因為 LaTeX 設定了一個啟發式方法來警告您是否\labels
和引用(可能還有其他一些事情)看起來好像需要再次運行 LaTeX。但是包沒有義務使用這些受監視的機制,並且很可能會做自己的事情。
問題中的程式碼是此類程式碼的一個主要範例。相關標籤是使用自訂\Newlabel
命令(而不是\newlabel
)寫出的,並且沒有程式碼來偵測這些標籤的變更。
.log
事實上,第一次和第二次運行的檔案之間唯一相關的差異是
No file <jobname>.aux.
與
(<jobname>.aux)
以及是否<jobname>.spl
載入所調用的檔案。
現在可以輕鬆建立一個範例,其中.log
檔案保持不變(時間和記憶體資訊除外),但輸出仍需要另一次 LaTeX 運行。
- 從問題中取得範例並編譯兩次。
- 新增第三位作者:
\author[3]{Antonín Dvořák}
附地址\address[3]{Vyšehrader Friedhof}
- 編譯一次參見德沃夏克的註腳「1」。
- 再次編譯得到“C」。
在步驟 3 和 4 之間,.log
除了日期/時間資訊、記憶體使用情況和字體資訊的行號之外,檔案保持不變。然而,這些更改都表明不需要再次運行 LaTeX。
因此,除非您使用的套件在 LaTeX 端內建了某種啟發式方法,可以仔細檢查是否需要重新運行並在 中發出警告.log
,.log
否則僅憑文件不足以決定是否重新運行 LaTeX。
latexmk
這就是為什麼還要監視輔助文件的變更的原因之一。如果輔助檔案在運作之間穩定,那麼輸出也應該是穩定的。事實上,在上面的範例中,在步驟3 的 LaTeX 運行中\Newlabel{3}{c}
被加入到檔案中。 (當然,在某些情況下,即使文件發生更改,也不需要重新運行,例如因為未使用new )。情況文件永遠不穩定的:.aux
.aux
.aux
.aux
\label
.aux
避免使用 biblatex 同上引用樣式進行無限編譯器傳遞?.)
您在問題中提到的套件rerunfilecheck
可以.aux
在 LaTeX 運行之間監視文件。特別.aux
是比較當前 LaTeX 運行之前和之後的檔案雜湊。如果哈希發生更改,則表示重新運行可能有用,並且您會收到以下形式的警告
Package rerunfilecheck Warning: File `<jobname>.aux' has changed. Rerun.
Package rerunfilecheck Info: Checksums for `<jobname>.aux':
(rerunfilecheck) Before: AE406B0DDBF18055292F1343793AC8CB;63
(rerunfilecheck) After: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.
另一方面,如果.aux
穩定,則報告
Package rerunfilecheck Info: File `<jobname>.aux' has not changed.
(rerunfilecheck) Checksum: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.
因此,rerunfilecheck
您的任務只是簡化為解析該套件的重新運行警告。
也許可以rerunfilecheck
在 makefile 中重做外部的操作。
- 散列當前
.aux
並記住散列。 - 運行乳膠。
- 對新的雜湊值進行雜湊處理
.aux
並與舊的雜湊值進行比較。 - 如果哈希值不同,則重新運行。
我懷疑這是否值得付出努力,但這可能是 bash 腳本的一次很好的學術練習(並不是說我不知道如何真正完成這項任務)。