55

It is an unfortunate reality that one must compile a LaTeX file several times in order to get all labels and citations correct. As far as I know, one should go on compiling as long as TeX warns that that "labels may have changed", and two or three passes may not be enough.

Is it possible to write a LaTeX document that never stabilizes, i.e., no matter how many times I compile it, it will go on complaining that labels have changed?

I am thinking about something like a \pageref{something} written in a large font that moves from page 9 to page 10, which requires longer to typeset and thus makes the corresponding label change page and so on ad infinitum.

15
  • 3
    We will need a minimal example.
    – Joseph Wright
    Oct 6 '11 at 11:37
  • 12
    @JosephWright That's the question! :)
    – egreg
    Oct 6 '11 at 11:50
  • 1
    Due to the halting problem, it isn't even possible to find out, if the document will eventually compile without label-changes.
    – FUZxxl
    Oct 6 '11 at 12:01
  • 6
    @FUZxxl That isn't true: That just states that there exists a class of problems exists for which you cannot prove if they will halt or not. Not all problems belong to that class. For example, you can mathematically prove that while(n>0){n++;} will go forever, and that n=10;while(n<10){n--}; will halt.
    – Canageek
    Jan 22 '12 at 20:47
  • 1
    and of course, there's the answer in the tex faq ... which just says "tweak it". a real answer would be welcome. Nov 8 '12 at 15:25
49

Having an explicit \ifthenelse test makes the document look like the looping is intentional. It is possible for the cross referencing not to converge even if there is no explicit conditional switching within the file. This document for example.

\documentclass{article}

\pagenumbering{Roman}
\begin{document}

a\clearpage b\clearpage c\clearpage

\begin{figure}[!t]
\framebox(200,430){}
\caption{a figure to take up space}
\end{figure}


Some interesting text about  something in Section \ref{x},
which starts on page \pageref{x}.

\section{zzz\label{x}}
The text of an interesting section.
\end{document}

Or this version using arabic proportional numbers

\documentclass[a5paper]{article}
\usepackage{cfr-lm}
\renewcommand\shapedefault{it}
\begin{document}

\section{Introduction}

\title{test}

\tableofcontents

\clearpage

\section{Zzz}
more text\\
more text

\subsection{Zzzz}
more text\\
more text\\
more text

\subsection{Zzzzz}
more text\\
more text\\
more text\\
more text\\
more text\\
more text

\subsection{Zzzzzz}
more text\\
more text

There is some text, in
Section~\ref{z} on page~\pageref{z}.
That has a, b, c.

\section{ZZZ\label{z}}
A, B, C.

\end{document}
9
  • 2
    Cool, that's exactly what I was looking for. I hope @RoelofSpijker won't mind if I accept this answer instead. Oct 30 '12 at 14:01
  • 17
    For those who wonder and are too lazy to compile: this crucially relies on the fact that in roman numerals, the page number IV takes more space than the page number V. This wouldn't work with Arabic page numbers, since increasing page numbers take increasing space. Aug 7 '14 at 22:48
  • 1
    @yo' are you sure? that seems unlikely, unless you have a funky font where 9 is wider than 10. Sep 17 '19 at 9:21
  • 1
    @DavidCarlisle Ouch. Right, sorry that's my bad.
    – yo'
    Sep 17 '19 at 9:32
  • 3
    @yo' there are certainly fonts with 0 wider than 1, which could be used.... Sep 17 '19 at 9:52
37

Quickly testing something, this seems to give the warning each time it is compiled.

