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 で、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 実行が必要です。

  1. 質問の例を 2 回コンパイルします。
  2. 3人目の著者を追加:\author[3]{Antonín Dvořák}住所付き\address[3]{Vyšehrader Friedhof}
  3. コンパイル一度ドヴォルザークの脚注「1」を参照してください。
  4. 再度コンパイルして「c「」。

ステップ 3 と 4 の間では、.log日付/時刻情報、メモリ使用量、フォント情報の行番号を除いて、ファイルは同じままです。ただし、これらの変更はいずれも、LaTeX を再度実行する必要があることを示すものではありません。

したがって、使用するパッケージに、再実行が必要かどうかを二重チェックして で警告する LaTeX 側で何らかのヒューリスティックが組み込まれていない限り、.logファイル.logだけでは LaTeX を再実行するかどうかを判断するのに不十分です。

これが、 が補助ファイルの変更も監視する理由の 1 つですlatexmk。実行間で補助ファイルが安定していれば、出力も安定しているはずです。実際、上記の例では、ステップ 3 の LaTeX 実行で がファイル\Newlabel{3}{c}に追加されます。したがって、ステップ 3 の実行前と実行後は が異なりますが、ステップ 4 の実行ではファイルは変更されません(もちろん、新しい が使用されていないなど、ファイルが変更されても再実行が不要な状況もあります。したがって、結果として得られるビルド サイクルが特定のドキュメントに対して最短になることは保証されません)。さらに、ファイルが安定しない状況もあります。.aux.aux.aux.aux\label.auxbiblatex 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タスクはそのパッケージの再実行警告を解析するだけになります。

rerunfilecheckmakefile 内で外部的に実行されていることをやり直すことは可能かもしれません。

  • 現在のハッシュを計算し.aux、ハッシュを記憶します。
  • LaTeXを実行します。
  • 新しいハッシュを作成.auxし、古いハッシュと比較します。
  • ハッシュが異なる場合は、再実行します。

努力する価値があるかどうかは疑問ですが、bash スクリプトに関する優れた学術的な演習になるかもしれません (ただし、このタスクを実際にどのように達成するかについては、まったくわかりません)。

関連情報