为没有 DOI 的学术论文创建具有不同引用风格的格式化参考文献

Creating formatted references with different citation styles to academic papers without DOIs

我想用 R 格式化对不同引用风格的学术论文的引用。

借助 rcrossref 包,我可以根据您指定的样式根据文章的 DOI 轻松创建对某些文章的引用。但是,并非所有论文都有 DOI,因此我正在寻找一种简单的方法来根据来自 BibTeX 条目或其他类型输入的文章信息以不同样式获取文本中的引用。

使用 rcrossref: 礼包内含length(rcrossref::get_styles())2209种不同款式。

例如,您可以在列表元素中使用不同的文本样式获取一些高引用论文的文本引用(来自此来源的 DOI:https://doi.org/10.1038/514550a),如下所示:

library(rcrossref)
# some DOIs of interest
dois <- c("10.1038/514550a", "10.1038/227680a0", "10.1016/0003-2697(76)90527-3",  "10.1073/Pnas.74.12.5463", "10.1016/0003-2697(87)90021-2", "10.1107/S0108767307043930")


# APA cv style
cr_cn(dois = dois, format = "text", style="apa-cv")
# same with Chicago style
cr_cn(dois = dois, format = "text", style="chicago-note-bibliography")
# same with Vancouver style
cr_cn(dois = dois, format = "text", style="vancouver")

现在,假设我有一个没有 DOI 的条目 f.ex。 BibTex 格式,例如:

@article {PMID:14907713,    Title = {Protein measurement with the Folin phenol reagent},    Author = {LOWRY, OH and ROSEBROUGH, NJ and FARR, AL and RANDALL, RJ},   Number = {1},   Volume = {193},     Month = {November},     Year = {1951},  Journal = {The Journal of biological chemistry},    ISSN = {0021-9258},     Pages = {265—275},  URL = {http://www.jbc.org/content/193/1/265.long} }  

我还想在 APA cv、芝加哥和温哥华样式中格式化此条目 f.ex,并以文本形式获得结果,我该怎么做?我还没有找到一个功能。目前有什么方法可以完成这个任务吗?

谢谢!

所以它看起来不像 rcrossref 支持这个,因为一切都发生在他们的 API 服务器上,而且似乎没有办法指定一个原始的 bibtex 条目不有一个DOI。

但是,通常与 RStudio 一起安装并由 rmarkdown 使用的 pandoc 似乎确实支持引用格式。我尝试做一些逆向工程,看看是否可以只生成给定条目的引文。这是我创建的函数。

citation <- function(bib, csl="chicago-author-date.csl", toformat="plain", cslrepo="https://raw.githubusercontent.com/citation-style-language/styles/master") {
  if (!file.exists(bib)) {
    message("Assuming input is literal bibtex entry")
    tmpbib <- tempfile(fileext = ".bib")
    on.exit(unlink(tmpbib), add=TRUE)
    if(!validUTF8(bib)) {
      bib <- iconv(bib, to="UTF-8")
    }
    writeLines(bib, tmpbib)
    bib <- tmpbib
  }
  if (tools::file_ext(csl)!="csl") {
    warning("CSL file name should end in '.csl'")
  }
  if (!file.exists(csl)) {
    cslurl <- file.path(cslrepo, csl)
    message(paste("Downling CSL from", cslurl))
    cslresp <- httr::GET(cslurl, httr::write_disk(csl))
    if(httr::http_error(cslresp)) {
      stop(paste("Could not download CSL.", "Code:", httr::status_code(cslresp)))
    }
  }
  tmpcit <- tempfile(fileext = ".md")
  on.exit(unlink(tmpcit), add=TRUE)
  
  writeLines(c("---","nocite: '@*'","---"), tmpcit)
  rmarkdown::find_pandoc()
  command <- paste(shQuote(rmarkdown:::pandoc()), 
                   "--filter", "pandoc-citeproc",
                   "--to", shQuote(toformat),
                   "--csl", shQuote(csl),
                   "--bibliography", shQuote(bib), 
                  shQuote(tmpcit))
  rmarkdown:::with_pandoc_safe_environment({
    result <- system(command, intern = TRUE)
    Encoding(result) <- "UTF-8"
  })
  result
}

您可以传入您的参考资料,它会使用标准的“CSL”文件对其进行转换。这些 CSL 文件控制格式。对于不同的格式,有一个具有不同 CSL 的巨大回购 here。您可以指定一个 CSL 文件,如果该文件不存在,此功能将自动从 repo 下载它。

您可以传入“原始”引用

test <- "@article {PMID:14907713,    Title = {Protein measurement with the Folin phenol reagent},    Author = {LOWRY, OH and ROSEBROUGH, NJ and FARR, AL and RANDALL, RJ},   Number = {1},   Volume = {193},     Month = {November},     Year = {1951},  Journal = {The Journal of biological chemistry},    ISSN = {0021-9258},     Pages = {265-275},  URL = {http://www.jbc.org/content/193/1/265.long} } "
citation(test)

或者如果数据在文件中,您可以使用文件名

writeLines(test, "test.bib") 
citation("test.bib")

如果您想使用不同的 CSL,只需在 CSL= 参数中设置 CSL 文件的名称即可

citation("test.bib", csl="apa-cv.csl")
citation("test.bib", csl="chicago-note-bibliography.csl")
citation("test.bib", csl="vancouver.csl")