Em meu trabalho como compositor LaTeX, costumo lidar com with multiply defined
avisos de rótulos. A maioria deles é sobre equações.
Minha pergunta é: o \ref
comando "sempre" refere-se ao último item rotulado? Na minha experiência é assim, mas gostaria de saber se há casos (por exemplo, configurações ou pacotes) em que isso não seja verdade.
Por exemplo, se eu tiver:
\documentclass[11pt]{article}
\begin{document}
\section{Introduction}
Equation~(\ref{eq1})
\begin{equation}
1 +1 =3
\label{eq1}
\end{equation}
Equation~(\ref{eq1})
\begin{equation}
2 +2 =5
\label{eq1}
\end{equation}
\end{document}
ambas as referências referem-se à última equação.
Observação.Sempre pedimos ao(s) autor(es) que verifiquem o aviso, mas a política da minha empresa é remover o aviso "antes" de enviar as provas. Estou procurando uma forma de "script" para gerenciar esses casos, comentando todos os rótulos definidos de forma múltipla, exceto o último, mas preciso saber se essa é uma abordagem segura.
Responder1
Se você olhar para o .aux
arquivo, verá
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
\newlabel{eq1}{{1}{1}}
\newlabel{eq1}{{2}{1}}
Como parte do \begin{document}
, o LaTeX lê o .aux
arquivo (conforme produzido na execução anterior) e o comando \newlabel{eq1}{{1}{1}}
essencialmente faz
\global\@namedef{r@eq1}{{1}{1}}
que é então substituído pelo posterior
\global\@namedef{r@eq1}{{2}{1}}
com o efeito que \ref{eq1}
apontará para a equação 2, pois \ref{eq1}
verifica se a macro \r@eq1
(produzida com \csname
, portanto os números são legais nela) está definida e, no caso, utiliza o conteúdo do primeiro par de chaves do seu texto substituto ( \pageref
usa o segundo).
Quando \end{document}
é processado, o .aux
arquivo produzido na execução atual é lido, mas \newlabel
faz coisas diferentes, entre elas verificar se o rótulo já apareceu.
A solução é muito simples:nuncarótulos duplicados. Caso existam, você precisa pedir ao autor para corrigi-los. Usar o último pode não ser a intenção do autor.