Discussion:
bibtex key ändern?
(zu alt für eine Antwort)
Gilbert Mirenque
2009-09-26 10:35:35 UTC
Permalink
Ist es irgendwie möglich bibtex-keys zu ändern? Ich zitiere zum Beispiel
mehrere Spezifikationen der Object Management Group. Ich benutze dafür
Manual-Einträge. Zur Zeit lasse ich das Feld "Author" frei und schreibe
bei "Organization" "Object Management Group" rein. Nun sehen die keys in
meinem Dokument so aus:

[Obj03]...
[Obj06]...
...

Vorher, als der Name noch beim "Author" drin stand, sah es so aus:

[Gro03]...
[Gro06]...
...

Da gefällt mir die Obj-Variante schon besser. Aber optimal ist sie
trotzdem nicht. Ich hätte gern sowas: [OMG03].

Ist sowas irgendwie möglicht?
Karsten Neumann
2009-09-26 10:41:50 UTC
Permalink
Post by Gilbert Mirenque
Ist es irgendwie möglich bibtex-keys zu ändern?
[...] Ich hätte gern sowas: [OMG03].
Ist sowas irgendwie möglicht?
Ja, sowas ist möglich. Das hängt von dem verwendeten Stil ab. Wenn
dieser ein entsprechendes Feld, beispielsweise das Key-Feld anbietet,
kann damit die Kurzform angegeben werden.

Du solltest also noch ein paar Informationen angeben, wie du dein
Literaturverzeichnis erstellst.


Karsten
Gilbert Mirenque
2009-09-26 10:58:00 UTC
Permalink
Hi Karsten,
Post by Karsten Neumann
Ja, sowas ist möglich. Das hängt von dem verwendeten Stil ab. Wenn
Ok schonmal gut zu hören.
Post by Karsten Neumann
dieser ein entsprechendes Feld, beispielsweise das Key-Feld anbietet,
kann damit die Kurzform angegeben werden.
Wie finde ich das raus, ob so ein Key-Feld existiert? Und wie gibt man
das dann an?
Post by Karsten Neumann
Du solltest also noch ein paar Informationen angeben, wie du dein
Literaturverzeichnis erstellst.
Nutze folgendes Package:
\usepackage{bibgerm}

Aufruf mit folgenden Befehlen:

\bibliographystyle{geralpha}
\bibliography{meineBibliografieDatei}
Karsten Neumann
2009-09-26 16:39:45 UTC
Permalink
Post by Gilbert Mirenque
Post by Karsten Neumann
Ja, sowas ist möglich. Das hängt von dem verwendeten Stil ab.
Ok schonmal gut zu hören.
\bibliographystyle{geralpha}
Die Datei geralpha.bst regelt in diesem Fall die Verarbeitung der
Einträge zu jeder Literaturangabe.
Post by Gilbert Mirenque
Wie finde ich das raus, ob so ein Key-Feld existiert? Und wie gibt man
das dann an?
Ein Blick in die Stildatei hilft da weiter. Prinzipiell kennt dieser
Stil ein key-Feld, wie du der Liste von Feldern entnehmen kannst, die zu
Beginn der Datei aufgeführt ist.

Das einfachste wäre also zu prüfen, ob es vielleicht schon reicht, wenn
du jeden Eintrag, den du unter anderem Label gelistet haben möchtest,
einfach ein key={} hinzufügst. Mit etwas Glück wird bei dem verwendeten
Eintragtype dieses Feld als Label ausgegeben.

Sollte das nicht der Fall sein, wäre zu prüfen, welchen Eintragstyp du
verwendest und wie dieser verarbeitet wird. Dann könnte man versuchen,
die Bearbeitung so umzubiegen, dass das gewünschte Verhalten erreicht wird.


Karsten
Gilbert Mirenque
2009-09-27 10:13:06 UTC
Permalink
Wow danke. Beim Typ Manual funktioniert das super. Doch ein weiteres
Problem habe ich. Für Web-Quellen benutze ich Misc. Da funktioniert es
leider nicht mit dem key={}-Attribut. Es werden einfach die
Standard-Keys gesetzt. Ich würde gerne vor Internet-Quellen jeweils ein
"@" setzen, da mein Betreuer meinte, dass man das so machen würde. Hast
du dafür vielleicht eine Idee?
Gilbert Mirenque
2009-09-27 10:18:51 UTC
Permalink
Nachtrag: Ich habe mich in der geralpha.bst jetzt soweit durchnavigiert,
dass ich die Funktion gefunden habe, die das Label erzeugt. Aber darin
sehe ich nicht so richtig durch:

FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
sortify 'sort.label :=
}

