使用 LaTeX 有什麼比較好的編寫技巧或習慣?

有沒有什麼比較實用的技巧和習慣,能極大的提高用 LaTeX 編寫數學論文的效率以及質量?


推薦一個我經常用的神器吧,識別手寫的symbol然後給出相應的Latex代碼並且給出需要include的package,識別的準確度很高。我寫Latex的時候必開的網頁。

Detexify LaTeX handwritten symbol recognition


我來說一個基本上我們都會用到的功能:製作表格。Latex對表格支持不是十分友好,每次做表格的時候都要手寫一大堆代碼,而且如果需要調格式,那就更麻煩了。

推薦這個在線製作Latex表格的網站神器!真正的所見即所得,支持代碼與表格之間的無縫轉換!更支持與Excel的複製粘貼,非常好用!地址在這裡:http://www.tablesgenerator.com

除去Latex之外,網站還支持Markdown,HTML等多種格式的表格生成。再也不用花時間做表格了!(當然,如果需要特別精細的調整,還是需要結合自己的需要靈活用LaTex代碼調整。這個工具只是輔助,但是基本上能解決很多的大問題的。)

(樓下有牛人願意寫Latex代碼做表格,你們厲害,我不行,我low)


技巧的話,我說幾點吧。

第一,使用雙排版的軟體,比如texmaker,這樣你可以左邊寫code,右邊出現pdf, 當然了,你用一個24寸的大屏幕更直接。對了,雙排版也不能馬上看成pdf,也得「生成」,只是你不需要在排版和pdf之間換來換去而去而已。

第二, 設置「自定義」命令: 利用自己明白的「短定義」替換「長命令」,比如,引入以下定義後, 原本需要使用hookrightarrow 來輸入hookrightarrow , 通過一開始的輸入defembed{hookrightarrow},我們在全文中只能用embed.

第三,這也是自定義,不過這個更厲害,定義完後本質上就是定義「函數」。比如我下面的


