在 flextable 中设置方程式的字体系列和大小

Set font family and size of equations in flextable

我正在寻找一个选项来设置 flextable 中方程式的字体系列和大小。

一般来说,table、行和列的字体系列和大小可以通过糖函数 flextable::fontflextable::fontsize 设置。但是,无论是在 HTML 输出还是导出到 docx 时,两者都不会影响方程式的字体系列和大小。

运行 下面的 reprex 为 text 列提供了正确的字体系列和大小,但不为 formula 列提供了正确的字体系列和大小.

library(flextable)

# Note: Running the reprex requires the `equatags` package. 
# Also equatags::mathjax_install() must be executed
# to install necessary dependencies. See ?flextable::as_equation.

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)
df
#>   text                                 formula
#> 1    A                     (ax^2 + bx + c = 0)
#> 2    B                                a \ne 0
#> 3    C x = {-b \pm \sqrt{b^2-4ac} \over 2a}

ft <- flextable(df)
ft <- compose(
  x = ft, j = "formula",
  value = as_paragraph(as_equation(formula, width = 2))
)
ft <- width(ft, j = 2, width = 2)
ft <- fontsize(ft, size = 20, part = "all")

fn <- tempfile(fileext = ".docx")
save_as_docx(ft, path = fn)
if (FALSE) fs::file_show(fn) # Set to TRUE to show file

要控制行高,您需要指定 hrule(ft, i = 1:3, rule = 'atleast') 以及通过 height_all

以英寸为单位的高度
ft <- flextable(df)
ft <- compose(
  x = ft, j = "formula",
  value = as_paragraph(as_equation(formula, width = 3, height = 2))
)
ft <- width(ft, j = 1:2, width = 2)
ft <- hrule(ft, i = 1:3, rule = 'atleast')
ft <- height_all(ft, height = 1)
ft <- fontsize(ft, size = 20, part = "all")

不幸的是,这并没有改变方程式的大小:

构成第二列的 mathjax 公式(包括文本字符)呈现为 SVG 路径,并且它们的大小和字体系列都是固定的。

如果你深入研究 flextable 代码,你会发现当你这样做时

  1. print(ft) 它调用
  2. flextable:::print.flextable 调用
  3. htmltools_value(ft) ,调用
  4. flextable:::html_str(ft),调用
  5. flextable:::html_gen(ft),生成实际的 html.

公式字符串在 html_gen 内部直接传递到 equatags::transform_mathjax,它不接受任何大小或字体系列参数,只是吐出默认的 mathjax svg。 svg 图像以固定大小合并到 table 个单元格中。

为了更改 svg 的大小,您需要参与 svg hacking,这在简单缩放的情况下并不难:

html_format <- as.character(htmltools_value(ft))
html_format <- gsub('<svg ',
                    '<svg transform=\"scale(2)\" ',
                    html_format, fixed = TRUE)

html_format对象就是flextable的html字符串,可以渲染 像这样:

dir <- tempfile()
dir.create(dir)
htmlFile <- file.path(dir, "index.html")
writeLines(html_format, con = htmlFile)
rstudioapi::viewer(htmlFile)

导致

None 这当然是理想的,但它只是限制了 flextable 通过 equatags 呈现公式的方式。

不幸的是,Mathjax does not allow for arbitrary fonts to be used,所以这会更难实现。