返回技能列表

manage-bibliography

pjt222
更新于 Yesterday
5 次查看
17
2
17
在 GitHub 上查看
general

关于

This skill helps developers manage BibTeX bibliography files using R packages like RefManageR and bibtex. It can parse, merge, deduplicate, and generate .bib entries from identifiers like DOIs, then export clean files. Use it when creating or cleaning bibliographies for R Markdown/Quarto projects or merging collaborator files.

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git 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
  • 可選:去重策略(doititleboth;預設:both
  • 可選:序(authoryearkey;預設: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 裝敗,察 curlxml2 系統庫是否可得。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 會 locale 支援 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 仓库

pjt222/agent-almanac
路径: i18n/wenyan/skills/manage-bibliography
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

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是理想选择。

查看技能