扫描 Rmarkdown 文档中的 bibtexkeys

Scan bibtexkeys in Rmarkdown documents

我喜欢 Rmarkdown 生成文档的简单性,并且我在 Bibtex (*.bib) 文档中维护我自己的库。 我正在使用 these instructions 在文档中引用(bibtexkey 以“@”符号开头)。

我的问题是:有没有办法扫描Rmarkdown文档(*.Rmd)并提取文档中引用的bibtexkeys列表? 这可能会很好地生成我的库的一个子集以附加到项目而不是所有的 ca。我的图书馆中积累了 6000 篇参考文献。

您可以通过查找给定的字符串模式(即 @)来解析您的 .Rmd 文档。

示例:

创建示例文件

Rmd_txt  <- "Lorem ipsum dolor sit amet [@bibkey_a], consectetur adipisici elit [@bibkey_b], sed eiusmod tempor incidunt ut labore et dolore magna aliqua [@bibkey_c;@bibkey_d]."
writeLines(Rmd_txt, "rmdfile.Rmd")

读取文件:

Rmd <- readChar("rmdfile.Rmd",nchars=1e6)

使用 RegExp 查找字符串以 [@ 开头并以 ]

结尾的所有情况
pattern <- "\[@(.*?)\]"
m <- regmatches(Rmd,gregexpr(pattern,Rmd))[[1]]
m
[1] "[@bibkey_a]"           "[@bibkey_b]"           "[@bibkey_c;@bibkey_d]"

最后根据您的需要拆分并清理字符串

res <- unlist(strsplit(m,";"))

res<- gsub("\[","",res)
res<- gsub("\]","",res)

res
[1] "@bibkey_a" "@bibkey_b" "@bibkey_c" "@bibkey_d"

在探索了几个替代方案之后,我从包 stringr 中找到了函数 str_extract()。 我在这里假设,你有一个 bibtex 库,包括所有引用的参考文献(通常更多)。 由于不同的 bibtexkey 样式,我还将 的示例与自己的示例结合起来。

首先是 Rmd 文档。

rmd_text <- c("# Introduction",
        "",
        "Lorem ipsum dolor sit amet [@bibkey_a], consectetur adipisici elit [@bibkey_b],",
        "sed eiusmod tempor incidunt ut labore et dolore magna aliqua [@bibkey_c;@bibkey_d].",
        "",
        "According to @Noname2000, the world is round [@Ladybug1999;Ladybug2009].",
        "This knowledge got lost [@Ladybug2009a].")
writeLines(rmd_text, "document.Rmd")

下一个代码块已注释。最后我们得到一个包含所有被引用参考文献的向量,可以将其压缩为 unique().

# Bibtexkeys from bib file
keys <- c("bibkey_a", "bibkey_b", "bibkey_c", "bibkey_d",
        "Noname2000", "Ladybug1999", "Ladybug2009", "Ladybug2009a")
keys <- paste0("@", keys)

# Read document
document <- readLines("document.Rmd")

# Scan document line by line
cited_refs <- list()
for(i in 1:length(document)) {
    cited_refs[[i]] <- str_extract(document[i], keys)
}

# Final output
cited_refs <- unlist(cited_refs)
cited_refs <- cited_refs[!is.na(cited_refs)]

summary(as.factor(cited_refs))

然后可以聚合生成的向量以了解文本中出现的频率(我认为对于检测罕见引用也很有用)。我也在考虑在输出中提取“行号”。

一个更简单的解决方案是使用函数 bbt_detect_citations()rbbt

另见 this discussion