在 R Markdown 输出的 latex-pdf 中自定义 CJK 字体
—使用 xeCJK 时的一点小坑
2021-03-20 21:28:29 +0800
前提
- RStudio
tinytex
R包- xeCJK
实现
参考了一篇日文的博客. 其中用的是 zxjatype
, 不过也提到可以用 xeCJK
; 我还是用了更常见的 xeCJK.
\usepackage{xeCJK}
然后是字体. 问题是, 我用 \setCJKmainfont
死活设置不了, 用字体名(Noto Serif CJK SC)也不行, 加上"regular"也不行, 用字体文件名还是不行; 于是搜了一下, 找到一篇百度LaTeX吧的求助贴. 其中4楼提到:
不过我一般都喜欢把字体文件放在文档同目录下的Fonts文件夹内。
然后这样调用:
\setCJKmainfont[Path=Fonts/]{SourceHanSansCN-Normal.otf}
我意识到, 可能是路径的问题. 我把字体文件复制到了 .Rmd 文件的同目录, 用字体名的方式就可以成功导出 pdf 了.
而后来再使用 \setmainfont{Noto Serif}
却一次就成功了, 这是为什么呢? 我据此得出两条结论:
- 我看到的字体名"Noto Sans CJK SC Regular"并非
NotoSerifCJKsc-Regular.otf
这个字体文件所对应的字体的"真名", 也即字体的内置名称. - 当使用字体文件名时, 需要指定路径, 否则会默认是在同一路径下. 而此时如果同一路径下不存在该字体文件, 生成时会报错.
最后的(阶段性)成果是这样的:
output:
pdf_document:
latex_engine: xelatex
header-includes: |
\usepackage{xeCJK}
\setmainfont{Noto Serif}
\setCJKmainfont{NotoSerifCJKsc-Regular.otf} % NOTE: under the same directory
我据此扩充, 写了一个小模板, 姑且根据自己的习惯和偏好(衬线和无衬线字体用 Noto 系列, 等宽字体用 Iosevka / Sarasa Mono)囊括了一般需要定义的字体项. 已经托管到 Gitee, 欢迎随意取用.
其实也没多少内容, 干脆贴在下面吧:
---
title: ""
author: ""
date: ""
output:
pdf_document:
latex_engine: xelatex
header-includes: |
\usepackage{xeCJK}
\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
\setmonofont{Iosevka}
\setCJKmainfont[BoldFont=NotoSansCJKsc-Regular.otf]{NotoSerifCJKsc-Regular.otf} % NOTE: under the same directory
\setCJKsansfont{NotoSansCJKsc-Regular.otf}
\setCJKmonofont{sarasa-gothic-sc-regular.ttf}
---