在 RMarkdown `output = "html_document"` 中为数学表达式使用额外的 Latex 包

sam*_*erk 6 mathjax knitr r-markdown

我知道如何使用额外的 Latex 包从 .Rmd 文件输出 pdf 格式

---
header-includes:
   - \usepackage{mathtools}
---
Run Code Online (Sandbox Code Playgroud)

在 YAML 标头中。

但是,如果指定output: html_document.

---
output: html_document
header-includes:
   - \usepackage{mathtools}
---
Run Code Online (Sandbox Code Playgroud)

使用额外的 Latex-Packages 也可能对 感兴趣output: html_document- 特别是在数学表达式中(下面的 MWE)

---
title: "MWE"
output: html_document
header-includes:
   - \usepackage{mathtools}
---

## Use "Defined by" Symbol

$$sin(x) \coloneqq \frac{opposite}{hypothenuse}$$
Run Code Online (Sandbox Code Playgroud)

tar*_*leb 5

MathJax 提供了许多扩展,也有第三方扩展。如果您想要的包以这种方式不可用,那么事情就会变得困难。

\coloneqq可以使用 重新创建简单的命令,例如\newcommand。最简单的方法是通过include-before选项添加这些。将 MWE 与Mathematics Meta SE的解决方案结合使用,您将获得:

---
title: "MWE"
output:
  html_document: default
include-before:
- '$\newcommand{\coloneqq}{\mathrel{=}}$'
---

## Use "Defined by" Symbol

$$sin(x) \coloneqq \frac{opposite}{hypothenuse}$$
Run Code Online (Sandbox Code Playgroud)

输出:

导出为 HTML 的 MWE 屏幕截图

背景

RMarkdown 是围绕pandoc构建的,它执行大部分格式转换。Pandoc 通过 LaTeX(默认情况下)创建 PDF,并且将简单地包含源中给出的任何原始 LaTeX 命令。当看到 时\usepackage{mathtools},包没有被解析,但命令只是逐字添加到中间 LaTeX 中。但是,当导出到 HTML 时,传递 LaTeX 命令是没有意义的,因此任何此类命令都将简单地从输出中省略,因此\usepackage文档中的任何命令都不会影响 HTML 输出。

替代方案

如果您使用非常复杂的 LaTeX 包,那么您可以考虑设置一个复杂的管道以继续使用它:例如,可以使用pandoc 过滤器来提取所有方程,将每个方程编译为一个单独的文档,然后转换结果PDF 转 SVG。最后,该 SVG 可以包含在 HTML 输出中。这很重要,可能不值得付出努力。建议使用类似的方法来包含 Ti k Z 图片

  • MathJax 具有(有限的)LaTeX 功能并且可以解释像 `\newcommand` 这样的命令——只要这些命令是在数学环境中给出的。这就是我在回答中使用的内容,因为我认为这个问题的重点是 MathJax。您是对的,因为 pandoc 支持 Markdown 中的 LaTeX 宏,因此可以使用 pandoc 的功能来做同样的事情。但是,解释除数学、SI 单位和宏以外的复杂 LaTeX 超出了 pandoc 的范围,因此是当前行为。 (2认同)