LaTeX 的罪与罚

作者:朴素的贝叶斯 https://zhuanlan.zhihu.com/p/52006922 本文已授权,未经允许,不得二次转载

前言

众所周知,LaTeX是一个很恶心的东西,但这么说显得有点不负责任,好像也让人不太清楚到底在批评Tex的语法?Tex软件?LaTeX的宏?开发者贡献的Tex包?

为了让我们的表达更清晰,这里应该更具体地说,Tex的一切,对,一切都很恶心...

当你开心地使用Word调整页面、插入中文英文德意法文时,Word从未扔出过后端肮脏的内部错误。LaTeX却对此骄傲得很,乐此不疲地邀请你解决它 \if \else pop 各种cls,bst里的所有错误。

自由软件让我们能用Latex已经是我们的幸运了,更加万幸的是,LaTeX这么烂没人需要被责备,严格来说也没人需要对Latex负责,因为这个软件是开源软件,遵循LPPL协议

如下是其中的一节,相信大家对此也不陌生,这种事情其实合理得很。

NO WARRANTY 软件质量无保证 =========== There is no warranty for the Work. Except when otherwise stated in writing, the Copyright Holder provides the Work `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the Work is with you. Should the Work prove defective, you assume the cost of all necessary servicing, repair, or correction. 其实就是说软件没任何保障,给你的就这样,爱用不用。 In no event unless required by applicable law or agreed to in writing will The Copyright Holder, or any author named in the components of the Work, or any other party who may distribute and/or modify the Work as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of the Work or out of inability to use the Work (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of the Work to operate with any other programs), even if the Copyright Holder or said author or said other party has been advised of the possibility of such damages.

所以无论是语言设计者、SDK编写者、GUI编写者还是软件包贡献者,都不是我们该责备的对象。

他们都是勇士、智者、佛陀,感谢他们的付出。

那么为了解决我们自己的问题,似乎你必须读一个“LaTeX学”博士学位,才能知道怎么写篇作文,才能清晰地知道LaTeX到底在闹哪样,才能冷静地面对LaTeX的行为,不至于砸桌子。

在拥挤的办公桌前,面对doc文件夹下三千多个PDF readme,我知道我这辈子都没办法做一个 LaTeX科班生。然而,命运不会等人,我手中小小的报告,常常24h内就必须要飞到老师的邮箱中。

LaTeX,你到底为什么惹人烦恼?这一切要从我写论文开始说起。

劳资要写论文!

为了写出符合学校要求的论文,谁都需要一个好用的模版,而不出意外地,我也是其中的一员。

  • 实验室的算法大神世豪搞了个模板用,折腾折腾,一编译,好使!
  • 我拿来用,不好使,浪费了一两天时间。
  • 实验室编码大神益达用了个模板,折腾折腾,编译一下,好使!
  • 我换成他的,不好使,浪费了一两天时间。
  • 我上Github下载了一个的ZJUthesis
  • 不好使,浪费了两三天吧。
  • 换成另一个github上的zju模板,不好使。
  • 这时候数学优化大神萝卜给我了一个师兄自用的模板。
  • 我试了一下午,不好使。

生活总是充满苦涩,我选择了一个 error 最少的cls文件,从0开始,一点一点把各个模板好使的语句慢慢粘贴过来,形成一个巨大的tex文件。

这Latex的世界

这是我使用LaTeX的第三年,踩了很多坑后,我也开始有了对LaTeX的一些感悟。

我觉得,LaTeX的世界,可以用“江湖”两个字概括。想象一下,在你面前的是一整个乱世,兵荒马乱,民不聊生,百废难兴。每个人都风尘仆仆,饱经风霜,为了生存,各个都身怀绝技,却也不知何时会被无处不在的暗箭一击杀死。

LaTeX 十年老用户的形象

\fullcite{} 奇遇记

展示自己的发表论文列表,常需要用 \fullcite{ },但根据网上的资料,它只能在如下环境使用:

\usepackage{biblatex} \addbibresource{ref.bib} .... \fullcite{mypaper} .... \printbibliography

用了之后引用全都显示不出来,参考文献页也是全空的,有99个warning呢你贼棒,贼都没你棒。

这么多warning,可能它愚蠢到无法处理bib引用

这说明它真的无法处理引用,像隔壁鲁西纳奶奶的鞋垫儿一样愚蠢。

压根用不了。

含蓄的\bibentry

万般无奈,我只能换成网上流传的另一种方案:bibentry!

\usepackage{bibentry} 之后 \bibentry{xxx}

结果发现它含蓄得很,什么都不显示:

bibentry什么都不显示,这两个点儿还要归功于 itemize

消失的官方文档

bibentry不好使到底是为什么?查了半天内心焦躁,转念想到LaTeX大牛说过:去bibentry官方链接里看文档,总会学会的:

官方文档?NULL?还想让我怎么样?

官方文档,真的是够权威,直接给我显示NULL,什么都不说!然而不说话就不会说错话,这一定是最正统的官方网站了不是吗?

偏方治怪病

终于找到网友的一个链接,阴馊馊教我了这些道理:

  1. \usepackage{bibentry} 不可以和 \usepackage{cite} 同时出现噢
  2. 一定要额外写一句 \nobibliography* 噢

latex,请问您祖宗,包写成这么复杂,比写成一句难实现多了,您就是喜欢复杂么?学习某语言一样专门恶心开发者么?

所言非所意,不知所云何

清理掉所有中间文件和辅助文件后,开始从头编LaTeX,出现:

找不到 begin document

找不到 begin document, 这里明明有啊

begin document 就在这 LaTeX 你瞎么 不会报错能闭嘴么 能不瞎bb么

搞了半天,我再次删除掉所有中间文件和辅助文件后,就没有这个错误了。

噢我尊敬的LaTeX,您到底怎么了,难道是和隔壁奥德赛老奶奶一样发烧了吗,怎么都开始说胡话了呢?一定是鄙人穷酸的主板太热烫着您金贵的比特序列了。

排山倒海 —— 错误们的派对

紧接着,LaTeX以迅雷不及掩耳盗铃儿响叮铛之势,爆出无法理解的错误!

Runaway argument? \BIBentryALTinterwordspacing W.~Commons, ``File hyperspectralcubejpg \ETC. ! Paragraph ended before \BR@c@bibitem was complete. <to be read again> \par

inter word spacing 是说我单词中间的空格有问题呗,懂英语的人,话还是会说的吧?这是说老夫的某个bibtex item格式不对?,查了一下这个bibtex的格式是这样的:

@misc{wiki:nasahsi, title = {File HyperspectralCubejpg Wikimedia Commons the free media repository}, author = {Wikimedia Commons}, year = {2018}, url = {File:HyperspectralCube.jpg - Wikimedia Commons}, note = {Online; accessed 3-December-2018} }

我尝试了如下方法:

  1. 删除所有空格
  2. 删除所有空格后, 切换成英文输入法,重新手动打进去空格。
  3. 删除任何特殊字符,只保留a-zA-Z字母
  4. 全都小写
  5. 全都大写
  6. 全用{}括号
  7. 全用“”引号
  8. 换行
  9. 不换行
  10. note那句也加逗号
  11. 用python将上述全文转成ascii编码,干掉奇怪的空白符
  12. 用python检测\t符号,发现并没有奇奇怪怪的占位符

都失败了。网上查询无果,自己翻看PDF文档,在其中花费了半个多小时努力寻找,眼睛都要瞎了,最终发现 misc 不支持url字段!!!那为什么不提示“不支持url字段”?而且凭什么故意不支持url字段?一个叫做“杂七杂八”的信息模版,就是为了容纳杂七杂八的信息的,连一个互联网来源链接都无法支持,何等的丢人现眼。

misc你有什么资格不支持url字段?

三重括号,最为致命 —— 性感 LaTeX 在线变异

好,我查还不行?我来查查怎么办!

要想在misc中加url,要这么写:

@misc{crappyLaTeX, howpublished = {\url{xsdfsaefaef}}}

三重括号,最为致命。那么喜欢搞异构的struct,建议LaTeX干脆把abs,article,inproceeding全都搞成不一样的好了,你们满意了,我们用户也干脆别用了。

噢我差点忘了,这个bibitem不是我自己手敲的,是从wiki上引用下来的,人家wiki自动生成的格式,bibtex处理不了,是wiki所有的格式都错了呢,还是bibtex有病呢?

需要关怀的数学差等生 —— LaTeX的逻辑能力

再清理、编译,出现了下面的错误,惊喜真是一个接着一个呢。

pdfTeX warning (ext4): destination with the same identifier (name{cite.mls2018_ pub}) has been already used, duplicate ignored <to be read again> \relax l.432 \bibitem{mls2018_pub}

啥玩意儿,听说pdftex连数数都数不好了?哪的数数不对了?干啥用的数?哪个作者写的数?你说啊你倒是说啊你别死啊。。。啊!死就死吧。

我搜了半天,查到的方法包括

  • 改documentclass,
  • 改hyperref[xxxx=xxx]
  • 手动把package内部的肠子肚子拉出来改来改去newcommand的[SO]
  • 甚至还有要求严格更改\usepackage顺序的[1][2]

开心死了,居然实测全都不好使呢!

热寒相冲,阴阳双虚 —— LaTeX的科学精神

其中这个更改usepackage顺序的真是让我拍案惊奇,无法控制自己连说了四个妙字!

吃了这个你就会不由自主地说出四个妙字

为了了解更多冲突的宏包,我随便一搜,就搜到了很多记录宏包冲突的博客文章,比如这个

里面细数了很多包冲突

  1. Hyperref 和 preamble pages 冲突
  2. Hyperref 和 Fancy headers 冲突
  3. Hyperref and Algorithm 冲突
  4. Hyperref and Algorithmic 冲突
  5. Algorithms and Pseudocode 冲突
  6. PGF 和 double subscripts 冲突
  7. XeLaTeX 和 pdftex driver 冲突
  8. XltXtra and Graphicx 冲突
  9. Amssymb with Xunicode 冲突
  10. Caption 和 Subfig 冲突
  11. ....

这听起来很耳熟啊,咱们中国乡亲早就知道这一套了:

  1. 螃蟹与梨相克:二者同食,伤人肠胃。
  2. 墨鱼与茄子相克:同食容易引起霍乱。
  3. 海蟹与大枣相克:同食容易患寒热病。
  4. 大蒜与蜂蜜相克:性质相反。
  5. 萝卜与何首乌相克:性寒滑。
  6. 萝卜与木耳相克:同食会得皮炎。
  7. 韭菜与白酒相克:火上加油。
  8. 南瓜与虾相克:同食会引起痢疾
  9. 芹菜与鸡肉相克:同食会伤元气。
  10. 甲鱼与黄鳝与蟹相克:孕妇吃了会影响胎儿健康。
  11. 葱与狗肉相克:共增火热。
  12. 葱与枣相克:辛热助火。
  13. 鳖肉与鸭蛋相克:二物皆属凉性,不宜同食。
  14. 南瓜与羊肉相克:两补同时,令人肠胃气壅。
  15. 螃蟹与泥鳅相克:功能正好相反,不宜同吃。
  16. ...

请问 hyperref 性温热,bibentry 性寒凉,两个一起用后面会黑胆汁逆流冲击粘液导致我歇斯底里么?

LaTeX同学,你既然都知道用相同的内部计数id会冲突,这种冲突不好,所以要警告我,那你怎么就不能直接安排个别的计数id?+1很难么?

丢给我让我怎么办,写个论文,每十分冲思路就要断一次,花费1个小时解决LaTeX的工程问题!

然后再写十分钟,再花费1个小时钻研LaTeX到天荒地老?

入乡不随俗,清高断如我 —— 坚持不被人利用的 LaTeX

平复一下抽搐的心,Push了刚刚做完的修改,回到寝室打开mac,继续开工。

Pull下来一编译,您猜怎么着!噢我的老天爷,放到mac上编译不好使了哈哈哈!一个跨平台的软件,入了乡还不能随俗的呀。

CTeX fontset `mac' is unavailable 是什么鬼?老子行走江湖从未见过这种错误。

