
Estoy trabajando en TeX Live 2013 con TeXShop (distribución MacTex2013)
El comportamiento esperado es que, en caso de que se produzca un error durante la compilación, se borre el archivo .aux. Por lo tanto, la compilación posterior debe realizarse dos veces para obtener las referencias correctas.
En el siguiente ejemplo "mínimo", esto no sucede. El archivo .aux permanece medio escrito, lo que provoca el error "archivo finalizado mientras se escanea el uso de \@newl@bel".
Incluso los cambios mínimos provocan que el archivo .aux se elimine correctamente. Como:
- Cambio de texto en titulares o pies de foto. Incluso un cambio de Ü a \"U.
- Omitiendo un \label{...} en cualquier lugar.
- Omitir un \cite{...} en cualquier lugar (proporcionar un recurso .bib no tiene ningún efecto).
- No utilizar biblatex ni hyperref.
- Cambiar los saltos de página.
Aquí está el archivo autónomo.
\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}
Para reproducir el error, haga lo siguiente:
- Observe el $ único al final del documento que provoca un error
- Compilar (.aux permanece en un estado sucio)
- Corregir el error
- Compile de nuevo (el archivo .aux medio escrito provoca un error)
- Eliminar el archivo .aux para recuperarlo
Sé lo que pasa y cómo recuperarme. Mi pregunta es:
¿Por qué pasó esto?
o mejor
¿Hay una forma de prevenirlo?
En mi documento actual, por cada error que cometo al escribir en la última sección, tengo que eliminar manualmente los archivos .aux para recuperarlos. Dado que compilo con bastante frecuencia mientras escribo, esto es una molestia y me gustaría evitarlo.
Por lo que tengo entendido, la salida a un archivo .aux está almacenada en el búfer. En caso de error, la compilación se detiene y el búfer actual permanece sin escribir. En este punto, el archivo .aux contiene los fragmentos del búfer ya escritos, que pueden romperse en cualquier lugar y dejar definiciones incompletas.
Normalmente no trabajo con el motor TeX en la consola, sino que simplemente corrijo mi error y reinicio.
No entiendo qué provoca la eliminación del archivo .aux que, como muestra el ejemplo, no funciona de forma fiable. Posiblemente debido al paquete biblatex o hyperref. ¿Si pudieras arrojar algo de luz sobre eso?
También de interés:
- ¿Existe algo para controlar la eliminación del archivo .aux después de un error?
- ¿Existen comandos TeX/LaTeX que pueda usar para vaciar manualmente el búfer de salida del archivo .aux? Podría usar este comando justo antes de la sección en la que estoy trabajando. De esa manera, probablemente ya no tendré que lidiar con un archivo .aux corrupto con tanta frecuencia.
- ¿Existe una opción para el programa pdflatex para que los buffers de salida se vacíen después de un error? En la mayoría de los casos el error no afecta al archivo .aux, por lo que no hay motivo para no terminar de escribirlo. En los casos en los que así sea, tendría que eliminarlo.
Hay varias preguntas relacionadas aquí en StackExchange:
Respuesta1
Con la ayuda de¿Cuándo se lee y escribe el archivo auxiliar?y la amable ayuda de Barbara Beeton pude determinar qué va mal y cómo prevenirlo.
Este es el problema:
Normalmente no trabajo con el motor TeX en la consola, sino que simplemente corrijo mi error y reinicio.
Esto es lo que debería haber hecho en la consola:
- Escriba
?
+Return
para tener una idea de lo que se puede hacer. - Simplemente golpea
Return
repetidamente hasta que Tex termine. - Escriba
X
+Return
para finalizar la ejecución inmediatamente. - Escriba
E
+Return
para que el cursor salte al punto donde ocurrió el error.
Lo que sucede es que TeX almacena los comandos \write en el archivo .aux en dos etapas. En la primera etapa, espera hasta que se envía una página para obtener los números de página correctos. En la segunda etapa, espera hasta que lo considere oportuno para emitir una write()
llamada al sistema, para reducir la cantidad de llamadas al sistema (potencialmente lentas). A este segundo buffer aparentemente no le importa si los fragmentos que escribe en el archivo son TeX legales autónomos, ya que de todos modos completará el archivo antes de que finalice la ejecución de TeX.
Sin embargo, en el entorno de TeXShop es tentador dejar que TeX quede sin terminar después de un error. Por lo tanto, el segundo puffer de salida no se vacía y el archivo .aux posiblemente queda sin terminar y en un estado ilegal.
Mi conclusión personal de esto:Siempre deja que TeX termine.
La suposición de que TeX tendrá la oportunidad de finalizar su ejecución después de que se detuviera por un error era muy razonable antes de los entornos con ventanas, donde se volvió fácil y normal dejar procesos colgados en segundo plano.
Cosas que se podrían hacer en el lado del software para facilitar este comportamiento del usuario:
- Cambie el comportamiento del segundo búfer de Tex para emitir una
write()
llamada al sistema en caso de un error o para dividirlo solo en fragmentos legales para TeX. - Ajuste el entorno (TexShop) para limpiar el archivo .aux después de una interrupción del proceso o proporcionar una entrada predeterminada para finalizar siempre correctamente el proceso.
Cosas que el usuario puede hacer, además de dejar que TeX termine siempre:
- Usar
\include{...}
. De esa manera, los archivos .aux de las secciones anteriores se cierran y finalizan cuando ocurre el error. Lo más probable es que el archivo .aux de su sección actual aún no sea lo suficientemente grande y no se hayan escrito partes ilegales para TeX. - Hackea algo que incluya
\immediate\closeout\@mainaux
seguido de\openout\@mainaux
una copia del contenido para que no se sobrescriba. Esto vaciará efectivamente el búfer de salida. Aunque no parece que valga la pena el esfuerzo.
Respuesta2
Acabo de experimentar el mismo problema y no pude encontrar ningún código ofensivo en mi archivo tex. Resulta que el texto ofensivo estaba en realidad en una cita que acababa de agregar a BibText, que estaba importando usando el biblatex
paquete. Debe haber algún tipo de carácter extraño en el resumen que se incluyó cuando exporté la cita de PubMed. Eliminé el resumen completo (ya que de todos modos no iba a aparecer en las referencias), eliminé los archivos temporales y reconstruí mi PDF sin errores.
Respuesta3
Me resulta mucho más rápido finalizar la compilación y simplemente eliminar la última línea del .aux
archivo dañado donde la escritura truncada en el buffer da como resultado un TeX incompleto/ilegal, particularmente cuando trabajo con documentos grandes y/o depuro .aux
corrupción persistente/recurrente. De esta manera puede conservar la parte válida del .aux
archivo y no tener que esperar a que finalice la compilación.
En la mayoría de los editores, sólo se necesitan unas pocas teclas para cambiar el foco al .aux
archivo, saltar al final y eliminar la última línea, por lo que esto se puede hacer con bastante rapidez.
Si prefiere forzar el final de la compilación para que todos \write
los archivos almacenados en el búfer se vacíen y .aux
no se dañen, puede indicarle al compilador que continúe con los errores sin pausar la entrada del usuario con la -interaction=nonstopmode
opción, de esa manera no tendrá que presionar una tecla más allá. cada uno de ellos.
Respuesta4
El mismo problema que tuve cuando trabajaba con mi tesis. Tenga cuidado con las referencias que podría utilizar de Google Scholar o algunos archivos completos que probablemente tengan un formato diferente al que admite su paquete bib. Hacer referencias correctas podría resolver su problema, ya que yo lo resolví corrigiendo referencias.