扫描 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
。
我喜欢 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
。