查来查去,很多人都说改一改字体,用mac支持的字体就好了,我前前后后改了数十个字体,挨个去macOS 的 Font 管理器里对照,都有啊,有这个字体啊。

后来我干脆从我自己的Windows10上下载了所有的字体

windows 10 里的整个字体文件夹,压缩好了安装在mac上

我把windows 10 里的整个字体文件夹压缩好了,安装在mac上。

安装后的mac字体库

老子现在有五百多个字体,能绕地球一圈,连微软雅黑我都有,重构字体缓存吧!字体放到texmf什么鬼的文件夹去吧!重构LaTeX字体缓存吧!编译吧latex君!

又是这个错误

还是这个错误。

经过三天的调试,我改用了XeLaTeX,删除了所有字体的自定义,全都tm默认吧,然后居然能编译了???

LaTeX 啊LaTeX,你犹抱琵琶半遮面,太过含蓄,有啥不满就不能明明白白告诉我到底是什么问题么?哪怕你抱怨说自己对所有font问题都无能为力也好啊,那我也就铁了心再也不用LaTeX好了,为啥圈圈绕绕就是整不明白自己有啥问题呢?

不求甚解,不拘小节 —— 格式奇怪的 LaTeX

文章拿去阅览获得一句回复:“字体都不一致,不认真”。

