PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : algorithmc - same identifier error (ext 4)



secret3des
26-02-2008, 14:55
Hi!

Zu der Fehlermeldung "same identifier" habe ich einiges hier im Forum gefunden. Leider aber nicht in Zusammenhang mit algorithmc (oder habe ich nur schlecht geschaut?).

Auf jeden Fall kommen bei mir wegen 2 "algorithmc-Sachen" massenhaft solche Fehler:

[27]pdfTeX warning (ext4): destination with the same identifier (name{ALC@rem.1
}) has been already used, duplicate ignored
<to be read again>
\relax
l.268 \STATE
$pruning\_lvl \leftarrow$ height(BTG)pdfTeX warning (ext4): destin
ation with the same identifier (name{ALC@line.1}) has been already used, duplic
ate ignored
<to be read again>
\relax
l.268 \STATE

An der Seitenzahl liegt es denke ich nicht. Ich habe aber auch keine Ahnung an was es sonst liegen könnte.

Wäre für hilfreiche Tipps sehr dankbar!

Viele Grüße,
Tom

Ein Beispiel-Algorithmus:

\begin{flushleft}
\captionsetup{style=ruled,type=algorithm,skip=0pt}
\makeatletter
\fst@algorithm\@fs@pre
\makeatother
\caption{blub}
\label{alg:blub}
\makeatletter
\@fs@mid
\makeatother
\algsetup{indent=1em}
\algsetup{linenodelimiter=.}
\renewcommand{\algorithmiccomment}[1]{// #1 }
\textbf{Eingaben:~} Relation $R$, Zwei dimensionale Pareto-Präferenz $P:=P_1\:\otimes P_2$\\
\textbf{Ausgabe:~} BMO set
\begin{algorithmic} %[1]
\STATE $BMO$-$set \leftarrow \emptyset$\\
\COMMENT{Die Level-Werte des letzten Tupels im BMO-Set speichern}
\STATE int bla1 = MAX\_INTEGER, bla2 = MAX\_INTEGER;
~\\
~\\
\COMMENT{Sortieren nach den Level-Werten von A$_{P_1}$, A$_{P_2}$}
~\\
\STATE SORT(R,level(A$_{P_1}$), level(A$_{P_2}$));
~\\
~\\
\FORALL{$t \in R$}
\IF{xy $\leq$ bla1} \label{alg:blub:vgl1a}
\IF{yz $\leq$ bla2} \label{alg:blub:vgl1b}
\STATE
\COMMENT{$t$ zu Ergebnis hinzufügen}
\STATE Ergebnis = Ergebnis $\cup t$ \label{alg:blub:bmo1}
\STATE bla1 = xy;
\STATE bla2 = yz;
\ENDIF
\ELSE \label{alg:blub:vgl2a}
\IF{yz $<$ bla2} \label{alg:blub:vgl2b}
\STATE
\COMMENT{$t$ zu Ergebnis hinzufügen}
\STATE Ergebnis = Ergebnis $\cup t$ \label{alg:blub:bmo1}
\STATE bla1 = xy;
\STATE bla2 = yz;
\ENDIF
\ENDIF
\ENDFOR
\end{algorithmic}
\makeatletter
\@fs@post
\makeatother
\end{flushleft}

sommerfee
26-02-2008, 17:12
Das algorithmic-Paket ist leider nicht an hyperref angepasst. In hyperref gibt es zwar eine Anpassung an das float-Paket, die bei richtiger Ladereihenfolge (siehe hyperref-README) auch bei den algorithm-Umgebungen greift, aber eben nicht bei algorithmic. Behandelt wurde diese Problematik z.B. hier:

http://groups.google.de/group/comp.text.tex/browse_frm/thread/bbf264a827c258b7/974eac7b8d0504aa?hl=de

Zusammenfassung:

1. Auf richtige Ladereihenfolge float -> algorithm -> hyperref achten, sofern das algorithm-Paket benutzt wird.

2. Folgenden Patch ggf. nach dem Laden des algorithmic-Paketes einbinden:


Patch entfernt, da nicht ausreichend, siehe Beitrag #6


Gruß,
Axel

secret3des
26-02-2008, 17:17
Hi Axel!

Vielen Dank für deine Hilfe! :-)

Mit dem Patch (2.) funktioniert es super. Die Ladereihenfolge allein scheint (zumindest bei mir) keine Auswirkungen zu haben.

Hm.. Wenn ich die Zeilennummerierung (wieder) anschalte, kommen die Warnings leider wieder. Kann man den Patch so anpassen, dass es dafür auch geht? Oder mal ganz blöd gefragt: Stören die Warnings (im Moment 49 von dieser Sorte)?

