寫在前面:按照本意其實比較想寫成“全平台記錄”的,但是想了一下感覺自己大概還是沒資格那樣說,更何況還有最緻命的一個問題——我手頭沒有mac且不會玩黑蘋果,于是就emmm,起了這個名字。
然後接下來是說正事環節,在本文中,我将嘗試去展示從盡可能多的角度,以盡可能詳細的方式去講述自己tex使用的經驗,以及一些潛在遇到的問題。在每章的開頭,我均會簡述一下閱讀本部分所需要的一些基礎技能點,以便補課。
關于\(\TeX\),首先我們看下wikipedia上的說明:
TeX, stylized within the system as TEX, is a typesetting system (or a "formatting system") which was designed and mostly written by Donald Knuth and released in 1978. TeX is a popular means of typesetting complex mathematical formulae; it has been noted as one of the most sophisticated digital typographical systems. TeX is popular in academia, especially in mathematics, computer science, economics, engineering, linguistics, physics, statistics, and quantitative psychology. It has largely displaced Unix troff, the other favored formatting system, in many Unix installations which use both for different purposes. It is also used for many other typesetting tasks, especially in the form of LaTeX, ConTeXt, and other macro packages. TeX was designed with two main goals in mind: to allow anybody to produce high-quality books with minimal effort, and to provide a system that would give exactly the same results on all computers, at any point in time (together with the Metafont language for font description and the Computer Modern family of typefaces). TeX is free software, which made it accessible to a wide range of users.
以上是原文,簡單來說大概這麼幾個要點:
\(\TeX\)是一種排版系統,這一點和word的定位有幾分類似
\(\TeX\)已經在學術界被廣泛使用,而且免費
\(\TeX\)的主要目标有二
讓任何人以極小代價建構高品質文檔内容,確定編寫者的内容專注性
確定同一份文檔在各個計算機上的渲染結果相同,確定格式統一性
實際上,\(\LaTeX\)是一個更為大衆所熟知的名詞。而這個詞和上文\(\TeX\)的關系,經過一番查閱官方資料,本人作如下了解,如有不當之處歡迎批評指正:
\(\TeX\)是一種語言,且存在多種不同的實作
\(\LaTeX\)是這種語言編寫的
這樣的關系實際上頗有些類似于C和C++的關系。首先C語言本身就存在多種實作,比如衆所周知的<code>gnu</code>實作(即<code>gcc</code>)、vs實作(從早期的vc6到現在和.NET Framework存在千絲萬縷關系的vs)以及clang實作等。在這些實作的基礎上,C++基于C本身的功能和特性,定義了更多的一些标準庫和功能,也在文法層面進行了進一步的擴充。同樣的,随着\(\LaTeX\)得到長足的發展,其本身也被納入了官方工具鍊的支援範圍中,這一點也和<code>gcc</code>頗為類似,現代的<code>gcc</code>實際上早已支援C++特性并可以完成C++項目的建構。
說回到不同實作的這一層,比較常見的latex環境大概兩個——texlive和ctex。這兩者都具備一定的使用量,基本功能和性能有所保證,而且ctex在win自帶編輯器等配套工具。不過相對來說,筆者覺得texlive的環境配置更為簡單一些,也更純粹。并且筆者早年嘗試過在win上配置ctex環境及其完整套件,感覺還是存在諸如支援老舊、封裝過度等一系列問題,環境本身也略微脆弱,相比之下texlive簡單暴力但是靠譜,跨平台也基本上沒啥坑,故本文中一概選擇texlive環境。當然了,對ctex有興趣的老哥老姐們也歡迎探索交流。
接下來就是關于編輯器的選擇了。實際上寫過paper或者latex文檔的都應該知道,latex實際上遠遠不隻是一個平鋪直叙的東西。
筆者在編輯器選擇的問題上,參考了一些國内外論壇上的說法,了解了一系列比較被廣泛使用的GUI編輯器。限于筆者對其也不能說都很了解,故在此處略微說說筆者比較了解的那些。
首先是線上類編輯器:ShareLatex、Overleaf,著名線上編輯器,同時模闆衆多且适合teamwork。但是缺點也很明顯,國内嘛,都懂,一系列不便是真實存在的。故個人推薦在需要teamwork的時候考慮線上編輯器(實際上也大可不必,完全可以基于git協作,用後文中所述的方式),在需要模闆的時候,可以去Overleaf上找一下,建立項目後直接打包下載下傳到本地。
本地類編輯器,着重說說幾個:
編輯器
優點
缺點
TexStudio
針對Latex設計,使用友善,功能齊全且可配置性完全可以;在Linux系統上視覺效果好
在Win平台上視覺效果不夠好,容易出現配色崩壞等情況(例如代碼警告色和部分高亮色完全重合等)
TexMaker
針對Latex設計,使用友善,可配置空間充分;比TexStudio更輕量化
在Win上效果略差;功能不如TexStudio齊全
WinEdt
入門級編輯器,CTex套裝自帶,功能齊全
跨平台支援受限,且存在過度封裝等情況,可配置性受限
VSCode
比較輕量化,且針對代碼編輯的優化到位,使用快捷
需要配置額外插件以及編譯方式,且實際使用起來并沒有上述幾個Latex專用工具流暢
Sublime Text
輕量化,啟動快,使用快捷
Latex相關插件支援付費,且比較需要進行手動配置
以上為個人的使用體驗,故筆者最終還是選擇了TexStudio作為跨平台的編輯器。
首先當然要從最簡單的一個開始講起來,先看下在linux上tex環境的配置。實際上真的特簡單,就一個指令完事
可能會運作比較長時間,畢竟這個包有3-4G之大。運作完後可以用以下的指令檢視環境是否配置妥當
在ubuntu16.04中,這樣安裝出來的版本是texlive-2015,雖然可能老了點,但是實測基本功能齊全,一般的使用完全沒有問題。
至此,texlive環境算是安裝完畢了。不過考慮到可能需要用到的編輯器,我們還是應該去安裝下,雖然也都是一條指令的事情:
可以根據自己的使用習慣決定安裝哪個,個人的話更喜歡使用texstudio。
實際上這部分操作也不算很複雜,甚至對于不那麼習慣使用指令行的人而言反而這樣更傻瓜一些。
首先,從清華大學鏡像源上下載下傳所需要的iso鏡像,并挂載到本地虛拟盤符上。而後進入盤内,運作<code>install-tl-windows.bat</code>批處理檔案(建議使用管理者權限,以便給全體使用者安裝)。然後就是等待安裝完畢,可能時間比較久(大概1小時不到一點)。安裝完畢後,可以用類似Linux的方式來檢測是否安裝成功,如果指令行不存在,則可以考慮找下可執行檔案并手動添加至環境變量中。
而關于編輯器的安裝,可以直接參考官方網站,均提供可執行安裝包:
TeXstudio
Texmaker (free cross-platform latex editor)
既然已經在linux等環境下準備指令行操作了,那Makefile這種的好東西自然必須提一嘴。這是我自己基于北航學位論文模闆上的Makefile,魔改後的一個版本
看上去似乎有些複雜,其實特别簡單,就幾個主要功能
此外,考慮到可能存在的調試情況,故可以直接調用<code>make xelatex</code>、<code>make bibtex</code>等。同時考慮到可能會有不基于xelatex的,或者順序不同的編譯過程,在這樣的情況下,可以參照<code>make xe_bi_xe_xe</code>的寫法進行擴充。
此腳本目前在ubuntu各個版本上實測運作正常,并在windows 10下的git bash中也運作正常(在win環境下,要想在<code>make edit</code>中國自動使用texstudio或者texmaker,需要額外配置一下環境變量),可以放心使用。
至此,我們看一下運作效果。首先咱們弄來IEEE的雙排tex模闆(這裡是傳送門),具體操作方式很簡單,打開模闆,建立線上項目,然後直接将建立好的線上項目打包下載下傳到本地然後解壓,在解壓完畢後,将上述Makefile添加進來,并添加一個<code>README.md</code>。目前的路徑結構應該如下
然後我們執行
後,結構如下
打開檔案<code>conference_041818.pdf</code>,看下效果

