Problema de numeração ToC

Problema de numeração ToC

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 \writeos comandos até \shipouto 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 \includedifere de \inputuma forma importante; não apenas adiciona alguns \clearpages. Acho que a solução certa é criar um \includecomando 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 auxarquivo dizendo "escreva isso e aquilo no tocarquivo". Então ele lê o auxarquivo e segue essa instrução. Quando você executa látexde novo, o tocarquivo contém o material certo e você obtém um bom índice analítico.

Mas o \writecomando tex tem algum tipo de atraso (que não entendo). Quando você usa \addcontentslinevá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 auxfile para o arquivo que você está incluindo eimediatamenteescreve um comando no auxarquivo principal dizendo "vá dar uma olhada naquele outro auxarquivo para obter instruções" (sem nenhum atraso estranho). Portanto, se você usar \includeimediatamente após um \addcontentsline, o comando "vá olhar para o outro auxarquivo" será escritoanteso comando "escrever algumas coisas no tocarquivo". Assim, todas as entradas de conteúdo do arquivo incluído são escritas primeiro!

Responder3

Funciona para mim quando substituo \includepor \input.

Acho que \includeé para capítulos (força um \clearpageou 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 \addcontentslineestiver no mesmo nível que \include. Uma solução alternativa é ter \addcontentslineno 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.

informação relacionada