[Tex/LaTex] Why does an environment’s label have to appear after the caption

algorithmscaptionscross-referencingnumbering

\documentclass{article}
\usepackage{algorithm}

\begin{document}
\setcounter{section}{54}
\section{A section with no label}
\begin{algorithm}
\label{myalg}
\caption{An algorithm with the label `myalg'.}
\end{algorithm}
Reference to myalg: \ref{myalg}.
\end{document}

With this code, the reference givens 55 (the section number); if I move the label after the caption command, I get the correct reference (1).

Why should this be the case? I find it confusing: when thinking about an algorithm as an environment, you expect to be able to label it right after you began it. At the very least I would expect some kind of error or "??" to appear, rather than the previous environment or reference-able entity being used.

Best Answer

This is in common with all captions: it's the \caption command that generates the number, so a \label before it can't know that number.

This could have been designed differently, of course, but you can think to a figure environment where two figures with distinct captions are placed, side by side in order to save space, for example.

So, always place the \label after the \caption.

Since \label is a "general purpose" command, it will always refer to the last previously generated number (be it a chapter, section, figure caption number or directly from the user with a \refstepcounter command) and to the page where it eventually falls. Actually it's not really the last generated number, but the one lastly generated at the same or higher grouping level.