假设我有一个结构如下的文档。
main.tex
+ ch1
- ch.tex
- s1.tex
- s2.tex
+ ch2
- ch.tex
- s1.tex
- s2.tex
这里,*.tex
是 LaTeX 文件,和ch1
是ch2
目录。
% main.tex
\documentclass{article}
\usepackage{import}
\includeonly{ch1/ch}
\begin{document}
\subimport{ch1/}{ch}
\subimport{ch2/}{ch}
\end{document}
% ch1/ch.tex
\input{s1}
\input{s2}
% ch1/s1.tex
Section 1.1
% ch1/s2.tex
Section 1.2
% ch2/ch.tex
\input{s1}
\input{s2}
% ch2/s1.tex
Section 2.1
% ch2/s2.tex
Section 2.2
不幸的是,这会编译整个文档,而不仅仅是第 1 章。我可能完全做错了,但我试图执行以下操作。我为每一章设置了一个单独的文件夹;在每个章节文件夹中,我都有一个ch.tex
管理整个章节的文件,以及包含该章节主要部分的文件s1.tex
、、s2.tex
...。我使用 import 命令是因为我希望能够在其中使用相对路径ch.tex
(用于输入部分文件,以及包括图形等)。但是,为了加快编译速度,我希望能够使用\includeonly
。有没有办法同时获得import
和的优势\includeonly
?像这样构建大型文档的最佳实践是什么?(我很好奇最佳实践,即使这意味着放弃相对路径或includeonly
。根据我阅读的其他帖子,专家们似乎更include
喜欢import
[如何使用导入包?,将大文档拆分为多个文件,如何使“\include”-d 文件中的“\input”使用正确的当前路径?]——这有什么好理由吗?)我看到一篇帖子(使用导入包获取 \includeonly 功能) 我希望它能给我答案,但那篇文章最终却回避了实际问题。
答案1
这是我多年来构建的结构的概要。
每个章节都有一个命名良好的目录,contents.tex
其中包含该章节所需的任何其他文件。
在我的序言中macros.tex
:
% placeholders for commands often renewed
\newcommand{\here}{here}
\newcommand{\mychaptername}{whatever}
在主驱动程序中book.tex
:
\include{macros}
%%-%%
%\includeonly{
%Preface/contents,
%FermiProblems/contents,
% ...
%}
%
\begin{document}
\renewcommand{\here}{Preface}
\renewcommand{\mychaptername}{Preface}
\include{\here/contents}
\renewcommand{\here}{FermiProblems}
\renewcommand{\mychaptername}{Calculating on the Back of an Envelope}
\include{\here/contents}
% and so on ...
然后,在一个典型的 contents.tex
% FermiProblems/contents.tex
%
\chapter{\mychaptername}
\label{\here}
% ...
\includegraphics[width=40mm]{\here/fermi_stamp.jpg}
% ...
\begin{mytikz}
\input{\here/carbonfootprint}
\end{mytikz}
% ...
记住使用\here
引用的文件来contents.tex
负责在当前目录中找到这些文件。
由于只有十几个章节并且很少更改,因此剪切和粘贴每个章节的三行代码块比编写宏来完成工作更容易。
我发现这个结构非常强大。我的前言中还有很多内容,甚至可以从一个地方管理添加一些复杂的功能(将选定的材料写入其他文件以供以后编译)。
对于您刚刚开始的大型项目,我建议用您自己的宏包装一些标准LaTeX
构造(例如mytikz
上面的环境),以便您以后可以用更少的魔法来改变它们的行为,从而减少本网站上的问题。
编辑:要仅编译一个章节,请使用章节目录中的以下驱动程序。
\documentclass[pdftex,12pt]{book}
\input{../macros}
\begin{document}
\renewcommand{\here}{.}
\renewcommand{\mychaptername}{Test}
\include{\here/contents}
\end{document}
答案2
我更关心的是多个 \documentclass \begin{document} 和 \end{document} 命令会发生什么。除 preamble.tex 外,以下所有内容均可正常运行
\documentclass{book}
\usepackage{mathtools}% for example
\newcommand{\preambleflag}{}
\begin{document}% you can only do this once
这是 master.tex
\input{preamble}
\tableofcontents
\input{chapter1}
\input{chapter2}
\end{document}
这是 chapter1.tex
\csname @ifundefined\endcsname{preambleflag}%
{\input{preamble}%
\edef\masterswitch{end}}%
{\edef\masterswitch{@gobble}}%
\chapter{I started life as a child}
yada yada yada
\csname \masterswitch\endcsname{document}%
chapter2.tex 几乎完全相同
\csname @ifundefined\endcsname{preambleflag}%
{\input{preamble}%
\setcounter{chapter}{1}% will be incrremented before use
\edef\masterswitch{end}}%
{\edef\masterswitch{@gobble}}%
\chapter{I started life as a child}
yada yada yada
\csname \masterswitch\endcsname{document}%
对于除序言之外的所有内容,您可以使用 \include 代替 \input。
第一个 \csname 只是为了避免必须添加 \makeatletter \makeatother。最后一个是为了避免在 \end{document} 之后出现任何内容。