如何在R Markdown中用网格排列PNG并支持LaTeX subref引用
解决方案
要实现用LaTeX subref 包引用子图,核心是让knitr/bookdown生成带子图结构的LaTeX代码,而非将所有图拼成单一栅格图(这会丢失子图标签信息)。具体操作如下:
关键逻辑
之前用cowplot拼接的方式会把三个图合并成一个独立ggplot对象,knitr仅输出一个figure环境,无法生成subfigure子环境,因此无法用subref引用子图。我们需要让每个子图独立输出,由knitr自动生成subfigure结构。
步骤1:调整代码块参数
修改knitr参数,指定子图副标题、输出宽度以控制布局:
fig.subcap:为每个子图设置副标题,自动生成(a)(b)(c)标签out.width:控制子图宽度,第一张占100%(整行),第二、三张各占50%(并排)fig.cap:设置整体图标题
步骤2:重写R代码(移除cowplot拼接)
直接输出每个独立图对象,不再用cowplot拼接:
--- title: "Grid" output: bookdown::pdf_document2: template: NULL keep_tex: true number_sections: false latex_engine: pdflatex header-includes: - \usepackage[subrefformat=simple]{subfig} ---
```{r label, echo = FALSE, warning=FALSE} #| fig.cap: "整体图标题" #| fig.align: "center" #| fig.subcap: ["Figure1", "Figure2", "Figure3"] #| out.width: ["100%", "50%", "50%"] library(magick) library(ggplot2) # 注意:原代码的ggplot应为ggplot2 # 加载PNG图片 png_image1 <- image_read("images/rectangle.png") png_image2 <- image_read("images/square1.png") png_image3 <- image_read("images/square2.png") # 转换为ggplot对象 im1 <- image_ggplot(png_image1) im2 <- image_ggplot(png_image2) im3 <- image_ggplot(png_image3) # 依次输出三个子图 print(im1) print(im2) print(im3)
## 步骤3:引用子图 在文档文本中,直接使用LaTeX的`subref`命令引用子图: - 引用第一个子图:`\subref*{fig:label-1}` - 引用第二个子图:`\subref*{fig:label-2}` - 引用第三个子图:`\subref*{fig:label-3}` 生成的PDF中,子图标签会与文档其他子图格式一致,且支持`subrefformat=simple`设置的无括号引用样式。 内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

