MCP HubMCP Hub
Volver a habilidades

manage-bibliography

pjt222
Actualizado Yesterday
3 vistas
17
2
17
Ver en GitHub
Metageneral

Acerca de

Esta habilidad ayuda a los desarrolladores a gestionar archivos de bibliografía BibTeX utilizando paquetes de R como RefManageR y bibtex. Puede analizar, fusionar, eliminar duplicados y generar entradas a partir de identificadores como DOI, para luego exportar archivos .bib limpios. Úsala para crear o limpiar bibliografías en proyectos de R Markdown/Quarto o para fusionar archivos de colaboradores.

Instalación rápida

Claude Code

Recomendado
Principal
npx skills add pjt222/agent-almanac -a claude-code
Comando PluginAlternativo
/plugin add https://github.com/pjt222/agent-almanac
Git CloneAlternativo
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/manage-bibliography

Copia y pega este comando en Claude Code para instalar esta habilidad

Documentación

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

Repositorio GitHub

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

Habilidades relacionadas

content-collections

Meta

Esta habilidad proporciona una configuración probada en producción para Content Collections, una herramienta centrada en TypeScript que transforma archivos Markdown/MDX en colecciones de datos con tipado seguro mediante validación Zod. Úsala al construir blogs, sitios de documentación o aplicaciones Vite + React con mucho contenido para garantizar seguridad de tipos y validación automática de contenido. Abarca todo, desde la configuración del plugin de Vite y compilación MDX hasta la optimización de despliegue y validación de esquemas.

Ver habilidad

polymarket

Meta

Esta habilidad permite a los desarrolladores crear aplicaciones con la plataforma de mercados de predicción Polymarket, incluyendo la integración de API para operaciones y datos de mercado. También proporciona transmisión de datos en tiempo real a través de WebSocket para monitorear operaciones en vivo y actividad del mercado. Úsela para implementar estrategias de trading o crear herramientas que procesen actualizaciones de mercado en tiempo real.

Ver habilidad

creating-opencode-plugins

Meta

Esta habilidad ayuda a los desarrolladores a crear complementos de OpenCode que se conectan a más de 25 tipos de eventos, como comandos, archivos y operaciones LSP. Proporciona la estructura del complemento, las especificaciones de la API de eventos y los patrones de implementación para módulos en JavaScript/TypeScript. Úsala cuando necesites interceptar, monitorear o extender el ciclo de vida del asistente de IA de OpenCode con lógica personalizada basada en eventos.

Ver habilidad

sglang

Meta

SGLang es un framework de alto rendimiento para el servicio de LLM que se especializa en generación rápida y estructurada para JSON, expresiones regulares y flujos de trabajo de agentes utilizando su caché de prefijos RadixAttention. Ofrece una inferencia significativamente más rápida, especialmente para tareas con prefijos repetidos, lo que lo hace ideal para salidas complejas y estructuradas, y conversaciones multiturno. Elige SGLang sobre alternativas como vLLM cuando necesites decodificación restringida o estés construyendo aplicaciones con uso extensivo de prefijos compartidos.

Ver habilidad