JackieMe
Never mind.
测试了一个简单文件,可以编译出 PDF。中文貌似有问题,趟下一个坑去了。

yihui 好的!新版 rmarkdown 已安装。我用 RStudio 新建 bookdown 项目得到了 'A Minimal Book Example',build 出了一个 test.tex 文件,里面的参考文献声明如下:

\bibliography{book.bib,packages.bib}

下面是用 tinytex + CTeX 对 test.tex 文件的编译信息。貌似找到 .bib 文件了:Found bibliography file(s) [book.bib packages.bib],但 .bbl 文件里的条目是空的。

> tinytex::pdflatex('test.tex')
Error: Failed to compile test.tex.
In addition: Warning message:
running command '"pdflatex" -halt-on-error -interaction=batchmode "test.tex"' had status 1 

> tinytex::latexmk('test.tex', 'pdflatex')
Latexmk: This is Latexmk, John Collins, 20 Nov. 2017, version: 4.54.
Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'test.aux'
------------
Run number 1 of rule 'pdflatex'
------------
------------
Running 'pdflatex  -halt-on-error -interaction=batchmode -recorder  "test.tex"'
------------
Latexmk: applying rule 'pdflatex'...
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (MiKTeX 2.9.6500)
entering extended mode
Latexmk: Found input bbl file 'test.bbl'
Latexmk: Log file says output to 'test.pdf'
Latexmk: List of undefined refs and citations:
  Citation `R-bookdown' on page 7 undefined on input line 249
  Citation `xie2015' on page 7 undefined on input line 250
=== TeX engine is 'pdfTeX'
Latexmk: Found bibliography file(s) [book.bib packages.bib]
Latexmk: Summary of warnings:
  Latex failed to resolve 2 citation(s)
Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'test.toc'
------------
Run number 2 of rule 'pdflatex'
------------
------------
Running 'pdflatex  -halt-on-error -interaction=batchmode -recorder  "test.tex"'
------------
Latexmk: applying rule 'pdflatex'...
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (MiKTeX 2.9.6500)
entering extended mode
Latexmk: Found input bbl file 'test.bbl'
Latexmk: Log file says output to 'test.pdf'
Latexmk: List of undefined refs and citations:
  Citation `R-bookdown' on page 7 undefined on input line 249
  Citation `xie2015' on page 7 undefined on input line 250
=== TeX engine is 'pdfTeX'
Latexmk: Found bibliography file(s) [book.bib packages.bib]
Latexmk: Summary of warnings:
  Latex failed to resolve 2 citation(s)
Latexmk: All targets (test.pdf) are up-to-date
Warning message:
running command '"latexmk" -pdf -latexoption=-halt-on-error -interaction=batchmode -pdflatex=pdflatex "test.tex"' had status 12 
> devtools::session_info()
Session info -------------------------------------------------------------------------------
 setting  value                                              
 version  R version 3.4.3 (2017-11-30)                       
 system   x86_64, mingw32                                    
 ui       RStudio (1.1.383)                                  
 language (EN)                                               
 collate  Chinese (Simplified)_People's Republic of China.936
 tz       Europe/Berlin                                      
 date     2017-12-20                                         

