PAYATHON 2026

R Markdown 的 tufte_book 中如何让 PNG 缩放到边注宽度?

数据阿明

结论

tufte::tufte_book() 支持边注图。对于用 knitr::include_graphics() 插入的 PNG,先确认 fig.margin = TRUE 生效,再用 out.width 设置排版宽度。可以先试试 out.width = '100%',让图片适应边注容器的宽度。仅凭现有代码,不能认定这是 tufte 的功能限制。tufte 图形说明

题目中展示的 YAML 缺少层级缩进,也需要修正。如果只是粘贴时丢失了缩进,以实际 .Rmd 文件为准。

使用明确的输出宽度

将下面的内容保存为 .Rmd 文件,确保 Figure O1.png 位于同一目录。示例将选项写在代码块头部,便于直接确认设置。

---
title: "REPREX"
output:
  tufte::tufte_book:
    citation_package: natbib
    latex_engine: xelatex
    keep_tex: true
  tufte::tufte_html: default
---

```{r setup, include=FALSE}
library(tufte)
knitr::opts_chunk$set(
  cache.extra = packageVersion('tufte')
)
options(htmltools.dir.version = FALSE)
```

Here is some text followed by a margin figure.

```{r margin-image, echo=FALSE, fig.margin=TRUE, out.width='100%'}
knitr::include_graphics("./Figure O1.png", dpi = NA)
```

渲染时选择 tufte::tufte_book,检查生成的 PDF。

dpi = NA 用于关闭按像素和 DPI 自动计算图片输出宽度。明确设置 out.width 后,knitr 本身就会跳过这项自动计算,因此不一定需要 dpi = NA。它也不会修改 PNG 文件或降低文件分辨率。knitr 的 include_graphics() 说明

为什么调整 fig.width 没有解决问题?

这几个选项的作用不同:

  • fig.margin = TRUE:指定图片放入边注区域。
  • fig.width、fig.height:主要控制 R 绘图设备生成图形时的尺寸。
  • out.width、out.height:控制图片在输出文档中的显示尺寸。

include_graphics() 引用已有的 PNG,设置 fig.width = 3.5 不会重新生成图片。要调整这类图片的排版大小,应优先设置 out.width。只指定宽度即可保留原始纵横比,通常不必同时固定高度。knitr 外部图片接口说明

如果仍然显示过宽

示例中的 keep_tex: true 会保留生成的 .tex 文件。找到图片路径附近的 LaTeX 代码,检查以下两点:

  1. 图片是否位于 marginfigure 环境中。如果没有,先排查输出格式和代码块选项是否被识别,以及是否存在自定义 hook。
  2. \includegraphics 是否带有宽度设置。如果边注环境已经存在,但宽度仍不正确,可以针对 PDF 改用明确的 LaTeX 长度:
```{r margin-image, echo=FALSE, fig.margin=TRUE, out.width='\\marginparwidth'}
knitr::include_graphics("./Figure O1.png", dpi = NA)
```

'\\marginparwidth' 是 R 字符串写法,双反斜杠表示输出一个反斜杠;生成的 LaTeX 长度是 \marginparwidth。这种设置针对 LaTeX/PDF,同时生成 HTML 时优先使用前面的百分比方案。

当前材料没有提供包版本、实际图片和生成的 .tex,还不能确认故障具体发生在哪一步。如果最小示例仍然异常,应结合 sessionInfo() 和对应的 LaTeX 片段继续定位。

备注:内容仅供参考。