Wenn ich die folgende Datei entweder mit pdflatex oder mit latex und dann dvipdf verarbeite, führt mich der Link auf Seite 1 der resultierenden PDF-Datei nicht wie erwartet zu Lemma 1.
\documentclass{amsart}
\usepackage{hyperref}
\newtheorem{lem}{Lemma}
\begin{document}
See Lemma~\ref{testlemma} below.
\pagebreak
\begin{lem}\label{testlemma}
\begin{enumerate}
\item Testing!
\end{enumerate}
\end{lem}
\end{document}
Wenn ich pdflatex verwende, erhalte ich eine Warnung:
pdfTeX warning (dest): name
{lem.1} has been referenced but does not exist, replaced by a fixed one
Wenn ich \documentclass{amsart}
durch ersetze \documentclass{article}
, funktioniert der Link wie erwartet.
Wie kann ich diese Testdatei reparieren, um funktionierende Hyperref-Links in PDF-Dateien zu erhalten amsart
?
Ich verwende pdfTeX 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian).
Antwort1
Damit der Referenzzähler einer Theorem-Klassenumgebung von einem richtig aufgerufen werden kann \label
, muss etwas auf den\begin{<
Umfeld>}
im horizontalen Modus. Da das nächste in diesem Beispiel ist \begin{enumerate}
, wird der horizontale Modus nie aufgerufen und das Etikett geht verloren. (Ich bin mir nicht ganz sicherWiees geht verloren, aber das ist der Nettoeffekt.)
Es gibt verschiedene Ansätze, um mit dieser Situation umzugehen. Bei allen wird etwas im horizontalen Modus eingefügt, bevor die Liste gestartet wird. Die am häufigsten gemachten Vorschläge (abgesehen vom Hinzufügen von tatsächlichem Text) sind \leavevmode
oder $ $
; sogar ein einzelner „Schrägstrich-Leerzeichen“ funktioniert. Alle diese Vorschläge führen jedoch dazu, dass die Liste in der nächsten Zeile gestartet wird, anstatt sie fortzusetzen.
Hier sind zwei weitere Fragen, die sich auf ähnliche Situationen beziehen, allerdings nicht auf die Interaktion mit \label
:
Hier ist ein etwas anderer Ansatz, bei dem die Nummer des ersten Elements manuell eingegeben wird und die „eigentliche“ Aufzählung mit dem zweiten Element beginnt. Er wird in dieser Antwort auf einen Beweis angewendet, funktioniert aber genauso gut mit jedem Objekt der Theoremklasse. Vorteil: Dadurch kann ein Etikett, das auf das Theorem verweisen soll, den richtigen Wert haben. Nachteil: Es ist möglicherweise kein Querverweis auf das erste Element möglich.
Antwort2
Das Hinzufügen \leavevmode
vor der enumerate
Umgebung behebt das Problem.
\documentclass{amsart}
\newtheorem{lem}{Lemma}
\usepackage{hyperref}
\begin{document}
\section{test}\label{sec:1}
See Lemma~\ref{testlemma} or rather Lemma~\ref{testlemma2} below.
\begin{lem}
\label{testlemma}
\begin{enumerate}
\item Testing!
\end{enumerate}
\end{lem}
\begin{lem}
\label{testlemma2}
\leavevmode
\begin{enumerate}
\item Testing!
\end{enumerate}
\end{lem}
\begin{lem}
\label{testlemma3}
\leavevmode
\begin{enumerate}
\item Testing!
\end{enumerate}
\end{lem}
lemma \ref{testlemma2}
section \ref{sec:1}
lemma \ref{testlemma3}
reference to lemma \ref{testlemma} does not work.
\end{document}