如何设置flextable中公式的字体族与字号
这个问题我之前也碰到过!其实是因为as_equation()生成的内容和普通文本不是同一类对象——在DOCX里它是Word的原生公式元素,在HTML里则依赖MathJax渲染,flextable的通用font()和fontsize()函数没法直接作用在这些特殊元素上,得针对性设置才行。
下面分两种输出场景给你解决方案:
1. 针对DOCX输出的处理
要调整DOCX里的公式字体和字号,我们可以借助officer包的fp_text()创建样式对象,然后通过as_equation()的props参数传入:
library(flextable) library(officer) # 用来创建公式的样式属性 eqs <- c( "(ax^2 + bx + c = 0)", "a \\ne 0", "x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}" ) text = LETTERS[1:3] df <- data.frame(text = text, formula = eqs) # 定义公式的样式:字号20,字体族设为Arial(可替换成你需要的字体) eq_style <- fp_text(font.size = 20, font.family = "Arial") ft <- flextable(df) ft <- compose( x = ft, j = "formula", value = as_paragraph( as_equation(formula, width = 2, props = eq_style) # 把样式传给公式 ) ) ft <- width(ft, j = 2, width = 2) # 普通文本的样式还是用常规方法设置 ft <- fontsize(ft, size = 20, part = "all") ft <- font(ft, fontname = "Arial", part = "all") # 导出DOCX fn <- tempfile(fileext = ".docx") save_as_docx(ft, path = fn) # fs::file_show(fn) # 取消注释打开文件查看效果
这样导出的DOCX里,公式和普通文本的字体、字号就能保持一致了。
2. 针对HTML输出的处理
HTML里的公式是MathJax渲染的,我们可以给公式元素添加行内CSS样式来调整字体和大小:
library(flextable) library(htmltools) eqs <- c( "(ax^2 + bx + c = 0)", "a \\ne 0", "x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}" ) text = LETTERS[1:3] df <- data.frame(text = text, formula = eqs) ft <- flextable(df) ft <- compose( x = ft, j = "formula", value = as_paragraph( as_equation( formula, width = 2, # 添加行内CSS样式,设置字号和字体族 attr = list(style = "font-size:20px; font-family:Arial;") ) ) ) ft <- width(ft, j = 2, width = 2) # 普通文本的样式照常设置 ft <- fontsize(ft, size = 20, part = "all") ft <- font(ft, fontname = "Arial", part = "all") # 导出HTML ft_html <- tempfile(fileext = ".html") save_as_html(ft, path = ft_html) # fs::file_show(ft_html) # 取消注释打开文件查看效果
需要注意的是,MathJax对部分字体的支持有限,如果自定义字体不生效,可以试试MathJax默认支持的字体(比如STIX-Regular、Times New Roman等)。
内容的提问来源于stack exchange,提问作者stefan
相关产品推荐
相关产品推荐

