首页 > 解决方案 > 在 Sumatra PDF 阅读器中打开已编译的 .rnw 的自定义功能?

问题描述

自从更新到 Windows 10 后,如果 .rnw 文件有引用,我无法使用 Rstudio 中的“编译 PDF”按钮编译它们(我使用 natbib 包)。所以,我放弃了 Sweave 转而使用 Knitr。虽然不如编译 PDF 按钮方便,但该命令

knitr::knit2pdf('my_doc.rnw')

使用 R 代码、Latex 和引用编译 PDF 时不会出错。但是,与“编译 PDF”按钮不同的是,它不会在我首选的 PDF 预览器 Sumatra 中自动启动新编译的 PDF。我的问题是,knitr::knit2pdf 的源代码是否可以,即,

function (input, output = NULL, compiler = NULL, envir = parent.frame(), 
    quiet = FALSE, ...) 
{
    out = knit(input, output = output, envir = envir, quiet = quiet)
    owd = setwd(dirname(out))
    on.exit(setwd(owd))
    if (is.null(compiler)) {
        compiler = if (grepl("\\.rst$", out)) 
            "rst2pdf"
        else "pdflatex"
    }
    if (identical(compiler, "rst2pdf")) {
        if (tolower(file_ext(out)) != "rst") 
            stop("for rst2pdf compiler input must be a .rst file")
        rst2pdf(basename(out), ...)
    }
    else {
        tinytex::latexmk(basename(out), engine = compiler, ...)
    }
    with_ext(out, "pdf")
}

每次运行时都会修改为启动和更新新编译的 PDFknitr::knit2pdf?谢谢。

标签: rpdflatexknitr

解决方案


我不建议尝试“修改” knit2pdf——但您可以在编织后轻松地在 SumatraPDF 中打开您的 PDF。只需致电:

system2("C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe", args = "my_doc.pdf", wait = FALSE, invisible = FALSE)

您可能需要将路径调整为SumatraPDF.exe. 当 PDF 更改时,SumatraPDF 会自动更新,因此您无需任何额外的努力即可查看更改。

如果您更喜欢使用 oneliner 来编织和打开 PDF:

knit2sumatra <- function(input) {
  # "input" should be the filename WITHOUT extension
  knitr::knit2pdf(paste0(input, ".Rnw"))
  system2(
    "C:/Program Files/RStudio/bin/sumatra/SumatraPDF.exe",
    args = paste0(input, ".pdf"),
    wait = FALSE,
    invisible = FALSE
  )
}

或者,只需将system2调用放在 RNW 文件中的一个块(某处)中。SumatraPDF 将尝试过早打开 PDF - 但一旦编译完成,最终的 PDF 将可见。


推荐阅读