3

未定義の参照のために Xe(La)TeX の再実行がいつ必要になるかを判断しようとしています。関連する質問をSCons メーリング リストに投稿しましたが、問題は次のとおりです。

XeLaTeX の複数回の実行を必要とするページ カウントやその他の参照は、現時点では SCons やその他のビルド システムによって検出されないことがあります。以下にサンプル ファイルを示します (これを と呼びますjob.tex)。

\documentclass[ones​ide,12pt]{memoir}
\usepackage{xltxtra}
\usepackage[T1]{fontenc}
\makepagestyle{plain}
\makeoddfoot{plain}{}{}{Page \thepage\ of \arabic{lastpage}}
\makeevenfoot{plain}{}{}{Page \thepage\ of \arabic{lastpage}}
\begin{document}
\pagestyle{plain}
Page 1
\newpage
Page 2
\newpage
Page 3
\newpage
\end{document}

を実行するxelatex jobと、生成される .pdf には、3 ページのページ番号「Page 1 of 0」、「Page 2 of 0」、および「Page 3 of 0」が含まれます。2 回目に実行xelatex jobすると、"Page 1 of 3" など (つまり、正しいページ数) が表示されます。

これを修正するために、未定義の参照を解決するために xelatex を実行するかどうかを確認するには、次の正規表現を変更することを SCons メーリング リストで提案しました (SCons.Tools.texバージョン 2.0.1.beta.20100627.r5064 の 71 行目)。

- warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'
+ warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'\
+                     '|(^No file \w+\.\w{3}\.$)'

実際には、これは「ファイル job.aux なし」のチェックです。Xe(La)TeX は最初の実行時に常に "No file job.aux" を出力し、Xe(La)TeX は常に 2 回実行されるため、これはすべての場合に機能します。job.aux事実上、これはと の間の暫定ビルド ターゲットになったのjob.texと同じjob.pdfです。

ここに問題があります: 未定義の参照がなくても (たとえば、上記\arabic{lastpage}からを削除job.tex)、Xe(La)TeX が 2 回呼び出され.auxます.pdf。明らかに、未定義の参照がない場合、この 2 番目の呼び出しは不要です。

job.logしたがって、私の質問:再コンパイルが必要な未定義の参照 (\arabic{lastpage} など) がある場合とない場合を、おそらく正規表現を使用して検出する方法を教えてください。

読んでくれてありがとう。

よろしくお願いします、

ブライアン

4

3 に答える 3

2

.aux ファイルをバックアップにコピーして、そのバックアップが Xetex の実行の最後に新しく生成された .aux ファイルと同じかどうかを比較することはできませんか?

于 2010-07-13T08:39:20.953 に答える
1

おそらく必要な解決策は、カウンター「lastpage」が定義されていないときに警告が表示されるように、最後のページを参照することです。これは、元の rerun 正規表現によって取得されます。

私が使用する別のアプローチは、aux ファイルが変更されなくなるまで LaTeX を実行し続けることです (概念的には、aux ファイルは LaTeX 実行の入力と出力の両方であり、修正点に到達するまで LaTeX を実行し続けます)。 aux ファイル)。これにより、LaTeX を再実行しても結果のドキュメントが変更されないことが保証されます。

この動作を scons に組み込むことができるかどうかはわかりません。Makefile から、いくつかのシェル ロジックを使用することはかなり簡単です。

于 2010-07-13T08:44:47.710 に答える