带有多行 LaTeX 方程的 R 帮助页面

R help pages with multiline LaTeX equations

我正在使用 roxygen2 编写 R 包文档。我想将以下多行方程插入帮助页面,但我的 LaTeX 代码没有被渲染。

#' hello2
#'
#' @description
#' \deqn{
#' F(t)= \begin{cases}\alpha(t) f_{L}(t)+[1-\alpha(t)] f_{C}(t) & t_{L}<t<t_{C} \ \beta(t) f_{C}(t)+[1-\beta(t)] f_{R}(t) & t_{C}<t<t_{R}\end{cases}
#' }
#' 
#' @export
hello2 <- function() {}

只是为了证明一旦您正确集成 mathjaxr 就可以实现:

tmp <- tempfile()
dir.create(tmp)
cwd <- setwd(tmp)

pkgname <- "foo"
usethis::create_package(pkgname, rstudio = FALSE, open = FALSE,
                        fields = list(Imports = "mathjaxr", RdMacros = "mathjaxr"))
setwd(pkgname)
text <- "#' A title
#' 
#' \loadmathjax{}
#' A description.
#' 
#' @param a,b Arguments.
#' 
#' @details
#' An irrelevant equation:
#' \mjtdeqn{F(t) = \left\lbrace\begin{array}{ll} \alpha(t) f_{L}(t) + \lbrack 1 - \alpha(t) \rbrack f_{C}(t)\,, & t_{L} < t < t_{C}\,, \cr \beta(t) f_{C}(t) + \lbrack 1 - \beta(t) \rbrack f_{R}(t)\,, & t_{C} < t < t_{R}\,. \end{array}\right.}{%
#'           F(t) = \begin{cases} \alpha(t) f_{L}(t) + \lbrack 1 - \alpha(t) \rbrack f_{C}(t)\,, & t_{L} < t < t_{C}\,, \cr \beta(t) f_{C}(t) + \lbrack 1 - \beta(t) \rbrack f_{R}(t)\,, & t_{C} < t < t_{R}\,. \end{cases}}{%
#'           ... a plain text translation ...}
#' 
#' @noMd
#' @export
#' @importFrom mathjaxr preview_rd
add <- function(a, b) a + b
"
cat(text, file = file.path("R", "add.R"))
roxygen2::roxygenize(".")

PDF 输出

mathjaxr::preview_rd("add.Rd", type = "pdf")

HTML输出

mathjaxr::preview_rd("add.Rd", type = "html")

纯文本输出

mathjaxr::preview_rd("add.Rd", type = "txt")

几点说明

  • 我们只是转义反斜杠,因为我们将 add.R 的内容输入到字符串中。 cat 创建的文本文件不包含转义符。
  • \loadmathjax{} 将 MathJax 脚本注入 HTML 文件。它通常放在描述的顶部,以便您可以在之后的任何地方排版数学。
  • 我们正在使用宏 \mjtdeqn 依次为 PDF 手册提供 LaTeX,为 HTML 帮助页面提供 LaTeX,为纯文本帮助页面提供纯文本。您可以在更简单的情况下使用其他宏。它们都记录在 README 中,您应该仔细阅读。
  • 在 PDF 字段中,您无权访问 AMS 扩展,因此您必须 cases 自己实现 array
  • 在 PDF 和 HTML 字段中,您需要使用 \cr 代替多行环境中通常的 \。我不确定为什么。
  • 我还没有想出如何在纯文本字段中对换行符进行编码(还)。很难将多行方程式转换为没有换行符的纯文本...
  • 我用 @noMd 禁用了对这个 header 的 Markdown 支持,因为根据我的经验,Markdown 解析器并不总是能很好地与 mathjaxr 宏一起使用。在我自己的包中,我通过 DESCRIPTION.
  • 全局禁用 Markdown 支持
  • 你需要 @importFrom mathjaxr preview_rd 在你的包中的某个地方来规避 R CMD check 关于在你的 Imports 中有 mathjaxr 的警告,而不使用 mathjaxr 导出的任何函数。
  • 要在不安装包的情况下预览使用 MathJax 的帮助页面,您需要使用 mathjaxr::preview_rddevtools 预览会显示未渲染的 LaTeX 代码。
  • 您必须决定 MathJax 支持是否值得 mathjaxr 在您的 Imports 中。任何试图安装您的软件包的人都必须安装 mathjaxr

正在清理

setwd(cwd)
unlink(tmp, recursive = TRUE)

基于 Mikael 的解决方案,更清洁的版本:

#' A title
#'
#' @param a,b Arguments.
#'
#' @section options:
#' - `item1`:
#'    \mjtdeqn{
#'    F(t) = \left\lbrace\begin{array}{ll}
#'         \alpha(t) f_{L}(t) + (1 - \alpha(t)) f_{C}(t), & t_{L} < t < t_{C}, \cr
#'         \beta(t) f_{C}(t) + (1 - \beta(t)) f_{R}(t), & t_{C} < t < t_{R}. \end{array}\right.}{%
#'    F(t) = \begin{cases}
#'         \alpha(t) f_{L}(t) + (1 - \alpha(t)) f_{C}(t), & t_{L} < t < t_{C}, \cr
#'         \beta(t) f_{C}(t) + (1 - \beta(t)) f_{R}(t), & t_{C} < t < t_{R}. \end{cases}}{}
#'
#' - item2
#'
#' \loadmathjax{}
#' @export
#' @importFrom mathjaxr preview_rd
add <- function(a, b) a + b

Markdown is compatible with mathjaxr in this example

mathjaxr::preview_rd("add.Rd", type = "pdf")
mathjaxr::preview_rd("add.Rd", type = "html")

以上脚本 returns 与 Mikael 的结果相同。