Zurück zu Fähigkeiten

manage-bibliography

pjt222
Aktualisiert 2 days ago
8 Ansichten
17
2
17
Auf GitHub ansehen
Metageneral

Über

Diese Fähigkeit unterstützt Entwickler bei der Verwaltung von BibTeX-Bibliografie-Dateien mit R-Paketen wie RefManageR und bibtex. Sie kann Einträge aus Identifikatoren wie DOIs parsen, zusammenführen, deduplizieren und generieren, um anschließend bereinigte .bib-Dateien zu exportieren. Nutzen Sie sie zum Erstellen oder Bereinigen von Bibliografien in R Markdown/Quarto-Projekten oder zum Zusammenführen von Dateien mehrerer Mitwirkender.

Schnellinstallation

Claude Code

Empfohlen
Primär
npx skills add pjt222/agent-almanac -a claude-code
Plugin-BefehlAlternativ
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternativ
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/manage-bibliography

Kopieren Sie diesen Befehl und fügen Sie ihn in Claude Code ein, um diese Fähigkeit zu installieren

Dokumentation

Manage Bibliography

Create, merge, deduplicate BibTeX bibliography files using R. Full lifecycle: parse existing .bib files into structured R objects, generate new entries from identifiers (DOI, ISBN, arXiv ID), merge multiple bibliographies with intelligent deduplication, export clean, consistently formatted .bib output.

When Use

  • Creating new .bib file for R Markdown or Quarto project
  • Merging bibliographies from multiple collaborators or sources
  • Deduplicating .bib file grown through copy-paste accumulation
  • Generating BibTeX entries programmatically from DOIs or other identifiers
  • Cleaning and standardizing existing .bib file (consistent keys, sorted fields)

Inputs

  • Required: Path to one or more .bib files, or list of DOIs/ISBNs/arXiv IDs
  • Optional: Output .bib file path (default: references.bib)
  • Optional: Deduplication strategy (doi, title, both; default: both)
  • Optional: Sort order (author, year, key; default: key)
  • Optional: Key generation pattern (default: AuthorYear)

Steps

Step 1: Install and Load Required Packages

required_packages <- c("RefManageR", "bibtex", "stringdist")
missing <- required_packages[!vapply(required_packages, requireNamespace,
                                     logical(1), quietly = TRUE)]
if (length(missing) > 0) install.packages(missing)

library(RefManageR)

Got: All packages load without errors.

If fail: RefManageR fails to install? Check curl and xml2 system libraries available. On Ubuntu: sudo apt install libcurl4-openssl-dev libxml2-dev.

Step 2: Parse Existing .bib Files

bib <- RefManageR::ReadBib("references.bib", check = FALSE)
message(sprintf("Parsed %d entries from references.bib", length(bib)))

# Inspect structure
print(bib[1:3])

# Access fields programmatically
keys <- names(bib)
years <- vapply(bib, function(x) x$year %||% NA_character_, character(1))

