Entrada manual do arquivo do índice (\jobname.toc) vazio em algumas circunstâncias

Entrada manual do arquivo do índice (\jobname.toc) vazio em algumas circunstâncias

De acordo comUsando arquivos externos .toc, o arquivo a seguir deverá exibir o índice duas vezes:

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

mas a entrada manual de \jobname.tocestá vazia.

Se \jobname.tocexistir (por exemplo, após uma primeira compilação do .texarquivo anterior), esta entrada manual fornece o resultado esperado (não vazio) assim que for removido ou comentado:

  • qualquer \tableofcontents,
  • ou \chapter{Foo}.

Você entende o que está acontecendo?

Responder1

A pergunta vinculada era sobre como inserir um .tocarquivo relacionado a umdiferentedocumento.

No momento em que você utiliza \input{\jobname.toc}ele certamente está vazio, pois \tableofcontentso insere e depois abre o arquivo para escrever nele, limpando-o assim.

O .tocarquivo é então preenchido novamente no documento final.

Dê uma olhada no shorttocpacote que deve resolver seu problema real.

Porém, é fácil resolver o problema, atrasando a abertura do arquivo para escrita no documento final.

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

Você vê que pode inserir o índice quantas vezes quiser; \InputIfFileExistsdeve ser usado, porque o .tocarquivo ainda pode estar faltando.

Responder2

 \tableofcontents

insere o toc, mas depois o abrepara escreverentão isso exclui o original, então você insere um arquivo enquanto grava nele, então você está sujeito ao buffer de arquivos do sistema operacional.

Responder3

Se você usar a memoirclasse (uma classe expandida booke report) o arquivo toc não será excluído e preenchido novamente até o final do documento, então você pode colocar quantos tocs quiser ao longo do documento.

informação relacionada