manage-bibliography
关于
This Claude Skill manages BibTeX bibliography files using R packages like RefManageR. It can parse, merge, deduplicate entries, and generate citations from identifiers like DOI or ISBN. Use it to clean, consolidate, or programmatically create .bib files for R Markdown or Quarto projects.
快速安装
Claude Code
推荐npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/manage-bibliography在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
管文獻
以 R 創、合並去重 BibTeX 文獻文件。此技能涵文獻管理之全生命:解析既有 .bib 文件為結構化 R 物件、自標識(DOI、ISBN、arXiv ID)生新條目、以智能去重合並多文獻,並匯出潔、一致格式之 .bib 出。
適用時機
- 為 R Markdown 或 Quarto 項目創新 .bib 文件
- 合並多協作者或源之文獻
- 去重因複製粘貼積而長之 .bib 文件
- 自 DOI 或他標識以程式生 BibTeX 條目
- 清並標化既有 .bib 文件(一致鍵、已排之域)
輸入
- 必要:一或多 .bib 文件之路,或 DOI/ISBN/arXiv ID 之清單
- 選擇性:出 .bib 文件路(默認:
references.bib) - 選擇性:去重策略(
doi、title、both;默認:both) - 選擇性:排序(
author、year、key;默認:key) - 選擇性:鍵生模式(默認:
AuthorYear)
步驟
步驟一:裝並載所需套件
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)
預期: 所有套件無誤載。
失敗時: 若 RefManageR 裝敗,查 curl 與 xml2 系統庫可得。Ubuntu 上:sudo apt install libcurl4-openssl-dev libxml2-dev。
步驟二:解析既有 .bib 文件
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))
預期: 含文件中所有條目之 BibEntry 物件。條目數匹配文件中 @article{、@book{ 等塊之數。
失敗時: 若解析敗,查 .bib 文件中未匹花括或無效 UTF-8。行 bibtex::read.bib() 為後備以嚴解析。
步驟三:自標識生條目
# 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)
預期: 每成功解之標識之 BibEntry 物件附完整元數據(標題、作者、期刊、年、DOI)。
失敗時: DOI 解析依 CrossRef API。若請求敗,查網連與 DOI 有效。大批或適速率限制;於請求間加 Sys.sleep(1)。
步驟四:合並多文獻
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)))
預期: 合並之 BibEntry 物件含兩文件之條目。
步驟五:去重條目
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")
預期: 重條目已除。已除重數已印。
失敗時: 若題比較過激(除非重),升相似閾值過 0.95 或僅換 method = "doi"。
步驟六:排序並匯出
# 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)))
預期: 潔 .bib 文件已書於磁,格式一致,每條一塊,按引鍵字母序排。
失敗時: 若 WriteBib 生編碼問題,確 R 會話語系支 UTF-8:Sys.setlocale("LC_ALL", "en_US.UTF-8")。
驗證
- 出 .bib 文件無誤解:
RefManageR::ReadBib("references.bib") - 條目數合期(輸入數減重)
- 無重 DOI 存:出中所有 DOI 唯一
- 所有條目有引鍵
- 依條類所需域已具(至少作者、題、年)
- 文件為有效 BibTeX(以
bibtex::read.bib()測)
常見陷阱
- 編碼問題:含 Latin-1 重音之 .bib 文件破 UTF-8 解析器。先轉編碼:
iconv -f ISO-8859-1 -t UTF-8 old.bib > new.bib - 未匹花括:單缺
}默丟條目。解大文件前驗花括平衡 - DOI 速率限制:CrossRef 節未認證請求。以
RefManageR::BibOptions(check.entries = FALSE)設禮電郵並批請求 - 鍵衝突:合並含重鍵之文件(如兩者皆有
Smith2020)默覆。合後重生鍵 - 題中 LaTeX:含
{DNA}或$\alpha$之題需謹處;RefManageR 保之而下游工具或剝之
相關技能
format-citations- 化文獻條目為樣式引validate-references- 驗 .bib 條目之全與 DOI 解析../reporting/format-apa-report- 以文獻生 APA 格式之報../r-packages/write-vignette- 創引文獻之套件小品
GitHub 仓库
相关推荐技能
content-collections
元Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。
polymarket
元这个Claude Skill为开发者提供完整的Polymarket预测市场开发支持,涵盖API调用、交易执行和市场数据分析。关键特性包括实时WebSocket数据流,可监控实时交易、订单和市场动态。开发者可用它构建预测市场应用、实施交易策略并集成实时市场预测功能。
creating-opencode-plugins
元该Skill帮助开发者创建OpenCode插件,用于接入命令、文件、LSP等25+种事件。它提供了插件结构、事件API规范和JavaScript/TypeScript实现模式,适合需要拦截操作、扩展功能或自定义事件处理的场景。开发者可通过它快速构建响应式模块来增强OpenCode AI助手的能力。
sglang
元SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。
