PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verhindern gleicher label



trinix
17-12-2006, 17:14
Hallo,

ich bin mir sicher einmal was gelesen zu haben, nur finde ich es leider nicht mehr.

Meine Teildokumente sind mittels \include im Hauptdokument eigebunden. In den Überschriften, Bildern, Tabellen usw. verwende label für die Querverweise.

Jetzt bekomme ich beim Setzen die folgende Warnung:


LaTeX Warning: There were multiply-defined labels.


Wie kann ich gleiche labels verhindern?

rais
17-12-2006, 18:15
Wie kann ich gleiche labels verhindern?
schau mal hier (http://www.mrunix.de/forums/showthread.php?t=47138)...
MfG,

daswaldhorn
17-12-2006, 18:19
Hallo,

also du musst schon selber sehen, dass das nicht passiert. Ich helfe mir damit, das ich die Art des Labels mit angebe, also bei Kapiteln oder Abschnitten \label{chap:bla}, \label{sec:blubb}, bei Abbildungen und Tabellen \label{fig:foo}, \label{tab:bar} und bei Gleichungen \label{eq:baz}.

Lass dir ein System einfallen.

Grüße, Carsten

P.S: Einen Punkt für Rainer :)

trinix
18-12-2006, 08:12
schau mal hier (http://www.mrunix.de/forums/showthread.php?t=47138)...
MfG,
Das Paket werde ich mir einmal ansehen...


...also bei Kapiteln oder Abschnitten \label{chap:bla}, \label{sec:blubb}, bei Abbildungen und Tabellen \label{fig:foo}, \label{tab:bar} und bei Gleichungen \label{eq:baz}...
Dieses System verwende ich schon.
Meine Idee war hier mehr an das System zu übergeben und nicht mehr an so was denken zu müssen, aber gut, hinbekommen werde ich es auch so...

trinix

rais
18-12-2006, 09:51
Meine Idee war hier mehr an das System zu übergeben und nicht mehr an so was denken zu müssen, aber gut, hinbekommen werde ich es auch so...

Du könntest natürlich erstmal grob danach suchen, indem Du die \include-Anweisungen im Hauptdokument der Reihe nach auskommentierst und zwischendurch schaust, ob es immer noch mehrere label gleichen Namens gibt. Wenn Dich das nicht weiterbringt, hast Du entweder mehrere solcher Fälle -- oder bereits eine doppelte Bezeichnung innerhalb einer Datei bzw. Überschneidung mit dem Hauptdokument, falls Du darin auch Marken gesetzt hast. Letzteres kriegst Du raus, indem Du alle \include-Anweisungen auskommentierst und dann jeweils nur eine davon aktivierst.

@Carsten: immer noch voll im Rennen :D

MfG,

trinix
18-12-2006, 10:19
Diese Vorgehen hatte ich ähnlich angewendet - mal sehen.

Vielleicht gibt es ja auch die Möglichkeit ein kleines Skript zu schreiben, das mir die tex-Dateien nach /label durchsucht und diese alphabetisch geordnet in einem txt-Dokument ausgibt...

rais
18-12-2006, 10:59
Diese Vorgehen hatte ich ähnlich angewendet - mal sehen.

Vielleicht gibt es ja auch die Möglichkeit ein kleines Skript zu schreiben, das mir die tex-Dateien nach /label durchsucht und diese alphabetisch geordnet in einem txt-Dokument ausgibt...
Ah ja -- ein erster Ansatz wäre vllt

for I in `grep -h "label{" *.tex`; do echo "$I"; done | grep "label{" | sort -d > foo.txt
;)
MfG,

rais
18-12-2006, 11:38
d.h. im nächsten Schritt vllt


for I in `cat foo.txt`; do J=${I##*label{} && J=${J%%\}*}; echo $J; done | sort -d > bar.txt

da guggst Du dann nach doppelten Einträgen, z.B. "blubb" ist doppelt (oder mehr):


grep -n blubb *.tex | grep label
sollte dann die entsprechenden Zeilen der .tex-Datei incl. Zeilennummer widergeben, wo dieses label definiert ist.;)
MfG,

trinix
18-12-2006, 13:15
Olla...
Das ist jetzt ein wenig schnell.

