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

时间:2015-10-20 01:41:50

标签: r latex markdown

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}
\]

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

enter image description here

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

更新

如果我正在运行

---
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}

我得到(没有错误)

this

4 个答案:

答案 0 :(得分:9)

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

  

!包amsmath错误:方程结构的错误嵌套;   (amsmath)试图用`align'恢复。

     

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

     

l.84 \ end {align}

当我删除\begin{align} ... \end{align} ...

时,我工作得很好

your previous question似乎也出现了类似的问题......)

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

至于为什么你没有得到正确的HTML输出:我非常肯定MathJax(用于渲染LaTeX嵌入在Rmarkdown制作的HTML中的引擎)doesn't know about \boldmath;将软件包添加到您的LaTeX输入不会有帮助,您必须使用\mathbf\boldsymbol。你可以玩here来查看哪些有效,哪些无法进入

$\bm X \boldmath X \boldsymbol X \mathbf X$

在该网页上给出了

enter image description here

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

答案 1 :(得分:8)

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

output:
    html_document:
       includes:
         before_body: preamble-mathjax.tex
    pdf_document:
       includes:
         in_header: preamble-latex.tex

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

\(
\newcommand{\bm}[1]{\boldsymbol{\mathbf{#1}}}
\)

preamble-latex.tex有:

\usepackage{bm}

因此,每当我在文档中使用\bm{..}时,无论我编译为HTML还是PDF,它都有效。 (将boldsymbolmathbf堆叠在一起,以便希腊字母和普通字母都变为粗体,粗体字母保持直立,就像使用\bm时一样。

您问题的外围设备: 最后,您可能希望第三个文件preamble-both.tex包含非特定于包的宏(假设已包含相关的preamble-*),例如。

\newcommand{\bX}{\bm{X}} % bold X
\newcommand{\R}{\mathbb{R}} % real numbers

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

我找到解决此问题的唯一方法是让文件bracket-start.txt只包含\(,文件bracket-end.txt只包含\),这样我的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

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

答案 2 :(得分:1)

另一个解决方案是使用子块参数。缺点是,它只适用于$ $或$$ $$所包围的数学。它不适用于等式环境。好处是你不会让你的定义在你的html页面顶部“闪烁”片刻,这在我上面的解决方案中就会发生。

demo.Rmd

---
title: Foo
output:
  pdf_document: default
  html_document: default
---

```{r child = 'defs.tex'}
```

My math definitions are in defs.tex.  Now I can use the defs in equations
but they need to be in math mode for html output.  This works for both
pdf and html:
$\AA^\top\BB$ and 
$$\AA^\top\BB$$

But using your new commands in the equation environment
only works for pdf output because pandoc will not expand the
definitions if the newcommands are not in $ $ or $$ $$.    

\begin{equation}
\AA^\top\BB
\end{equation}

defs.tex

\newcommand{\BB}{\mathbf{B}}
\newcommand{\CC}{\mathbf{C}}
\renewcommand{\AA}{\mathbf{A}}

答案 3 :(得分:0)

如果您使用Mathjax在html文档中渲染方程式,第三种解决方案效果很好。默认情况下,Mathjax在RStudio中的pandoc中打开。这具有无闪烁的优点,可在$$ $$和等式环境中工作。这样做的一大缺点就是pandoc从html中删除了\ ref {},所以你必须添加一个编织钩子才能更改为\ ref {}。当然有一种方法可以告诉pandoc不要这样做,但我找不到它。我尝试了许多不同的pandoc args但没有成功。

此示例假设您需要等式编号,并且希望交叉文本中的那些。它还假设你是从RStudio编织的。可能是其他方式,但这是我测试的。

mathjax.js ---在这里定义宏并告诉Mathjax添加eqn #s

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<script type="text/x-mathjax-config"> 
  MathJax.Hub.Config({ 
    TeX: { 
      equationNumbers: {autoNumber: "all"},
      Macros: {
        AA: "{\\bf A}",
        BB: "{\\bf B}"
      }
    } 
  });
</script>

defs.tex ---这是pdf_document

\def\AA{\bf A}
\def\BB{\bf B}

test.Rmd ---现在我们可以制作适用于html和pdf的Rmd文档。我无法弄清楚如何告诉pandoc不要从HTML中删除LaTeX命令。因此传入一个编织钩子来加倍\ \ ref {}调用。

---
title: "Test"
knit: ( function(inputFile, encoding) { if(rmarkdown::all_output_formats(inputFile)[1]=="html_document"){ f <- inputFile; x <- readLines(f); y <- gsub("[\\]ref[{]","\\\\\\\\ref{", x); cat(y,file="tmp.Rmd", sep="\n"); rmarkdown::render("tmp.Rmd", encoding = encoding ) }else{ rmarkdown::render(inputFile, encoding = encoding ) } })
output: 
  html_document:
    includes:
      before_body: [../tex/mathjax.html]
  pdf_document: 
    includes: 
      before_body: ../tex/defs2.tex
---

```{r mss-setup, include=FALSE, purl=FALSE}
knitr::opts_knit$set(unnamed.chunk.label = "tvarss-")
```

In the pdf, this will not have a number but in the html it will.

$$
\AA^\top\BB
$$
You can use nonumber if you need the equation numbering to be the same in html and pdf.

$$
\AA^\top\BB\nonumber
$$

If we want to crossref an equation, use equation environment.  
\begin{equation}
\AA^\top\BB
\label{eqn1}\end{equation}
This is Equation \ref{eqn1}.

这是编织功能:

(function(inputFile,encoding){if(rmarkdown :: all_output_formats(inputFile)[1] ==“html_document”){f&lt; - inputFile; x&lt; - readLines(f); y&lt; - gsub (“[\] ref [{]”,“\\\\ ref {”,x); cat(y,file =“tmp.Rmd”,sep =“\ n”); rmarkdown :: render(“tmp .Rmd“,encoding = encoding)} else {rmarkdown :: render(inputFile,encoding = encoding)}})