subimport 和 includeonly

subimport 和 includeonly

假设我有一个结构如下的文档。

main.tex
    + ch1
        - ch.tex
        - s1.tex
        - s2.tex
    + ch2
        - ch.tex
        - s1.tex
        - s2.tex

这里,*.tex是 LaTeX 文件,和ch1ch2目录。

% 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} 之后出现任何内容。

相关内容