Ich habe mit Skripten noch nichts zu tun gehabt. Kannst du mir bitte ein paar Worte dazu sagen? Vor Allem was es bedeutet und wie es implementieren muss.

rais
18-12-2006, 22:30
Olla...
Das ist jetzt ein wenig schnell.

Ich habe mit Skripten noch nichts zu tun gehabt. Kannst du mir bitte ein paar Worte dazu sagen? Vor Allem was es bedeutet und wie es implementieren muss.
was soll ich sagen? Das war noch gar kein Skript ;-)
Das verdient den Namen schon eher:


#!/bin/bash
# (c) 2006-12-18-rais
TMPUNSRT=foo.txt
TMPPRESORT=bar.txt
TMPSORTED=$TMPUNSRT #kein Grund, mehr Dateien zu basteln als notwendig;-)
test -r $TMPUNSRT && rm $TMPUNSRT #Liste löschen, falls vorhanden...
test -r $TMPPRESORT && rm $TMPPRESORT #Liste löschen, falls vorhanden...
#da $TMPUNSRT und $TMPSORTED eigentlich dieselbe Datei sind, braucht $TMPSORTED nicht gelöscht zu werden...
for I in `grep -h "label{" *.tex`; do #das macht zweierlei:
#der grep gibt hier zeilenweise alle in den *.tex-Dateien vorkommenden "label{" wider, während die for I - Schleife diese Zeile auch noch wortweise einliest (könnte ja mehr als nur das \label{bla} in einer Zeile stehen...
X=`echo "$I" | grep label` #hiermit (und der Folgezeile) werden alle Zeilen rausgefischt, die gar kein label deklarieren...
test ! -z "$X" && echo "$I" >> $TMPUNSRT #alle Einträge, die label enthalten, landen hingegen in $TMPUNSRT
done #Ok, das läßt sich vermutlich noch vereinfachen, aber sooo oft wird dieses Skript wohl gar nicht benötigt... und sooo viel länger braucht es bei den heutigen Rechnern wohl auch nicht;-)
for I in `cat $TMPUNSRT`; do #die bisher unsortierte Liste wortweise einlesen
J=${I##*label\{} && J=${J%%\}*} # hier geschieht wieder zweierlei: erst wird alles vor der Marke (inklusive des Kommandos "label" und der öffnenden geschweiften Klammer abgekniffen und an String $J übergeben. Anschließend wird alles nach der ersten schließenden geschweiften Klammer abgekniffen und an $J übergeben -- hier (in $J) sollte nun nur noch die Bezeichnung der Marke drinstehen...
echo $J >> $TMPPRESORT #...und die wird in die (immer noch nicht sortierte Liste) eingetragen
done #huch -- schon wieder fertig;-)
cat $TMPPRESORT | sort -d > $TMPSORTED #was einmal unsortiert war, wird nun als sortierte Liste in $TMPSORTED erzeugt
#der nun folgenden Teil soll Dir das Nachschauen in Datei sowieso nach doppelten Einträgen Abnehmen:
S=diese-Marke-hast-Du-bestimmt-nicht-deklariert #zum Vergleich...
SKIP=$S #falls eine Marke 3- oder mehrmals deklariert sein sollte...
for I in `cat $TMPSORTED`; do #die sortierte Liste wieder einlesen...
if [ "$S" = "$I" ]; then #wenn Eintrag in Liste doppelt...
if [ "$I" != "$SKIP" ]; then #wenn nicht drei- oder mehrfach, dann
echo "Guggst Du hier:" #genau;-)
grep -n $I *.tex #das gibt Dir die Treffer für einen Eintrag aus, der mehrmals gefunden wurde
echo " " #zus. Abstand, falls es zu viele Einträge werden
SKIP=$I #damit dieses "Guggst Du hier" nicht mehrmals für ein Label ausgegeben wird...
fi
fi
S=$I #für den nächsten Schleifenaufruf: dat stand vorher drin
done #Oh, schon wieder fertig;-)

obwohl, eigentlich wär' das wohl schon eher was fürs Nachbarboard: Skriptsprachen...
MfG,

trinix
18-12-2006, 23:05
Besten Dank Rainer...
Das werde ich am Wochenende gleich mal testen und mich dann wieder melden...

Beste Grüße
trinix