Got: BibEntry object containing all entries from file. Entry count matches number of @article{, @book{, etc. blocks in file.

If fail: Parsing fails? Check for unmatched braces or invalid UTF-8 in .bib file. Run bibtex::read.bib() as fallback with stricter parsing.

Step 3: Generate Entries from Identifiers

# From DOI
entry_doi <- RefManageR::GetBibEntryWithDOI("10.1093/bioinformatics/btz848")

# From a vector of DOIs
dois <- c("10.1093/bioinformatics/btz848", "10.1038/s41586-020-2649-2")
entries <- do.call(c, lapply(dois, function(d) {
  tryCatch(
    RefManageR::GetBibEntryWithDOI(d),
    error = function(e) {
      warning(sprintf("Failed to fetch DOI %s: %s", d, e$message))
      NULL
    }
  )
}))
entries <- Filter(Negate(is.null), entries)

Got: BibEntry objects with complete metadata (title, author, journal, year, DOI) for each successfully resolved identifier.

If fail: DOI resolution depends on CrossRef API. Requests fail? Check network connectivity and whether DOI is valid. Rate limiting may apply for large batches. Add Sys.sleep(1) between requests.

Step 4: Merge Multiple Bibliographies

bib1 <- RefManageR::ReadBib("project_a.bib", check = FALSE)
bib2 <- RefManageR::ReadBib("project_b.bib", check = FALSE)

# Simple merge
merged <- c(bib1, bib2)
message(sprintf("Merged: %d + %d = %d entries (before dedup)",
                length(bib1), length(bib2), length(merged)))

Got: Combined BibEntry object containing entries from both files.

Step 5: Deduplicate Entries

deduplicate_bib <- function(bib, method = "both") {
  n_before <- length(bib)
  keys_to_remove <- c()

  for (i in seq_along(bib)) {
    if (names(bib)[i] %in% keys_to_remove) next
    for (j in seq(i + 1, length(bib))) {
      if (j > length(bib)) break
      if (names(bib)[j] %in% keys_to_remove) next

      is_dup <- FALSE
      if (method %in% c("doi", "both")) {
        doi_i <- bib[[i]]$doi %||% ""
        doi_j <- bib[[j]]$doi %||% ""
        if (nzchar(doi_i) && nzchar(doi_j) && tolower(doi_i) == tolower(doi_j)) {
          is_dup <- TRUE
        }
      }
      if (!is_dup && method %in% c("title", "both")) {
        title_i <- tolower(gsub("[^a-z0-9 ]", "", tolower(bib[[i]]$title %||% "")))
        title_j <- tolower(gsub("[^a-z0-9 ]", "", tolower(bib[[j]]$title %||% "")))
        if (nzchar(title_i) && nzchar(title_j)) {
          sim <- 1 - stringdist::stringdist(title_i, title_j, method = "jw")
          if (sim > 0.95) is_dup <- TRUE
        }
      }
      if (is_dup) keys_to_remove <- c(keys_to_remove, names(bib)[j])
    }
  }

  if (length(keys_to_remove) > 0) {
    bib <- bib[!names(bib) %in% keys_to_remove]
  }
  message(sprintf("Deduplication: %d -> %d entries (%d duplicates removed)",
                  n_before, length(bib), n_before - length(bib)))
  bib
}

merged <- deduplicate_bib(merged, method = "both")

Got: Duplicate entries removed. Count of removed duplicates printed.

If fail: Title comparison too aggressive (removing non-duplicates)? Raise similarity threshold above 0.95 or switch to method = "doi" only.

Step 6: Sort and Export

# Sort by citation key
sorted_bib <- sort(merged, sorting = "nyt")  # name-year-title

# Export to .bib file
RefManageR::WriteBib(sorted_bib, file = "references.bib", biblatex = FALSE)
message(sprintf("Wrote %d entries to references.bib", length(sorted_bib)))

Got: Clean .bib file written to disk with consistent formatting, one entry per block, sorted alphabetically by citation key.

If fail: WriteBib produces encoding issues? Ensure R session locale supports UTF-8: Sys.setlocale("LC_ALL", "en_US.UTF-8").

Checks

  • Output .bib file parses without errors: RefManageR::ReadBib("references.bib")
  • Entry count matches expectations (input count minus duplicates)
  • No duplicate DOIs remain: all DOIs in output unique
  • All entries have citation key
  • Required fields present per entry type (author, title, year at minimum)
  • File is valid BibTeX (test with bibtex::read.bib())

Pitfalls

  • Encoding issues: .bib files with Latin-1 accents break UTF-8 parsers. Convert encoding first: iconv -f ISO-8859-1 -t UTF-8 old.bib > new.bib
  • Unmatched braces: Single missing } silently drops entries. Validate brace balance before parsing large files
  • DOI rate limiting: CrossRef throttles unauthenticated requests. Set polite email with RefManageR::BibOptions(check.entries = FALSE) and batch requests
  • Key collisions: Merging files with duplicate keys (e.g., both have Smith2020) silently overwrites. Regenerate keys after merging
  • LaTeX in titles: Titles with {DNA} or $\alpha$ need careful handling. RefManageR preserves these but downstream tools may strip them

See Also

  • format-citations - format bibliography entries into styled citations
  • validate-references - verify completeness and DOI resolution of .bib entries
  • ../reporting/format-apa-report - generate APA-formatted reports using bibliographies
  • ../r-packages/write-vignette - create package vignettes citing references

GitHub Repository

pjt222/agent-almanac
Pfad: i18n/caveman/skills/manage-bibliography
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

Verwandte Skills

content-collections

Meta

Diese Skill bietet eine produktionsgetestete Einrichtung für Content Collections – ein TypeScript-first-Tool, das Markdown/MDX-Dateien in typsichere Datensammlungen mit Zod-Validierung umwandelt. Verwenden Sie ihn beim Erstellen von Blogs, Dokumentationsseiten oder inhaltsstarken Vite + React-Anwendungen, um Typsicherheit und automatische Inhaltsvalidierung zu gewährleisten. Er behandelt alles von der Vite-Plugin-Konfiguration und MDX-Kompilierung bis hin zur Deployment-Optimierung und Schema-Validierung.

Skill ansehen

polymarket

Meta

Diese Fähigkeit ermöglicht es Entwicklern, Anwendungen mit der Polymarket-Prognosemärkte-Plattform zu erstellen, einschließlich API-Integration für Handel und Marktdaten. Sie bietet außerdem Echtzeit-Datenstreaming über WebSocket, um Live-Trades und Marktaktivitäten zu überwachen. Nutzen Sie sie zur Implementierung von Handelsstrategien oder zur Erstellung von Tools, die Live-Marktaktualisierungen verarbeiten.

Skill ansehen

creating-opencode-plugins

Meta

Diese Fähigkeit unterstützt Entwickler dabei, OpenCode-Plugins zu erstellen, die in über 25 Ereignistypen wie Befehle, Dateien und LSP-Operationen eingreifen. Sie bietet die Plugin-Struktur, Event-API-Spezifikationen und Implementierungsmuster für JavaScript/TypeScript-Module. Nutzen Sie sie, wenn Sie den Lebenszyklus des OpenCode KI-Assistenten mit benutzerdefinierter ereignisgesteuerter Logik abfangen, überwachen oder erweitern müssen.

Skill ansehen

sglang

Meta

SGLang ist ein hochperformantes LLM-Serving-Framework, das sich auf schnelle, strukturierte Generierung für JSON, Regex und agentenbasierte Workflows unter Verwendung seines RadixAttention-Prefix-Cachings spezialisiert. Es bietet deutlich schnellere Inferenz, insbesondere für Aufgaben mit wiederholten Präfixen, was es ideal für komplexe, strukturierte Ausgaben und Mehrfachdialoge macht. Wählen Sie SGLang gegenüber Alternativen wie vLLM, wenn Sie constrained decoding benötigen oder Anwendungen mit umfangreicher Präfix-Weitergabe entwickeln.

Skill ansehen