Wahrscheinlich muss ich die dahingehend ändern, dass bei "Misc" auch ein
key-Attribut akzeptiert wird. Hat jemand eine Idee?
Karsten Neumann
2009-09-27 12:30:20 UTC
Permalink
Post by Gilbert Mirenque
FUNCTION {calc.label}
[...]
Wahrscheinlich muss ich die dahingehend ändern, dass bei "Misc" auch ein
key-Attribut akzeptiert wird. Hat jemand eine Idee?
Also ich hab das ganze bei alphadin.bst folgendermaßen gelöst, wobei das
ganze auf einem Posting von vor längerer Zeit basiert.

Dabei ist die Basis des ganzen, dass anstelle von @Misc ein neuer
Eintragstyp, in meinem Fall @Norm, definiert wird, der auf Misc basiert,
für den aber die Labelbestimmung umgebogen wird. @Misc bleibt auf diese
Weise erhalten. Das ganze funktioniert scheinbar auch für geralpha.bst
nach Ergänzung unten folgender Funktionen.

Dazu am besten eine Kopie der Datei im Projektverzeichnis ablegen oder
unter anderen Namen speichern. Die Änderungen direkt in der geralpha.bst
vorzunehmen ist nicht empfehlenswert.


1. Hinter die Definition von FUNCTION {Misc} folgende Zeile einfügen, um
den neuen Eintragstyp anzulegen, der auf @Misc basiert:

FUNCTION {norm} {misc}

2. Funktion um Erzeugen des Labels für den Eintragstyp @Norm (habe ich
direkt vor der FUNCTION {calc.label}):

FUNCTION {norm.label} %%fuer Normen
{ key empty$
{ 'author.key.label}
{ key #20 text.prefix$ }
if$
}

3. Die FUNCTION {calc.label} ein wenig modifizieren, so dass bei den
neuen Eintragstyp die norm.label-Funktion genutzt wird und das key-feld
ausgeben wird:

FUNCTION {calc.label}
{ type$ "book" =
type$ "booklet" =
type$ "inbook" =
or or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
{ type$ "norm" =
'norm.label
'author.key.label
if$
}
if$
}
if$
}
if$
type$ "norm" = %%keine Jahreszahl anhaengen
{ duplicate$
"" *
'label :=
"" *
}
{ duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
}
if$
sortify 'sort.label :=
}


Ansich sollte das funktionieren. Ob auf anderen Eintragstypen bei
geralpha.bst negative Auswirkungen entstehen habe ich jetzt nicht getestet.


HTH
Karsten
Gilbert Mirenque
2009-09-27 13:33:26 UTC
Permalink
Hi Karsten,
danke für deine Ausführungen. Ich habe gerade ein sehr gutes Dokument
gefunden ([1]), wo die Bibtex-Sprache erklärt wird. Dadurch verstehe ich
jetzt einiges mehr. Und deine Snippets haben sich als Ergänzung als
Bestätigung rausgestellt. Ich bin mittlerweile so weit, dass bei
geralpha nur der key benutzt wird, wenn kein Author angegeben wurde.
Deshalb funktioniert das bei mir bei Misc nicht, da ich dort Autoren
habe. Ich möchte die calc.label-Funktion jetzt am besten so anpassen,
dass, wenn ein key angegeben wurde, dieser auch als Label benutzt wird,
egal, ob der Author gesetzt wurde oder nicht. Dazu habe ich die
calc.label so angepasst:

FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
%% ab hier meins
key empty$
{ 'author.key.label }
{ key 'label := }
if$
%% bis hier meins
sortify 'sort.label :=
}

Wie du unten an den Kommentaren siehst, will ich einfach nur prüfen, ob
key gesetzt wurde, wenn nicht dann soll alles bleiben wie vorher und
wenn doch, dann soll 'label auf key gesetzt werden. Das hat bei mir aber
noch keinen Erfolg. Kannst du vielleicht mal rüberschauen und mir
weiterhelfen?

Beste Grüße,
Gilbert


[1] http://www.lsv.ens-cachan.fr/~markey/BibTeX/doc/ttb_en.pdf
Gilbert Mirenque
2009-09-27 14:04:14 UTC
Permalink
Ich habe irgendwie das Gefühl, dass meine Änderungen gar nicht ankommen.
Meine geralpha sieht jetzt so aus:

FUNCTION {calc.label}
{ key empty$
{
type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*

}
{ "TestTest" }
if$

sortify 'sort.label :=
}

Ich habe also den Check, ob key gesetzt wurde gleich an den Anfang
gehaun und dann soll "TestTest" ausgegeben werden. Aber nichts
dergleichen passiert. Eine Idee?
Wie belasse ich denn eigentlich die originale geralpha so wie sie ist
und lege dann eine Kopie an um sie an meine Bedürfnisse anzupassen?
Speichere ich die Kopie in meinem Verzeichnis mit der tex-Datei? Wird
dort zuerst gesucht? Oder muss ich die Datei umbenennen und
dementsprechend einen anderen Stil angeben?
Karsten Neumann
2009-09-27 19:13:13 UTC
Permalink
[...] Ich bin mittlerweile so weit, dass bei
geralpha nur der key benutzt wird, wenn kein Author angegeben wurde.
Deshalb funktioniert das bei mir bei Misc nicht, da ich dort Autoren
habe.
Also das kann ich mit der von dir geänderten calc.label nicht
nachvollziehen. Ich habe einfach in einer in das Projektverzeichnis
erstellten Kopie von geralpha.bst die vorhandene calc.label-Funktion
durch die von dir geänderte Version ersetzt. Ich habe die kopierte Datei
auch umbenannt, aber ansich wird die im Projektverzeichnis eh zuerst
gefunden.
Ich möchte die calc.label-Funktion jetzt am besten so anpassen,
dass, wenn ein key angegeben wurde, dieser auch als Label benutzt wird,
egal, ob der Author gesetzt wurde oder nicht.
Genau dieses Verhalten habe ich hier. Daher weiss ich nicht genau, was
an dem Ergebnis noch nicht passt.
FUNCTION {calc.label}
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
%% ab hier meins
key empty$
{ 'author.key.label }
{ key 'label := }
if$
%% bis hier meins
sortify 'sort.label :=
}
Ich habe mal ein Minibeispiel gebastelt:

\begin{filecontents}{Literatur.bib}
@misc{testquelle,
Author={Autor Mustermann},
title = {Buchtitel},
year = {2004},
key={mein}
}
\end{filecontents}

\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin9]{inputenc}
\usepackage{bibgerm}
\bibliographystyle{geralphab} % Hier den Namen anpassen

\begin{document}
\cite{testquelle}
\bibliography{Literatur}
\end{document}

Wenn ich das key-Feld angebe, dann wieder dieses trotz vorhandenem
Author-Feld ausgegeben. Fehlt der key, wird der abgekürzte Author
ausgegeben. Ich denke, das sollte so passen.

Bitte beachten, dass die filecontents-Umgebung nur einmal funktioniert.
Wenn die Literatur.bib einmal vorhanden ist, werden Änderungen in der
filecontents-Umgebung nicht mehr in die Literatur.bib übernommen. Am
besten einfach die filecontents-Umgebung rauswerfen und mit eigener
Datei testen.

Karsten
Gilbert Mirenque
2009-09-28 10:08:35 UTC
Permalink
Hi Karsten,
ich habe jetzt auch mal eine neue bst-Datei in mein Projektverzeichnis
gelegt und nun geht es. Ich habe die Funktion noch ein wenig angepasst:

FUNCTION {calc.label}
{ key empty$
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
}
{
key "@" =
{ "@" %% normal berechnen und @ davor setzen
'author.key.label
*
}
{ key #5 text.prefix$ }
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
sortify 'sort.label :=
}

So gefällt es mir besser, da nun ein vorhandener key als Grundlage
benutzt wird und dort hinten ran noch die Jahreszahl gehängt wird. Ein
kleines Problem existiert noch aber vielleicht kannst du mir dabei
helfen. Ich möchte bei Webreferenzen ein @ vor jeden key setzen, damit
man gleich im Text erkennt, dass das ein solcher ist. Dafür möchte ich
in meinem bib-Eintrag einfach ein @ im key setzen, wodurch in meiner
geänderten Funktion der key normal berechnet werden soll und dann das @
davor konkateniert werden soll. So wie ich es oben habe, erscheint aber
als Key nur das Jahreskürzel. Nichtmal Buchstaben für die Abkürzung der
Autoren stehen davor. Kannst du das nochvollziehen und mir einen Tipp geben?

Viele Grüße,
Gilbert
Karsten Neumann
2009-09-28 14:54:16 UTC
Permalink
Post by Gilbert Mirenque
ich habe jetzt auch mal eine neue bst-Datei in mein Projektverzeichnis
FUNCTION {calc.label}
[...]
So gefällt es mir besser, da nun ein vorhandener key als Grundlage
benutzt wird und dort hinten ran noch die Jahreszahl gehängt wird.
Nun gut, wenn du das besser findest soll es mir Recht sein.
Post by Gilbert Mirenque
man gleich im Text erkennt, dass das ein solcher ist. Dafür möchte ich
davor konkateniert werden soll.
Also ob das mit dem @ so eine gute Idee ist sei mal dahingestellt. Ich
würde es als unüblich empfinden und wäre beim lesen eher verwundert als
dass es weiter hilft. Ob eine Quelle online zu finden ist oder nicht,
spielt ja eigentlich eher keine Rolle.

Wenn man das doch trennen will, dann würde ich das nur im Verzeichnis
aufteilen. Also beispielsweise ein Verzeichnis klassische Quellen, ein
Verzeichnis Online-Quellen. Dafür wäre multibib bspw. eine Möglichkeit.

Aber zurück zu deinem Problem: Ich verstehe es nicht so ganz. Du
möchtest auf der einen Seite in das key-Feld ein @ reinschreiben, aber
dann das Label normal berechnen lassen und das @ wieder davor setzen?
Warum gibst du nicht gleich im key-Feld das Label so an, wie es
ermittelt würde plus dem @ davor? Dann passt die Ausgabe und der Aufwand
sollte sehr überschaubar sein.
Post by Gilbert Mirenque
So wie ich es oben habe, erscheint aber
als Key nur das Jahreskürzel. Nichtmal Buchstaben für die Abkürzung der
Autoren stehen davor. Kannst du das nochvollziehen und mir einen Tipp geben?
Ich kann das nachvollziehen, ja.

Dass keine Buchstaben für die Autoren dabei sind, liegt wohl an der
Tatsache: "author.key.label is a funtion literal, not a string", wie
BibTeX als Fehlermeldung zurückgibt. Weiss aber auch nicht, woran das
liegt. Jedenfalls hab ich den Eindruck, dass die Funktion nicht
aufgerufen wird, sondern einfach der Funktionsname als Label
zurückgegeben wird. Darüber stolpert dann die Sortierfunktion, zumindest
deutet die Fehlermmeldung darauf hin.


Karsten
Gilbert Mirenque
2009-09-28 16:26:57 UTC
Permalink
Hi Karsten,
Post by Karsten Neumann
Aber zurück zu deinem Problem: Ich verstehe es nicht so ganz. Du
Warum gibst du nicht gleich im key-Feld das Label so an, wie es
sollte sehr überschaubar sein.
Der Grund dafür ist, dass bei generierten Keys, mit mehr als 4 Autoren
die Anfangsbuchstaben der Nachnamen der ersten 3 Autoren benutzt wird
und dahinter ein hochgestelltes + gesetzt wird und dahinter die
Jahreszahl. Füge ich nun diesen Key manuell ein, so ist das + nicht
hochgestellt. Sicher würde es so gehen, jedoch empfinde ich das
Generieren des normalen Keys und ein Davorsetzen von @ als konsistenter.

Viele Grüße,
Gilbert
Gilbert Mirenque
2009-09-30 08:42:08 UTC
Permalink
Hi Karsten,
Post by Karsten Neumann
Dass keine Buchstaben für die Autoren dabei sind, liegt wohl an der
Tatsache: "author.key.label is a funtion literal, not a string", wie
BibTeX als Fehlermeldung zurückgibt. Weiss aber auch nicht, woran das
liegt. Jedenfalls hab ich den Eindruck, dass die Funktion nicht
aufgerufen wird, sondern einfach der Funktionsname als Label
zurückgegeben wird. Darüber stolpert dann die Sortierfunktion, zumindest
deutet die Fehlermmeldung darauf hin.
Wo finde ich denn diese Fehlermeldung?
Karsten Neumann
2009-09-30 09:08:23 UTC
Permalink
Post by Gilbert Mirenque
Post by Karsten Neumann
Dass keine Buchstaben für die Autoren dabei sind, liegt wohl an der
Tatsache: "author.key.label is a funtion literal, not a string", wie
BibTeX als Fehlermeldung zurückgibt. [...]
Wo finde ich denn diese Fehlermeldung?
Im log-File sollte das stehen. Ich seh das im Ausgabefenster vom
TexnicCenter, wenn ich ein bisschen hochscroll. Aber da läuft wohl auch
nur das log-File durch.

Aber ist ja gut, wenn es jetzt funktioniert. Wobei ich zugeben muss,
dass mich die Lösung wundert, ich dachte genau das hatte ich getestet.


Karsten

Gilbert Mirenque
2009-09-30 08:59:51 UTC
Permalink
Hi Karsten,
ich habe es jetzt hinbekommen. Es war nur ein kleiner Fehler. Der kleine
Strich vor der Erezeugung des Labels muss weg:

FUNCTION {calc.label}
{ key empty$
{ type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.organization.label
{ type$ "manual" =
'author.key.organization.label
'author.key.label
if$
}
if$
}
if$
}
{
key "@" =
{ "@"
author.key.label %%% hier stand vorher ein Strich davor
*
}
{ key #5 text.prefix$ }
if$
}
if$
duplicate$
year field.or.null purify$ #-1 #2 substring$
*
'label :=
year field.or.null purify$ #-1 #4 substring$
*
sortify 'sort.label :=
}

Vielen Dank für deine gute Hilfe.

Gruß,
Gilbert
Loading...