召集壮士帮忙测试 TinyTeX
我这次直接偷懒用 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)
卸载成功!
- 已编辑
今天折腾 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 这种怪风气的……
- 已编辑
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' 这个扩展名是可有可无的呀。莫非哪里升级了?
字体问题大概是这样,需要改 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了…
dapengde 这个的确是我前段时间在 rmarkdown 中修改过的,如果你用最新版的 rmarkdown,应该是不会出问题的,因为我对这个问题专门打了补丁:https://github.com/rstudio/rmarkdown/commit/1a0db722 但还是存在出问题的可能,就是你不幸安装了 latexmk 包(LaTeX 包)。不要装这个包。 latexmk 包不如 tinytex::latexmk()
这个模拟函数聪明,貌似它的作者并不在意这个 .bib 扩展名的大坑。
- 已编辑
yihui 是的,latexmk 包在安装和升级 CTeX 时自动安装了。rmarkdown 是最新版。现在我的麻烦是:
- 如果 index.Rmd 的 yaml 里,参考文献库不写扩展名 '.bib' ,那么编译成 pdf 没问题,但其他格式就不行了。
- 如果写扩展名 '.bib',编译成其他格式就没问题,但 pdf 就全是问号了。
- 卸载了MiKTeX 的 latexmk 包仍然没有改善。
- 如果不用 CTeX 改用 tinytex,那么好几个模板编译不通过(而在 CTeX 里能编译通过),具体原因得一个一个模板去找。
几个月前,这些模板个个都好好的,没有任何问题。现在却是乱糟糟,按了葫芦起了瓢。已经折腾好几天了,我觉得我陷到这个坑里出不来了。
我的愿望就是用 bookdown 痛痛快快写东西。长远来看,应该是丢掉 CTeX 换到 TinyTeX,让工具链全部纳入 R 的框架里,以便自洽。
- 已编辑
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 输出,只能二选一。非要输出的话,只能自行用脚本方式:先生成一个,然后把输出重命名或移动到别的地方去,再生成第二个。