You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rmd可正常渲染HTML,转PDF出现LaTeX图形格式错误求助

解决R Markdown转PDF时图片带?raw=true的LaTeX编译错误

我来帮你搞定这个头疼的问题——你遇到的情况是R Markdown转HTML完全正常,但生成PDF时就弹出LaTeX错误,提示Unknown graphics extension: .png?raw=true,对吧?

问题根源

本质原因是LaTeX的\includegraphics命令不认带查询参数的文件名,而你的Rmd转成LaTeX后,图片链接里的?raw=true被原封不动保留了:

\begin{figure} \centering \includegraphics[width=4.16667in]{pics/myimage.png?raw=true} \caption{Some text here.} \end{figure}

这个参数是GitHub显示图片必需的,但LaTeX完全不买账。另外你提到的keep_md: yes确实有可能加剧这个问题——因为保留的MD文件会带着?raw=true,后续转LaTeX时就直接用了这个有问题的链接。

靠谱的解决方案

1. 用条件渲染自动适配HTML和PDF

既然HTML需要?raw=true、PDF不需要,我们让knitr根据输出格式自动切换图片链接就行。把你原来的图片引用换成下面这个代码块:

```{r echo=FALSE, results='asis'}
if (knitr::is_html_output()) {
  # HTML输出保留?raw=true
  cat('![Some text here.](pics/myimage.png?raw=true){width=400px}')
} else {
  # PDF输出自动去掉参数
  cat('![Some text here.](pics/myimage.png){width=400px}')
}
这样编译HTML时会生成带参数的链接,满足GitHub需求;编译PDF时则用纯净的图片路径,LaTeX就能正常识别了。

#### 2. 调整`keep_md`设置(可选排查)
如果怀疑`keep_md: yes`是诱因,可以先把这个设置关掉试试:
```yaml
html_document:
  keep_md: no  # 暂时关闭测试
  number_sections: yes
  toc: yes
  toc_depth: 2

要是关闭后PDF能正常生成,说明确实是保留的MD文件带着有问题的链接导致的,这时候优先用上面的条件渲染方案,既能保留keep_md又能解决问题。

3. 临时应急:手动修改LaTeX文件

如果赶时间要出PDF,也可以在knitr生成test.tex后,手动把所有图片链接里的?raw=true删掉,再编译成PDF。不过这只是临时办法,长期用还是推荐条件渲染。

验证效果

把条件渲染代码替换到你的示例Rmd里,重新编译:

  • HTML输出会保留?raw=true,GitHub上能正常显示图片
  • PDF输出会自动移除参数,LaTeX编译不会再报错

内容的提问来源于stack exchange,提问作者Christoph

火山引擎 最新活动