Установите семейство шрифтов и размер уравнений в flextable

Я ищу возможность установить семейство шрифтов и размер уравнений в 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

Вы пытались запустить этот пример: davidgohel.github.io/flextable/reference/as_equation.html?

Quinten 09.04.2022 13:10

@Квинтен Да. Конечно. Мой репрекс основан на этом. Я также пробовал использовать разные аргументы width и height, так как согласно документации их можно использовать для установки size of the resulting equation. Но не повезло. На самом деле я не понимаю, как работают эти аргументы, поскольку они не повлияли на конечный результат.

stefan 09.04.2022 13:29
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
2
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы контролировать высоту строки, вам нужно указать 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")

К сожалению, это не меняет размер уравнений:

enter image description here

Формулы 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 встраиваются в ячейки таблицы фиксированного размера.

Чтобы изменить размер 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)

В результате чего

enter image description here

Ничто из этого не является идеальным или, конечно, просто ограничением того, как flextable отображает формулы с помощью экватэгов.

К сожалению, Mathjax не позволяет использовать произвольные шрифты, так что добиться этого будет еще сложнее.

Хей Аллан. Большое спасибо, что покопались в исходном коде и показали мне, как установить высоту ячейки. Больше, чем я ожидал. Переключение семейства шрифтов на самом деле не так важно для меня. Более важным было бы установить размер шрифта в случае экспорта docx (вздох. Работа в компании, ориентированной на Office.). Но для моего текущего варианта использования это только одна таблица с тремя уравнениями. Так что это можно сделать вручную в Word. Немного покопавшись в исходном коде офицера и OOXML в последнее время, я предположил, что это должно быть каким-то образом возможно. Посмотрю. Лучший С.

stefan 09.04.2022 15:25

Другие вопросы по теме