如何使用devtools::build_vignettes()同时生成HTML与PDF格式的vignette文件?
我之前也碰到过这个问题,默认情况下devtools::build_vignettes()确实只会生成你YAML配置里output列表的第一个格式——这是因为vignette系统原本的设计是为每个文档提供一种标准展示格式。不过想要同时生成HTML和PDF也有几个可行的办法,分享给你:
方法1:手动分别渲染两种格式到指定目录
这是最直接的解决方案,我们绕过build_vignettes()的单格式限制,用rmarkdown::render()分别生成两种格式的文件,然后放到inst/doc目录(这是build_vignettes()最终存放vignette文件的默认位置)。
在R控制台运行以下代码就行:
# 替换成你的vignette文件实际路径 vignette_file <- "vignettes/Function_xyz.Rmd" # 生成HTML文件并放到inst/doc rmarkdown::render(vignette_file, output_format = "html_document", output_dir = "inst/doc") # 生成PDF文件并放到inst/doc rmarkdown::render(vignette_file, output_format = "pdf_document", output_dir = "inst/doc")
如果需要更新vignette的索引页面(比如doc/index.html),可以再运行一次devtools::build_vignettes(),它会自动识别inst/doc里的两个文件并更新索引。
方法2:配置多输出YAML+自定义批量渲染脚本
你可以先保留Rmd里的多输出配置,然后写个简单的脚本批量生成两种格式,最后再更新vignette索引。
首先你的Rmd YAML保持不变:
--- title: "Function xyz" output: html_document: default pdf_document: default vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} ---
然后创建一个R脚本(比如build_vignettes_multi.R),内容如下:
# 找到vignettes目录下所有的Rmd文件 all_vignettes <- list.files("vignettes", pattern = "\\.Rmd$", full.names = TRUE) # 遍历每个文件,同时生成HTML和PDF for (rmd_file in all_vignettes) { rmarkdown::render(rmd_file, output_format = c("html_document", "pdf_document"), output_dir = "inst/doc") } # 更新vignette索引,避免重复渲染文件 devtools::build_vignettes(build_vignettes = FALSE)
运行这个脚本就能一次性生成所有vignette的两种格式文件,还能自动更新索引。
方法3:用bookdown增强多输出能力(可选)
如果你的vignette需要更复杂的格式(比如交叉引用、章节编号),可以用bookdown的输出格式,它原生支持同时生成多种格式。
把Rmd的YAML修改成:
--- title: "Function xyz" output: bookdown::html_document2: default bookdown::pdf_document2: default vignette: > %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} ---
然后同样用rmarkdown::render()指定两种格式生成文件,用法和方法2一致,只是输出格式换成bookdown的版本,能获得更专业的文档排版效果。
备注:内容来源于stack exchange,提问作者dkarlez