Viele Grüße,
Tom

sommerfee
26-02-2008, 17:41
Hm.. Wenn ich die Zeilennummerierung (wieder) anschalte, kommen die Warnings leider wieder. Kann man den Patch so anpassen, dass es dafür auch geht?

Hast du ein kleines aber vollständiges Beispiel für mich, mit dem ich die Warnungen reproduzieren und ein wenig herumspielen kann?



Oder mal ganz blöd gefragt: Stören die Warnings (im Moment 49 von dieser Sorte)?

Keine Ahnung...

Gruß,
Axel

secret3des
26-02-2008, 17:59
Hast du ein kleines aber vollständiges Beispiel für mich, mit dem ich die Warnungen reproduzieren und ein wenig herumspielen kann?

Klar, gerne! Hier mal ein vollständiges und nicht allzu großes Beispiel:



\documentclass[titlepage, 12pt, final,oneside]{scrbook}
\KOMAoptions{paper=a4}

\usepackage[automark,headsepline]{scrpage2} % für die Formatierung (der Fuß- und Kopfzeile)
\usepackage[latin1]{inputenc} % für die Unterstützung von Umlauten
\usepackage[ngerman]{babel} % deutsche Silbentrennung

\usepackage{float}

\usepackage{caption}
\usepackage{algorithmic}
\usepackage{algorithm}

\makeatletter
\newcounter{algorithmic}
\let\ORIG@algorithmic\algorithmic
\def\algorithmic{\stepcounter{algorithmic}\ORIG@al gorithmic}
\def\theHALC@line{\thealgorithmic-\theALC@line}
\def\theHALC@rem{\thealgorithmic-\theALC@rem}
\makeatother

\usepackage[pdftex,
colorlinks=true, linkcolor=blue, urlcolor=blue, citecolor=blue,
raiselinks=true,
bookmarks=false,
bookmarksopenlevel=1,
bookmarksopen=true,
bookmarksnumbered=true,
hyperindex=true,
plainpages=false,% correct hyperlinks
pdfpagelabels=true%,% view TeX pagenumber in PDF reader
%pdfborder={0 0 0.5}
]{hyperref} % erzeuge Hyperlinks z.B. für pdflatex

\begin{document}

\begin{flushleft}
\captionsetup{style=ruled,type=algorithm,skip=0pt}
\makeatletter
\fst@algorithm\@fs@pre
\makeatother
\caption{blub}
\label{alg:blub}
\makeatletter
\@fs@mid
\makeatother
\algsetup{indent=1em}
\algsetup{linenodelimiter=.}
\renewcommand{\algorithmiccomment}[1]{// #1 }
\textbf{Eingaben:~} Relation $R$, Zwei dimensionale Pareto-Präferenz $P:=P_1\:\otimes P_2$\\
\textbf{Ausgabe:~} BMO set
\begin{algorithmic}[1]
\STATE Ergebnis $\leftarrow \emptyset$\\
\COMMENT{Die Level-Werte des letzten Tupels im BMO-Set speichern}
\STATE int bla1 = MAX\_INTEGER, bla2 = MAX\_INTEGER;
~\\
\COMMENT{Sortieren nach blub}
~\\
\STATE SORT(blub);
\FORALL{$t \in R$}
\IF{xy $\leq$ bla1} \label{alg:blub:vgl1a}
\STATE
\COMMENT{$t$ zu Ergebnis hinzufügen}
\STATE Ergebnis = Ergebnis $\cup t$ \label{alg:blub:bmo1}
\STATE bla1 = xy;
\ENDIF
\ENDFOR
\end{algorithmic}
\makeatletter
\@fs@post
\makeatother
\end{flushleft}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.


Referenz auf Zeile \ref{alg:blub:vgl1a} und noch eine Referenz auf Zeile \ref{alg:blub:bmo1}.

\end{document}


Ich hab mal noch Blindtext eingebaut, um die Referenzen zu testen. Die scheinen trotz Warnings korrekt zu funktionieren.


Wenn du keine einzelnen Zeilen mit \label+\ref referenzierst, nicht. (Obwohl: Mich würden sie trotzdem stören ) Wenn doch, dann stimmen die Sprungziele bei diesen Referenzen nicht.

Hm, ja.. es stört mich schon auch. Sonst hätte ich den Thread nicht gestartet. ;-) Wobei das Ergebnis - soweit ich das sehe - nicht darunter leidet.

Viele Grüße,
Tom

sommerfee
28-02-2008, 07:50
Hallo Tom,

So, ich habe gestern abend etwas Zeit gefunden und mir die Quellen des algorithmic-Paketes angesehen, um eine Lösung zu basteln, die die Probleme wirklich behebt und nicht nur an den Symptomen herumdoktert. Herausgekommen ist folgendes:

