
Estou trabalhando no TeX Live 2013 com TeXShop (distribuição MacTex2013)
O comportamento esperado é que, caso ocorra um erro durante a compilação, o arquivo .aux seja eliminado. A compilação subsequente deve, portanto, ser feita duas vezes, para obter as referências corretas.
No exemplo "mínimo" abaixo, isso não acontece. O arquivo .aux permanece meio escrito, causando um erro "arquivo encerrado durante a verificação do uso de \@newl@bel".
Mesmo alterações mínimas fazem com que o arquivo .aux seja eliminado corretamente. Como:
- Mudança de texto em títulos ou legendas. Mesmo uma mudança de Ü para \"U.
- Omitindo um \label{...} em qualquer lugar.
- Omitir um \cite{...} em qualquer lugar (fornecer um recurso .bib não tem efeito).
- Não usar biblatex ou hyperref.
- Alterando as quebras de página.
Aqui está o arquivo independente.
\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 reproduzir o bug, faça o seguinte:
- Observe o único $ no final do documento causando erro
- Compilar (.aux permanece em estado impuro)
- Corrija o erro
- Compilar novamente (.aux escrito pela metade causa erro)
- Exclua o arquivo .aux para recuperar
Eu sei o que acontece e como me recuperar. Minha pergunta é:
Por que isso acontece?
ou melhor
Existe uma maneira de evitá-lo?
No meu documento atual, para cada erro que cometo ao escrever na última seção, tenho que excluir manualmente os arquivos .aux para recuperar. Como compilo com bastante frequência enquanto escrevo, isso é um aborrecimento e gostaria de evitá-lo.
Pelo que entendi, a saída para um arquivo .aux é armazenada em buffer. Em caso de erro, a compilação é interrompida e o buffer atual permanece sem gravação. Neste ponto, o arquivo .aux contém os pedaços de buffer já escritos, que podem quebrar em qualquer lugar, deixando definições incompletas.
Normalmente eu não trabalho com o mecanismo TeX no console, simplesmente corrijo meu erro e reinicio.
Não entendo o que desencadeia a exclusão do arquivo .aux, que, como mostra o exemplo, não funciona de maneira confiável. Possivelmente devido ao pacote biblatex ou hyperref. Se você pudesse lançar alguma luz sobre isso?
Também de interesse:
- Existe algo para controlar a exclusão do arquivo .aux após um erro?
- Existem comandos TeX/LaTeX que posso usar para liberar manualmente o buffer de saída do arquivo .aux? Eu poderia usar este comando logo antes da seção em que estou trabalhando. Dessa forma, provavelmente não terei mais que lidar com um arquivo .aux corrompido com tanta frequência.
- Existe uma opção para o programa pdflatex para que os buffers de saída sejam liberados após um erro. Na maioria dos casos o erro não afeta o arquivo .aux, portanto não há razão para não terminar de escrevê-lo. Nos casos em que isso acontecer, eu teria que excluí-lo.
Existem várias questões relacionadas aqui no StackExchange:
Responder1
Com a ajuda deQuando o arquivo aux é lido e gravado?e a gentil assistência de Barbara Beeton, consegui determinar o que está errado e como evitá-lo.
Este é o problema:
Normalmente eu não trabalho com o mecanismo TeX no console, simplesmente corrijo meu erro e reinicio.
Isto é o que eu deveria ter feito no console:
- Digite
?
+Return
para ter uma ideia do que pode ser feito. - Basta bater
Return
repetidamente até que Tex termine. - Digite
X
+Return
para finalizar a execução imediatamente. - Digite
E
+Return
para que o cursor pule para o ponto onde ocorreu o erro.
O que acontece é que o TeX armazena em buffer os comandos \write no arquivo .aux em dois estágios. No primeiro estágio, ele espera até que uma página seja enviada para acertar os números das páginas. Segundo estágio, ele espera até que considere adequado emitir uma write()
chamada de sistema, para reduzir o número de chamadas de sistema (potencialmente lentas). Este segundo buffer aparentemente não se importa, se os pedaços que ele grava no arquivo são TeX legais independentes, uma vez que ele completará o arquivo antes que a execução do TeX seja concluída de qualquer maneira.
No entanto, no ambiente do TeXShop é tentador deixar o TeX travar inacabado após um erro. Assim, o segundo soprador de saída não é liberado e o arquivo .aux possivelmente fica inacabado e em estado ilegal.
Minha conclusão pessoal disso:Sempre deixe o TeX terminar.
A suposição de que o TeX terá uma chance de terminar sua execução após ter parado por um erro era muito razoável antes dos ambientes de janela, onde se tornou fácil e normal deixar processos pendurados em segundo plano.
Coisas que poderiam ser feitas no lado do software para facilitar esse comportamento do usuário:
- Altere o comportamento do segundo buffer do Tex para emitir uma
write()
chamada de sistema em caso de erro ou para quebrar apenas em partes legais do TeX. - Ajuste o ambiente (TexShop) para limpar o arquivo .aux após a interrupção do processo ou fornecer entrada padrão para sempre finalizar o processo corretamente.
Coisas que o usuário pode fazer, além de sempre deixar o TeX terminar:
- Usar
\include{...}
. Dessa forma, os arquivos .aux das seções anteriores são fechados e finalizados no momento em que ocorre o erro. Provavelmente, o arquivo .aux da sua seção atual ainda não é grande o suficiente e nenhuma parte ilegal do TeX foi escrita. - Hackeie algo envolvendo
\immediate\closeout\@mainaux
seguido de\openout\@mainaux
uma cópia do conteúdo para que não sejam substituídos. Isso irá liberar efetivamente o buffer de saída. Não parece valer a pena o esforço.
Responder2
Acabei de experimentar o mesmo problema e não consegui encontrar nenhum código incorreto em meu arquivo tex. Acontece que o texto ofensivo estava na verdade em uma citação que acabei de adicionar ao BibText, que estava importando usando o biblatex
pacote. Deve ter havido algum tipo de caractere estranho no resumo que foi incluído quando exportei a citação do PubMed. Removi todo o resumo (já que ele não seria exibido nas referências de qualquer maneira), excluí os arquivos temporários e reconstruí meu PDF sem erros.
Responder3
Acho muito mais rápido interromper a compilação e simplesmente excluir a última linha do arquivo corrompido, onde a gravação do buffer truncado resulta em TeX incompleto/ilegal, especialmente ao trabalhar com documentos grandes e/ou depurar corrupção .aux
persistente/recorrente . .aux
Dessa forma, você pode reter a parte válida do .aux
arquivo e não precisa esperar o término da compilação.
Na maioria dos editores, basta pressionar algumas teclas para mudar o foco para o .aux
arquivo, pular para o final e excluir a última linha, para que isso possa ser feito rapidamente.
Se você preferir forçar a conclusão da compilação para que todos \write
os buffered sejam liberados e .aux
não sejam corrompidos, você pode instruir o compilador a prosseguir com os erros sem pausar a entrada do usuário com a -interaction=nonstopmode
opção, dessa forma você não precisa pressionar a tecla passado cada um deles.
Responder4
O mesmo problema que tive ao trabalhar com minha tese. Tenha cuidado com as referências que você pode usar do Google Scholar ou com alguns arquivos abrangentes que provavelmente têm um formato diferente do suporte do seu pacote bib. Fazer referências corretas pode resolver o seu problema, assim como eu resolvi corrigindo as referências.