为什么我必须在 TeXShop 中排版多次?

为什么我必须在 TeXShop 中排版多次?

我对 TeX 还很陌生,正在写一本书(使用bookdocument 类),并使用 TeXShop。我知道 TeX 需要多次传递才能生成所需的所有中间文件(索引、目录、词汇表等),但为什么当我“排版”文档时它不知道哪些中间文件已过期?

一个简单的例子:

% --- FRONT MATTER ---
\frontmatter
% Title
\input{./pre/title.tex}
% Preface
\chapter*{Preface}
\input{./pre/preface.tex}
% Contents
\tableofcontents
% --- MAIN MATTER ---
\mainmatter
% Introduction
\chapter*{Introduction}
\addcontentsline{toc}{chapter}{Introduction}
\input{./pre/introduction.tex}
.
.
.
% --- BACK MATTER ---
\backmatter
\addcontentsline{toc}{chapter}{test}
\addtocontents{toc}{\vspace{\normalbaselineskip}}
    % Glossary
\printglossaries
\addcontentsline{toc}{chapter}{Glossary}

在上面的例子中,如果我删除该行\addcontentsline{toc}{chapter}{test}并按+t来排版文档,但“测试”章节仍然在内容中,我必须再次排版才能更正它。

这是一个非常成熟的项目,由非常了解 makefile 和源依赖关系的程序员编写,这些都是已解决的问题,并且应该不难知道中间文件(例如文件)何时.toc过期。如果这是一个错误,或者只是工作流程中尚未改进的粗糙边缘,那么没关系,我可以接受,或者可能只是用户和开发人员认为它并不重要。但是,在我看来,更有可能的是,我只是做错了,或者有一个更好/不同的工作流程,或者我可以在某处添加一个命令行选项,可以避免这些问题。

最强力的解决方案是不断排版,直到中间文件/输出文件都不再改变,但这显然不是一个非常有效的过程,它应该由 TeX 以更智能的方式在内部完成。我该如何解决这个问题?

答案1

C与或等编程语言相反,PascalLaTeX 基本上是一个线性编译过程,也就是说,它不能看得太远才能看到下一章的内容。

事实上,大多数编译器实际上都是多遍编译器,它们只是多次进行编译并假装只运行一次。

一般规则是

pdflatex foo

bibtex   foo  %(or biber foo)
makeindex foo %( if there is an index (exception: `imakeidx` can do this automatically
makeglossaries foo %If needed
pdflatex foo %again
pdflatex foo %3rd run --> now all should be ok!

如果预计编译时间过长,请使用宏\includeonly{foo1, foo2, foo100}

\include{foo1}
\include{foo2}
.
.
.
\include{foo100}

用于包含子文件。(还有一个excludeonly包)

\addcontentsline我已经回答了(其他用户也回答了)这个问题背后发生的事情以及 ToC 的更深入的细节:模仿 LaTeX 的“目录”功能

相关内容