Das algorithmic-Paket verwendet an 2 Stellen fälschlicherweise \refstepcounter statt \stepcounter, das hat den Nebeneffekt, daß \label ggf. das falsche Label aufgreift, das hat auch der Paket-Autor gemerkt, aber anstatt den Fehler zu beheben hatte er ein Makro namens \ALC@setref erfunden, was das wieder geradebiegen soll. Ohne hyperref klappt das auch, aber mit hyperref macht \refstepcounter etwas mehr, und deswegen klappt die eingebaute Fehler-Umgehung nicht mehr. Abhilfe: Den Fehler beseitigen, also die beiden falschen \refstepcounter durch \stepcounter ersetzen, \ALC@setref streichen.

Dann braucht man "nur" noch ein eindeutiges \theHALC@line für die Referenzen auf Zeilen und die Sache ist erledigt, diesmal hoffentlich endgültig. Als Nebeneffekt müssten auch die PDFs etwas kleiner werden, weil nicht mehr so unnötig viele Hyperlink-Anker gesetzt werden, nur noch einer pro Zeile.

Bauanleitung: Man speichere das folgende als algorithmic-fix.sty und lade das algorithmic-Paket mit \usepackage{algorithmic,algorithmic-fix}:


\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{algorithmic-fix}[2008/03/01 v0.2 Fixes algorithmic for hyperref (caption@sommerfee.de)]
% 1. Replace the two wrong \refstepcounter's with \stepcounter's
\begingroup
\long\def\x#1\refstepcounter#2\@nil{%
\endgroup
\def\ALC@item[##1]{#1\stepcounter#2}}%
\expandafter\x\ALC@item[{#1}]\@nil
\newcommand\ALC@list{%
\begingroup
\long\def\x\refstepcounter##1\@nil{%
\endgroup
\def\ALC@it{\stepcounter##1}}%
\expandafter\x\ALC@it\@nil
\let\list\ORI@list\list}%
\renewcommand\ALC@setref{}%
% 2. Define a unique \theHALC@line
\newcounter{algorithmic}
\let\ORI@algorithmic\algorithmic
\def\algorithmic{%
\refstepcounter{algorithmic}%
\let\ORI@list\list\let\list\ALC@list\ORI@algorithm ic}
\def\theHALC@line{\thealgorithmic-\theALC@line}
% That's all
\endinput


Eine Rückmeldung wäre nett, denn wenn das auch bei dir klappt, werde ich dem Paket-Maintainer meine Erkenntnisse zukommen lassen, so daß algorithmic-fix hoffentlich bald nicht mehr notwendig ist. (Aber er scheint nicht auf E-Mails zu antworten, zumindest auf meine letzte nicht :( )



Die Ladereihenfolge allein scheint (zumindest bei mir) keine Auswirkungen zu haben.

Das liegt daran, daß du die "algorithm"-Umgebung gar nicht verwendest, würdest du es tun, würdest du ansonsten Probleme bekommen. (Du verwendest ja stattdessen \captionsetup{type=...}, und das caption-Paket ist (fast) unabhängig von der Ladereihenfolge.)

Gruß,
Axel

secret3des
28-02-2008, 09:43
Hi Axel!


Eine Rückmeldung wäre nett, denn wenn das auch bei dir klappt, werde ich dem Paket-Maintainer meine Erkenntnisse zukommen lassen, so daß algorithmic-fix hoffentlich bald nicht mehr notwendig ist. (Aber er scheint nicht auf E-Mails zu antworten, zumindest auf meine letzte nicht )

Nachdem ich herausgefunden hatte, wie ich die algorithmic-fix.sty einbinde, hat es einwandfrei funktioniert. :-) Vielen Dank für deine freundliche und äußerst kompetente Hilfe!

Ja, wäre super, wenn das eingebaut würde. Ich hoffe, dass der Autor sich bald rührt. ;-)

Viele Grüße,
Tom

Tyrfing
08-04-2009, 10:47
Herzlichen Dank für das schnelle fixen von >100 Warnungen ;)

Die oben beschriebene Lösung funktioniert auch für mich.
Scheint fast ein wenig so, als würde das Packet nicht mehr so recht gewartet.
Vielleicht sollte man mal ein anderes Packet für Pseudocode nehmen, wobei ich ja sagen muss, dass mir kein wirklich gutes bekannt ist - letztlich haben sie alle irgendwie ihre Macken - und für selbstmachen fehlt mir wohl die TeX Erfahrung :(

Nunja, wie dem auch sei, danke für die Lösung!