Yihui Xie

你说咱跑这么快咱直接拿个锤子砸了直接拿跑就是了

谢益辉 / 2018-01-15


我经常觉得技术懂的越多,办事越纠结、越慢。无知如我,却偏偏踌躇满志,操起键盘两个星期写完了我盼了四五年的 TinyTeX。一般的项目我不会傲娇,但根据我这约十年来的 LaTeX 踩坑经验,我觉得 TinyTeX 应该是完胜主流 LaTeX 安装包了,官方推荐的 TeX Live、MiKTeX、MacTeX,它们都把事情搞复杂了,都不如 TinyTeX 便利1。尤其是对 R Markdown 用户,可以说 TinyTeX 解决了 99% 的可能遇到的问题,尤其是缺包自动安装这个特性,让苦兮兮的 R 用户再也不用费一点脑子去琢磨。

今日看见我中土大唐的 LaTeX 名家李阿玲点评 TinyTeX:

如果你仔细读过 tlmgr 的文档并且用过 TeX Live的 online installer 的话,所谓 tiny 不过是最小的 scheme。缺包的问题,tlmgr 的开发者 Karl Berry 以前讨论过,TeX Live 并不能像 MikTeX 那样即时安装包,这个特性如果想在 TeX Live 里去做的话,涉及到底层诸多数据库,很麻烦的。TeX Live 即便自己装,要控制在 300M 内是很容易的,但这意味着用户要从懒人玩家变成骨灰级玩家。

你瞧,人家三秒钟就看穿了我做的事情。没错,TinyTeX 正是在最简版的 TeX Live 基础上再安装了一些常用包,但我不同意“这意味着用户要从懒人玩家变成骨灰级玩家”。和李阿玲比起来,我的 LaTeX 在幼儿园水平,而她是博士水平,但正是因为我幼儿园,才让我能有勇气并在短时间内做成这事(而不是去单手创 ApTeX 世纪)。我用我的幼儿园水平让更多幼儿园小朋友能用上一款不需要操心的 LaTeX 发行版,他们不需要成为骨灰级玩家,这事情没那么复杂,我把安装过程用脚本全自动化处理就可以了,他们只管一行代码安装,不必管里面是怎样的魔法。

我没读过 Karl Berry 的讨论,内心毫无波澜,甚至连这个名字都不认识,但我知道这几点知识:首先从 LaTeX 编译出错的日志中可以用正则表达式提取缺失的文件名,根据文件名可以从 CTAN 上自动搜索包名,然后 tlmgr 可以安装缺失的包。我完全不需要知道 TeX Live 里面到底有多麻烦的数据库,我只需要用这个暴力手段:只要编译出错就去尝试自动搜索并安装包。这便是 R 包 tinytex 里面的 latexmk() 函数默认做的事情。当然,这个原理也是用户完全不需要关心的,他们只需要在 RStudio 中点击 Knit 按钮,PDF 就会自动出来。如此这般,我们便把 LaTeX 彻底藏在了 R Markdown 的幕后。

从效率上来说,这个编程实现实在低效得令人发指,也不严谨:最初缺包时,可能会重复尝试编译好多遍(如果缺包太多,装一个还缺,再装还缺……2),但这有什么关系呢?因为这种低效只是一次性的。只要你装过一遍了,下次编译就不需要再装了。就算你第一次编译耗费五分钟时间,第二次编译可能会骤减到五秒钟。对普通用户而言,他最坏的情况是需要等一小会儿,这比自己研究错误日志舒服多了(尤其是在 Linux 上,从缺失文件推导缺失的 Linux 包还要绕更多的弯)。最近钟浩光说我是产品型码农而不是技术性码农,这个描述也很符合我对自己的认知。

所以我这种做法就跟《疯狂的石头》中的黄渤一样(自己脑补他的口音):

早知道咱费那劲干嘛,拿锤子把玻璃敲了,抓起翡翠就跑,看谁能追得上?

哎你说咱跑这么快,咱直接拿个锤子砸了,直接拿跑就是了,咱还费那劲干甚嘛?

你说咱网速这么快,咱直接提取错误日志中的缺失文件名,直接搜到 LaTeX 包名给用户装上就是了,咱费那劲干嘛。

有人会有疑问:为啥还要费劲自动安装缺失的包?把所有包都装了不就好了。当然,如果嫌硬盘太大的话,装几千个 LaTeX 包也并非不是个办法,这样更加黄渤。我不喜欢这种一锅端下来的解决方案,我估计绝大多数 LaTeX 用户一生用的包也不会超过 CTAN 上十分之一的包。不需要的东西为啥要装上呢?我就没在任何其它社区听说过把库中所有包都装上的解决方案。

应该都没有,那为啥 LaTeX 用户就得苦兮兮把整个 CTAN 都装上嘞?如果整个 CTAN 文件大小的数量级在 500 M,那我觉得还可以接受,但好几 G 我觉得就有点过分了。

还有人会有疑问:要是我没有网呢?嗨,瞧您说的,仿佛没网的时候真的就能通古今之变、成一家之言似的。有网的时候你不好好干活儿,在这儿浪费时间看别人的博客,没网的时候你想起来立牌坊、表决心、写论文了3


  1. 对,这说话口吻是学王垠,虽然我并不是很喜欢他。
  2. 这是由于坑爹的 LaTeX 无法一次性把所有缺失的文件在错误日志中报齐,只能编一遍出一个。
  3. 像查理芒格一样,我直言不讳的胆量应该到了黑带水平,明年今日且看我坟头草几尺高。