Packages -----------------------------------------------------------------------------------
 package   * version date       source                        
 base      * 3.4.3   2017-11-30 local                         
 compiler    3.4.3   2017-11-30 local                         
 curl        3.0     2017-10-06 CRAN (R 3.4.2)                
 datasets  * 3.4.3   2017-11-30 local                         
 devtools    1.13.4  2017-11-09 CRAN (R 3.4.3)                
 digest      0.6.12  2017-01-27 CRAN (R 3.3.2)                
 git2r       0.19.0  2017-07-19 CRAN (R 3.4.1)                
 graphics  * 3.4.3   2017-11-30 local                         
 grDevices * 3.4.3   2017-11-30 local                         
 httr        1.3.1   2017-08-20 CRAN (R 3.4.1)                
 memoise     1.1.0   2017-04-21 CRAN (R 3.3.3)                
 methods   * 3.4.3   2017-11-30 local                         
 R6          2.2.2   2017-06-17 CRAN (R 3.3.3)                
 stats     * 3.4.3   2017-11-30 local                         
 tinytex     0.1.6   2017-12-19 Github (yihui/tinytex@acbc9db)
 tools       3.4.3   2017-11-30 local                         
 utils     * 3.4.3   2017-11-30 local                         
 withr       2.1.0   2017-11-01 CRAN (R 3.4.3)                
 yaml        2.1.16  2017-12-12 CRAN (R 3.4.3)  

    Cloud2016 谢谢。真是跟不上节奏。已升级,但仍然不行。这个不是 tinytex 的问题,是 MiKTeX 或者 BiBTeX 的问题。我放弃了,就带病生存吧,也挺好。

    tinytex     0.2     2017-12-20 Github (yihui/tinytex@dbb4900) 

    JackieMe 这个 PATH 问题不能算 RStudio 的问题,所有图形界面工具都会存在这个问题。核心问题就是只有你的命令行终端会读那些 ~/.bash_profile 之类的文件,图形界面工具不会读那些文件,所以你在那里面修改 PATH 是无效的。

    dapengde 你直接在命令行窗口中跑 "pdflatex" -halt-on-error -interaction=batchmode "test.tex" 是什么结果?有没有日志文件 test.log?

      yihui 你咋就不让我放弃呢? 在cmd 窗口运行 pdflatex,有 log 文件,里面关于参考文献的信息是:

      Package natbib Warning: Citation `R-bookdown' on page 7 undefined on input line
       249.
      Package natbib Warning: Citation `xie2015' on page 7 undefined on input line 25
      0.

      这是运行第一遍 pdflatex 的记录。关键是下一步运行 bibtex,就成了 book.bib.bib 了,所以后面第二遍第三遍运行的 pdflatex 就没啥意义了:

      Microsoft Windows [Version 6.1.7601]
      Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
      
      D:\temp\newpkg\test>"pdflatex" -halt-on-error -interaction=batchmode "test.tex"
      
      This is pdfTeX, Version 3.14159265-2.6-1.40.18 (MiKTeX 2.9.6500)
      entering extended mode
      
      D:\temp\newpkg\test>bibtex test
      This is BibTeX, Version 0.99d (MiKTeX 2.9.6500)
      The top-level auxiliary file: test.aux
      The style file: apalike.bst
      I couldn't open database file book.bib.bib
      ---line 50 of file test.aux
       : \bibdata{book.bib
       :                  ,packages.bib}
      I'm skipping whatever remains of this command
      I found no database files---while reading file test.aux
      Warning--I didn't find a database entry for "R-bookdown"
      Warning--I didn't find a database entry for "xie2015"
      (There were 2 error messages)

        dapengde 嗯,我只想知道第一遍 pdflatex 为什么会失败,后面不需要跑 bibtex(它肯定会失败,这个我明白)。你得先把那些 .aux / .bbl / .blg 之类的辅助文件删掉再跑 pdflatex,我想看的是 .log 文件里面说什么。

        因为你这个问题实在是太匪夷所思了,我想不明白为什么鱼儿会漏网。

          yihui .log 太长,来这里看看。你现在搞得我非常讳疾忌医。

          我在 .tex 里把 .bib 文件的扩展名去掉编译,得到的 .log 文件跟没去掉扩展名得到的 .log 文件比较了一下,两个 .log 文件一模一样。但是第二步 运行 bibtex test 就不同了,一个找到了 .bib 文件,一个没找到 .bib.bib 文件。

            yihui 反正试过了在 R console 和 终端打开的 RStudio 都可以成功编译 PDF,我的折腾也算告一段落了。其实我开始就说纯属好奇,因为我平时基本不写 R Markdown 文档?

              dapengde 在两个网友的首次见面会上,我们解决了这个谜题。参考文献编不出来是因为 CTeX 里面的 latexmk.exe 居然可以不依赖 LaTeX 包 latexmk 就可以运行,而且疑案现场的电脑上还因为不明原因碰巧装了 Perl,在这两重因素下,tinytex::latexmk() 被说服了使用命令行工具 latexmk 来编 PDF,由于该工具没有跟我一样对 .aux 文件中的 .bib 文件名打补丁,于是 bibtex 抱怨说找不到 foo.bib.bib 文件。我刚在 tinytex 中强制启用了模拟模式,也就是说除非用户特地指定用 latexmk,否则我就用我自己的模拟模式去编 PDF,这个模式对带 .bib 扩展名的文件是安全的(跨平台通用)。

              Cloud2016 我希望你可以试试最新的开发版,看看你不自己调整 PATH 变量能否正常编译 PDF。

                yihui 网友见面我总是紧张,尤其是男网友,尤其是男偶像。手都不知道往哪儿放了。PS:Perl 是哪里来的,真不知道。

                感谢偶像帮我修电脑!

                PPS: 又查了一下,我的 Windows 下有一个叫 Strawberry Perl 的安装,和一个 ActivePerl 的安装。你远程看到的 c:/perl 来自后者。根据安装时间猜测,我可能是在折腾某些在 linux 容易安装但是在 windows 不容易安装的东西时,按网上的方法装上去的,可能是 python 的某个库或者别的什么东西——完全不记得了。

                我卸载了这两个 Perl 之后,即使不使用你今天施的法术,而保留 latexmk.exe 原来的样子,也可以正常编译了!那么说到底这个锅是 perl 来背咯?perl 在 latex 里多管闲事?

                  dapengde Perl 是躺着中枪,只是因为 latexmk 包本来是用 Perl 写的而已。真正的锅还是该 MiKTeX 里的 bibtex 来背,它是麻烦的根源。它看见 foo.bib 时非要认为是 foo.bib.bib,为了向它投降,我们必须把扩展名去掉,而去掉扩展名会导致文档不具有可移植性(某个工具下能编,换个工具就不能编)。可移植性比隐藏扩展名要重要多了,这一点 MiKTeX 中的 bibtex 的作者可能不太认同(估计伊不用非 Windows 的系统),而 latexmk.exe 又没像我一样对这个问题打补丁,放任 bibtex 出错。既然它不打补丁,我只好把它默认辞退了。

                    yihui 明白了。目前是在 bookdown 里编译就没问题,但是在 cmd 里或者 texstudio 里编译 tex 文件仍然是在傻傻地找 foo.bib.bib. 也就是说, bookdown / rmarkdown 为 bibtex 填坑的行为受到了我电脑里 perl 的干扰,而其他软件根本连 bibtex 的坑都没填。

                    你上面多次提到的为 bibtex 填坑的行为,我一直很困惑,就是因为我这里 perl 的存在导致我这里这个坑压根儿就没填上。

                    这也解释了为何我最初用 bookdown 没这问题——当时是今年 3 月份,而我的 Perl 是 5 月份安装了。

                    这正是小白长得像哥哥:真相大白。

                      dapengde 完全正确。你不能通过纯 LaTeX 命令行或者 TeXStudio 编译。当然,其实 Rscript -e "rmarkdown::render('foo.Rmd')" 也是命令行。

                        yihui 经测试没问题,可以正常编译出pdf。是在 R 内设置 Sys.setenv('PATH') 追加 TinyTeX 路径?
                        #L50

                          Cloud2016 是的,只是在有必要的情况下(条件:系统是 Linux、~/bin/tlmgr 存在但通过 Sys.which() 找不到或者找到的不是它),临时调整 PATH,编完了再恢复。

                          yihui
                          我本身除了 TinyTeX 之外没有装任何 TeX,使用 zsh,之前把 TinyTeX 路径自己加在~/.zshrc
                          刚刚从~/.zshrcPATH设置中去掉 TinyTeX 。然后:

                          devtools::install_github('yihui/tinytex')
                          tinytex::install_tinytex(force=TRUE)

                          重新安装。安装一切顺利。
                          之后直接打开 RStudio:

                          R >>> library(tinytex)
                          R >>> Sys.getenv('PATH')
                          [1] "/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
                          R >>> tinytex::is_tinytext()
                          Error: 'is_tinytext' is not an exported object from 'namespace:tinytex'

                          不管,直接打开测试的在R Markdown文档中使用中文.Rmd编译。报错:

                          pandoc: xelatex not found. xelatex is needed for pdf output.
                          Error: pandoc document conversion failed with error 41
                          Execution halted

                          貌似还是路径问题?找不到 xelatex。还是我配置问题?

                          但是测试编译xelatex('xxx.tex')文件是可以的,但是 RStudio 打开 tex 文件再点击 Compile PDF 还是提示找不到 XeLaTeX:

                          Unabled to find specified LaTeX program 'XeLaTeX' on the system path

                          所以如果要用 knitr还需要另外配置?

                          另外:

                          R >>> tlmgr_update()
                          tlmgr update --all --self
                          tlmgr: package repository http://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet (verified)
                          sh: 1: fmtutil-sys: not found
                          R >>> tlmgr_search('fmtutil-sys')
                          tlmgr search --file --global 'fmtutil-sys'
                          tlmgr: package repository http://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet (verified)
                          tetex:
                          	texmf-dist/doc/man/man1/fmtutil-sys.1
                          	texmf-dist/doc/man/man1/fmtutil-sys.man1.pdf
                          	texmf-dist/scripts/texlive/fmtutil-sys.sh
                          tetex.amd64-freebsd:
                          	bin/amd64-freebsd/fmtutil-sys
                          tetex.amd64-netbsd:
                          	bin/amd64-netbsd/fmtutil-sys
                          tetex.armel-linux:
                          	bin/armel-linux/fmtutil-sys
                          tetex.armhf-linux:
                          	bin/armhf-linux/fmtutil-sys
                          tetex.i386-cygwin:
                          	bin/i386-cygwin/fmtutil-sys
                          tetex.i386-darwin:
                          	bin/i386-darwin/fmtutil-sys
                          tetex.i386-freebsd:
                          	bin/i386-freebsd/fmtutil-sys
                          tetex.i386-linux:
                          	bin/i386-linux/fmtutil-sys
                          tetex.i386-netbsd:
                          	bin/i386-netbsd/fmtutil-sys
                          tetex.i386-solaris:
                          	bin/i386-solaris/fmtutil-sys
                          tetex.powerpc-darwin:
                          	bin/powerpc-darwin/fmtutil-sys
                          tetex.powerpc-linux:
                          	bin/powerpc-linux/fmtutil-sys
                          tetex.sparc-solaris:
                          	bin/sparc-solaris/fmtutil-sys
                          tetex.win32:
                          	bin/win32/fmtutil-sys.exe
                          tetex.x86_64-cygwin:
                          	bin/x86_64-cygwin/fmtutil-sys
                          tetex.x86_64-darwin:
                          	bin/x86_64-darwin/fmtutil-sys
                          tetex.x86_64-darwinlegacy:
                          	bin/x86_64-darwinlegacy/fmtutil-sys
                          tetex.x86_64-linux:
                          	bin/x86_64-linux/fmtutil-sys
                          tetex.x86_64-solaris:
                          	bin/x86_64-solaris/fmtutil-sys

                          这个?

                            JackieMe 你需要

                            devtools::install_github(c('yihui/tinytex', 'rstudio/rmarkdown'))

                            另外,是 tinytex:::is_tinytex() 而不是 tinytex::is_tinytext()