[texhax] tex goes into infinite loop

Ross Moore ross at maths.mq.edu.au
Mon Oct 11 02:11:46 CEST 2004

Hello Tom,

On 10/10/2004, at 11:19 PM, tomfool at as220.org wrote:

>
> Can anyone help me understand why the following doesn't work?

I see 2 distinct problems:

>
>   \documentclass[twocolumn]{article}
>
>   \makeatletter
>   \newbox\IN at topfig
>   \newbox\IN at topfiga
>   \newtoks\IN at output
>   \global\IN at output\expandafter{\the\output}

>   \global\output{%
>     \expandafter\the\IN at output%
^^^^^^^^^^^ --------  this is wrong, surely!

>     \ifvoid\IN at topfig \else\unvbox\IN at topfig\fi%
>     \global\setbox\IN at topfig \vbox{\hbox{Hola!}}
>   }

Firstly, don't you want here either:

\global\output\expandafter{\the\IN at output ... }

or simply just

\global\output{\the\IN at output ... }

since \IN at output  is constant, so expanding it can
be delayed until you are actually going to use it.

Secondly, your use of \unvbox  places material back onto
the vertical-list, every time the \output routine is called
(except perhaps for the first time).
Hence TeX will *always* think that there is more work to do.

In short, you have created an algorithm for which the stopping
criterion is never satisfied. Hence it keeps looping through
the \output, never able to stop...

>   \makeatother
>
>   ...
>
> When I try to compile, TeX goes into an infinite loop.  Not that I've

... as you observe.

> waited long enough to confirm it's infinite, but it's long, and more
> to the point, silent:

But it's actually a little more complicated than this, in that LaTeX's
own \output routine (which you use as \IN at output) actually gets caught
in a loop, trying to clear out the new stuff.
This prevents TeX from ever getting to \shipout anything.

> box that I'm not understanding?  This works fine if I \unvbox a
> different box than the one I \setbox, so it isn't the commands
> themselves that aren't working, but somehow \setboxing a box right
> after I've \unvboxed it in an \output routine is a problem.  Can
> anyone tell me what I've done wrong here?

It looks like you are trying to place constant material on every page,
by having the \output routine from the previous page place it there.
Apart from the logical flaw in this approach, whereby TeX can never
finish, working with \output  routines in this way is *very* tricky.

It's much easier to redefine \shipout to position the new material
as a box of zero size. This is what the  {everyshi}  package does.
Have you tried this ?
Is there a reason that isn't suitable for your needs ?

>
> Many thanks,

Hope this helps,

Ross Moore

>
> -tom
>
>  ------------------------
>  tomfool at as220 dot org
>  http://sgouros.com
>  http://whatcheer.net
>
> _______________________________________________
> TeX FAQ: http://www.tex.ac.uk/faq
> Mailing list archives: http://tug.org/pipermail/texhax/
>
> Automated subscription management:
> http://tug.org/mailman/listinfo/texhax
> Human mailing list managers: postmaster at tug.org
>
------------------------------------------------------------------------
Ross Moore                                         ross at maths.mq.edu.au
Mathematics Department                             office: E7A-419
Macquarie University                               tel: +61 +2 9850 8955
Sydney, Australia                                  fax: +61 +2 9850 8114
------------------------------------------------------------------------