Mi documento LaTeX está actuando de manera extraña. Aquí hay una versión simplificada:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\addcontentsline{toc}{part}{A Part of My Document}
\include{includedfile}
\end{document}
Y en includedfile.tex
:
\section{My Section Title}
Quack.
Claramente, en el índice, el encabezado de la parte debe preceder al de la sección, ¡pero no es así! ¿Qué ocurre?
Respuesta1
El problema del retraso que varias personas han mencionado es que TeX retrasa todos \write
los comandos hasta \shipout
el momento. Si por alguna razón necesita un correo electrónico inmediato \write
, puede utilizarlo \immediate\write
. Con ese fin, aquí hay una nueva macro simple que actúa como \addcontentsline
, pero escribe en el archivo auxiliar inmediatamente.
\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}
Respuesta2
Este es un pequeño tema complicado. Resulta que \include
se diferencia de \input
en un aspecto importante; no solo agrega un par de \clearpage
s. Creo que la solución correcta es crear un \include
comando personalizado que funcione casi como el habitual:
\newcommand{\myinclude}[1]{\clearpage\input{#1}\clearpage}
Cuando usas \addcontentsline
, directa o indirectamente, escribe una línea en el aux
archivo que dice "escribe esto y aquello en el toc
archivo". Luego lee el aux
archivo y sigue esa instrucción. Cuando corres látexde nuevo, el toc
archivo tiene lo correcto y obtienes una buena tabla de contenido.
Pero el \write
comando tex tiene algún tipo de retraso (que no entiendo). Cuando lo usas \addcontentsline
varias veces seguidas, no importa porque todos van a la pila de escritura en el orden correcto. Pero aquí está la parte complicada: cuando usas \include
, genera unaseparado aux
archivo para el archivo que está incluyendo yinmediatamenteescribe un comando en el aux
archivo principal que dice "ve a buscar aux
instrucciones en ese otro archivo" (sin demoras extrañas). Entonces, si usa \include
inmediatamente después de un , se escribe \addcontentsline
el comando "ir a mirar el otro archivo".aux
antesel comando "escribir algunas cosas en el toc
archivo". ¡Así que todas las entradas de contenido del archivo incluido se escriben primero!
Respuesta3
A mí me funciona cuando lo reemplazo \include
por \input
.
Creo que \include
es para capítulos (obliga a \clearpage
algo así), así que nunca lo uso en la práctica.
Respuesta4
Intente mover la línea addcontents encima de la tabla de contenido:
Actualizado:Se produce un pedido incorrecto si \addcontentsline
está en el mismo nivel que \include
. Una solución alternativa es tener \addcontentsline
en el archivo incluido:
\documentclass{article}
\begin{document}
\tableofcontents
\newpage
\include{includedfile}
\include{some-other-file}
\end{document}
contenidos deincludedfile.tex
\addcontentsline{toc}{part}{First Part of My Document}
\section{My Section Title}
Quack.