[texhax] optionally compiling parts of a document
Neal H. Walfield
neal at walfield.org
Sun Dec 2 14:13:47 CET 2012
Hi,
The document that I'm working on now takes about a minute to typeset.
I want to improve this by only compiling a subset of the chapters. I
know about breaking the document into multiple files and using
\includeonly to only select a subset of the chapters, but I like
having a single file. I thought that I could get the same effect
using the filecontents package. I've written some macros that appear
to do what I want, but the file inclusion results in an "infinite"
loop. Here's the output of the attached example:
LaTeX Warning: Overwriting file `./b-segment-1.tex'.
LaTeX Warning: Overwriting file `./b-segment-2.tex'.
(./b-segment-2.tex
! LaTeX Error: \include cannot be nested.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.1
I think that the problem has something to do with the interaction of
\filecontents and \include. If I replace the \include with just some
text, it seems to work fine.
Thanks for any help!
Neal
Here is a minimal example using my macros:
\documentclass{report}
\usepackage{lipsum}
\usepackage{filecontents}
\usepackage{tikz}
% The segments to include in the document. If empty or undefined, all
% segments are included.
\def\segmentsToInclude{chapter 2, 3}
\def\segmentcount{0}
% Create a segment of text, which is only included in the compiled
% document if its name or segment index is in \segmentsToInclude.
%
% \begin{segment}{name}
% text.
% \end{segment}
%
% If name is empty, then a name will be assigned automatically.
\newenvironment{segment}[1]{%
% #1 is optional in the sense that it can be empty, but it is
% required because otherwise TeX starts to convert the text into
% tokens, which we need to avoid.
\xdef\segmentname{#1}%
%
% Increment the segment count macro.
\pgfmathparse{\segmentcount + 1}
% Save the result. Note: \pgfmathresult is 'XXX.0'. Strip the
% trailing .0.
\def\nozerohelper##1.0{##1}%
\def\nozero##1{\expandafter\nozerohelper##1}%
\xdef\segmentcount{\nozero{\pgfmathresult}}%
%
% If the provided segment name is empty, use the segment's offset.
\def\empty{}%
\ifx\segmentname\empty%
\xdef\segmentname{\segmentcount}%
\fi%
%
% The segment's filename.
\xdef\segmentsfilename{\jobname-segment-\segmentcount}%
%
% Write out the segment's contents.
\filecontents{\segmentsfilename.tex}%
}{%
% Include the segment if appropriate.
\def\empty{}%
\def\doinclude{\include{\segmentsfilename}}%
%\def\doinclude{including \segmentsfilename}%
\expandafter \ifx \csname segmentsToInclude\endcsname \relax
% \segmentsToInclude is undefined. Include the segment.
\doinclude%
\else%
\ifx\segmentsToInclude\empty%
% \segmentsToInclude is empty. Include the segment.
\doinclude%
\else%
\foreach \i in \segmentsToInclude {%
% Determine whether to include the segment.
\def\includep{}%
\ifx \i\segmentname%
% The segment's name is in \segmentsToInclude. Include the
% segment.
\def\includep{1}%
\fi%
\ifx \i\segmentcount%
% The segment's index is in \segmentsToInclude. Include the
% segment.
\def\includep{1}%
\fi%
%
\ifx \includep\empty%
\else%
\doinclude%
\breakforeach%
\fi%
}%
\fi%
\fi%
}
\begin{document}
\begin{segment}{}
\chapter{One}
Start of chapter one.
\lipsum[1-10]
End of chapter one.
\end{segment}
\begin{segment}{chapter 2}
\chapter{Two}
Start of chapter two.
\lipsum[11-20]
End of chapter two.
\end{segment}
\begin{segment}{}
\chapter{Three}
Start of chapter three.
\lipsum[21-30]
End of chapter three.
\end{segment}
\end{document}
More information about the texhax
mailing list