Meu documento LaTeX está agindo de forma estranha. Aqui está uma versão simplificada:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\addcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}
\end{document}
E em includedfile.tex
:
\section{My Section Title}
Quack.
É claro que, no índice, o título da parte deveria preceder o da seção, mas isso não acontece! O que está errado?
Responder1
O problema de atraso que várias pessoas mencionaram é que o TeX atrasa todos \write
os comandos até \shipout
o momento. Se por algum motivo você precisar de um imediato \write
, poderá usar \immediate\write
. Para esse fim, aqui está uma nova macro simples que funciona como \addcontentsline
, mas grava no arquivo aux imediatamente.
\documentclass{article}
\newcommand\immediateaddcontentsline[3]{%
\begingroup
\let\origwrite\write
\def\write{\immediate\origwrite}%
\addcontentsline{#1}{#2}{#3}%
\endgroup
}
\begin{document}
\tableofcontents
\newpage
\immediateaddcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}
\end{document}
Responder2
Este é um pequeno problema complicado. Acontece que isso \include
difere de \input
uma forma importante; não apenas adiciona alguns \clearpage
s. Acho que a solução certa é criar um \include
comando personalizado que funcione quase como o normal:
\newcommand{\myinclude}[1]{\clearpage\input{#1}\clearpage}
Quando você usa \addcontentsline
, direta ou indiretamente, ele escreve uma linha no aux
arquivo dizendo "escreva isso e aquilo no toc
arquivo". Então ele lê o aux
arquivo e segue essa instrução. Quando você executa látexde novo, o toc
arquivo contém o material certo e você obtém um bom índice analítico.
Mas o \write
comando tex tem algum tipo de atraso (que não entendo). Quando você usa \addcontentsline
várias vezes seguidas, não importa porque todas elas vão para a pilha de gravação na ordem correta. Mas aqui está a parte complicada: quando você usa \include
, faz umseparado aux
file para o arquivo que você está incluindo eimediatamenteescreve um comando no aux
arquivo principal dizendo "vá dar uma olhada naquele outro aux
arquivo para obter instruções" (sem nenhum atraso estranho). Portanto, se você usar \include
imediatamente após um \addcontentsline
, o comando "vá olhar para o outro aux
arquivo" será escritoanteso comando "escrever algumas coisas no toc
arquivo". Assim, todas as entradas de conteúdo do arquivo incluído são escritas primeiro!
Responder3
Funciona para mim quando substituo \include
por \input
.
Acho que \include
é para capítulos (força um \clearpage
ou algo parecido), então nunca uso na prática.
Responder4
Tente mover a linha addcontents acima do índice:
Atualizada:a ordenação incorreta ocorre se \addcontentsline
estiver no mesmo nível que \include
. Uma solução alternativa é ter \addcontentsline
no arquivo incluído:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\include{includedfile}
\include{some-other-file}
\end{document}
conteúdo deincludedfile.tex
\addcontentsline{toc}{part}{First Part of My Document}
\section{My Section Title}
Quack.