dapengde 吼住,这是黎明前的黑暗。

参考文献变成问号表明后台 LaTeX 引擎编译次数不够多,或者 bibtex 命令失败了。这两个问题都是 tinytex::latexmk() 要解决的问题。如果解决不了,那就是 tinytex 的缺陷,只要你把 LaTeX 日志文件给我看看,应该能找出办法。在这个测试中,LaTeX 错误日志对我最有用。

我用“她”字是受英语写作的影响。其实你说的对,中文中“他”是可以泛指的。

    yufree 最后一个的错误应该是由于 rjournal_article() 格式调用了不智能的 tools::texi2pdf() 而不是智能的 tinytex::pdflatex()。其它几个的原因类似,需要安装 devtools::install_github(('rstudio/rmarkdown@feature/tinytex'))

      yihui 嗯,最后那个估计得更新 rticles 包的模版,不过装了最新分支后这四个模版还是报错,这次我还是直接贴 tex 那边的错误日志吧,感觉并不是找不到包,还是字体问题(asa、jss模版)还有包的依赖问题(pnas模版)

      额...错误日志内容过大,我把他们扔这里了,tex里的各式花样深坑实在太多了...

        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' 这个扩展名是可有可无的呀。莫非哪里升级了?

          yufree

          字体问题大概是这样,需要改 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了…

          yufree 很好,谢谢!前三个的问题现在最新的 tinytex 包应该自动解决了。asa 和 jss 的问题都容易解决;pnas 那个问题是在是很恶心,最讨厌这种不按正常方式出牌的包了。一般情况下 LaTeX 错误消息都以感叹号开头,它偏偏自己写一个错误消息,这还不是最讨厌的,真正讨厌的是为什么不用正常方式声明依赖(即依赖 sttools,而是直接用 sttools 里面的一个样式文件)。

            dapengde 这个的确是我前段时间在 rmarkdown 中修改过的,如果你用最新版的 rmarkdown,应该是不会出问题的,因为我对这个问题专门打了补丁:https://github.com/rstudio/rmarkdown/commit/1a0db722 但还是存在出问题的可能,就是你不幸安装了 latexmk 包(LaTeX 包)。不要装这个包。 latexmk 包不如 tinytex::latexmk() 这个模拟函数聪明,貌似它的作者并不在意这个 .bib 扩展名的大坑。

              yihui 是的,latexmk 包在安装和升级 CTeX 时自动安装了。rmarkdown 是最新版。现在我的麻烦是:

              1. 如果 index.Rmd 的 yaml 里,参考文献库不写扩展名 '.bib' ,那么编译成 pdf 没问题,但其他格式就不行了。
              2. 如果写扩展名 '.bib',编译成其他格式就没问题,但 pdf 就全是问号了。
              3. 卸载了MiKTeX 的 latexmk 包仍然没有改善。
              4. 如果不用 CTeX 改用 tinytex,那么好几个模板编译不通过(而在 CTeX 里能编译通过),具体原因得一个一个模板去找。

              几个月前,这些模板个个都好好的,没有任何问题。现在却是乱糟糟,按了葫芦起了瓢。已经折腾好几天了,我觉得我陷到这个坑里出不来了。

              我的愿望就是用 bookdown 痛痛快快写东西。长远来看,应该是丢掉 CTeX 换到 TinyTeX,让工具链全部纳入 R 的框架里,以便自洽。

                yihui 刚才试了下,编译还是出错,那个错误在安装了相关字体包后依旧出现且最后无法编译成功,无奈下放狗,发现果然是个,解决方法不在 tinytex 这边,而是在相关 rticles 模版里加\usepackage{lmodern}世界就安静了,编译也能成功,稍后我会 PR 到 rticles 那边。

                至于PNAS,解决了包依赖问题后,用pdflatex('untitle.tex')啥也不返回了,不报错,但pdf没有就算了连错误日志都没了,这个就超出我的能力范围了…

                  yufree 谢谢,PR 已经合并。Andrew Gelman 一天到晚嘲笑 PNAS 是 PPNAS,看来 LaTeX 模板也很差劲。待我有空再看看。

                  dapengde 让我在 Windows 下测试一下,这个 .bib 扩展名问题不难解决(心里再腹诽 biber 的作者一遍)。

                    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。

                          yihui PNAS问题已经解决,Andrew Gelman 那个我一直以为是某神秘大牛期刊,例如 “Papers Passed by Nature And Science ”

                          dapengde chemistry 模版跟 discussion 模版里加上 \usepackage{lmodern} 应该可解决问题,不算是tinytex 的锅,参见 yufree

                            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 包最新版。

                              1. 先用 bookdownplus::bookdownplus('discussion') 生成了一套 bookdown 需要的文件。
                              2. 然后按 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.
                                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)'
                                就停到这里了。 log文件我贴在了这里。此外还生成了个 missfont.log,内容是:
                                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()或别的。
                                1. 如果写成 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.
                                1. 如果写成 bibliography: [book.bib],那么 Ubuntu 下无论 pdf 还是其他格式,都没有任何问题,但是 Windows + CTeX 会找不到参考文献库,因为 CTeX 画蛇添足地把 'book.bib' 改成了 'book.bib.bib'。
                                我的意思是想提交这个关于 bookdown/CTeX 的 bug:Windows + CTeX 的用户,用 RStudio 新建个 bookdown 项目,编译出来的 pdf 里参考文献问号。这个问题跟 TinyTex 无关。当然,改用 TinyTex 能解决,但是我说的是 CTeX 用户啊。这个锅应该让 CTeX 来背,但是我不知道上哪儿去反馈这个问题,所以想问问能不能在 bookdown 层面解决。这个问题在今年上半年是不存在的,肯定是后来 MiKTeX 还是 Pandoc 还是 bookdown 哪次升级造成的。

                                所以我觉得我应该完全摒弃 CTeX,改用 TinyTex。之所以没改,是因为 bookdownplus 的几个模板目前只能在 CTeX 才能通过,TinyTex 无法通过。这就涉及下面的问题。

                                3. 象棋和围棋包

                                我原以为 LaTeX 不同的发行版在宏包库上是一致的呢!既然这俩包在 TeXLive 上不存在,估计没几个人用,我懒得折腾手动安装的事儿了,直接无视得了。

                                看来,LaTeX 的世界太混乱了。希望 TinyTeX 的出现,能最终实现车同轨书同文。当然,到达这个目标之前,可能会加剧混乱……

                                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,但我估计这件事优先级不那么高,所以我就先不管它了。

                                  yihui 确实是那两个包的问题

                                  • 没有 lmodern 不安装 metafont/mfware 依旧报错
                                  • 安装 metafont/mfware 包后编译成功

                                  那么现在的问题就是把 metafont 跟 mfware 写到 rticles 包模版里还是 TinyTex 里直接打包这两个包了

                                    yihui
                                    命名前后不统一,为什么TinyTeX要用驼峰命名,啊啊啊啊啊啊啊啊啊啊