带有多行 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_rd
。 devtools
预览会显示未渲染的 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 的结果相同。
我正在使用 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_rd
。devtools
预览会显示未渲染的 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 withmathjaxr
in this example
mathjaxr::preview_rd("add.Rd", type = "pdf")
mathjaxr::preview_rd("add.Rd", type = "html")
以上脚本 returns 与 Mikael 的结果相同。