\documentclass{article}
\usepackage{ifthen}
\begin{document}
\newcommand{\tes}[1]{\ifthenelse{\equal{#1}{1}}{\Huge A}{\small A}}
\vspace*{.95\textheight}
\tes{\pageref{test}}
\label{test}
\end{document}

So it seems that it is possible. Basically, \tes puts a huge A in front of the label if the label is on page 1, moving its location to page 2. If it's on page 2, \tes puts a small A in front of it instead, moving it back to page 1. Changed the code a little bit, no longer needs lipsum, just uses a vspace now. If you just run latex file.tex you will see the output switches between a 1 page dvi and a 2 page dvi after each run.

7
  • 1
    The output is different each time, the A might have the same size, but it is not on the same page. The output switches between having 0 and 1 blank pages prior to the Huge A. I would not call that stable at all. Oct 6 '11 at 11:56
  • 1
    As a matter of fact, thats incorrect. The A also switches between Huge and small size. Change the capital A to a lowercase a in the else branch to see this a little more clearly. Oct 6 '11 at 11:59
  • 6
    Now someone should put this into latexmk and watch it run forever.
    – Canageek
    Jan 22 '12 at 21:23
  • 3
    @Canageek: I got 'pdflatex' needed too many passes after latexmk compiled it five times. May 1 '12 at 18:48
  • 1
    @MartinScharrer Good to know that there is a built in safety for that.
    – Canageek
    May 2 '12 at 5:33
19

I accidentally created such a document for real. I used biblatex-icomp. Two consecutive citations of the same source happened to be in the vicinity of a page break. Then apparently the following happened (citing Paul Stanley's accurate description):

  1. On the first run the citation seems to fit on the first page, so the aux file records "this citation was on page 1".

  2. Next time round, biblatex looks at this, and says "OK, that fit on page 1, so I'll use ibid". Unfortunately, doing that forces the citation onto the next page, so this time the aux file records: "citation was on page 2". And biblatex (which is using "old information" about where the citation appears) wrongly prints the citation as an "ibid".

  3. All would be well if the citation stayed on page 2, because biblatex would put things right next time it ran and it would get back in sync. But in fact next time, because a full citation is used, it moves back to page 1! So this time you end up with a full citation on page 1.

  4. And next time ... you get the picture.

A working example and Paul Stanley's explanation can be found at the question Avoid infinite compiler passes with biblatex ibid citation styles?

8

For the fun of it. See also The LaTeX runs (with varioref) never settle down to a stable final state.

\documentclass[a4paper]{article}
\usepackage{geometry}

\begin{document}

\pagenumbering{Roman}
I\clearpage
II\clearpage
III\clearpage
IV\clearpage
V\clearpage
VI\clearpage
VII\clearpage

\section{foo}

xxxx xxxx 
xxxx xxxx 
xxxx xxxx 
xxxx xxxx 
xxxx xxxx 
xxxx xxxx xxxx xx
See section on page~\pageref{bar}

\vspace*{17.4cm}

\section{bar}\label{bar}

Where am I ?

\end{document}
1
  • 1
    ah sorry, I had not seen that Roman numerals were also in use in @DavidCarlisle answer from 2012. Here VIII has two more characters than IX. With monotype font, would be easier yet.
    – user4686
    Jan 22 '16 at 16:57
3

Based on @DavidCarlisle 's answer (which relies on roman page numbers being used) and his comment, I have created a document with arabic page numbers:

\documentclass[11pt]{article}
\usepackage[proportional]{libertine}

\begin{document}

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

There is nothing of interest on this page.\clearpage

\begin{figure}[!t]
\centering
\framebox(260,420){}
\caption{A figure to take up space}
\end{figure}

Here is some text referring to something in section \ref{mylabel} (which starts on page \pageref{mylabel}).

\section{A very interesting section\label{mylabel}}

The text of an interesting section.

\end{document}

The font used in this document is Linux Libertine with proportional figures. "proportional figures" means that the characters 0123456789 do not have the same width. For example, 0 is (slightly) wider than 1.

The sentence Here is some text referring to something in section \ref{mylabel} (which starts on page \pageref{mylabel}). on page 10 just fits in one line if \pageref{mylabel} is 11, but it occupies two lines if \pageref{mylabel} is 10. (This is because 0 is slightly wider than 1.)

Now the following happens: If the sentence refers to page 11, it fits in one line and the section fits on page 10. If the sentence refers to page 10, it occupies two lines, the section does not fit on page 10 and is moved to page 11...

5
  • +1 Nice example! Just one suggestion: to make the code shorter you can just replace the whole one-liners by a single \setcounter{page}{10} just before \begin{figure}.
    – campa
    Apr 15 at 9:46
  • 1
    Well, I thought it was funnier this way :). Of course \setcounter{page}{10} is shorter. Another option would be to fill nine pages with an appropriate amount of dummy text from the lipsum or blindtext package.
    – user227621
    Apr 15 at 10:27
  • using 0/1 you need to go to 10 I have somewhere an example using proportional figues with 3 wider than 4 so takes less filler May 31 at 11:31
  • @DavidCarlisle That would be very funny :). Creating such an example is of course even more demanding, since the difference in width between "3" and "4" is even smaller than between "0" and "1.
    – user227621
    May 31 at 11:38
  • 1
    @user227621 a few grep later I found it (actually it is 2 wider than 3) I added it to my answer. May 31 at 11:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.