Проблема нумерации ToC

Проблема нумерации ToC

Мой документ LaTeX ведет себя странно. Вот его упрощенная версия:

\documentclass{article}

\begin{document}

\tableofcontents
\newpage

\addcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}

\end{document}

И в includedfile.tex:

\section{My Section Title}
Quack.

Очевидно, что в оглавлении заголовок части должен предшествовать заголовку раздела, но этого не происходит! Что не так?

решение1

Проблема задержки, о которой упоминали несколько человек, заключается в том, что TeX откладывает все \writeкоманды до \shipoutвремени. Если по какой-то причине вам нужен немедленный \write, вы можете использовать \immediate\write. Для этого вот простой новый макрос, который действует как \addcontentsline, но немедленно записывает в файл aux.

\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}

решение2

Это сложная маленькая проблема. Оказывается, \includeотличается от \inputв важном смысле; он не просто добавляет пару \clearpages. Я думаю, правильным решением будет создать пользовательскую \includeкоманду, которая будет работать почти как обычная:

\newcommand{\myinclude}[1]{\clearpage\input{#1}\clearpage}

Когда вы используете \addcontentsline, напрямую или косвенно, он записывает строку в auxфайл, говоря «запишите это и то в tocфайл». Затем он читает auxфайл и следует этой инструкции. Когда вы запускаете latexснова, tocв файле есть все необходимое, и вы получаете хорошее оглавление.

Но команда tex \writeимеет какую-то задержку (которую я не понимаю). Когда вы используете \addcontentslineнесколько раз подряд, это не имеет значения, потому что они все попадают в стек записи в правильном порядке. Но вот в чем загвоздка: когда вы используете \include, это делаетотдельный auxфайл для файла, который вы включаете инемедленнозаписывает команду в основной auxфайл, говорящую "иди посмотри в этом другом auxфайле для инструкций" (без странной задержки). Так что если вы используете \includeсразу после \addcontentsline, команда "иди посмотри в другом auxфайле" будет записанадокоманда "записать что-нибудь в tocфайл". Таким образом, все записи содержимого из включенного файла записываются первыми!

решение3

У меня это работает, когда я заменяю \includeна \input.

Я думаю, \includeэто для глав (это заставляет \clearpageили что-то в этом роде), поэтому я никогда не использую это на практике.

решение4

Попробуйте переместить строку addcontents над оглавлением:

Обновлено:Неправильный порядок возникает, если \addcontentslineнаходится на том же уровне, что и \include. Обходной путь — иметь \addcontentslineво включенном файле:

\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\include{includedfile}
\include{some-other-file}
\end{document}

содержимоеincludedfile.tex

\addcontentsline{toc}{part}{First Part of My Document}
\section{My Section Title}
Quack.

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