可以看到效果已經出來了。
此外,如果需要支援中文的話也十分簡單,隻需要在文檔開頭添加
即可直接在後文中使用中文,不需要任何額外配置,實測可用。
而考慮到部分小夥伴可能比較喜歡docker-based開發,是以在此筆者也進行了一定的踩坑。關于docker相關,我也分享一下經驗。
目前已經做了如下的探索:
選用ubuntu容器,建議選用國内版,或者自行更換鏡像源、時區以及預設系統編碼
在上面用<code>apt</code>指令安裝<code>texlive-full</code>
考慮到後續可能有自行安裝額外字型的需要,服還需要額外安裝<code>fc-cache</code>指令行
大概摘取了一部分,供參考
按照如下方式編譯并運作看看效果
以上是比較簡單的一種。值得注意的是:
實測,在ubuntu16.04鏡像上,安裝的版本是2015版,在18.04鏡像上是2017版,20.04鏡像上是2019版
如果對環境沒有特别敏感的需求的話,自行選用對應的ubuntu系統即可
當然,如果您比較依賴特殊環境,或者就是想在同一個系統下精準安裝自定義的版本,那麼大概需要自備iso并挂載安裝。iso的安裝方式可以參考下這篇文章:https://blog.csdn.net/engreal/article/details/80704755,寫于2018年内容應該還算比較新
在前面的章節中,已經解決了tex純指令行編譯的問題,也通過docker鏡像的建構實作了獨立環境的問題。
故在此基礎上,我們可以基于gitlab ci将推上倉庫的tex文檔進行自動建構,并将pdf推送到特定的地方。
這是筆者在近期寫的一篇綜述文中所使用的<code>.gitlab-ci.yml</code>檔案(關于gitlab runner等的一系列具體配置方法,此處不作詳細展開,感興趣的話可以讀一下gitlab ci的官方文檔:傳送門)
實際上,在github上也可以用類似的方式,而且思路基本一緻,隻不過是換上了travis等持續繼承系統而已。
以上就是近期在Latex上一次實戰的大概總結,實際上也根本沒啥東西,權當一個可有可無的記錄吧,不為别的,隻為等到哪天我這榆木腦袋把這些忘個精光後,再來看看時省點時間吧。總結啥的,也就這麼回事而已。
胡言亂語的話,實際上也沒啥好說的,真的沒啥畢竟。近期一系列的操作早就亂了套,自己就一泥菩薩也沒資格說啥,說啥都是蒼白的。硬要說的話,長點記性長點腦子,别一天到晚和牲口似的記吃不記打,好了傷疤忘了疼,不,那連牲口都比不上。失敗不可怕,隻要心中的旗子沒倒下,最起碼還能重來,但旗子倒了那就真的沒救了。他們都說,摧毀一個人,隻需要令他相信,然後将這份信念撕得粉碎。但是我一直覺得,隻有這樣,依然願意自個撿起來縫縫補補并像寶貝一樣收好走下去的信念,才算得上是信念,而不是一張打着信念的旗号被當做擋箭牌的廁紙。
算了,也不想那些有的沒的,想了也沒用你又不是上帝,更何況眼巴巴看着悲劇發生卻隻能眼巴巴看着無能為力,那才叫真的悲劇。别問,問就一句——“但将行好事,莫要問前程”。就醬,告辭。