rmarkdown pdf字体不可用

时间:2017-04-12 18:02:35

标签: r latex r-markdown

我有一个与this one类似的问题,但我得到了一个不同的错误。我想将yaml中的mainfont设置为roboto,但是当我将其编织为PDF时,我收到错误“fontspec error:”font-not-found“”。

---
title: "My Title"
header-includes:
  - \usepackage[sfdefault]{roboto}
  - \usepackage[T1]{fontenc}
output:
  pdf_document:
    latex_engine: xelatex
mainfont: roboto
---

运行MacTex 2016

sessionInfo()
#R version 3.3.2 (2016-10-31)
#Platform: x86_64-apple-darwin13.4.0 (64-bit)
#Running under: macOS Sierra 10.12.4

更新1

它可以在header-includes中定义字体,但似乎mainfont规范也应该有效:

---
title: "My Title"
header-includes:
  - \usepackage[sfdefault]{roboto}
  - \renewcommand{\familydefault}{\sfdefault}
output:
  pdf_document:
    latex_engine: xelatex
---

更新2

monofont对我来说也失败了,但是header-includes工作了:

---
title: "My Title"
header-includes:
  - \usepackage{fontspec}
  - \setmonofont[Mapping=tex-text]{inconsolata}
  - \usepackage[sfdefault]{roboto}
  - \renewcommand{\familydefault}{\sfdefault}
output:
  pdf_document:
    latex_engine: xelatex
---

我在yaml中mainfontmonofont做错了什么?

2 个答案:

答案 0 :(得分:7)

此选项必须缩进。当你没有缩进选项latex_engine时它只是因为它被忽略而没有真正传递给pdf_document()作为参数。 R Markdown使用 yaml 包解析YAML,您可以比较latex_engine缩进时的输出:

yaml::yaml.load(
'output:
  pdf_document:
    latex_engine: xelatex
mainfont: roboto')

输出:

$output
$output$pdf_document
$output$pdf_document$latex_engine
[1] "xelatex"

$mainfont
[1] "roboto"

如果没有缩进,您实际上是在调用rmarkdown::render(, pdf_document())

yaml::yaml.load(
'output:
  pdf_document:
  latex_engine: xelatex
mainfont: roboto')

输出:

$output
$output$pdf_document
NULL

$output$latex_engine
[1] "xelatex"


$mainfont
[1] "roboto"

在这种情况下,会使用pdf_document的默认引擎pdflatex

我不能肯定地说,但我相信roboto包仅适用于pdflatex。您的原始示例失败了,因为您混淆了pdflatexxelatex:roboto用于pdflatex,而mainfont选项用于xelatex(将被翻译)使用fontspec包到LaTeX代码\setmainfont{roboto}。你可以选择任何一种方式,但不能两种方式。

如果您想使用xelatex,您必须确保已在系统中安装了该字体,并且您知道确切的字体名称(区分大小写)。我猜这个名字可能是Roboto。除非你有其他理由使用xelatex(例如你已经足够了解fontspec包并希望配置更多字体),我建议你继续使用roboto包和pdflatex,因为它很简单足够了,你不必学习太多的低级技术细节。

您可能需要花一分钟时间阅读本页有关YAML:https://bookdown.org/yihui/bookdown/r-markdown.html

的信息

答案 1 :(得分:1)

更新:Yihui的回答全面解决了这个问题

这是由RMarkdown解析YAML标头的方式引起的问题。 latex_engine不应缩进,然后才能工作。目前,我认为pandoc忽略了latex_engine命令,因为当它是pdf_output部分的一部分时,它嵌套在output中。以下是正确的标题:

---
title: "My Title"
header-includes:
    - \usepackage[sfdefault]{roboto}
    - \usepackage[T1]{fontenc}
output:
    pdf_document:
    latex_engine: xelatex
mainfont: roboto
---