我的妈?

我这正文都是宋体,该强调也强调了,怎么?哎!

这个字体???

这是为什么啊,怎么宋体里面多了楷体???我原文怎么写的?

这就是一个强调啊?怎么不给斜体,不给粗体,给了个奇奇怪怪的楷体,字体字号还和正文不匹配,也没像英文一样给我多加半个空格隔开,这也太不拘小节了吧?说好的模板呢?怎么这点事都处理不好?

机关算尽太聪明 —— 前后不一干着急

好吧那我把所有的emph都去掉好了。然后根据学校要求,我得把修改的地方写成一个列表,

那我就写了:

编译出来:

噢各位读者,我当然知道,\ 符号要转义才能打出来的对吧, \\ 这样就好了:

不会难倒我的哈哈,编译:

怎么给老子换行了??????

热心的六年LaTeX专家萝卜来帮我,提出了如下方案:

结果嘛:

还是没效果

条条大路通悬崖——做个幻灯片喘息下。

用$\backslash$绕过了反斜线的沟壑后,让我们来找个答辩模板编译一个PPT吧,就从上一届毕业生那里拿一个好使的来好了。

曾经亲眼目睹编译成功的我,这次又栽在了起跑线上:

编译不出,未定义的指令???没输出任何友好的提示说问题是什么以及如何解决。

