Benutzerdefinierte BibTex-Keys mit Zotero

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! :facepalm:

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 :)

Zuletzt geändert: 14. März 2014 um 23:18 Uhr.

Geschrieben von .

a.k.a.

Ich bin Diplom-Informatiker, den es von Herten im wunderschönen Ruhrgebiet nach Berlin verschlagen hat. An der TU Berlin forsche ich nun als wissenschaftlicher Mitarbeiter in der kombinatorischen Optimierung an Graphalgorithmen; nebenbei bringe ich Anfängern Programmieren bei. Ich blogge hier über alles was mich interessiert, vor allem Nerdiges und Reisen.

1 thought on “Benutzerdefinierte BibTex-Keys mit Zotero

  1. link

    Moroever, it would be very helpful to be able to see the Bibtex cite key somehow within zotero, either as an optional column in the main pane, or as a key on the „Info“ tab. As it is now, there is no way to access the cite key at all from within Zotero. Just a thought.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

O:-) B-) :cry: :-* :D :-o :P ;) :O :-/ more »