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()

            yihui OK。install_github之后可以编译 Rmd 文件了。
            tinytex::is_tinytex()命令去掉了是吧?

              19 天 后

              yihui

              code.tex 文件内容如下:

              \documentclass{ctexart}
              \usepackage{minted}
              
              \title{R语言}
              \author{某某}
              
              \begin{document}
              \maketitle
              \section{数据描述}
              
              \begin{minted}{c}
              int main() {
              	printf("hello, world");
              	return 0;
              }
              \end{minted}
              
              \begin{minted}{python}
              def boring(args = None):
              	pass
              \end{minted}
              
              \begin{minted}{r}
              require(stats) # for lowess, rpois, rnorm
              plot(cars)
              lines(lowess(cars))
              plot(sin, -pi, 2*pi) # see ?plot.function
              ## Discrete Distribution Plot:
              plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10,
                   main = "rpois(100, lambda = 5)")
              ## Simple quantiles/ECDF, see ecdf() {library(stats)} for a better one:
              plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")")
              points(x, cex = .5, col = "dark red")
              \end{minted}
              
              \mint{python}|import this|
              
              \end{document}

              使用 minted 包的tex文件,需要在编译的时候使用-shell-escape参数,如果使用 tinytex::xelatex,不知道如何传这个参数?如果不能传递,谢大大是否可以再添加 args 选项让用户自己传递类似上述 -shell-escape 参数?

              system2('xelatex', args = '-shell-escape code') # 没问题,但是要运行几遍才有目录索引
              
              tinytex::xelatex(file = 'code.tex') 
              
              # I was unable to find any missing LaTeX packages from the error log code.log.
              # ! Package minted Error: You must invoke LaTeX with the -shell-escape flag.
              # 
              # Error: Failed to compile code.tex. See code.log for more info.
              # In addition: Warning message:
              #   running command '"xelatex" -halt-on-error -interaction=batchmode "code.tex"' had status 1

                Cloud2016 安装 Github 上最新版的 tinytex 包 devtools::install_github('yihui/tinytex'),然后

                tinytex::xelatex('code.tex', engine_args = '-shell-escape')

                应该就可以了。如果懒得每次都敲这个,可以设置全局选项:

                options(tinytex.engine_args = '-shell-escape')

                然后 tinytex::xelatex('code.tex')

                另外我建议你少花点时间折腾 minted 包。据我观察,你正在一步一步重复蹚我年少时蹚过的浑水,LaTeX 真的很浪费时间,投入产出严重不成比例。这种语法高亮的问题还是用 R Markdown 算了,Pandoc 已经把事情都给办好了。如果你真的闲得慌,我可以给你找一堆更有意义的事情来做。

                  yihui 你还说!要不是你鼓捣出来个 bookdown,我早就跟 LaTeX 决裂了!

                    yihui 我在折腾学校的latex模版,还是先立足做好tex而不是R Markdown或者bookdown之类的模版,其实即使模版出来了,也没几个人会用,可见意义不大,只是自己有点强迫症,既然开始了就想做完做到自己满意。

                    谢大大可以列一个有意义的事件表,闲得慌的时候可以看看,如果力所能及还可以动动手

                      dapengde 没办法,你是包的开发者,所以你注定要下地狱啃这块硬骨头,目的是为了让你的用户不必再啃它。

                      Cloud2016 如果你能把 R Markdown 套在学校的 LaTeX 模板上,那将会是一件非常有意义的事情,这事要是能办成,我愿意给你连续发一个星期的红包。单纯只是做出一个 LaTeX 模板并没有太大意义,因为那是把事情复杂化(疯狂自定义环境和命令);更有意义的事情是把事情简单化,让用户一个 LaTeX 命令都看不到,还能站在 LaTeX 肩膀上把论文给写了。打倒学术界的排版(包括学校论文的排版)是我的人生目标之一。做这件事就是在 R Markdown 的强约束条件下求最优解(只有有限可用的元素),也就要求你克制自定义 LaTeX 命令和环境;“要做什么”不难,“不做什么”才难。

                      yihui 问题能重现,可是我不会修复,谢大大太瞧得起我啦

                      只要不用R Notebook输出html就没关系,警告信息不随html/PDF文件走

                      学校的模板比较奇葩,如参考文献格式还是国标2005版(现在是2015版),模板风格都是很多年前的,还有很多细节要调整 <https://github.com/XiangyunHuang/CUMTB-Master-Thesis>

                      最近尝试了下 docker 发现 cboettig 大人已经在 rocker 里整合了 tinytex,一个完整的 verse 镜像 915.6MB,而没有 tex 支持的 tidyverse 镜像是 666MB ,解压后可能大些,但作为包含IDE的完整数据分析环境来分发做可重复性研究已经没什么问题了,甚至可以把 rticles 写的论文都包进去分发,后续看要不要也把 xaringan 包进去,这样就从分析到写作到演讲一条龙服务了。

                      ps: 一个临时的小问题是 rmarkdown 的 CRAN 版本还没更新,直接用服务器版 RStudio 上的 knit 按钮编不出来,要么在 Dockerfile 里装 rmarkdown 的 github 版本,要么就是不用按钮,用 tinytex::pdflatex('asdf.tex') 直接去编译 tex 文件,或者就是等 CRAN 上的更新

                        yufree 我计划下周把 rmarkdown 发 CRAN,到时候就可以正式昭告天下了:至少对 R 用户来说,LaTeX 问题至此基本全剧终。