Я ищу возможность установить семейство шрифтов и размер уравнений в flextable
.
Как правило, семейство шрифтов и размер таблицы, строк и столбцов можно установить с помощью сахарных функций flextable::font
и flextable::fontsize
. Однако ни то, ни другое не влияет на семейство шрифтов и размер уравнений ни в выводе HTML, ни при экспорте в docx.
Запуск приведенного ниже репрекса дает правильное семейство и размер шрифта для столбца текст, но не для столбца формула.
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
@Квинтен Да. Конечно. Мой репрекс основан на этом. Я также пробовал использовать разные аргументы width
и height
, так как согласно документации их можно использовать для установки size of the resulting equation
. Но не повезло. На самом деле я не понимаю, как работают эти аргументы, поскольку они не повлияли на конечный результат.
Чтобы контролировать высоту строки, вам нужно указать 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 встраиваются в ячейки таблицы фиксированного размера.
Чтобы изменить размер svgs, вам нужно заняться взломом svg, что в случае простого масштабирования не так уж сложно:
html_format <- as.character(htmltools_value(ft))
html_format <- gsub('<svg ',
'<svg transform=\"scale(2)\" ',
html_format, fixed = TRUE)
Объект html_format
— это просто html-строка гибкой таблицы, которую можно отобразить.
как это:
dir <- tempfile()
dir.create(dir)
htmlFile <- file.path(dir, "index.html")
writeLines(html_format, con = htmlFile)
rstudioapi::viewer(htmlFile)
В результате чего
Ничто из этого не является идеальным или, конечно, просто ограничением того, как flextable отображает формулы с помощью экватэгов.
К сожалению, Mathjax не позволяет использовать произвольные шрифты, так что добиться этого будет еще сложнее.
Хей Аллан. Большое спасибо, что покопались в исходном коде и показали мне, как установить высоту ячейки. Больше, чем я ожидал. Переключение семейства шрифтов на самом деле не так важно для меня. Более важным было бы установить размер шрифта в случае экспорта docx (вздох. Работа в компании, ориентированной на Office.). Но для моего текущего варианта использования это только одна таблица с тремя уравнениями. Так что это можно сделать вручную в Word. Немного покопавшись в исходном коде офицера и OOXML в последнее время, я предположил, что это должно быть каким-то образом возможно. Посмотрю. Лучший С.
Вы пытались запустить этот пример: davidgohel.github.io/flextable/reference/as_equation.html?