在 flextable 中设置方程式的字体系列和大小
Set font family and size of equations in flextable
我正在寻找一个选项来设置 flextable
中方程式的字体系列和大小。
一般来说,table、行和列的字体系列和大小可以通过糖函数 flextable::font
和 flextable::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 代码,你会发现当你这样做时
print(ft)
它调用
flextable:::print.flextable
调用
htmltools_value(ft)
,调用
flextable:::html_str(ft)
,调用
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,所以这会更难实现。
我正在寻找一个选项来设置 flextable
中方程式的字体系列和大小。
一般来说,table、行和列的字体系列和大小可以通过糖函数 flextable::font
和 flextable::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 代码,你会发现当你这样做时
print(ft)
它调用flextable:::print.flextable
调用htmltools_value(ft)
,调用flextable:::html_str(ft)
,调用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,所以这会更难实现。