我对 TeX 还很陌生,正在写一本书(使用book
document 类),并使用 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
与或等编程语言相反,Pascal
LaTeX 基本上是一个线性编译过程,也就是说,它不能看得太远才能看到下一章的内容。
事实上,大多数编译器实际上都是多遍编译器,它们只是多次进行编译并假装只运行一次。
一般规则是
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 的“目录”功能