根据StackOverflow的回答[SO] ,这是由于旧的beamer会在nav,toc文件中写入一些代码,一旦检测到你得beamer更新了,就删除自己,让新的beamer生成最新的格式成功编译!这简直太美好了!然而你也该醒醒了:

想得美!!!它才不会删除陈旧的自己,它就拒绝编译,然后扔出\beamer@endinputifotherversion,抱怨“你的beamer是新版”让旧版宝宝嫉妒了,宝宝不给你编译了,宝宝还生气了不正儿八经地告诉你是版本不一致导致的,也不告诉你该删除旧的nav,就是不给你编译好了,这样能最大化你的效率呢!就问善良不善良?

让我们细看看SO的LaTeX大神怎么说[SO]:

Older versions of beamer add \beamer@endinputifotherversion to the .nav and .tocfiles to check for version changes. This was removed in recent versions as it tends to cause more trouble than it fixes. 旧版的 beamer 在 .nav.toc 文件中加入了 \beamer@endinputifotherversion 来检测版本的变更。这一特性在最近版本中已经被移除,因为它导致的新BUG比它修复的旧BUG还要多。

没有问题创造问题也要上,不然怎么点亮github的贡献方格呢。

我手动删除掉nav,终于可以编译了。

一石激起千层浪——中间文件如海洋

虽然删掉nav后问题算是解决了,可我之前清理过中间文件了啊?为什么清理了没删掉nav呢?打开WinEdt发现,在这么多的中间文件列表中没有nav文件,所以点击清理按钮会删掉toc文件,却不会删掉nav文件。

winedit 能清理的众多中间文件列表

这勾起了我关于LaTex中间文件的回忆,那是一个稀松平常的下午,人生中第一次编译出pdf的快乐,如久旱后的甘露,滋润着我累得干裂的心。我开心地点开文件夹,却找不到生成的pdf!

“握日,怎么生出这么多不认识的文件???比VisualStudio还多!文件夹都快填满了!”

作为来自东方大陆的Bug编写者,crash的创造者,指针的解放者,内存的占有者...

...通情达理的我知道每个文件背后,都有一个辛勤的开发者,花费无数个日日夜夜为这个格式的临时文件设计语法、宏、变量、函数、数据格式.... 。每一个临时文件都像一个秘密的宝藏等待着我去挖掘。我想到只要把这些中间文件都弄懂,我就是半个专家了。

我已经迫不及待了,快让我看看有多少种中间文件需要学习呀!

