如何让\ bm {}在R markdown(到HTML)文件中工作?

Mar*_*ert 10 markdown latex r

My R Markdown(.Rmd)文件如下所示:

---
title: Foo
author: Marius Hofert
header-includes:
    - \usepackage{bm}
output:
    pdf_document
vignette: >
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteIndexEntry{Foo}
---
\[
\begin{align}
   \bm{U}=a\bm{X}\quad\boldmath{U}=a\boldmath{X}\quad\mathbf{U}=a\mathbf{X}.
\end{align}
\]
Run Code Online (Sandbox Code Playgroud)

输出(通过R CMD build和查看获得./inst/doc/*.html)是这样的:

在此输入图像描述

为了获得斜体粗体矢量,我想\bm{X}在我的.Rmd文档中使用,但它失败了(虽然我加载了包bm).为什么?没有这output: pdf_document部分也会发生同样的事情

UPDATE

如果我在跑

---
title: Foo
author: Marius Hofert
header-includes:
    - \usepackage{bm}
output:
    pdf_document
vignette: >
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteIndexEntry{Foo}
---
\[
\begin{align}
   \bm{U}=a\bm{X}\quad\boldmath{U}=a\boldmath{X}\quad\mathbf{U}=a\mathbf{X}.
\end{align}
\]

\[
   \bm{U}=a\bm{X}\quad\boldmath{U}=a\boldmath{X}\quad\mathbf{U}=a\mathbf{X}.
\]

\begin{align}
   \bm{U}=a\bm{X}\quad\boldmath{U}=a\boldmath{X}\quad\mathbf{U}=a\mathbf{X}.
\end{align}
Run Code Online (Sandbox Code Playgroud)

我得到了(没有错误)

这个

Ben*_*ker 9

我觉得你\[ \]\begin{align} ... \end{align}是多余的.当我按照上面的说明运行时,我得到了

!包amsmath错误:方程结构的错误嵌套; (amsmath)试图用"对齐"来恢复.

有关说明,请参阅amsmath软件包文档.输入H即可获得帮助....

l.84\end {align}

我删除时工作得很好\begin{align} ... \end{align}......

(似乎你的上一个问题也出现了类似的问题......)

(也许你得到的错误是你没有注意到的,并且不小心看了以前编译过的版本?)


至于为什么你没有得到正确的HTML输出:我很确定MathJax(用于渲染嵌入在Rmarkdown中生成的HTML的LaTeX的引擎)不知道\boldmath ; 将包添加到您的LaTeX输入将无济于事,您将不得不使用\mathbf\boldsymbol不是.你可以在这里,看看哪些有效,哪些无效:进入

$\bm X \boldmath X \boldsymbol X \mathbf X$
Run Code Online (Sandbox Code Playgroud)

在那个网页给出

在此输入图像描述

最重要的是,如果你想要正确渲染花哨的数学,你可能最好坚持使用PDF输出.


mat*_*fee 8

我不认为Mathjax(这是Pandoc在HTML输出中使用的)可以\usepackage{}.我通过拥有2个文件来解决这个问题:一个叫做preamble-mathjax.tex,一个名为preamble-latex.texMy YAML的元数据设置如下(for rmarkdown):

output:
    html_document:
       includes:
         before_body: preamble-mathjax.tex
    pdf_document:
       includes:
         in_header: preamble-latex.tex
Run Code Online (Sandbox Code Playgroud)

并且preamble-mathjax.tex(注意周围,\( \)以便mathjax解析为数学块)

\(
\newcommand{\bm}[1]{\boldsymbol{\mathbf{#1}}}
\)
Run Code Online (Sandbox Code Playgroud)

虽然preamble-latex.tex有:

\usepackage{bm}
Run Code Online (Sandbox Code Playgroud)

因此,每当我\bm{..}在我的文档中使用时,无论我编译为HTML还是PDF,它都有效.(堆叠boldsymbol,mathbf以便希腊字母和普通字母都是粗体,粗体字母保持直立,如果你使用的话\bm).


您问题的外围设备:最终您可能希望拥有第三个文件,preamble-both.tex其中的宏不是特定于包的(假设preamble-*已经包含相关的内容),例如

\newcommand{\bX}{\bm{X}} % bold X
\newcommand{\R}{\mathbb{R}} % real numbers
Run Code Online (Sandbox Code Playgroud)

然后用两种输出格式包含它.这样可以避免两次编写所有宏,一次用于html_document,另一次用于pdf_document.但是,MathJax要求宏被\(和包围\),而如果是这种情况,LaTeX将会出错.

我找到解决这个问题的唯一方法是让一个bracket-start.txt包含just \(的文件和一个bracket-end.txt包含just 的文件\),这样我的YAML就是:

output:
    html_document:
       includes:
         before_body: [preamble-mathjax.tex, bracket-start.txt, preamble-both.tex, bracket-end.txt]
    pdf_document:
       includes:
         in_header: preamble-latex.tex
         before_body: preamble-both.tex
Run Code Online (Sandbox Code Playgroud)

这是非常笨拙,但它的工作原理(有Pandoc latex_macros扩展,但它从来没有为我工作)