為 elsarticle 運行 pdflatex 所需的最少次數

為 elsarticle 運行 pdflatex 所需的最少次數

運行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 運行。

  1. 從問題中取得範例並編譯兩次。
  2. 新增第三位作者:\author[3]{Antonín Dvořák}附地址\address[3]{Vyšehrader Friedhof}
  3. 編譯一次參見德沃夏克的註腳「1」。
  4. 再次編譯得到“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 腳本的一次很好的學術練習(並不是說我不知道如何真正完成這項任務)。

相關內容