召集壮士帮忙测试 TinyTeX
- 已编辑
yihui 参考文献变问号的问题跟 tinytex 没啥关系。我重新描述一下问题:Windows 7 下装了 CTeX,用 RStudio 新建 bookdown 项目得到的 Mini 模板,编译得到的 pdf 里参考文献都是问号。
我看了一下中间生成的 bbl 文件,里面的项目是空的。经过了多次重装和升级 CTeX 和 bibtex 未果,即将放弃的时候,我发现了一条警告信息,说“I cann't find book.bib.bib”!不知道这条工具链中间哪个货为 book.bib 又增添了个扩展名!
这就好办了。把 Mini 模板 index.Rmd 里 yaml 声明里的文献库文件扩展名 '.bib' 去掉,就好了!
奇怪,我记得以前在yaml 声明里 '.bib' 这个扩展名是可有可无的呀。莫非哪里升级了?
字体问题大概是这样,需要改 latex.R
里
r = c(
".*! Font [^=]+=([^ ]+).+ not loadable.*",
'.*! The font "([^"]+)" cannot be found.*',
".*! LaTeX Error: File `([^']+)' not found.*",
'.*the language definition file ([^ ]+) .*',
'.* \\(file ([^)]+)\\): cannot open .*',
".*! CTeX fontset `([^']+)' is unavailable.*",
".*: ([^:]+): command not found.*"
)
去适配这样的错误信息
!pdfTeX error: pdflatex (file tcrm1095): Font tcrm1095 at 600 not found
我猜测是后面那个 at 600
搞出得问题
包依赖的关键错误信息是这个
Package widetext error: Install the flushend package which is a part of sttools
bundle. Available from CTAN.
也需要修改正则表达适配,不过我的正则表达水平属于小学生入门,怕又引入新问题就不pr了…
dapengde 这个的确是我前段时间在 rmarkdown 中修改过的,如果你用最新版的 rmarkdown,应该是不会出问题的,因为我对这个问题专门打了补丁:https://github.com/rstudio/rmarkdown/commit/1a0db722 但还是存在出问题的可能,就是你不幸安装了 latexmk 包(LaTeX 包)。不要装这个包。 latexmk 包不如 tinytex::latexmk()
这个模拟函数聪明,貌似它的作者并不在意这个 .bib 扩展名的大坑。
- 已编辑
yihui 是的,latexmk 包在安装和升级 CTeX 时自动安装了。rmarkdown 是最新版。现在我的麻烦是:
- 如果 index.Rmd 的 yaml 里,参考文献库不写扩展名 '.bib' ,那么编译成 pdf 没问题,但其他格式就不行了。
- 如果写扩展名 '.bib',编译成其他格式就没问题,但 pdf 就全是问号了。
- 卸载了MiKTeX 的 latexmk 包仍然没有改善。
- 如果不用 CTeX 改用 tinytex,那么好几个模板编译不通过(而在 CTeX 里能编译通过),具体原因得一个一个模板去找。
几个月前,这些模板个个都好好的,没有任何问题。现在却是乱糟糟,按了葫芦起了瓢。已经折腾好几天了,我觉得我陷到这个坑里出不来了。
我的愿望就是用 bookdown 痛痛快快写东西。长远来看,应该是丢掉 CTeX 换到 TinyTeX,让工具链全部纳入 R 的框架里,以便自洽。
- 已编辑
yihui 谢谢!快来把我捞出来吧!矛盾就在于, CTeX 说:只有不加 '.bib' 扩展名时我才能找到 .bib 文件; 而 pandoc 说,不加 '.bib' 扩展名我就找不到这个 .bib 文件。
抱歉,本来是测试 tinytex,结果被我歪楼到调戏 bookdown 了。没办法,我对 bd 感情太深。
顺便再报告刚发现的一个 bug。bookdown 编译书为 html_document2 格式(单一文件)时,如果同时编译为 gitbook 格式(多个文件),那么前者不会生成:
bookdown::render_book("index.Rmd",
output_format = c("bookdown::html_document2", "bookdown::gitbook" ))
但是,只要把两者的顺序调换,两个格式就都能生成了:
bookdown::render_book("index.Rmd",
output_format = c("bookdown::gitbook" , "bookdown::html_document2"))
看上去好像是生成 gitbook 时可能生成了个临时文件,跟 html_document2 生成的最终文件同名,所以覆盖了。
yufree PNAS 问题现在应该已经解决了,重装一下 tinytex 包试试。
dapengde 我刚在 Windows 上测试了,用 TinyTeX 无法重现你的问题,应该加上 .bib 扩展名。不要信 CTeX 的鬼话,那只不过是向 MiKTeX 中的 bibtex 妥协投降的做法。好好的一个文件名,凭啥不加扩展名。这种妥协导致的后果就是无法跨平台,从此用户又要记住一条特有的奇葩规则:如果我在 Windows 上,我就不加扩展名;如果不在 Windows 上,就加上。
bookdown 不支持同时生成两种同样格式(不同样式)的输出,gitbook 和 html_document2 都是 HTML 输出,只能二选一。非要输出的话,只能自行用脚本方式:先生成一个,然后把输出重命名或移动到别的地方去,再生成第二个。
- 已编辑
yihui tinytex 没这个问题。有这个问题的是 CTeX。Windows 的 CTeX 用户不知多不多,但是他们拿 RStudio 建个 bookdown 模板直接编译出来参考文献问号,这不好吧?会让新手困惑啊!
bookdownplus 的 29 个 LaTeX 模板在 tinytex 下的测试报告
bookdownplus 目前收集的 29 个模板(不含海报模板),在 Windows 下均可用 bookdown + CTeX 顺利编译成 pdf,从未在 Linux 下测试过。这回我用 Ubuntu 16.04 下 tinytex + bookdown + bookdownplus 进行了逐个测试。
测试结果,是19 个模板都顺利编译通过了,是让我惊喜的。这 29 个模板涵盖了技术报告、期刊论文、学位论文、散文等常用中英文模板,还收录了吉他谱、五线谱、国际象棋、中国象棋、围棋棋谱等乱七八糟的模板,应该算是个考验。
我记录在案的编译失败情况如下:
- latex 的中国象棋宏包 cchess 用
tlmgr_search('cchess.sty')
未找到,而这个宏包在<https://ctan.org/pkg/cchess>. - latex 的围棋宏包 igo 用
tlmgr_search('igo.sty')
未找到,这个宏包在 <https://ctan.org/pkg/igo>. - bookdownplus 的 chemistry 模板用 latexmk('chemistry.tex') 编译失败,说是字体找不到:
# tlmgr search --file --global '/tcbx0700[.](tfm|afm|mf|otf)' # !pdfTeX error: pdflatex (file tcbx0700): Font tcbx0700 at 600 not found
- bookdownplus 的 discussion模板用 latexmk('discussion.tex') 编译失败,说是字体找不到:
# tlmgr search --file --global '/ecrm1000[.](tfm|afm|mf|otf)' # !pdfTeX error: pdflatex (file ecrm1000): Font ecrm1000 at 600 not found
其他几个失败的模板我还没闹明白是不是模板本身的问题。如果确定不是模板的问题,我将来再贴错误信息。欢迎大家来测试,我新写了个函数 bookdownplus::showcase()
方便测试用。当然,因为我今天为了跟 MiKTeX 妥协而把模板里的 .bib 扩展名都去掉了,所以目前只能编成 pdf。
- 已编辑
dapengde 首先,用 tinytex::latexmk()
加 CTeX 编译不带 .bib 扩展名的参考文献是没有问题的,因为我对这个特殊情况作了特殊处理。唯一会出问题的情况是你用别的编辑器去编 PDF,这就不是我能控制的了,出了 R 的国界,我就无能为力了。
中国象棋包只能用户手工下载安装了,TeX Live 没有收录它,我不知道具体原因,但我的猜测是这个包的许可证不明确,MiKTeX 在许可证不明的情况下收录了它也是蛮大胆的。
围棋包为什么没收录我就彻底不知道了。
tcbx0700 和 ecrm1000 字体问题我用最新版的 tinytex R 包都可以自动匹配出 ec 包来啊。
TeX Live 没有收录的包应该是可以自己手工下载安装的,解压缩之后放在 file.path(tinytex:::texlive_root(), 'texmf-dist', 'tex', 'latex')
目录下。然后运行一下
texhash
updmap-sys
fmtutil-sys --all
我没尝试,只是猜测。
- 已编辑
我目前的测试涉及了三个问题:字体,参考文献,冷门包。为了避免混乱,我分开描述。
在未来相当长的一段时间里,tinytex 会跟 MiKTeX,TeXLive 等发行版并驾齐驱吧。"tinytex" 一词现在既指 R 包又指 tinytex 发行版,我觉得有时候表述起来容易混淆。如果其中一个改个名字,例如叫 tinytexr, 会不会更有利于减少交流里的误会?不然别人说她安装了 tinytex 后如何如何,你还得问,是 R 包还是发行版?有点小纠结。
1. 字体
yufree 谢谢。但是我在 chemistry 模版里添加了 \usepackage{lmodern},仍然没解决,故障依旧。我用另一个方案解决了,见下文。无心插柳,你这个办法解决了另外一个问题: article_mdpi 模板现在也在 tinytex 下通过了!原先也是字体问题。
yihui 可能是我对这个字体问题的理解有误,描述不当。下面是详情。我刚才已经在这里找到了解决方案(哦耶!),是手动安装两个包:
tlmgr_install('collection-fontsrecommended')
tlmgr_install('collection-latexrecommended')
为了对别人有用,我把对应的故障现象整理如下,全部是在 Ubuntu 16.04 下最新版的 RStudio 里操作,tinytex 包最新版。
- 先用
bookdownplus::bookdownplus('discussion')
生成了一套 bookdown 需要的文件。 - 然后按 ctrl + shift + b 进行编译,pdf 未能生成,RStudio 的 Build 面板显示信息如下:
==> rmarkdown::render_site(output_format = 'bookdown::pdf_book', encoding = 'UTF-8') |............. | 20% ordinary text without R code |.......................... | 40% label: fig1 (with options) List of 4 $ fig.cap : chr "caption" $ out.width: chr "80%" $ fig.align: chr "center" $ echo : logi FALSE processing file: discussion.Rmd |....................................... | 60% ordinary text without R code |.................................................... | 80% label: tab1 (with options) List of 2 $ tidy: logi FALSE $ echo: logi FALSE |.................................................................| 100% inline R code fragments /usr/lib/rstudio/bin/pandoc/pandoc +RTS -K512m -RTS discussion.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash --output discussion.tex --table-of-contents --toc-depth 3 --template tex/template_discussion.tex --number-sections --highlight-style tango --latex-engine pdflatex --natbib --variable tables=yes --standalone output file: discussion.knit.md tlmgr search --file --global '/ecrm1000[.](tfm|afm|mf|otf)' Trying to automatically install missing LaTeX packages... tlmgr install ec tlmgr: package repository http://mirror.kumi.systems/ctan/systems/texlive/tlnet (verified) tlmgr install: package already present: ec tlmgr path add tlmgr search --file --global '/ecrm1000[.](tfm|afm|mf|otf)' Output created: _book/discussion.pdf Error in tools::file_path_as_absolute(output_file) : file '_book/discussion.pdf' does not exist Calls: <Anonymous> ... render_book -> render_cur_session -> <Anonymous> -> <Anonymous> In addition: Warning message: In file.rename(output, output2) : cannot rename file 'discussion.pdf' to '_book/discussion.pdf', reason 'No such file or directory' Please delete discussion.Rmd after you finish debugging the error. Execution halted Exited with status 1.
- 紧接着,我对上一步生成的 discussion.tex 运行
tinytex::latexmk()
来编译:> latexmk('discussion.tex') tlmgr search --file --global '/ecrm1000[.](tfm|afm|mf|otf)' Trying to automatically install missing LaTeX packages... tlmgr install ec tlmgr: package repository http://mirror.kumi.systems/ctan/systems/texlive/tlnet (verified) tlmgr install: package already present: ec tlmgr path add tlmgr search --file --global '/ecrm1000[.](tfm|afm|mf|otf)'
上述问题用前面说的安装两个包就解决了。mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 ecrm1000
而 discussion 模板在 Windows 7 + CTeX(没有安装 tinytex R 包和发行版)是可以顺利编译通过的。
2. 参考文献出现问号
yihui 大概是我没说清,或者说得太分散,让你误会了。这里汇总一下。我是在 Windows 7 和 Ubuntu 16.04 下分别用 RStuido 新建了一个 bookdown 项目,在自动出现的 mini 模板上,通过修改 index.Rmd 里 yaml 的bibliography: [book.bib]
这一行的声明来测试。我修改的只是这个yaml声明,而不是参考文献库 'book.bib'文件的文件名。我编译是在 bookdown 环境下用 ctrl+shift+b,不是用tinytex::latexmk()
或别的。
- 如果写成
bibliography: [book]
,那么无论 Windows+CTeX 还是 Ubuntu+TinyTex,都能生成正确的 pdf ,但不能生成其他格式。可能是因为 pandoc 认为 'book' 跟'book.bib'是不同的文件。 错误信息如下:
pandoc-citeproc: Could not find book CallStack (from HasCallStack): error, called at src/Text/CSL/Pandoc.hs:224:39 in pandoc-citeproc-0.10.4-6rooHIpno7nIk4QQSmQ8di:Text.CSL.Pandoc pandoc: Error running filter /usr/lib/rstudio/bin/pandoc/pandoc-citeproc Filter returned error status 1 Error: pandoc document conversion failed with error 83 Please delete bdtest.Rmd after you finish debugging the error. Execution halted Exited with status 1.
- 如果写成
bibliography: [book.bib]
,那么 Ubuntu 下无论 pdf 还是其他格式,都没有任何问题,但是 Windows + CTeX 会找不到参考文献库,因为 CTeX 画蛇添足地把 'book.bib' 改成了 'book.bib.bib'。
所以我觉得我应该完全摒弃 CTeX,改用 TinyTex。之所以没改,是因为 bookdownplus 的几个模板目前只能在 CTeX 才能通过,TinyTex 无法通过。这就涉及下面的问题。
3. 象棋和围棋包
我原以为 LaTeX 不同的发行版在宏包库上是一致的呢!既然这俩包在 TeXLive 上不存在,估计没几个人用,我懒得折腾手动安装的事儿了,直接无视得了。
看来,LaTeX 的世界太混乱了。希望 TinyTeX 的出现,能最终实现车同轨书同文。当然,到达这个目标之前,可能会加剧混乱…… - 紧接着,我对上一步生成的 discussion.tex 运行
- 已编辑
yihui 好了!我把 bookdownplus 的 29 个模板里的 26 个都修理了,可以在 Ubuntu + bookdown + TinyTeX 或 Windows + bookdown + TinyTex 下正常编译。甚至连五线谱和国际象棋的模板都通过了。来展示一下:
CTeX 下找不到参考文献库的问题我搁置不理了。剩下的 3 个模板,一个是中国象棋,一个是围棋,还有一个是设置了很多 Windows 下中文字体的模板,就留给 Windows 的用户独享吧。反正我自己也用不着。
TinyTeX 的测试算是告一段落。总结:这个包和发行版都非常爽!幸好有它,不然我是不会在 linux 测试 bookdownplus 的。
dapengde 关于名字问题,我在脚注中说明了:https://yihui.name/tinytex/ 小写表示 R 包,驼峰大写 TinyTeX 表示一套自定义的 TeX Live。我知道这会导致误会,但 R 包名我倾向于用短名。R 用户不需要跳出 tinytex 包,所有常见操作都可以在包内完成,不需去执行系统命令;非 R 用户也不需要知道 tinytex 包是个啥东东。
字体问题我查明原因了,是由于没有安装 metafont 和 mfware 两个包。yufree 如果你有空,可以再重装 TinyTeX(tinytex::install_tinytex()
)并测试一下 rticles 包中那两个模板在没有 lmodern 以及有安装 metafont/mfware 两个包的情况下是否能编译通过。
关于参考文献问题:我的意思是,不管你用哪个 LaTeX 套装,只要你用的是这里的 rmarkdown(这个会在不久的将来合并到正式版中):
devtools::install_github(('rstudio/rmarkdown@feature/tinytex'))
那么在 YAML 里使用带扩展名的 book.bib 应该都能通过。如果通不过,那么就是 tinytex R 包的缺陷,因为我是专门处理了 Windows 下的特殊情况的。
象棋围棋包最坏的情况就是我写个包装函数,让用户从 CTAN 上直接下载安装,绕开 tlmgr,但我估计这件事优先级不那么高,所以我就先不管它了。