Zotero ist ein tolles Tool, um Bibliotheken von Referenzen zu verwalten, insbesondere wenn man an verschiedenen Papern und einer Dissertation arbeitet. Der Export nach BibTex wird aber leider etwas stiefmütterlich behandelt, was komisch ist, wo doch Latex im Bereich Physik/Mathematik/Informatik der Standard ist.
Unflexibel heißt hier zum Beispiel, dass die zitierten BibTex-Schlüssel (also das, was im \ref{}
als Verweis benutzt wird), die Form „author1_titelwort1_jahr
“ hat. Und zwar genau so, mit kleinen Buchstaben etc.
Wie ein solcher Schlüssel erstellt wird, kann (zumindest in der Variante als Firefox-Plugin) in der Datei BibLaTex
festgelegt werden. Diese Datei enthält JavaScript-Code, der aus einem Zotero-Datenbankeintrag einen BibTex-Eintrag erzeugt.
Ein kleines bisschen Flexibilität ist insofern vorhanden, als es die Variable
//%a = first listed creator surname //%y = year //%t = first word of title var citeKeyFormat = "%a_%t_%y";
gibt, in der man das Format festlegen kann. Nicht so gut ist, dass es nur die drei schon erwähnten Platzhalter gibt.
Ich will hier nicht weiter darauf eingehen, wie man überhaupt auf die Idee kommen kann, ein so eingeschränktes, fest vorgegebenes Verfahren zu implementieren, wenn man schon Ansätze wie allgemeine Schlüssel-Formate und reguläre Ausdrücke für die Implementierung benutzt!
Komplexere Schlüssel erzeugen
Ich hätte gerne Schlüssel mit der folgenden Struktur: „Author1Author2Author3+Jahr
„, wobei das + genau dann gesetzt wird, wenn es mehr als 3 Autoren gibt. Die Felder für Author2
und Author3
bleiben natürlich leer, wenn eine Veröffentlichung entsprechend weniger Autoren hat.
Eine mögliche Lösung:
Die Variable var citeKeyConversions = {
gibt drei Funktionen zurück, abhängig davon, ob a
, t
oder y
als Wert in citeKeyFormat
benutzt worden ist.
Um das Verhalten wie gewünscht anzupassen benutze ich folgendes Vorgehen: wenn die Variable %a
mehrmals benutzt wird, soll jeweils der nächste Author benutzt werden. Weiterhin sollen die Authoren mit großem Anfangsbuchstaben benutzt werden, der Aufruf von toLowerCase()
muss also entfernt werden. Der Anfang des Funktionsgenerators sähe dann z. B. so aus:
var authorcount = 0; // counts how often %a is already used var citeKeyConversions = { "a": function (flags, item) { if (item.creators && item.creators[authorcount] && item.creators[authorcount].lastName) { if( authorcount == 3 ) // add + for each additional author after the third return "+"; // removed the lower case conversion here and access to authorcount-index instead of zero return item.creators[authorcount++].lastName.replace(/ /g, "_").replace(/,/g, ""); } return ""; },
Dies liefert allerdings noch nicht das gewünschte verhalten, die Namen werden weiterhin in Kleinbuchstaben verwandelt. Dafür zuständig ist der reguläre Ausdruck
var citeKeyCleanRe = /[^a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
der Angibt welche Zeichen erlaubt sind. Sämtliche anderen Zeichen werden am Ende entfernt. Hier fehlt der Teil für Großbuchstaben, so dass diese entfernt werden. Wenn man es anpasst, klappt es:
var citeKeyCleanRe = /[^a-zA-Z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+/g;
Mit dem korrekten citeKeyFormat
var citeKeyFormat = "%a%a%a%a%y";
funktioniert es im Wesentlichen, wie gewünscht.
Feintuning
Etwas Feintuning ist allerdings noch notwendig. Es wird zur Formatierung die Methode tidyAccents
aufgerufen, die Akzente, Tilden und Ähnliches entfernt, so dass der BibTex-Key am Ende im Ascii-Format ist. Die dabei aufgerufene Methode ZU.removeDiacritics
ist leider nicht hundertprozentig korrekt, so dass aus einem ß
lediglich ein einzelnes s
wird.
Um das zu korrigieren kann man vorher
r = r.replace(new RegExp("[ß]", 'g'), "ss");
einfügen.
Weitere Änderungen kann man bei Bedarf hinzufügen. Falls Dopplungen auftauchen (was eher unwahrscheinlich ist, aber trotzdem vorkommen kann) werden Anhänge der Form „-1“, „-2“ etc. automatisch angehängt. Für meine Situation habe ich das so angepasst, dass Buchstaben „a“, „b“, etc. angehängt werden.
var citekey = basekey; var i = 0; while (citekeys[citekey]) { //citekey = basekey + "-" + i; citekey = basekey + String.fromCharCode("a".charCodeAt()+i); i++; } citekeys[citekey] = true;
Die Variante mit den Buchstaben ist natürlich nicht so allgemein, wie die mit den Indizes, aber ich erwarte nicht mehr Veröffentlichungen der gleichen Autoren in einem Jahr zu haben, als Buchstaben im Alphabet sind, vor allem, da die hier vorgestellte Variante mit Großbuchstaben fortfährt.
Viel Erfolg euch, euer eigenes Schlüssel-Key-System automatisch generieren zu lassen