问题描述

使用 RStudio 新建一个 bookdown 示例项目,不做任何修改,默认生成 epub 和 gitbook 没有问题,但生成 pdf 会报错。错误信息为

! File ended while scanning use of \kvsetkeys.
<inserted text>
\par
<*> test-rstudio.tex

Error: LaTeX failed to compile test-rstudio.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips. See test-rstudio.log for more info.
Execution halted

Exited with status 1.

尝试的解决方法

尝试了以下方法,未果。错误信息仍然相同

  • 重新安装最新版 R 和 Rstudio 并更新相关 R 包,失败
  • 升级 Texlive (MacTeX) 到 2021, 重启电脑后再尝试,失败
  • 根据这位坛友的经历,卸载 RStudio 并安装旧版本,失败
  • 根据这位坛友的经历,删除本地安装的 pandoc, 失败

按提示检索了下错误信息,似乎出现这个问题是因为少了一个花括号 }. 遂怀疑问题出在 pandoc template,但我不确定下一步该如何继续排查。

之前一直用 Typora, 写完 md 文件,用 pandoc 转为 latex 后可以直接成功编译。昨天拿起了 bookdown, 发现它已经不认我了。

系统环境

这个问题我在 RStudio v1.4 和 v1.3 均可复现。

> sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils    
[5] datasets  methods   base     

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6      rstudioapi_0.11  
 [3] knitr_1.28        servr_0.21       
 [5] magrittr_1.5      R6_2.4.1         
 [7] rlang_0.4.10      stringr_1.4.0    
 [9] highr_0.8         tools_4.0.5      
[11] xfun_0.22         sessioninfo_1.1.1
[13] cli_2.3.1         withr_2.4.1      
[15] htmltools_0.4.0   yaml_2.2.1       
[17] digest_0.6.25     assertthat_0.2.1 
[19] bookdown_0.22     later_1.1.0.1    
[21] promises_1.1.0    glue_1.4.0       
[23] evaluate_0.14     mime_0.9         
[25] rmarkdown_2.7     stringi_1.4.6    
[27] compiler_4.0.5    jsonlite_1.6.1   
[29] httpuv_1.5.2  

.log 文件错误信息

文件很长,见这个 github gist

这里我也有个小疑问,默认的 bookdown 示例文件只包含英文,为啥还是用的 XeTeX?

之前用rstudio1.4也编不了我的bookdown的论文,换成1.3就成了,你可以试试空白的bookdown模板能不能编译

    问题已解决

    解决方法:重新安装最新版 pandoc, 指定使用 pandoc 自带的 latex 模板。
    pandoc -D latex > ~/.pandoc/templates/default.latex

    Mac 可以在 $HOME/.pandoc 存放 pandoc 用户数据,见 Pandoc 手册

    这个问题大概率是我自己作出来的,因为我曾经试图修改过 latex 模板(估计改坏了)。现在 rstudio 会使用我新建的 default.latex 作为模板,我用 rstudio 1.3/1.4 都可以编译出(包含中文的) pdf.

      tctcab 我有尝试过用 v1.3,但没有成功。

      根据这位坛友的经历,卸载 RStudio 并安装旧版本,失败

      现在能正常使用。我平时基本不用 r 了,只用 bookdown.

      albert-R 这个问题大概率是我自己作出来的

      嗯,如果是这样的话,那我强烈建议你停止折腾,并把 $HOME/.pandoc 文件夹删掉,否则下次你又容易忘记你魔改过 Pandoc 的默认模板。别人的东西一旦拿来改,就意味着要承担未来维护的压力(改了的东西就是你自己的了,不再受上游控制)。尤其是这种默认模板,它往往与 Pandoc 版本挂钩,不同版本的模板都有差异,这是普通人维护不了的;而且还藏在一个隐藏文件夹下,太难察觉和回想起来了。如果要自定义模板,建议用 template 参数includes 参数修改局部,而不要整体换掉。

      新建 .pandoc 文件夹确实解决了我的问题。把它删掉的话,应该在哪里修改 RStudio pandoc 默认的模板呢?实在没找到...