如何用bookdown生成含SVG图片的PDF?LaTeX报错求助
解决LaTeX无法识别SVG格式图片的问题
你遇到的这个问题很常见——LaTeX本身确实不支持直接导入SVG文件,不过有几个简单的办法能搞定:
方法1:让knitr自动转换SVG为PDF/PNG
knitr自带格式转换功能,你可以通过全局设置或者单个代码块配置,让它根据输出格式自动适配图片类型:
全局设置(推荐)
在你的R Markdown文档开头添加这段代码,一次配置适配所有图片:
knitr::opts_chunk$set( dev = c("svg", "pdf"), # HTML输出用SVG,PDF输出自动转成PDF格式 dev.args = list(pdf = list(useDingbats = FALSE)) # 避免部分PDF渲染异常问题 )
这样生成PDF时,knitr会自动把SVG转换成LaTeX能识别的矢量PDF,完全不用手动修改图片路径。
单个代码块设置
如果只想针对这张图片调整,直接修改你的代码块:
{r huff51, fig.show='hold', fig.cap='Design decisions connecting research purpose and outcomes [@huff_2009_designingresearchpublication p. 86].', echo=FALSE, dev='pdf'} knitr::include_graphics('images/Huff-2009-fig5.1.svg')
不过这个方法的缺点是HTML输出也会用PDF图片,不如全局设置灵活。
方法2:手动转换SVG为PDF/PNG
如果你更习惯手动操作,可以把SVG转成PDF(推荐用PDF,矢量图清晰度不会损失):
- 用Inkscape打开SVG文件,导出为PDF,保存为
images/Huff-2009-fig5.1.pdf - 然后修改代码块里的图片路径,让knitr自动匹配输出格式:
{r huff51, fig.show='hold', fig.cap='Design decisions connecting research purpose and outcomes [@huff_2009_designingresearchpublication p. 86].', echo=FALSE} knitr::include_graphics(c('images/Huff-2009-fig5.1.svg', 'images/Huff-2009-fig5.1.pdf'))
这样HTML会加载SVG,PDF会加载转换好的PDF图片,两边都能正常显示。
方法3:让LaTeX直接支持SVG
如果你不想转换格式,可以给LaTeX添加支持SVG的包。在你的bookdown文档的YAML头部或者_output.yml里设置:
output: bookdown::pdf_book: includes: in_header: preamble.tex
然后创建preamble.tex文件,写入LaTeX包引用:
\usepackage{svg}
不过这个方法需要你的LaTeX环境安装了svg包,而且编译时可能需要开启shell escape(部分环境默认未启用),操作相对麻烦,新手更推荐前两种方法。
内容的提问来源于stack exchange,提问作者Peter Smith
相关产品推荐
相关产品推荐

