PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : newcounter und hyperref erzeugen Warnung 'destination with the same identifier'



Magger
01-12-2013, 23:49
Hallo,

ich habe mir eine nummerierte labeling-Umgebung (enumlabeling) erstellt und dazu einen neuen Zähler namens enumlabel angelegt. Das funktioniert auch prima. Allerdings bekomme ich bei der Benutzung des hyperref-Pakets eine Warnung.

Folgendes Minimalbeispiel verdeutlicht das Problem:


\documentclass{scrartcl}

% Definition einer nummerierten labeling-Umgebung zur Darstellung der Abschlussarbeiten
\makeatletter
\newcounter{enumlabel}
\newenvironment{enumlabeling}[2][]{%
\setcounter{enumlabel}{0}%
\def\sc@septext{#1}%
\list{}{\settowidth{\labelwidth}{{%
#2%
\sc@septext%
}}%
\leftmargin\labelwidth \advance\leftmargin by \labelsep
\let\makelabel\enumlabelinglabel
}%
}{%
\endlist
}
\newcommand\enumlabelinglabel[1]{%
\refstepcounter{enumlabel}%
\theenumlabel. #1\hfil
\sc@septext%
}
\makeatother

\usepackage{hyperref}

\begin{document}

\begin{enumlabeling}{Test}
\item[Test] Test
\end{enumlabeling}

\begin{enumlabeling}{Test}
\item[Test] Test
\end{enumlabeling}

\end{document}


Die Warnung lautet:


destination with the same identifier (name{enumlabel.1}) has been already used, duplicate ignored


Wenn ich hyperef mit der Option hypertexnames=false lade, verschwindet die Warnung. Ich bin aber sicher, damit nicht die Ursache, sondern nur das Symptom zu beheben. Wie kann ich die 'identifier' eindeutig machen, bei der normalen enumerate-Umgebung mit ihrem Zähler scheint das ja auch irgendwie zu funktionieren?

Viele Grüße, Mathias

sommerfee
02-12-2013, 10:55
Das hyperref-Paket patcht \newcounter. Wenn du hyperref einsetzt, mußt du also die von hyperref gepatchte Version von \newcounter verwenden, also \newcounter *nach* dem Laden von hyperref anwenden.

Magger
05-12-2013, 20:52
Danke für den Hinweis, aber wenn ich das hyperref-Paket wie im geänderten Minimalbeispiel gleich am Anfang lade, tritt die Warnung immer noch auf.


\documentclass{scrartcl}

\usepackage{hyperref}

% Definition einer nummerierten labeling-Umgebung zur Darstellung der Abschlussarbeiten
\makeatletter
\newcounter{enumlabel}
\newenvironment{enumlabeling}[2][]{%
\setcounter{enumlabel}{0}%
\def\sc@septext{#1}%
\list{}{\settowidth{\labelwidth}{{%
#2%
\sc@septext%
}}%
\leftmargin\labelwidth \advance\leftmargin by \labelsep
\let\makelabel\enumlabelinglabel
}%
}{%
\endlist
}
\newcommand\enumlabelinglabel[1]{%
\refstepcounter{enumlabel}%
\theenumlabel. #1\hfil
\sc@septext%
}
\makeatother

\begin{document}

\begin{enumlabeling}{Test}
\item[Test] Test
\end{enumlabeling}

\begin{enumlabeling}{Test}
\item[Test] Test
\end{enumlabeling}

\end{document}

sommerfee
06-12-2013, 10:06
Danke für den Hinweis, aber wenn ich das hyperref-Paket wie im geänderten Minimalbeispiel gleich am Anfang lade, tritt die Warnung immer noch auf.
Oh, 'Tschuldigung. Ich muß gestehen, mir das Beispiel gar nicht weiter angeschaut zu haben, als ich die Sache mit dem hyperref nach dem \newcount gesehen hatte.

Nun aber: hyperref braucht einen eindeutigen Zählerwert für seine Anker. Bei dir wird der Zähler aber immer wieder auf 0 zurückgesetzt, so daß die Hyperref-Anker im Anschluß nicht mehr eindeutig sind. Hier gibt es drei verschiedene Abhilfen:


Man macht den Zähler eindeutig, z.B. durch Kopplung an einen anderen Zähler, so wie bei Section-Chapter
Man definiert nach \newcounter \theHenumlabel (man beachte das "H") so um, daß es eindeutig ist
Man verwendet die Paketoption hypertexnames=false, dann sorgt hyperref automatisch für fortlaufende Zähler für die Ankernamenvergabe. ACHTUNG: Dies wirkt dann global auf alle Zähler.


Hier 'mal eine mögliche Lösung, die Ansatz Nr. 1 verfolgt:


\documentclass{scrartcl}

\usepackage{hyperref}

% Definition einer nummerierten labeling-Umgebung zur Darstellung der Abschlussarbeiten
\makeatletter
\newcounter{enumlabeling} % <= Neu: Zähler enumlabeling, Zählt die Umgebungen
\newcounter{enumlabel}[enumlabeling] % <= Geändert: Kopplung an enumlabeling
\newenvironment{enumlabeling}[2][]{%
\stepcounter{enumlabeling}% <= Geändert: Umgebungszähler hochzählen
\def\sc@septext{#1}%
\list{}{\settowidth{\labelwidth}{{%
#2%
\sc@septext%
}}%
\leftmargin\labelwidth \advance\leftmargin by \labelsep
\let\makelabel\enumlabelinglabel
}%
}{%
\endlist
}
\newcommand\enumlabelinglabel[1]{%
\refstepcounter{enumlabel}%
\theenumlabel. #1\hfil
\sc@septext%
}
\makeatother

\begin{document}

\begin{enumlabeling}{Test}
\item[Test] Test
\item[Test] Test
\end{enumlabeling}

\begin{enumlabeling}{Test}
\item[Test] Test
\end{enumlabeling}

\end{document}

Magger
06-12-2013, 21:20
Vielen Dank, das ist genau die Lösung, nach der ich gesucht habe.