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)
我得到了(没有错误)
我觉得你\[ \]和\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输出.
我不认为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扩展,但它从来没有为我工作)