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要用驼峰命名,啊啊啊啊啊啊啊啊啊啊

                        yufree 太好了。我看了一下这两个包的大小,只有 1M 左右,所以我直接打包了。非常感谢二位坚持不懈的测试!我感觉现在基本上已经天亮了,应该不会有什么别的诡异问题了。

                        tctcab 因为 LaTeX / TeXLive / MiKTeX / MacTeX 全都是驼峰,我只好跟风了。

                          yihui 谢大不用这么客气,这个包的出现解决了开源社区长久以来的问题(特别对 travis-ci 的在线测试),是用户的福音,水平低到我这样就算有心解决也没能力去面对 TexLive 这个庞然大物,终于可以放心把它删掉了,全面转 TinyTex

                            yihui yufree 嗯,我也终于可以删掉 CTeX 这个庞然大物了。象棋围棋包在展示时还是非常酷的,不过我现在肯定用不着。说不定将来退休之后会拿来研究棋谱用。

                            这次弄得我都有意从 windows 转向 linux 阵营了,能省好多心。感谢益辉又为开源世界贡献了一件给力的宝贝。

                              我原本以为三天能解决的问题,最终花了两整周时间,这就是理想和现实的差距。其实这里面花的暗时间更多,这两周用了好多我以前积攒的经验,要是没有这些年踩坑的经验,恐怕两个月都搞不定。

                              dapengde 投向 Linux 要慎重。建议还是先用虚拟机玩一年再说,看适不适应。Linux 对 R 用户来说最大的不便就是有些包需要从源码编译,得寻找相应的头文件包(什么 libcurl4-dev 之类的),这个有点烦。对普通用户来说,Linux 娱乐功能可能差一点。我已经退出这个江湖四年,但就 R 包开发者而言,Linux 应该比 Windows 还是方便更多,macOS 本质是 Unix,所以对开发者来说也不错,就是贵,而且被苹果的屏幕惯坏眼睛之后,看别的电脑屏幕总觉得线条不够清晰。

                                fedora 27,今天测试报错

                                错误: Functions that produce HTML output found in document targeting latex output.
                                Please change the output type of this document to HTML. Alternatively, you can allow
                                HTML output in non-HTML formats by adding this option to the YAML front-matter of
                                your rmarkdown file:
                                always_allow_html: yes
                                Note however that the HTML output will not be visible in non-HTML formats.
                                
                                停止执行

                                但我的头文件是这样的

                                output:
                                  pdf_document:
                                    latex_engine: xelatex
                                documentclass: ctexart

                                所以这个
                                always_allow_html: yes 怎么换成 no

                                  lovebluesky 错误消息说你的 R Markdown 文档中包含 HTML 元素。在 PDF 输出中是不能有 HTML 元素的。

                                    yihui 明白了,大概因为我这两天正在弄 leaflet吧,但是还有报错:

                                     !LaTeX Error: File `ctexart.cls' not found.
                                    
                                    Type X to quit or <RETURN> to proceed,
                                    or enter new name. (Default extension: cls)
                                    
                                    Enter file name: 
                                    ! Emergency stop.
                                    <read *> 
                                             
                                    l.2 \usepackage
                                    
                                    pandoc: Error producing PDF
                                    错误: pandoc document conversion failed with error 43
                                    停止执行
                                    
                                    > library(tinytex)
                                    > tlmgr_search('ctexart.cls')
                                    tlmgr search --file --global 'ctexart.cls'
                                    sh: tlmgr: 未找到命令
                                    Warning message:
                                    In tlmgr(c("search", if (file) "--file", if (all) "--all", if (global) "--global",  :
                                      TeX Live does not seem to be installed. See https://yihui.name/tinytex/.
                                    > tlmgr_install('ctex')
                                    tlmgr install ctex
                                    sh: tlmgr: 未找到命令
                                    tlmgr path add
                                    sh: tlmgr: 未找到命令
                                    Warning messages:
                                    1: In tlmgr(c("install", pkgs), usermode) :
                                      TeX Live does not seem to be installed. See https://yihui.name/tinytex/.
                                    2: In tlmgr(c("path", match.arg(action))) :
                                      TeX Live does not seem to be installed. See https://yihui.name/tinytex/.