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

                                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

                                      我没尝试,只是猜测。