2017-04-12 89 views
6

我有一个类似的问题this one,但我收到了一个不同的错误。我想将yaml中的mainfont设置为roboto,但是当我将它编织为PDF时,出现“fontspec error:”font-not-found“”错误。rmarkdown pdf字体不可用

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

回答

5

此选项必须缩进。当它没有缩进选项latex_engine时,它的工作原因仅仅是因为它被忽略,并没有真正传递给pdf_document()作为参数。 [R减价使用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包中,因为它足够简单,您不必学习太多低级技术细节。

您可以spedn一分钟阅读此页有关YAML:https://bookdown.org/yihui/bookdown/r-markdown.html

+1

非常有帮助,@易辉。感谢您花时间澄清。 –

1

更新:一辉的回答全面解决问题

这是由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 
--- 
+0

它看起来对我来说,'latex_engine'应根据[Rmarkdown文档】是第三级(http://rmarkdown.rstudio.com/ pdf_document_format.html#latex_engine)。 –

+1

好点。当我缩进时,我收到了“字体未找到”的错误,但是当我将它移动到某个级别时,它会正常运行。我不确定这只是他们文档中的一个怪癖或错字。 –