The answer to your question in the title is “LaTeX doesn't know”, at least not completely.
How does LaTeX manage cross-references?
Suppose you have
As we shall see in section~\ref{sec!main-results}, ...
...[many pages later]...
\section{Main results}\label{sec!main-results}
We are now ready to prove the most important theorems.
When the \label
is seen, the page with \ref
has long been typeset and output: there's no way to “get back and fix the number”.
So the approach is not “get all the cross references right at once”, because it would need keeping the whole document in memory, before doing any typesetting. Instead, LaTeX writes a note as soon as it outputs a page where a \label
command appeared: in the .aux
file you'll find something like
\newlabel{sec!main-results}{{3}{9}}
where the first number is the section number and the second one is the page number. The note is written out only when shipping out a page, because only then the page number is really known. Remember that TeX always looks ahead and only typesets full paragraphs, before deciding for a page break.
At the end of the job, the .aux
file is closed and input. At such time \newlabel
gets a suitable definition, whose purpose is to check whether the label was already known from a previous run and, in this case, whether one of the associated numbers has changed.
This is the point where you can see warnings such as
Label(s) may have changed. Rerun to get cross-references right
There were multiply-defined labels
Label `<label>' multiply defined
that should be self-explanatory.
At the start of a job, when LaTeX is processing \begin{document}
, the .aux
file is input and \newlabel
gets a different definition, which allows for \ref{sec!main-results}
or \pageref{sec!main-results}
to print the proper number. But what number? In the case above, the section number will be 3, even in case you have added a whole section between runs. Only at the end of the job, LaTeX will know the number has changed and it will issue the first of the warnings listed above.
If a cross-reference is unknown, just ??
will be printed and the warning about changed label will be issued. If a \ref
or \pageref
command refers to a label not yet defined, you get the warning
There were undefined references
but also
Reference `<label>' on page <page> undefined
that will tell you that, maybe, you have misspelled the label.
Should we care about the size of a cross-reference?
Should we care about the space used by the reference? Not really. Paragraphs usually have enough flexibility to allow for shrinking or stretching a line without modifying substantially the output. This is not completely foolproof and there are examples around of cleverly written documents that never stabilize: each new run of LaTeX will change the page number associated to a label so it never remains the same. However, the chances that this happens in a real document are pretty small.
What about multiple runs?
Document processors such as latexmk
are able to look into the .log
file for warnings about changed labels or undefined references and trigger a new run for fixing the output. However it's not so important that at each point in time the cross-references are correct: they'll be when you get no warning like the ones above.
What about the .aux
file?
The .aux
file is used for several other purposes: citations, for example, but also other administrative tasks. Packages, notably hyperref
, can modify the annotations made, by extending the syntax for the two versions of \newlabel
, but dealing with this would be too long. The idea is still the same.
Important note. It's clear from this description, that preserving the integrity of the .aux
file between runs is essential. This file should generally not be removed, unless it has become corrupt because of some fatal error. An incomplete annotation might cause an error when the file is input: interrupting the LaTeX run at this error will preserve the same corrupt file, so at the next run the same error will reappear. In such cases, removing the .aux
file is the only remedy. Not a big deal, it will cost a new run of LaTeX (maybe two). But, of course, removing a correct .aux
file at the end of a run will always produce errors about undefined reference.
Finally, there is a switch that makes LaTeX not touch any of the file it writes out: if you add \nofiles
in the preamble, the .aux
file and the ones used for the table of contents and similar lists will only be input and not rewritten. It's a relic of the past, when even writing to a file or just keeping some open caused delays, so when one was sure that cross-reference and lists were correct, adding \nofiles
saved some running time. Nowadays, the overhead is so small that such a trick is almost useless.
amsmath
allows the end user to insert their own tags for numbered equations and therefore collects the body of math environments before processing them. This allows for proper parsing of the content, possibly delaying the execution of \label
only after the equation
counter has been stepped. It does, however, retain access to the original LaTeX \label
via \ltx@label
, which is appropriate for your use:
\documentclass[fleqn]{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\ltxlabel}{\ltx@label}% User-level access to original LaTeX \label
\makeatother
\begin{document}
\newcounter{mycounter}
\refstepcounter{mycounter}\label{foo}\ref{foo}% 1
\refstepcounter{mycounter}\label{bar}\ref{bar}% 2
\begin{equation} x\refstepcounter{mycounter}\ltxlabel{baz}\ref{baz} \end{equation}
\ref{baz}% 3
\refstepcounter{mycounter}\label{qux}\ref{qux}% 4
\end{document}
\ltxlabel
(or \ltx@label
) will be executed immediately, using whatever counter was previously stepped (via \refstepcounter
) as a label reference. In contrast, \label
will only be used to reference the equation
counter under amsmath
.
Best Answer
Assuming you want to use the same counter variable for both equation-like and inequality-like environments, you can proceed by informing
cleveref
(i) that certain environments are "special" (specifically, that they are inequalities) and (ii) what to do in terms of typesetting the cross-references to these "special" objects. The former can be achieved by providing an optional argument to the\label
command. (cleveref
cleverly redefines\label
to make this possible.) The latter can be achieved by executing appropriate\crefname
and\creflabelformat
instructions.Section 6 of the user guide of the
cleveref
package provides a fuller explanation of how this works. In that section, it's also explained how to automate this a bit if you have lots and lots of inequalities, in which case it might become tedious to have to remember to supply the optionineq
to\label
whenever the object is an inequality.