Мой документ 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
в важном смысле; он не просто добавляет пару \clearpage
s. Я думаю, правильным решением будет создать пользовательскую \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.