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 で、Mr. Beethoven の後の上付き星がありません。pdflatex
この問題を修正するには、 の 2 回目の実行が必要です。
しかし、pdflatex
常に少なくとも2回実行するのは望ましくありません。特に大きな論文では時間がかかります。一方、pdflatex
前回の実行で適切な.auxファイルが利用できる場合は、1回の実行で十分な場合があります。2回目の再実行が必要かどうかのヒントを見つけるために、.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\.)'
メイクファイルの冒頭に
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
ファイル解析では、必要な再実行を検出するのに十分であるとは保証できません。 の再実行警告は、引用 (およびおそらく他のいくつかのもの) が別の LaTeX 実行が必要であると思われる.log
場合に警告するためのヒューリスティックを LaTeX が設定しているためにのみ表示され\labels
ます。ただし、パッケージはこれらの監視メカニズムを使用する義務はなく、独自の処理を実行する可能性があります。
質問のコードは、そのようなコードの代表的な例です。関連するラベルは、\Newlabel
( ではなく\newlabel
)カスタム コマンドを使用して書き出されており、それらの変更を検出するコードはありません。
.log
実際、最初の実行と2回目の実行のファイル間における唯一の重要な違いは
No file <jobname>.aux.
対
(<jobname>.aux)
というファイル<jobname>.spl
がロードされているかどうか。
.log
ファイルは同じまま (時間とメモリ情報を除く) の例を簡単に作成できるようになりましたが、出力には別の LaTeX 実行が必要です。
- 質問の例を 2 回コンパイルします。
- 3人目の著者を追加:
\author[3]{Antonín Dvořák}
住所付き\address[3]{Vyšehrader Friedhof}
- コンパイル一度ドヴォルザークの脚注「1」を参照してください。
- 再度コンパイルして「c「」。
ステップ 3 と 4 の間では、.log
日付/時刻情報、メモリ使用量、フォント情報の行番号を除いて、ファイルは同じままです。ただし、これらの変更はいずれも、LaTeX を再度実行する必要があることを示すものではありません。
したがって、使用するパッケージに、再実行が必要かどうかを二重チェックして で警告する LaTeX 側で何らかのヒューリスティックが組み込まれていない限り、.log
ファイル.log
だけでは LaTeX を再実行するかどうかを判断するのに不十分です。
これが、 が補助ファイルの変更も監視する理由の 1 つですlatexmk
。実行間で補助ファイルが安定していれば、出力も安定しているはずです。実際、上記の例では、ステップ 3 の LaTeX 実行で がファイル\Newlabel{3}{c}
に追加されます。したがって、ステップ 3 の実行前と実行後は が異なりますが、ステップ 4 の実行ではファイルは変更されません(もちろん、新しい が使用されていないなど、ファイルが変更されても再実行が不要な状況もあります。したがって、結果として得られるビルド サイクルが特定のドキュメントに対して最短になることは保証されません)。さらに、ファイルが安定しない状況もあります。.aux
.aux
.aux
.aux
\label
.aux
biblatex ibid 引用スタイルを使用して無限のコンパイラ パスを回避しますか?。
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
、ハッシュを記憶します。 - LaTeXを実行します。
- 新しいハッシュを作成
.aux
し、古いハッシュと比較します。 - ハッシュが異なる場合は、再実行します。
努力する価値があるかどうかは疑問ですが、bash スクリプトに関する優れた学術的な演習になるかもしれません (ただし、このタスクを実際にどのように達成するかについては、まったくわかりません)。