前言

眾所周知,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 inwriting, the Copyright Holder provides the Work `as is, withoutwarranty of any kind, either expressed or implied, including, but notlimited to, the implied warranties of merchantability and fitness for aparticular purpose. The entire risk as to the quality and performanceof the Work is with you. Should the Work prove defective, you assumethe 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 theWork, or any other party who may distribute and/or modify the Work aspermitted above, be liable to you for damages, including any general,special, incidental or consequential damages arising out of any use ofthe Work or out of inability to use the Work (including, but not limitedto, loss of data, data being rendered inaccurate, or losses sustained byanyone as a result of any failure of the Work to operate with any otherprograms), even if the Copyright Holder or said author or said otherparty 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引用
這說明它真的無法處理引用,像隔壁魯西納奶奶的鞋墊兒一樣愚蠢。

壓根用不了。

含蓄的ibentry

萬般無奈,我只能換成網上流傳的另一種方案:bibentry!

usepackage{bibentry}

之後 ibentry{xxx}

結果發現它含蓄得很,什麼都不顯示:

bibentry什麼都不顯示,這兩個點兒還要歸功於 itemize

消失的官方文檔

bibentry不好使到底是為什麼?查了半天內心焦躁,轉念想到LaTeX大牛說過:去bibentry官方鏈接里看文檔,總會學會的:

官方文檔?NULL?還想讓我怎麼樣?

官方文檔,真的是夠權威,直接給我顯示NULL,什麼都不說!然而不說話就不會說錯話,這一定是最正統的官方網站了不是嗎?

偏方治怪病

終於找到網友的一個鏈接,陰餿餿教我了這些道理:

  1. usepackage{bibentry} 不可以和 usepackage{cite} 同時出現噢
  2. 一定要額外寫一句
    obibliography* 噢

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檢測 符號,發現並沒有奇奇怪怪的佔位符

都失敗了。網上查詢無果,自己翻看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>
elax

l.432 ibitem{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專家蘿蔔來幫我,提出了如下方案:

結果嘛:

還是沒效果

條條大路通懸崖——做個幻燈片喘息下。

用$ackslash$繞過了反斜線的溝壑後,讓我們來找個答辯模板編譯一個PPT吧,就從上一屆畢業生那裡拿一個好使的來好了。

曾經親眼目睹編譯成功的我,這次又栽在了起跑線上:

編譯不出,未定義的指令???沒輸出任何友好的提示說問題是什麼以及如何解決。

根據StackOverflow的回答[SO] ,這是由於舊的beamer會在nav,toc文件中寫入一些代碼,一旦檢測到你得beamer更新了,就刪除自己,讓新的beamer生成最新的格式成功編譯!這簡直太美好了!然而你也該醒醒了:

想得美!!!它才不會刪除陳舊的自己,它就拒絕編譯,然後扔出eamer@endinputifotherversion,抱怨「你的beamer是新版」讓舊版寶寶嫉妒了,寶寶不給你編譯了,寶寶還生氣了不正兒八經地告訴你是版本不一致導致的,也不告訴你該刪除舊的nav,就是不給你編譯好了,這樣能最大化你的效率呢! 就問善良不善良?

讓我們細看看SO的LaTeX大神怎麼說[SO]:

Older versions of beamer add eamer@endinputifotherversion to the .nav and .toc files to check for version changes. This was removed in recent versions as it tends to cause more trouble than it fixes.

舊版的 beamer 在 .nav.toc 文件中加入了 eamer@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雙模版,我一定....公式語言真香!


推薦閱讀:
相关文章