[TxMt] smart Latex typesetting

Christoph Biela cbiela at gmail.com
Tue May 23 10:46:48 UTC 2006


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 at 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 at gmail.com





More information about the textmate mailing list