在R Markdown生成PDF时使用units包失效,该如何正确使用?
在R Markdown(PDF输出)中使用units包的解决方案
当然可以在R Markdown的PDF输出里使用units包!你遇到的问题是因为units对象的默认输出格式和LaTeX的排版逻辑不兼容,只需要对units对象做一点格式转换就能解决。
核心问题
当你直接输出len * wid时,它返回的是一个带有单位属性的对象,默认打印时会显示类似50 mm^2的文本,但LaTeX不会自动把^2解析为上标,而且有时候会因为格式问题导致渲染失败。
解决方法
我们需要把units对象转换为LaTeX能识别的字符串格式,这里有两种常用方式:
方法1:自定义函数手动格式化LaTeX友好字符串
可以写一个小函数,把units对象拆分为数值和单位,再将单位的上标转换为LaTeX支持的语法:
--- title: "Units in R Markdown" output: pdf_document ---
knitr::opts_chunk$set(echo = TRUE) library(units) # 自定义转换函数,适配LaTeX上标 unit_to_latex <- function(x) { num_val <- as.numeric(x) unit_text <- format_units(x) # 把^替换为LaTeX上标语法 unit_text <- gsub("\\^(\\d+)", "$^\\1$", unit_text) paste0(num_val, " ", unit_text) }
len <- set_units(5, mm) wid <- set_units(10, mm) area <- len * wid
行内代码:矩形的面积是r unit_to_latex(area)。
cat(paste("The area of the rectangle is", unit_to_latex(area)))
方法2:启用units包的LaTeX输出模式
units包自带了针对LaTeX的输出配置,只需要设置全局选项,就能让单位自动输出为LaTeX兼容格式:
--- title: "Units in R Markdown" output: pdf_document ---
knitr::opts_chunk$set(echo = TRUE) library(units) # 开启LaTeX兼容的单位输出模式 units_options(sep = "~", parse = TRUE)
len <- set_units(5, mm) wid <- set_units(10, mm) area <- len * wid
行内代码:矩形的面积是r area。
cat(paste("The area of the rectangle is", area))
效果说明
用上面任意一种方法,渲染后的PDF都会正确显示:
行内代码:矩形的面积是50 mm$^2$。
The area of the rectangle is 50 mm$^2$
其中mm$^2$会被LaTeX解析为带平方上标的毫米单位,最终呈现你预期的50mm²样式。
注意事项
- 两种方法都能自动处理复杂单位(比如
m/s^2这类带多层上标的单位); - 使用
parse = TRUE选项时,代码块输出建议用cat(),确保knitr能正确识别LaTeX语法; - 若遇到极特殊的单位格式,可微调自定义函数的正则规则,适配需求。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

