Entrada manual del archivo de tabla de contenido (\jobname.toc) vacío en algunas circunstancias

Entrada manual del archivo de tabla de contenido (\jobname.toc) vacío en algunas circunstancias

De acuerdo aUsando archivos externos .toc, el siguiente archivo debería mostrar la tabla de contenidos dos veces:

\documentclass{report}
\begin{document}
\tableofcontents
\chapter*{Contents (manual input)}
\makeatletter
\input{\jobname.toc}
\makeatother
\chapter{Foo}
\section{Bar}
\end{document}

pero la entrada manual de \jobname.tocestá vacía.

Si \jobname.tocexiste (por ejemplo, después de una primera compilación del .texarchivo anterior), esta entrada manual proporciona el resultado esperado (no vacío) tan pronto como se elimina o comenta:

  • cualquiera \tableofcontents,
  • o \chapter{Foo}.

¿Entiendes lo que está pasando?

Respuesta1

La pregunta vinculada trataba sobre cómo ingresar un .tocarchivo relacionado con undiferentedocumento.

En el momento en que lo usa, \input{\jobname.toc}seguramente está vacío, porque \tableofcontentslo ingresa y luego abre el archivo para escribir en él, borrándolo así.

Luego, el .tocarchivo se vuelve a llenar al finalizar el documento.

Eche un vistazo al shorttocpaquete que debería resolver su problema real.

Sin embargo, es fácil resolver el problema retrasando la apertura del archivo para escribirlo al final del documento.

\documentclass{report}

\usepackage{atveryend}

\makeatletter
\def\@starttoc#1{%
  \begingroup
    \makeatletter
    \@input{\jobname.#1}%
    \if@filesw
      \AfterLastShipout{%
        \@ifundefined{tf@#1}{%
           \expandafter\newwrite\csname tf@#1\endcsname
           \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
        }{}%
      }%
    \fi
    \@nobreakfalse
  \endgroup}
\makeatother

\begin{document}

\tableofcontents
\chapter*{Contents (manual input)}
\InputIfFileExists{\jobname.toc}{}{Missing toc}

\setcounter{tocdepth}{0}
\renewcommand{\contentsname}{Short contents}
\tableofcontents

\chapter{Foo}
\section{Bar}

\end{document}

Verás que puedes ingresar la tabla de contenido tantas veces como quieras; \InputIfFileExistsSe debe utilizar, porque .toces posible que aún falte el archivo.

Respuesta2

 \tableofcontents

ingresa el toc pero luego lo abrepara la escrituraentonces esto elimina el original, entonces usted ingresa un archivo mientras escribe en él, por lo que está sujeto al almacenamiento en búfer de archivos del sistema operativo.

Respuesta3

Si usa la memoirclase (una clase expandida booky report), el archivo toc no se elimina ni se vuelve a llenar hasta el final del documento, por lo que puede colocar tantos tocs como desee en todo el documento.

información relacionada