Неочищенный .aux-файл вызывает ошибку "файл закончился при сканировании использования \@newl@bel". Почему он не очищается?

Неочищенный .aux-файл вызывает ошибку "файл закончился при сканировании использования \@newl@bel". Почему он не очищается?

Я работаю над TeX Live 2013 с TeXShop (дистрибутив MacTex2013)

Ожидаемое поведение таково, что в случае возникновения ошибки во время компиляции файл .aux очищается. Поэтому последующую компиляцию необходимо выполнить дважды, чтобы ссылки были правильными.

В приведенном ниже "минимальном" примере этого не происходит. Файл .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}

Чтобы воспроизвести ошибку, сделайте следующее:

  1. Обратите внимание на одиночный символ $ в конце документа, вызывающий ошибку.
  2. Компилировать (.aux остается в нечистом состоянии)
  3. Исправьте ошибку
  4. Скомпилируйте еще раз (наполовину написанный .aux вызывает ошибку)
  5. Удалите файл .aux для восстановления

Я знаю, что происходит и как восстановиться. Мой вопрос:

Почему это происходит?

или лучше

Есть ли способ это предотвратить?


В моем текущем документе для каждой ошибки, которую я делаю при написании в последнем разделе, мне приходится вручную удалять файлы .aux для исправления. Поскольку я довольно часто компилирую во время написания, это раздражает, и я хотел бы это предотвратить.

Насколько я понимаю, вывод в файл .aux буферизуется. В случае ошибки компиляция останавливается, и текущий буфер остается незаписанным. На этом этапе файл .aux содержит уже записанные фрагменты буфера, которые могут сломаться в любом месте, оставляя неполные определения.

Обычно я не работаю с движком TeX на консоли, а просто исправляю свою ошибку и перезапускаю.

Я не понимаю, что вызывает удаление файла .aux, который, как показывает пример, работает ненадёжно. Возможно, из-за пакета biblatex или hyperref. Не могли бы вы пролить свет на это?

Также интересно:

  • Есть ли способ контролировать удаление файла .aux после ошибки?
  • Есть ли команды TeX/LaTeX, которые я могу использовать для ручной очистки выходного буфера для файла .aux? Я мог бы использовать эту команду прямо перед разделом, над которым я работаю. Таким образом, мне, вероятно, больше не придется иметь дело с поврежденным файлом .aux так часто.
  • Есть ли опция для программы pdflatex, чтобы выходные буферы очищались после ошибки. В большинстве случаев ошибка не влияет на файл .aux, поэтому нет причин не закончить его запись. В тех случаях, когда это происходит, мне придется удалить его.

На StackExchange есть несколько связанных вопросов:

решение1

С помощьюКогда считывается и записывается aux-файл?и благодаря любезной помощи Барбары Битон я смог определить, что идет не так и как это предотвратить.

Это проблема:

Обычно я не работаю с движком TeX на консоли, а просто исправляю свою ошибку и перезапускаю.

Вот что мне следовало сделать на консоли:

  • Введите ?+ Return, чтобы получить представление о том, что можно сделать.
  • Просто нажимайте Returnнесколько раз, пока Текс не закончится.
  • Нажмите X+ Return, чтобы немедленно завершить выполнение.
  • Нажмите E+ Return, чтобы курсор переместился в точку, где произошла ошибка.

Происходит следующее: TeX буферизует команды \write в файл .aux в два этапа. На первом этапе он ждет, пока страница не будет отправлена, чтобы правильно расставить номера страниц. На втором этапе он ждет, пока не посчитает нужным выполнить системный write()вызов, чтобы сократить количество (потенциально медленных) системных вызовов. Этот второй буфер, по-видимому, не заботится о том, являются ли фрагменты, которые он записывает в файл, самодостаточными легальными TeX, поскольку он в любом случае завершит файл до того, как завершится выполнение TeX.

Однако в среде TeXShop возникает соблазн оставить TeX зависшим незавершенным после ошибки. Таким образом, второй выходной пуффер не очищается, а файл .aux, возможно, остается незавершенным и в недопустимом состоянии.

Мой личный вывод из этого:Всегда давайте TeX закончить работу.


Предположение о том, что TeX сможет завершить свою работу после остановки из-за ошибки, было вполне обоснованным до появления оконных сред, когда стало легко и нормально оставлять процессы висящими в фоновом режиме.

Что можно сделать на программном уровне, чтобы облегчить такое поведение пользователя:

  • Измените поведение второго буфера Tex так, чтобы он вызывал 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. Создание правильных ссылок может решить вашу проблему, как я решил ее, исправив ссылки.

Связанный контент