*.aux *.lof *.log *.lot *.fls *.out *.toc *.fmt *.fot *.cb *.cb2 *.dvi *-converted-to.* docs/latex/*.pdf *.bbl *.bcf *.blg *-blx.aux *-blx.bib *.run.xml *.fdb_latexmk *.synctex *.synctex(busy) *.synctex.gz *.synctex.gz(busy) *.pdfsync *.alg *.loa acs-*.bib *.thm *.nav *.pre *.snm *.vrb *.soc *.cpt *.spl *.ent *.lox *.mf *.mp *.t[1-9] *.t[1-9][0-9] *.tfm *.end *.?end *.[1-9] *.[1-9][0-9] *.[1-9][0-9][0-9] *.[1-9]R *.[1-9][0-9]R *.[1-9][0-9][0-9]R *.eledsec[1-9] *.eledsec[1-9]R *.eledsec[1-9][0-9] *.eledsec[1-9][0-9]R *.eledsec[1-9][0-9][0-9] *.eledsec[1-9][0-9][0-9]R *.acn *.acr *.glg *.glo *.gls *.glsdefs *-gnuplottex-* *.gaux *.gtex *.brf *-concordance.tex *.tikz *-tikzDictionary *.lol *.idx *.ilg *.ind *.ist *.maf *.mlf *.mlt *.mtc[0-9]* *.slf[0-9]* *.slt[0-9]* *.stc[0-9]* _minted* *.pyg *.mw *.nlo *.pax *.pdfpc *.sagetex.sage *.sagetex.py *.sagetex.scmd *.wrt *.sout *.sympy sympy-plots-for-*.tex/ *.upa *.upb *.pytxcode pythontex-files-*/ *.loe *.dpth *.md5 *.auxlock *.tdo *.lod *.xdy *.xyc *.ttt *.fff TSWLatexianTemp* *.bak *.sav .texpadtmp *.backup *~[0-9]* /auto/* *-tags.tex 一共 118 种 引自GitHub 自动创建的TeX gitignore,

彼之宝藏,我之垃圾。

沉醉在这垃圾文件的海洋中,我质问自己,是不是我最终还是要精通每一个中间文件的语法、内容、变量、作用、才能开心地做个ppt呢。

彩蛋

带着忐忑不安的心情,我清理后再次点击了编译。

Tex第一次给我有效的友情提示

然后崩溃退出,优雅离场,留下泪流满面的我。

我太感动了,原来Tex也会给我有用的错误提示!Stack overflow, 我来啦!!

感谢 LaTeX TeX Bibtex texlive ... whatever

尊敬的Tex,我用word template你开心了么?

尊敬的Tex,那我不搞学术了你开心了么?

尊敬的Tex,浪费人那么多的时间,毁掉那么多心情,LaTeX你可是真优秀呢!

后记

作为一个在LaTeX之路上屡屡受挫的失败者,我真心希望越来越多的人能熟读LaTeX说明文档,希望世上能有更多的Latex正统科班生,也鼓励那些真正的大神们少出现在评论区里,多出现在知乎回答、Quora、StackExchange、博客园、GitHub和百度知道里,帮助千千万万的人解决问题。

我也希望自己能做一个弄明白LaTeX的人。然而可惜的是,我或许永远无法将LaTeX看作一个“专业工具”,拿出钻研编译原理的劲儿来啃透LaTeX。

这或许是因为,在座的你我需要的无非是排个章节、插个图、上下标、来几行公式... 我们需要一个能好好地把字母排列到理想位置的“效率软件”,而不是一个慢吞吞又挑三拣四难以融洽的“活祖宗”。

好奇的我,曾经搜到过一些有趣的事:Office有超过5亿的全球用户,而StackOverflow上只能搜到约14,000个关于Word的提问,片面来看提问率0.028‰ ,Word把我25,000字的本科论文编译成PDF大约需要11秒,平均每个字0.44毫秒。

本科论文

如果假设全球的在校大学生都用LaTeX,约1亿8500万人,StackOverflow上LaTeX相关问题有约27,000个,片面来看提问率0.14‰,我两万六千字的论文编译成pdf要54秒,平均每个字2毫秒。

研究生论文

LaTeX 编译时间

然而2毫秒,足够一片 core i5 执行一亿条指令了。

作为专业工具,LaTeX,够劲道。

下次写论文,面对会议和期刊提供的LaTeX/Word双模版,我一定....公式语言真香!

原文发布于微信公众号 - CVer(CVerNews)

原文发表时间:2019-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券