
私はTeXShop(MacTex2013ディストリビューション)を使ってTeX Live 2013に取り組んでいます。
予想される動作は、コンパイル中にエラーが発生した場合、.aux ファイルが消去されることです。したがって、参照を正しくするために、後続のコンパイルを 2 回実行する必要があります。
以下の「最小限の」例では、これは発生しません。.aux ファイルは半分書き込まれたままになり、「\@newl@bel の使用をスキャン中にファイルが終了しました」というエラーが発生します。
最小限の変更でも、.aux ファイルが正しく削除されます。例:
- 見出しやキャプションのテキストの変更。Ü を \"U に変更するなど。
- どこでも \label{...} を省略します。
- どこでも \cite{...} を省略します (.bib リソースを指定しても効果はありません)。
- biblatex または hyperref を使用していません。
- 改ページを変更します。
ここに自己完結型ファイルがあります。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{csquotes}
%\usepackage[T1]{fontenc}
\usepackage{biblatex}
\usepackage{hyperref}
% ================================================
\begin{document}
\clearpage
\section{Geomaxrie der ganzzahligen linearen Optimierung}
\label{Sec.Einfuhrung}
. [figure]
\begin{figure}
\caption{Caption}
\label{Fig.Beispiel-ILP}
\end{figure}
\section{Gitterbasisreduktion und Voronoi Algorithmus}
\label{Sec.Voronoi}
.
.
.
.
.
.
.
.
.
.
cite\cite{Voronoi}
.
.
.
label\label{Thm.Voronoi}
.
.
label\label{Alg.VoronoiFilter}
.
.
label\label{Alg.VoronoiFilter.Bedingung}
.
.
.
.
.
.
.
.
.
label\label{Alg.CVPP}
.
.
.
.
.
.
.
label\label{Alg.VoronoiRelevant}
.
.
.
.
.
.
.
label\label{Alg.Voronoi}
.
\clearpage
\section{Ellipsoid-Überdeckungen und M-Ellipsoide}
\label{Sec.Ellipsoid-Methode.M-Ellipsoide}
. [figure]
\begin{figure}
.
\caption{Löwner-John-Ellipsoid mit Anwendung in der Ellipsoid Methode}
\label{Fig.MinEllipsoid}
\end{figure}
.
.
label\label{Thm.InertEllipsoid}
label\label{Thm.MEllipsoid}
.
.
. [figure]
\begin{figure}
\caption{Label}
\label{Fig.M-Ellipsoidoo}
\end{figure}
label\label{Alg.ConvexBodyEnumerationInformal}
.
.
\clearpage
\section{Berechnungsmodell}
\label{Sec.Berechnungsmodell}
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
cite\cite{M-Ellipsoid}
.
.
.
.
.
.
.
.
.
.
.
.
.
.
label\label{Def.SEP}
.
.
.
.
\section{M-Ellipsoid Algorithmen}
.
label\label{Theorem}
Cause error here: $
A simple error at this point results in the .aux file not being cleaned. Even marginal changes in the document above make the effect disappear
\end{document}
バグを再現するには、次の手順を実行します。
- 文書の末尾にある単一の$がエラーの原因となっていることに注意する
- コンパイル(.aux はクリーンな状態のままです)
- エラーを修正する
- 再度コンパイルします(.aux が半分書き込まれているためエラーが発生します)
- 回復するには.auxファイルを削除してください
何が起こるか、そしてどのように回復するかはわかっています。私の質問は次のとおりです。
なぜこのようなことが起こるのでしょうか?
またはそれ以上
それを防ぐ方法はありますか?
現在のドキュメントでは、最後のセクションでの書き込み中にエラーが発生するたびに、.aux ファイルを手動で削除して回復する必要があります。書き込み中に頻繁にコンパイルするため、これは煩わしいので、回避したいと思います。
私の理解では、.aux ファイルへの出力はバッファリングされます。エラーが発生した場合、コンパイルは停止し、現在のバッファは書き込まれません。この時点で、.aux ファイルにはすでに書き込まれたバッファ チャンクが含まれており、どこかで中断して不完全な定義が残る可能性があります。
通常、私はコンソール上の TeX エンジンを操作するのではなく、単にエラーを修正して再起動します。
何が .aux ファイルの削除をトリガーするのかわかりません。例が示すように、これは確実には機能しません。おそらく、biblatex または hyperref パッケージが原因です。これについて、何か説明していただけますか?
興味深い点:
- エラー後に .aux ファイルの削除を制御するものはありますか?
- .aux ファイルの出力バッファを手動でフラッシュするために使用できる TeX/LaTeX コマンドはありますか? 作業中のセクションの直前にこのコマンドを使用できます。 そうすれば、破損した .aux ファイルを頻繁に処理する必要がなくなるでしょう。
- pdflatex プログラムには、エラー後に出力バッファをフラッシュするオプションがありますか。ほとんどの場合、エラーは .aux ファイルに影響しないので、書き込みを完了しない理由はありません。影響する場合は、そのファイルを削除する必要があります。
StackExchange には関連する質問がいくつかあります。
答え1
の助けを借りてaux ファイルはいつ読み書きされますか?そして、Barbara Beeton の親切な援助のおかげで、何が問題なのか、どうすればそれを防ぐことができるのかを判断することができました。
これが問題です:
通常、私はコンソール上の TeX エンジンを操作するのではなく、単にエラーを修正して再起動します。
コンソールで実行すべき操作は次のとおりです。
?
+と入力Return
すると、何ができるかがわかります。Return
Tex が終了するまで繰り返しヒットするだけです。- 実行をすぐに終了するには
X
+と入力します。Return
E
+と入力するReturn
と、カーソルがエラーが発生したポイントにジャンプします。
実際に起きていることは、TeX が \write コマンドを .aux ファイルに 2 段階でバッファリングすることです。最初の段階では、ページ番号を正しくするためにページが送信されるまで待機します。2 番目の段階では、write()
(潜在的に遅い) システム コールの数を減らすために、システム コールを発行するのに適切と判断されるまで待機します。この 2 番目のバッファは、ファイルに書き込むチャンクが自己完結型の正当な TeX であるかどうかを気にしないようです。いずれにしても、TeX の実行が完了する前にファイルを完成させるからです。
しかし、TeXShop の環境では、エラーが発生した後に TeX を未完了のままにしておく誘惑にかられることがあります。そのため、2 番目の出力パファーはフラッシュされず、.aux ファイルは未完了のまま、不正な状態のままになる可能性があります。
このことから私が個人的に得た結論は次のとおりです。常に TeX を終了させます。
エラーのために停止した後、TeX の実行を完了できるという想定は、プロセスをバックグラウンドで停止したままにしておくことが簡単かつ普通になったウィンドウ環境以前は、非常に妥当なものでした。
このユーザー動作を容易にするためにソフトウェア側で実行できること:
- Tex の 2 番目のバッファの動作を変更して、
write()
エラーが発生した場合にシステム コールを発行するか、TeX に準拠したチャンクにのみ分割するようにします。 - 環境 (TexShop) を調整して、プロセスの中止後に .aux ファイルをクリーンアップするか、デフォルトの入力を提供してプロセスを常に正しく終了するようにします。
TeX を常に終了させる以外にユーザーが実行できる操作:
- を使用します
\include{...}
。こうすることで、エラーが発生するまでに、前のセクションの .aux ファイルが閉じられ、完了します。現在のセクションの .aux ファイルはまだ十分な大きさではなく、TeX に違反する部分が書き込まれていない可能性があります。 \immediate\closeout\@mainaux
内容が上書きされないように、に続いて とその内容のコピーを含む何かをハックします\openout\@mainaux
。これにより、出力バッファが効果的にフラッシュされます。ただし、労力に見合う価値はなさそうです。
答え2
私も同じ問題を経験しましたが、Tex ファイル内に問題のあるコードは見つかりませんでした。問題のあるテキストは、パッケージを使用してインポートした BibText に追加したばかりの引用文に実際に含まれていたことが判明biblatex
しました。PubMed から引用文をエクスポートしたときに含まれていた要約に、何らかの奇妙な文字が含まれていたに違いありません。要約全体を削除し (いずれにしても参考文献には表示されないため)、一時ファイルを削除して、エラーなしで PDF を再構築しました。
答え3
.aux
特に大きなドキュメントを扱っている場合や、永続的または繰り返し発生する破損をデバッグする場合、コンパイルを中止し、バッファ書き込みが切り捨てられて不完全/不正な TeX になる破損ファイルの最後の行を削除する方がはるかに高速であることがわかり.aux
ました。この方法では、ファイルの有効な部分を保持でき.aux
、コンパイルが完了するまで待つ必要がありません。
ほとんどのエディターでは、ファイルにフォーカスを切り替え.aux
、末尾にスキップし、最後の行を削除するには、数回のキー操作のみが必要なので、これは非常に迅速に実行できます。
\write
バッファリングされたすべての がフラッシュされ、 が破損しないように強制的にコンパイルを終了したい場合は.aux
、 オプションを使用して、ユーザー入力を待たずにエラーの処理を続行するようにコンパイラに指示できます。-interaction=nonstopmode
こうすることで、エラーごとにキー入力する必要がなくなります。
答え4
論文を書いているときにも同じ問題がありました。Google Scholar や、bib パッケージでサポートされている形式とは異なる可能性のある包括的なファイルから参照を使用する場合は注意してください。正しい参照を作成すると、問題が解決する可能性があります。私は参照を修正することでこの問題を解決しました。