LaTeX 식자공으로 일하면서 나는 종종 with multiply defined
라벨 경고를 다룹니다. 대부분은 방정식에 관한 것입니다.
내 질문은 \ref
"항상"이라는 명령이 마지막으로 레이블이 지정된 항목을 참조하는 것입니까? 제 경험상 그렇습니다만, 이것이 사실이 아닌 경우(예: 설정이나 패키지)가 있는지 알고 싶습니다.
예를 들어 다음과 같은 경우가 있습니다.
\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}
두 참조 모두 마지막 방정식을 나타냅니다.
메모.우리는 항상 작성자에게 경고를 확인하도록 요청하지만 회사 정책은 교정본을 보내기 "전에" 경고를 제거하는 것입니다. 나는 이러한 사례를 관리하기 위한 "스크립팅" 방법을 찾고 있으며 마지막 레이블을 제외한 모든 다중 정의 레이블에 주석을 달고 있지만 이것이 안전한 접근 방식인지 알아야 합니다.
답변1
파일을 보시면 .aux
아시겠지만
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
\newlabel{eq1}{{1}{1}}
\newlabel{eq1}{{2}{1}}
의 일부로 \begin{document}
LaTeX는 파일을 읽고 .aux
(이전 실행에서 생성된 대로) 명령은 \newlabel{eq1}{{1}{1}}
기본적으로 다음을 수행합니다.
\global\@namedef{r@eq1}{{1}{1}}
그런 다음 나중에 재정의됩니다.
\global\@namedef{r@eq1}{{2}{1}}
매크로 ( 로 생성되었으므로 숫자가 적법함)가 정의되었는지 확인하고 대체 텍스트의 첫 번째 중괄호 쌍에 있는 내용을 사용하기 때문에 방정식 \ref{eq1}
2를 가리키는 효과가 있습니다 ( 두번째).\ref{eq1}
\r@eq1
\csname
\pageref
\end{document}
처리 되면 .aux
현재 실행에서 생성된 파일을 읽지만 \newlabel
레이블이 이미 표시되었는지 확인하는 등 다른 작업을 수행합니다.
해결책은 매우 간단합니다.절대라벨이 중복됩니다. 그런 경우에는 작성자에게 수정을 요청해야 합니다. 마지막 것을 사용하는 것은 저자의 의도가 아닐 수도 있습니다.