ewcomannd{Ker}[1]{mathcal{K}er(#1)}

是什麼意思,就是說,如果我在文章正文中輸入$Ker{A}$, 那麼出現的就是$mathcal{K}er(A)$ mathcal{K}er(A) .

第四,很多軟體有「自動補完」,比如你要輸入只需要輸入一半的命令,它會出現可能的命令。你可以通過簡單的選擇來完成命令。


如果你經常要畫交換圖,使用tikzcd的話,可以用 tikzcd-editor 90%的交換圖都可以由他作出來。

上面已經有人説了texstudio了,它最強的是他的自定義功能,舉幾例。

首先preference-&>shortcuts-&>editor-&>basic key mapping 找到next palceholder or one word right 的快捷鍵變為tab

點macro,edit macro

加一個新的macro

name is texbf, trigger is 『bf content is as below
extbf{%&}%&<%:persistent%&>

下面你輸入』bf,然後用tab就可以在%&和&<%:persistent%&>之間jump,&<%:persistent%&>作用是產生沒有長度的palceholder,按兩次回車到下一行。這個命令還有一種用法,先選擇你想要加黑的內容,然後輸入『tb,那麼此內容就會加黑,在idefix下有清除所有placeholder這個選項,你可以自定義shortcut。

再一例

name is tikz, trigger is 』tz content is as below
egin{tikzpicture}%&<%:persistent%&>
%&
end{tikzpicture}%&<%:persistent%&>

這個先在第一個&<%:persistent%&>會停一下,這是為了方便你輸入選項,若沒有選項要輸入,按tab,就到了%&處。

實際上這個macro功能很強,舉一個複雜例子

%SCRIPT
choisedialog = UniversalInputDialog(["Commit","Commit with Push"],"Git","choiseGIT")
choisedialog.setWindowTitle("Git")
choise = choisedialog.get("comment")
if (choisedialog.exec() != null) {
if (choisedialog.get("choiseGIT") == "Commit") {
dialog = new UniversalInputDialog()
dialog.setWindowTitle("Git commit / push")
dialog.add("Committed by TeXstudio", "Comment", "comment")
dialog.add(true, "Commit all Files","allfiles")
if (dialog.exec() != null) {
comment = dialog.get("comment")
if ((dialog.get("allfiles")) == true){
buildManager.runCommand("git commit -a -m "" + comment + """, editor.fileName())
}else{
buildManager.runCommand("git commit " + editor.fileName() + " -m "" + comment + """, editor.fileName())
}
}
} else
if (choisedialog.get("choiseGIT") == "Commit with Push") {
dialog = new UniversalInputDialog()
dialog.setWindowTitle("Git commit / push")
dialog.add("Committed by TeXstudio", "Comment", "comment")
dialog.add("master", "Branch", "branch")
dialog.add(true, "Commit all Files","allfiles")
if (dialog.exec() != null) {
comment = dialog.get("comment")
branch = dialog.get("branch")
if ((dialog.get("allfiles")) == true){
buildManager.runCommand("git commit -a -m "" + comment + """, editor.fileName())
}else{
buildManager.runCommand("git commit " + editor.fileName() + " -m "" + comment + """, editor.fileName())
}
buildManager.runCommand("git push origin "" + branch +""", editor.fileName())
}
}
}

這是在texstudio中用git。這個例子來自這裡TeXstudio - A LaTeX Editor


很多人都問了 xeCJK,可以參考《處理中文時應該用ctex宏包還是應該用xeCJK宏包》一貼。還有,我見過用 WinEdt 把字體調成 Times New Roman 的人。

想到哪寫到哪吧。

  1. 看了一圈,竟然沒有人提 Stackoverflow。只要遇到問題,Google 一下,後面加一個 site:http://stackoverflow.com,能解決你 99.999% 的疑問,還能順便把英文練好。
  2. 新手不要自己造輪子,你 99% 的需求都有宏包支持,你只需要找到是哪個宏包,並且看懂手冊就行了。
  3. 查找手冊可以在命令行里用 texdoc + 宏包名字,執行起來有點小慢,我喜歡在 Everything 里搜索宏包名字 + PDF。
  4. 要配合 Git 使用,那真是想刪哪就刪哪,大不了再退回來。而且,晚上回家前 push 到網上,回家可以繼續寫。多人合作一篇文章也不錯。
  5. 寫中文文檔一定要用 ctex 宏包,不要用 CJK 或者 xeCJK 宏包。
  6. tabu 比 tabular 好用太多,cleveref 提供的 cref 比默認的
    ef 好用太多。
  7. 關於 label 的命名,我建議 perfix:caption,perfix 就是前綴,比如 fig、tab、lst、eqn、等等,一看就知道這個 label 是什麼類型。前綴加 caption 的組合,可以很容易的找到需要引用的 label,而不用到處往回翻找。
  8. 數學公式,要規範,花點時間讀一下 ChinaTEX MathFAQ。
  9. 不要忽視 Warning,最好弄明白每個 Warning 是什麼意思,怎麼產生的,會對文檔造成什麼影響,如何消除。實在覺得 Warning 礙眼的話,可以用 silence 宏包屏蔽掉。
  10. 寫特別大的文檔,要將整個文檔分成若干部分,用 input 或者 include 加到主文件中。
  11. 論文實驗數據繪圖可以考慮用 pgfplots,實驗代碼只需要把結果保存成文本格式的數據就行。有兩點好處:第一,圖的風格與正文一致,強迫症福音;第二,修改實驗不需要改圖,只需要重新跑一下實驗,然後重新用 LaTeX 編譯一下就行了。
  12. 如果你是強迫症晚期的話,其他插圖可以考慮用 tikz 宏包完成。
  13. LaTeX 表格對新手不是特別友好,可以考慮用這個 https://www.tablesgenerator.com/。
  14. 說到表格,不管你用什麼編輯器,一定要用支持列模式的編輯器,一定要用等寬字體,千萬別用 Times New Roman 等非等寬字體的,畫表格想死。
  15. 最後推薦幾個我經常用的宏包吧。
    1. tcolorbox,簡直是黑魔法的存在;
    2. minted/listings,排版代碼需要他們;
    3. enumitem,列表環境想怎麼調就怎麼調;
    4. xparse,提供 NewDocumentCommand 等命令,方便定義形參複雜的命令。

不就是要攢個cookbook嘛?多的是。

  1. 針對於發行版的選擇。現在只推薦TeX Live。在Windows平台下雖然有MikTeX可以選擇,但是因為一些依賴的庫實現不一致,很容易出現不可在TeX Live復現的bug,所以一般還是使用TeX Live來進行編譯。
  2. 現在有一些在線版本的TeX環境可以使用。無一例外,都是使用TeX Live作為後端支持的。如果想要得到極為迅速的編譯速度和編輯體驗,是很難的。大致上和在手機上使用TeX的速度類似。這種東西,只能做應急用以及一些慢性子的人寫作用。有些東西還是要做比較實時的視覺檢查的,這種情況就最好在實體機上編譯。
  3. 所有的TeX都是慢。唯一的例外是我的TeX。我的TeX有私有版本,主要給一些公司替換MathJax用。其他的TeX之所以慢,是因為系統的I/O問題,在Windows上尤甚。我提供的私有版本都是在內存中操作宏包和文檔類的,所以快太多了。
  4. pdfTeX和CJK已經過時了。但是這種具有繁複操作的東西還是有不少人在用。所謂痛心疾首,肯定是有的,我們這些人科普這些年還是擋不住一些老頑固去用這些舊東西。有些老年人不想怎麼傷筋動骨的,那自然就讓他們去用。但是年輕人,才二三十歲就學不進去新東西了總是有些不妙。
  5. CCT也是過時的。和上例一樣。其實「過時」的意思就是「我們現在有了更好的實現方式和工具」。有了智能手機,尋呼機肯定就是過時的。CCT在歷史上的意義是很大的,但是,這個歷史大概也就停留在二十年前吧。現在求求你們不要再用了。
  6. 現在的主流是XeTeX和LuaTeX。我的ApTeX算是一直活著,但是我不知道有多少用戶。勉強可以把這三個放在一起去用吧。XeTeX除了速度慢之外沒什麼缺點。LuaTeX除了性能爛之外沒什麼缺點。ApTeX除了作者喜歡挖坑之外沒什麼缺點。
  7. TeX的默認輸出是DVI格式文件,但是現在基本上都是拿PDF格式做輸出了。大部分開源軟體使用的是poppler,少部分使用的是MuPDF,後者好用很多。但是如果使用了一些支持特殊PDF效果的宏包,那麼還是建議使用Adobe的軟體閱讀。至於Foxit么,該軟體自帶bug,好的PDF也能顯示錯了。
  8. 其他人也提到了,PDF和源文件互相跳轉的問題。實際上即使是DVI文件也可以和源文件互相跳轉。這背後實際上是使用到了SyncTeX技術。現在大部分編輯器都是支持的,直接用就好了。
  9. 現在可用的開源字體很多。在XeTeX和LuaTeX下面能夠極大程度地豐富LaTeX文檔的觀感。但是並沒有一個很完善的catalog做示例。TeX下面用字體,是沒有fallback機制的。好處是,不至於出現很多不可預見的排版效果。壞處是,很多人就像要TeX有CSS那樣的東西。一旦我們使用TeX去做多語種的文檔,就是要反覆去做字體的切換。
  10. 實際上,TeX圈子裡面是有個VF技術的。所謂的VF指的是虛擬字體。就是可以把多個字體拼合成一個。這種東西TeX並不需要知道。需要知道的是將DVI轉換為PS/PDF的程序。這個虛擬字體實際上是比較像CSS的字體fallback。
  11. 現在的所有TeX都不怎麼支持SVG插圖。但是SVG的處理很簡單。簡單點的,用Java庫或者ImageMagick轉換一下就可以。複雜一點的,可以使用librsvg自己生成可插圖的格式。
  12. 現在的TeX之中,我們是可以插入EPS圖。但是EPS格式,所有的DVI格式轉PDF的工具都直接地「插」。背後實際上都是將EPS文件轉換為了PDF文件的。可能你在當前文件夾下面並不一定能夠看到轉換後的PDF。但是事實就是,所有的EPS都是需要轉換為PDF。所以我一直建議是,如果最終輸出的格式為PDF,那麼中間所有的EPS圖都建議轉換為PDF之後插入,或者是直接導出為PDF格式,這樣能夠省下很多時間。
  13. 將EPS/PS文件轉化為PDF的軟體叫做GhostScript,TeX Live下面可能自帶。但是如果想要玩一些比較高端的EPS/PS操作的話,建議去仔細讀一讀GhostScript的手冊。GhostScript實際上還能夠解析閱讀PDF文件,想要做一些PDF操作也是可以的。但是前提是讀完手冊。
  14. 想要滿足快速寫文檔。那麼還是需要很好的記憶力。輔助工具固然多,但是好好看看 @劉海洋 的書還是很有必要的。論寫宏,除了劉海洋還有就是 @李清 ,我自己的水平是排不上號的。劉和李這麼多年的工作著實豐富了大家在中文相關的LaTeX的寫作上的體驗,請多感謝他們。
  15. LaTeX終究還是個工具,但是對待工具的時候要有個態度,用的時候就專心一點,不用的時候就當做一條死狗好了。所謂專心,大致上就是遇到相關問題的時候先google一下,找一找答案以及近似的答案,往往比直接問人有用得多。
  16. 當然,還是不能保證沒有粗心人。在用一些雜誌社以及出版社的模板的時候會出現一些小問題。這個時候,本著誰污染誰治理的原則,直接找負責的編輯不就好了?
  17. 現在想在TeX中畫圖,請使用TiKZ。其他的PSTricks等包,不建議再用了。TiKZ也慢,但是這個慢和上文提到的I/O也是有關係的。我以前的測試是,調整好I/O的,調TiKZ可能只會多花0.3s。
  18. (未完待續)

編輯器神器 TeXstudio,誰用誰知道,用過都說好。

經常寫TeX建議至少通讀一本TeX的書,可以節省很多調試的時間。

引文不應該直接插入正文,考慮用bibtex。引作者名字的格式要統一。

文章體量大的話用input分出來章節,模塊化管理還便於調試。

數學專業的學術寫作參考 Writing Scientific Documents Using LaTeX

punctuation(不知道中文比較恰當的翻譯是什麼)很重要 。什麼時候該用-,--和---都是學問。這一點ltxprimer這本書寫的非常不錯。讀讀Academic writing 之類的書,學術寫作是很繁瑣的一件事情。舉例如下

  1. 在不希望分割的片語之間加~,例如 some words blah blah~cite{citation} (引文不應該出現在行首),或者 Michael Jackson~et~al. (et al是不應該分開的)
  2. 微分是mathrm{d} (What"s the proper way to typeset a differential operator?)
  3. 更多的例子 TeX - LaTeX Stack Exchange

編譯太慢的話可以考慮是不是要清字體緩存。

PDF預覽炸了的話可以看看是不是synctex出問題了……(此條供有緣人參考)

texdoc is awesome! :)


DeclareMathOperator{ ao}{ au}
DeclareMathOperator{ita}{eta}

直到被發現了之後被老闆笑了半天。。。

尷尬程度堪比上次老闆讓我輸入xxx空格xxx,結果我輸了一個【xxxspacexxx】。。


個人來說,最大的技巧就是給@李阿玲催更,讓他把正式版做出來。

說實話我用過這個鬼的試用版之後覺得哪個編譯器都慢的要死。

當然接下來就是自定義了。這個沒啥好說的,大家都知道。


對於WinEdt的使用者有一個「奇淫技巧」——正/反向搜索。winedt的這個功能對經常要寫論文的人來說太方便。。

比如說像這樣的一個Tex代碼,

用PDFTexify編譯出來是這樣的,

但是由於Tex的代碼y通常比較長,經常容易出錯,偶爾會出現編譯的PDF結果和預期不一樣,需要按照對應的pdf返回源代碼去改代碼,如果直接按照記憶去一行一行找錯,就太費時間,也比較傷害眼睛。這時只需使用winedt的反向搜索功能即可輕鬆搞定!

直接在SumatraPDF上面相應位置雙擊,即可立即返回對應的tex源代碼中,然後進行修改,簡單方便。

這是Sumatra的反向搜索功能,如果想在源代碼中查找某一代碼編譯出來的PDF的效果,可以直接在winedt中將游標放在相應的代碼處,

然後點擊工具欄上面的PDF Search 按鈕,即可找到對應生成的pdf。。。

非常方便,這樣就避免了在用tex編碼寫論文的時候,一行一行找代碼,該錯誤的囧狀,值得一試。。。


橫屏編輯,豎屏顯示


最大的技巧是自定義命令函數,自定義比如短正合序列的格式,某些術語改個名字自動花體字之類

然而……最後你自定義到根本不像latex的時候,就會像我一樣————直接用pylatex

JelteF/PyLaTeX

說到底,如果你既想靈活排版又想隨時能套用模板,那你就不該用tex,而應該用編程語言,比如python,用軟體工程來代碼復用,降低模塊間的耦合度,還能少打字。


去arxiv上直接下現有論文的latex

LaTeX實戰經驗:如何利用arxiv學習LaTeX - CSDN博客


latexmk的-pvc (auto-compile)模式 。

每次相關文件更新,比如在editor里保存文檔或者文件夾里更新圖片,都會後台自動編譯更新pdf文件。配合能夠自動刷新的sumatra pdf/skim,省卻等待編譯的無數個1s。

(我之前用過TeXStudio和Sublime的LaTeXTool/LaTeXing,編譯的時候程序的焦點都會離開編輯區,打斷寫作。)

Stackoverflow上的一個小教程:Don"t make me manually abort a LaTeX compile when there"s an error


0,在線LaTex協作編譯器 -- 合作者的利器

初級功能免費,高級功能(例如附件個數超過「50」)則需要付費。

優點是支持多人同時編輯文檔,因此是國際合作者共同編輯論文的利器。

特別是deadline之前,往往沒有很多時間收發郵件溝通。

它長這樣:

1,好用的LaTex軟體

這裡推薦一個實時預覽的軟體,再也不用狂敲pdflatex了 -- Gummi,Linux完美運行,不知有沒有windows版本。

大概是長這樣的:

2,自定義一些命令

例如: defR{mathbb{R}}

這樣你敲$R$ 就等價於 敲 $mathbb{R}$了。

P.S.: 別問我$$是幹什麼的,是時候入坑了。

3,.bib 文檔

把所有citation都放在一個叫research.bib的文檔里,然後代碼的最後加上以下倆行:

ibliographystyle{unsrt}

ibliography{research}

bib文檔中一個引用是長這樣的:

@ARTICLE{potts,
author = {{Potts}, R.~B. and {Domb}, C.},
title = {Some generalized order-disorder transformations},
journal = {Proceedings of the Cambridge Philosophical Society},
year = 1952,
volume = 48,
pages = {106--109},
}

這樣的好處是,容易管理citation,方便重複利用。

4,數學公式對齊

我經常用的是{align},這裡我貼一段代碼,以及它的output,大家有興趣可以copy paste一下。

egin{align}
ext{min};; sumoptlimits_{i=1}^m sumoptlimits_{j=1}^n | w_{i,j} - y_{i,j} | +lambdasumoptlimits_{ein E} x_e label{model2}\
|w_{i,j+1}-w_{i,j}| leq Mx_{e^r_{ij}}, ;; i in [m],; jin[n-1], ag{
ef{model2}a}\
|w_{i+1,j}-w_{i,j}| leq M x_{e^c_{ij}}, ;; jin[n],; iin [m-1], ag{
ef{model2}b}\
w_{i,j} in R, ;; i in [m],; jin[n], ag{
ef{model2}c}\
x_e in {0,1}, ;;ein E ag{
ef{model2}d}.
end{align}

可以看到,代碼中的「」是用來對齊的。

5,公式標號

還是上圖,可以看到公式的標號為(4),以及(4a)..(4d)。

這樣可以防止下標「溢出」,同時個人感覺也較為美觀。

代碼在上面,trick在於 ag{..a}。

6,32寸超寬屏+24寸豎屏

在此鳴謝老闆,才有了目前的工作環境:


如果大家覺得有用,我會持續更新。

12.12更新:

0,overleaf

6,屏幕

畢竟德國的Ph.D. thesis是項超大工程。

P.S.:因為出國較早,想了解下目前國內碩士、博士thesis用word還是latex?

是thesis不是paper哈~


latexmk + vim


如果是 vim + Ultisnips 的話,我一般不會在頭文件定義長命令,而是採取 snippets 的方法;因為 Ultisnips 支持 regex match 和 python,所以可以實現一些比較簡潔的操作

比如

SI9.8ms-2&

直接成了

SI{9.8}{ms^{-2}}

我的包放在了 zhujinxuan/snippets-tex-equations


雖然感覺有點不對題了,但是使用合適的工具也是提高寫paper效率的一種途徑,所以我來安利一波shareLatex:

  1. Collaborative writing: 合作寫paper,你一段我一段,效率杠杠的(寫出來上下文能不能銜接上又是另外一回事了......)
  2. Review History: 方便添加註釋和追蹤修改記錄,類似於word中的track changes;同時shareLatex會定期將修改後的LaTeX文件保存為一個歷史版本,並且記錄這個版本內的修改情況

從圖上可以看到,我選中的某一個歷史版本內經歷了7次修改,修改部分被高亮出來了,紅框內的按鈕的功能是回滾,可以將本次版本的修改全部還原。

3. Chat: 支持數學符號輸入,支持數學符號輸入,支持數學符號輸入!!! 合作寫paper(尤其是異地合作)的時候溝通必不可少, 數學記號可以完美地出現在聊天對話框裡面,終於不用再忍受微信里滿屏的H_t, v in mathbb{R}^n, W dot x.....

4. Spell-check Auto-close Brackets: 避免一些低級錯誤,還是挺有用的~

5. Auto-complete:當你需要頻繁用到 Longleftrightarrow 之類的又臭又長的指令時,你就會發現這個功能有多麼重要

6. Online Editor:裝LaTeX編譯器?配環境?安裝各種各樣的package? 這些對於shareLatex都是不存在的, just copy and paste from LaTeX stackexchange~~

除了上面這些優點,我自己在用的過程中還發現了一些小的加分項

比如 @王晉東不在家 提到的做表格的時候需要手寫很多代碼,而shareLatex的自動補全功能可以支持table的模板生成:

當我選擇egin{table}...作為補全項之後,會產生如下的代碼:

egin{table}[]
centering
egin{tabular}{c|c}
\

end{tabular}
caption{Caption}
label{tab:my_label}
end{table}

label, caption, abular部分都自動生成了,剩下的就是設置一下column,然後往裡面填數據,可以省去不少時間~

@Devinlee 提到了錯誤定位的問題,shareLatex也給出了類似的解決方案:

(a) 雙擊pdf的某個地方,游標會移動到對應的LaTex源代碼的位置

(b) 雙向定位: pdf-&>code code-&>pdf

要注意的是這兩個可愛的小箭頭要在split screen模式下才有,我找了很久才發現 哈哈

上個月跟師兄合寫paper的時候才開始用的shareLaTeX, 關於它的特性暫時就只了解到這麼多,歡迎各位路過的大神補充其他更好用的功能~~

另外,shareLaTeX的官網上還有很多待挖掘的學習資源 https://www.sharelatex.com/learn/

前段時間在準備一個會議的presentation的時候, @李丕績 老哥給我安利了 Beamer, 用了之後感覺:卧槽,原來幻燈片還可以用latex來做?? 卧槽,這提供的模板也太好看了吧!! 卧槽,以後PowerPoint只能用來畫圖了。。。

-------------------------------------------------------------------

寫完答案以後發現 @楊起帆 @lianxue 安利了overleaf,這也是一個很流行的線上latex編輯的工具

而且shareLaTeX的開發團隊已經加入了overleaf,所以理論上shareLaTeX的特性overleaf都能夠支持 (待考證)


如果你將來長期使用 TeX,可以在看到比較漂亮的文檔模版時,研究一下,分離出一個最簡可用的部分,將來寫文檔/簡歷/書的時候使用。


用Lyx寫長公式或者表格,然後打開Source pane, 把tex code複製到Latex裡面去


推薦閱讀:

為什麼用 LaTeX 排出來的文檔普遍看上去比較美觀?
LaTeX 在你導師那一代人之中的流行程度如何?
LaTeX 相對於 Word 有什麼優勢?
有哪些好的 LaTeX 編輯器?

TAG:排版 | 數學 | 科研 | LaTeX | 論文 |