为何blogdown目录内编织Rmd文件与目录外输出结果不一致
Knit按钮底层执行逻辑
- 读取当前Rmd文件的YAML头配置,匹配输出格式规则。如果检测到当前工作目录属于blogdown项目(存在config.toml、config.yaml或站点级_index.md等标识文件),blogdown包会默认覆盖原生rmarkdown的输出配置,优先调用内置站点渲染逻辑。
- 调用knitr引擎运行Rmd内所有代码块,将代码运行结果、文本内容拼接生成中间markdown文件(即日志中的
.knit.md文件)。 - 调用pandoc工具,按照输出格式对应的参数,将中间markdown文件渲染为最终的输出文件。
问题原因
blogdown目录下渲染时的pandoc参数和非blogdown目录存在核心差异:
- blogdown目录下默认调用
--template /usr/local/lib/R/site-library/blogdown/resources/template-minimal.html极简模板,没有包含bootstrap主题样式、MathJax完整加载配置、静态资源内嵌逻辑,因此出现样式错乱、公式无法渲染的问题,输出文件为临时文件1.html~而非可用的标准html文件。
- 非blogdown目录下调用rmarkdown默认的
default.html模板,自带完整的bootstrap主题、MathJax CDN配置,同时开启--self-contained参数将所有静态资源内嵌到html文件中,渲染效果符合预期。
配置调整方案
单文件指定输出格式
仅需要调整单个Rmd的渲染效果时,直接在Rmd文件的YAML头明确指定输出格式,覆盖blogdown的默认配置即可:
--- title: "文档标题" output: html_document ---
点击knit后会直接走rmarkdown原生的html_document渲染逻辑,和非blogdown目录下的输出效果完全一致。
全局修改项目默认配置
如果需要整个blogdown项目下所有Rmd手动knit时都默认生成标准html_document,在项目根目录的.Rprofile文件中添加如下配置:
options(blogdown.knit.on_save = FALSE, blogdown.knit.output = "html_document")
修改完成后重启R会话即可生效,后续项目内所有Rmd点击knit都会默认使用标准html_document格式渲染。
内容的提问来源于stack exchange,提问作者NickZeng
相关产品推荐
相关产品推荐

