---
title: 你说咱跑这么快咱直接拿个锤子砸了直接拿跑就是了
date: '2018-01-15'
slug: brutal-force
---

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

今日看见我中土大唐的 LaTeX 名家李阿玲[点评](https://zhuanlan.zhihu.com/p/32119213) 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](https://github.com/rstudio/tinytex) 里面的 `latexmk()` 函数默认做的事情。当然，这个原理也是用户完全不需要关心的，他们只需要在 RStudio 中点击 Knit 按钮，PDF 就会自动出来。如此这般，我们便把 LaTeX 彻底藏在了 R Markdown 的幕后。

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

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

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

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

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

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

- 有人在 R 里面把整个 CRAN 都装上咩？
- 有人在 Python 里把整个 PyPI 都装上咩？
- 有人在 Perl 里把整个 CPAN 都装上咩？
- 有人在  Debian/Ubuntu 里把所有 Debian 包都装上咩？

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

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

[^1]: 对，这说话口吻是学王垠，虽然我并不是很喜欢他。

[^2]: 这是由于坑爹的 LaTeX 无法一次性把所有缺失的文件在错误日志中报齐，只能编一遍出一个。

[^3]: 像查理芒格一样，我直言不讳的胆量应该到了黑带水平，明年今日且看我坟头草几尺高。
