That's it thanks!!!
This is a really nice and handy thing. However, somehow this all stopped working and then I only got it working after writing.
\renewcommand{\setflag}{\newif \ifwhole \wholefalse} \setflag % was somehow needed \input{foot.tex}
Does anyone know why? Is this related to TextMate?
Thanks Christoph
On 2006-05-19, at 01:53, Charilaos Skiadas wrote:
I wanted to elaborate a bit on Jeroen's explanation for those not very familiar with the "more obsure" TeXnical commands. But first, let me bring to everyone's attention the \includeonly command. Say you have in your master document:
\include{chapter1} \include{chapter2} \include{chapter3}
and you have typeset them once, and hence the .aux files with the reference and counter information have been created. Then you want to only work on chapter 3. You can add the command: \includeonly{chapter3} before those includes, and then, when you typeset, only chapter 3 gets typeset, BUT the .aux files from the other chapters are being used. In other words, this will STILL be typeset as "chapter 3", instead of becoming "chapter 1", keeping things just a bit more neat. So one way to arrange things is to have the command as:
\includeonly{ chapter1, chapter2, chapter3, }
and then to comment out some of these lines depending on what chapters you want typeset.
Ok, on to Jeroen's explanation, which basically answers the question: "How to have a file that can be typeset normally, but that when include'd into other documents it will compile just fine." The question is in essence: How can I make the header and footer stuff of a document conditional as to whether the document is included or not. The idea is to create two extra files, a header.tex and a footer.tex. The header should have the following:
\providecommand{\setflag}{\newif \ifwhole \wholefalse} \setflag \ifwhole\else \documentclass[11pt,a4paper,twoside,openright]{report} % your header stuff here, usepackages etc \begin{document} \fi
We'll explain what all this does in a minute. Then the footer should contain:
\ifwhole\else \end{document} \fi
Finally, your individual "chapter" files should have the following form:
\input{header.tex} % your chapter text here \input{footer.tex}
while your master document should have the form:
\input{header.tex} \renewcommand{\setflag}{\newif \ifwhole \wholetrue} % your chapter includes here: \include{chapter1} \include{chapter2} ... \renewcommand{\setflag}{\newif \ifwhole \wholefalse} \input{footer.tex}
Ok, now you are set. Let's explain what has happened here:
Let's start with the text in header.tex. The first line tells TeX to provide the command \setflag with definition {\newif\ifwhole \wholefalse}. \providecommand checks to see if the command is already present, and if it is not it creates it. When we compile this chapter file directly, this is the first command encountered, so it hasn't been created yet, so it gets created. the second line then executes it.
Ok, so what does \setflag do? It runs the commands \newif\ifwhole \wholefalse. \newif is a TeX primitive. What it does is kind of complicated: It takes one argument, which should be of the form \iffoo. In this case it is \ifwhole (we could also have written this as \newif {\ifwhole}). So, when \newif\iffoo is run, the result is that three new commands are being defined. Two of these commands are \footrue and \foofalse, and they just set some "magical variable" to true or false respectively. The third new command is the command \iffoo, which is an "if" command an returns true or false depending on whether \footrue or \foofalse is the last command executed.
In out case, after the triple \ifwhole,\wholetrue,\wholefalse has been defined, our program runs \wholefalse. So this means that when \ifwhole gets called in the next line, it will return true.
Ok, let's move to this next line now. TeX "if" clauses have exactly this syntax: \ifclause % stuff that happens when \ifclause is true \else % stuff that happens when \ifclause is false \fi
In our case, \ifwhole is now false, hence the entire \else block gets executed, and we get our header, and later on our footer, hence the document can be compiled.
Now let's see what happens when we are in our master document. Then we again include the header in the same way. Then we have the \renewcommand that redefines the \setflag command to be returning \wholetrue when executed. then we go on to include the various chapters. When header.tex in loaded in them, the \providecommand will not do anything since \setflag has already been defined, hence its definition with \wholetrue is the one that will be used. This now means that the \ifwhole test succeeds, hence the \else part is not executed, so the header data (and similarly the footer data) does not get inserted again (avoiding the disaster that would arise if it did).
Finally, after all the chapters have been included, we redefine the command again to make sure that the footer gets inserted. (I guess you could have directly used \end{document} in the master file instead of trying to include the footer file.)
One little question that might have arisen is why I used \input instead of \include. The reason is that by design (don't ask me why, I don't know) you cannot have nested \include's, while you could have nested \input's. The difference between the \input'ed files and the \include'd files is that the \include'd files generate their own .aux files, while the \input'ed files don't. I am guessing pdfsync might also not work with \input'ed files, but I haven't tested this.
Sorry for the long post, I hope it was interesting to some people.
Haris
For new threads USE THIS: textmate@lists.macromates.com (threading gets destroyed and the universe will collapse if you don't) http://lists.macromates.com/mailman/listinfo/textmate
~~~~~ Christoph Biela
cbiela@gmail.com