dapengde 嗯,应该是 PowerShell 版本太低了。我花了两天时间写这个脚本,写之前我犹豫了好一阵子是写 .bat 脚本还是为了 Windows 用户我来自学 Go 语言写一个可执行程序,最终还是偷懒写了 BAT 脚本,学习新语言不是我的强项,但看样子是要逼着我学 Go 语言了。

dapengde 你的德语模板问题我已经解决了,安装最新的 tinytex 包和 rmarkdown 分支应该会自动安装相应的 babel 语言包。

    yihui

    我这次直接偷懒用 testthat 去测 rticles 包的模版了,目前只有4个模版有问题,目测前三个原因应该一致,可能跟路径设置有关,最后一个比较吊诡,信息如下:

    1. Error: asa_article format (@test_formats.R#30) ------------------------------
    file 'testdoc.pdf' does not exist
    1: rmarkdown::render(testdoc) at C:\Users\SPMESUPERCPU\Downloads\rticles/tests/testthat/test_formats.R:30
    2: tools::file_path_as_absolute(output_file)
    3: stop(gettextf("file '%s' does not exist", x), domain = NA)
    2. Error: jss_article format (@test_formats.R#30) ------------------------------
    file 'testdoc.pdf' does not exist
    1: rmarkdown::render(testdoc) at C:\Users\SPMESUPERCPU\Downloads\rticles/tests/testthat/test_formats.R:30
    2: tools::file_path_as_absolute(output_file)
    3: stop(gettextf("file '%s' does not exist", x), domain = NA)
    3. Error: pnas_article format (@test_formats.R#30) -----------------------------
    file 'testdoc.pdf' does not exist
    1: rmarkdown::render(testdoc) at C:\Users\SPMESUPERCPU\Downloads\rticles/tests/testthat/test_formats.R:30
    2: tools::file_path_as_absolute(output_file)
    3: stop(gettextf("file '%s' does not exist", x), domain = NA)
    4. Error: rjournal_article format (@test_formats.R#30) -------------------------
    unable to run 'pdflatex' on 'RJwrapper.tex'
    1: rmarkdown::render(testdoc) at C:\Users\SPMESUPERCPU\Downloads\rticles/tests/testthat/test_formats.R:30
    2: output_format$post_processor(yaml_front_matter, utf8_input, output_file, clean, !quiet)
    3: tools::texi2pdf("RJwrapper.tex", clean = clean) at C:\Users\SPMESUPERCPU\Downloads\rticles/R/rjournal_article.R:39
    4: texi2dvi(file = file, pdf = TRUE, clean = clean, quiet = quiet, texi2dvi = texi2dvi, 
           texinputs = texinputs, index = index)
    5: stop(gettextf("unable to run '%s' on '%s'", latex, file), domain = NA)
    DONE ===========================================================================

      yihui 你这是神的效率啊。

      Windows 下初步测试报告

      总结一下上面的测试。我的操作系统是 windows 7,安装有点麻烦。

      首先出现的安装错误是:

      'install-tl-windows.bat' is not recognized as an internal or external command,
      operable program or batch file.

      原因:安装要使用 powershell。如果环境变量里没有 powershell 的路径,则出错。

      解决办法:环境变量添加 path:%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\,重启。

      然后,出现的错误是:

      The term 'Invoke-WebRequest' is not recognized as ....

      原因:powershell 版本过低。查看 powershell 版本的方法:在命令行运行

      powershell
      $PSVersionTable.PSVersion

      如果主版本是2,那就是版本太低。下载安装新版,重启。

      解决这些问题之后,R 里尝试 bookdownplus 里的三个模板:

      bookdownplus::bookdownplus(template = 'yihui_mini')
      bookdownplus::bookdownplus(template = 'yihui_demo')
      bookdownplus::bookdownplus(template = 'yihui_zh`)

      前两个编译顺利。第三个失败,因为缺少 latex 宏包。只需运行:

      latexmk('yihui_zh.tex', engine = 'xelatex')

      就自动安装了所有缺少包(和字体)。顺利通过。

      调用 babel 包的模板bookdownplus::bookdownplus(template = 'thesis_classic') 仍然编译失败,同 Ubuntu 下的错误。装 rmarkdown 的分支失败,错误信息:

      ERROR: dependency 'yaml' is not available for package 'rmarkdown'

      暂时折腾到这里,洗脚睡觉去了。

      又及:欢迎大家用 bookdownplus 里的 30 个模板来调戏 tinytex,同时也算是调戏 bookdownplu 了。安装方法:

      devtools::install_github("pzhaonet/bookdownplus")

      使用方法见 bookdownplus 主页

        dapengde 你的 template_thesis_classic.tex 模板有问题,里面没有设置 babel 选项。


        第一次用狗语言写程序,写了半天才写完解压缩。实在是没兴趣写下去了,谁有兴趣谁继续吧,对照我的 Windows 批处理脚本翻译就好了。我还是老老实实用 R 语言翻译它吧,估计十五分钟能写完,狗语言里啥都得从头写起,好麻烦。

        package main
        
        import (
          "io"
          "io/ioutil"
          "log"
          "os"
          "net/http"
          "archive/zip"
        )
        
        func main() {
          dir, err := ioutil.TempDir("", "tinytex")
          if err != nil {
            log.Fatal(err)
          }
          defer os.RemoveAll(dir)
          println(dir)
        
          os.Chdir(dir)
        
          zipname := "install-tl.zip"
          out, err := os.Create(zipname)
          if err != nil {
            log.Fatal(err)
          }
          defer out.Close()
        
          resp, err := http.Get("http://mirror.ctan.org/systems/texlive/tlnet/install-tl.zip")
          if err != nil {
            println("Faled to download the TeX Live installer")
            log.Fatal(err)
          }
          defer resp.Body.Close()
        
          println("Downloading the TeX Live installer (this may take a few seconds)...")
          if err := io.Copy(out, resp.Body); err != nil {
            log.Fatal(err)
          }
        
          unzip(zipname)
        }
        
        func unzip(archive) error {
          reader, err := zip.OpenReader(archive)
          if err != nil {
            return err
          }
        
          for _, file := range reader.File {
            path := file.Name
            println(path)
        
            if file.FileInfo().IsDir() {
              os.MkdirAll(path, file.Mode())
              continue
            }
        
            fileReader, err := file.Open()
            if err != nil {
              return err
            }
            defer fileReader.Close()
        
            targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
            if err != nil {
              return err
            }
            defer targetFile.Close()
        
            if _, err := io.Copy(targetFile, fileReader); err != nil {
              return err
            }
          }
        
          return nil
        }

          yihui 迟些我再研究一下 thesis_classic 模板。不光是这个模板,bookdownplus 里好几个 tex 模板我都没法在 Ubuntu 下正常编译,也不知道是模板本身的问题,还是别的问题,只能暂时搁置。有个模板("thesis_zju_zh")在用 latexmk() 编译时自动去找 'booktabs-de.sty',没找到:

          ## tlmgr search --file --global '/booktabs-de.sty'
          ## ! LaTeX Error: File `booktabs-de.sty' not found.

          于是我去看这个文件在 windows 下的安装路径,是:

          d:\Program Files\CTEX\MiKTeX\tex\latex\booktabs-de\

          那么说明是在'booktabs-de' 包里咯?直接安装:

          tlmgr_install('booktabs-de')

          装上去了,但是编译同一个 tex 文件仍然说找不到`booktabs-de.sty'。暂时搁置了。

          此外,我 Ubuntu 里的 bookdown 在编译 pdf 时突然能自动下载 latex 宏包了,不知是不是因为装了 rmarkdown 分支。

          下面是卸载 tinytex 的测试。

          Ubuntu 下卸载 tinytex

          比较顺利。第一次卸载时出了个错,但是再次运行卸载命令时显示已经卸载了。

          tinytex::uninstall_tinytex()
          ## tlmgr path remove
          ## man symlink destination (/usr/local/share/man) not writable, cannot remove symlinks.
          ## tlmgr: An error has occurred. See above messages. Exiting.
          ## remove of symlinks had 1 error(s), see messages above.
          tinytex::uninstall_tinytex()
          ## tlmgr path remove
          ## sh: 1: tlmgr: not found
          ## Warning message:
          ## In tlmgr(c("path", match.arg(action))) :
          ##  TeX Live does not seem to be installed. See https://yihui.name/tinytex/.

          Windows 下卸载 tinytex

          首先是卸载出错:

          tinytex::uninstall_tinytex()
          ## Error in Sys.getenv("APPDATA", stop("Environment variable \"APPDATA\" not set.")) : 
          ##   Environment variable "APPDATA" not set.

          手动往环境变量里添加 PATH 为 %APPDATA%,重启,卸载,错误依旧。

          试了试微软提供的方案:Environment variable may not expand %APPDATA% to the Application folder,重启,卸载,错误依旧。

          看了看 uninstall_tinytex()的源代码,问题出在这里:

          file.path(Sys.getenv("APPDATA",  stop("Environment variable \"APPDATA\" not set.")), "TinyTeX")
          ## Error in Sys.getenv("APPDATA", stop("Environment variable \"APPDATA\" not set.")) : 
          ##   Environment variable "APPDATA" not set.

          系统找不到 "APPDATA"。我不明白是怎么回事,于是重写了卸载代码,手动输入了我的安装路径:

          target = file.path("c:/Users/dapeng/AppData/Roaming", "TinyTeX")
          tlmgr_path("remove")
          unlink(target, recursive = TRUE)

          卸载成功!

            yihui

            今天折腾 tinytex 跟 bookdownplus 模板。大概是有点欠扁,我卸载了 Windows 里的 tinytex 重装 CTeX,并且把 MiKTeX 里的包全部升级,就发现 bookdownplus 所有模板的参考文献引用都成了问号,连 RStudio 的默认 bookdown 模板也是。折腾了两个小时没解决,索性卸载 CTeX 重装,装完不升级,参考文献居然好了!

            不是说出现问题就升级吗……

            比较苦闷,我就读了一下是莽撞人就来单挑:还世界一个轻量级 TeXLive,发现两句话,就明白为啥我这么费劲了。第一句话:

            LaTeX 的安装可以简化是基于一个假设前提的:你不会没事用一些冷门包。

            为了好玩,我确实在 bookdownplus 里用了很多冷门包,什么画吉他谱的、五线谱的、画中国象棋、国际象棋的.....于是掉进了自己挖的坑里。

            第二句话:

            如果用户需要安装包,可以请求在默认安装包中添加这个包(方便后人),或者自己敲一行命令安装,

            “她”?莫非 tinytex 的初衷为女性用户设计的……

              dapengde 这个 Windows 下卸载的 APPDATA 问题我昨天已经自己发现并解决了。你重新装一下 R 包 tinytex 即可。

              你一个浙江大学的中文论文模板 thesis_zju_zh,为何要用到一个德语版的 booktabs 包?真相是世上根本就不存在 booktabs-de 这样一个 LaTeX 包,同名的包只是 booktabs 包的德语文档。正确的用法应该是 \usepackages{booktabs},而不是 \usepackages{booktabs-de}。MiKTeX 在这个问题上作出了很好的误导,它把 booktabs.sty 复制了一份 booktabs-de.sty。深度阅读:

              所以归根结底,这个锅该 MikTeX 和 thesis_zju_zh LaTeX 模板作者两个人共同来背。

              dapengde 是有点欠扁,谁叫你不相信我踩过的 LaTeX 坑比你过过的桥都多,还不死心要试一下 CTeX。我对 TinyTeX 有极大的信心,它肯定可以解决多数 LaTeX 安装维护方面的问题,但具体 LaTeX 的用法出错这种问题就不是工具包能解决的问题了,只能谁写的 LaTeX 代码谁自己负责。

              “你不会没事用一些冷门包”这个假设我需要解释一下:它仅仅指 LaTeX 的安装。也就是,我提供一个默认的小巧安装包,在不额外安装其它包的情况下,应该足够日常使用(但什么是“日常”,各人有个人的习惯,就不好说了)。

              TinyTeX 第一步是要解决小巧安装的问题,这个问题我认为已经很好解决了,楼上有人为此收拾出十几 G 的硬盘空间,就是我预期的结果。第二步是要解决常见的 LaTeX 错误,最常见的就是缺失包,这个问题我不方便为所有用户解决,但 R Markdown 用户肯定是没问题的,我已经在 rmarkdown 库的 feature/tinytex 分支中解决了。只要安装这个分支,一旦检测到缺失包,就会自动安装。所以就算你用冷门包,也没关系,只要这个包在 CTAN 上能找到,就任你用。

              至于“她”,只不过是我三天两头同时打两个性别的 TA 字以及打烦了,总是“他/她”、“he/she”一起;干脆只写后一个算了,反正男性不会介意。如果只写男他,我怕惹上政治正确的麻烦以及招惹女权主义者。

                yihui 唉,白天不懂夜的黑,你是不懂一个半吊子 latex 用户的辛酸。比如,一个不成熟的 latex 模板,以前明明在 CTeX 下编译没问题,现在在测试版的 tinytex 下出问题,那么到底是出在测试版 tinytex 的兼容性呢,还是 CTeX ,还是模板本身?就像我现在这样。我身边又没有个专家能张嘴就问的。只能自己磕磕碰碰去试,装回 CTeX,先固定一个维度,才有可能找到问题的根源。事实上,tinytex 给我最大的惊喜是在 Ubuntu 上轻松安装通过了——此前我的 Ubuntu 装 LaTeX 就一直没成功过。现在终于可以在 Ubuntu下测试 bookdownplus 的模板了。

                那个 MiKTeX 包全部升级后导致 RStudio 的默认 bookdown 模板引用文献都成了问号的事儿,可能得留意一下。感觉这些宏包的管理是个灾难。鬼知道 bookdown 的用户电脑上装了哪些宏包,都是什么版本,哪些 latex 模板能直接用,哪次升级又突然不能用了。前不久,不知道哪个升级,你的那个中文 bookdown 模板的段首空两格突然没了,还得自己往模板里加一条。今天,重装 CTeX 不知是哪个问题,导致 bookdown.org 上那本 Lokal lagring og bruk av sensitive data 的源代码突然编译失败了。以后真不知道会有多少这种问题。看来这事儿就得指望 tiny 了。要不然我就对 bookdownplus 模板的维护绝望了。

                再说“她”,我特意查了新华字典,明明“他”字就是第三人称泛指,不分性别,是人字旁又不是男字旁,什么时候出现他/她或者 TA 这种怪风气的……

                  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 生成的最终文件同名,所以覆盖了。