无需完全重新编译即可生成目录页

无需完全重新编译即可生成目录页

我有一个需要经常重新编译的文档。目前,我正在执行标准的两遍编译,其中第一遍生成 .toc 文件,第二遍然后插入它。

然而,由于我的文档编译需要几个小时,而第二遍只改变了前几页,我正在寻找一种方法来避免重新编译整个文档只是为了生成目录

笔记:

  • 我并不担心第二遍处理的其他问题,例如标签、交叉引用、、longtable\tikzmark
  • 需要书签和目录链接到相应的页面,但不要不是需要任何返回目录本身的链接。
  • 下面的 MWE 使用来自设置目录的最小页数,为 目录。这应能确保从目录到正文的书签和链接正常工作。
  • 本文件仅有的仅供内部使用,因此在目录中留下几页额外的空白页以适应文档的增长是完全可以接受的。

代码:

\def\NumberOfChapters{10}
\def\NumberOfSections{50}
\def\NumberOfPagesForTOC{14}

\documentclass{book}
\usepackage{lipsum}
\usepackage{pgffor}
\usepackage[colorlinks=true]{hyperref}

\begin{document}
\frontmatter
\pagenumbering{roman}
\tableofcontents
\cleardoublepage


%% https://tex.stackexchange.com/questions/43140/set-minimum-number-of-pages-for-toc
\foreach\x in {\value{page},...,\NumberOfPagesForTOC}{\vbox{}\newpage}% Insert up to absolute page #14.

\pagenumbering{arabic}

\mainmatter
\foreach \x in {1,...,\NumberOfChapters}{%
    \chapter{Chapter \x}
    \foreach \y in {1,...,\NumberOfSections}{%
        \section{Section \y}
        \lipsum[1-7]
    }
}
\end{document}

答案1

更新: 我的第一个解决方案很糟糕,因为书签包从第一遍开始就起作用了。这是另一个解决方案,这次使用书签和目录链接

假设这个main.tex文件

\def\NumberOfChapters{20}
\def\NumberOfSections{50}

\documentclass{book}
\usepackage{lipsum}
\usepackage{pgffor}


\usepackage[colorlinks=true]{hyperref}

\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\foreach \x in {1,...,\NumberOfChapters}{%
    \chapter{Chapter \x}
    \section{Section \x}
    \lipsum[1-7]
    \foreach \y in {1,...,\NumberOfSections}{%
        \section{Section \y}
        \lipsum[1-3]
    }
}

\end{document}

我们需要第二个maintocbook.tex文件(2 pass)

\documentclass{book}

\usepackage{pdfpages}
\usepackage[colorlinks=true]{hyperref}

\def\mtpage{1}

\begin{document}
\frontmatter
\tableofcontents

\mainmatter

\begingroup
\makeatletter
\def\contentsline#1#2#3#4{%
\ifnum #3 = \mtpage\else
\includepdf[pages={\the\numexpr\mtpage+2\relax - \the\numexpr#3+1\relax}]{main.pdf}%
\gdef\mtpage{#3}%
\fi
\phantomsection
\addcontentsline{toc}{#1}{\@gobbletwo #2}%
}
\makeatother
\input{main.toc}
\endgroup

\includepdf[pages={\the\numexpr\mtpage+2\relax-}]{main.pdf}
\end{document}

解释:

\contentsline {chapter}{\numberline {1}Chapter 1}{1}{chapter.1}

\@gobbletwo >> \long\def \@gobbletwo #1#2{} --> defined in latex.ltx

所以在我们的例子中

\@gobbletwo #2 = \@gobbletwo\numberline {1}Chapter 1 >> Chapter 1

主目录

\contentsline {chapter}{\numberline {1}Chapter 1}{1}{chapter.1}
\contentsline {section}{\numberline {1.1}Section 1}{1}{section.1.1}
\contentsline {section}{\numberline {1.2}Section 1}{2}{section.1.2}
\contentsline {section}{\numberline {1.3}Section 2}{3}{section.1.3}

算法

1st \contentsline: #3=1=\mtpage we do 
\phantomsection
\addcontentsline{toc}{#1}{\@gobbletwo #2} => \addcontentsline{toc}{chapter}{Chapter 1}

2nd \contentsline: #3=1=\mtpage we do 
\phantomsection
\addcontentsline{toc}{#1}{\@gobbletwo #2} => \addcontentsline{toc}{section}{Section 1}

3rd \contentsline: #3=2>\mtpage we include all pages before the page number #3 
that's mean from \mtpage to #3-1
but since there is 2 pages (i, ii) in frontmatter (\tableofcontents) 
the page number 1 is 3rd page of the pdf and so on, 
that's why we use \mtpage+2 to #3+1. Next we set \mtpage=#3 and restar.

相关内容