之前,我們介紹了一位神奇的本科生,他在數學課上用Vim+LaTeX,全程手打出1700頁課堂筆記,速度直追老師的板書。
現在,這位Gilles小哥又開課了,上次他只教了大家手打公式的方法,這次他展示了數學筆記裡的畫圖技巧。
他用到的神器是Inkscape+LaTeX,再加上自定義的快捷鍵,一個Ctrl+F,直接完成原來的六個步驟。
讓你在電腦上畫圖也能追得上老師。
無論是複分析、微分幾何、電動力學,還是小哥目前正在準備的橢圓曲線畢業論文,都能用這些神器輕鬆搞定。
為何選擇Inkscape
小哥說,其實不用圖形軟體,他也能畫圖。
給LaTeX文檔添加圖形可以用TikZ。用TikZ繪製一個向量A的圖形只需要5行代碼:
\begin{tikzpicture}\coordinate (A) at (1, 3);\draw[thick, ->] (0, 0) — (A);\node[above right] at (A) };\end{tikzpicture}
運行以上代碼就畫出矢量A的圖形。(注,A應等於(1,3) ,原文錯誤。)
TikZ優點是繪製圖形只需要寫代碼。但是它的缺點也在於此,因為是代碼所以無法實時看到圖像,運行代碼的速度也會比較慢。
因此,用一個能實時繪圖的軟體Inkscape比TikZ方便很多。
Inkscape是一個開源的矢量圖形編輯器,Linux、Windows、Mac平臺都可以使用。雖然比Adobe Illustrator功能少,但是勝在免費。圖形軟體Inkscape與LaTeX代碼並不衝突,Inkscape仍具有LaTeX的排版功能。
下面開始介紹如何把Inkscape和LaTeX兩件武器結合起來。
給LaTeX文檔加上圖形
Inkscape可以選擇使用LaTeX渲染圖形中的文本,只需在保存時把圖形導出為pdf和LaTeX文件。
其中,pdf文檔包含剝離了文字的圖形,LaTeX文件則包含了將文字放在正確位置所需的代碼。
如果我們要在LaTeX中插入下面這張圖:
需要轉到「文件」→「另存為」,選擇pdf作為擴展名。然後點擊保存,會彈出以下對話框:
選擇「Omit text in PDF and create LaTeX file」(在pdf中省略文本並創建LaTeX文件),將圖形保存為pdf+LaTeX。
假設生成的文件都存儲在figures文件夾下,最後生成的目錄應該像這樣:
figures/figure1.pdf_tex figure1.svg figure1.pdf
要在LaTeX文檔中插入Inkscape圖形,只要在開頭加入以下代碼:
\usepackage{import}\usepackage{xifthen}\usepackage{pdfpages}\usepackage{transparent}\newcommand{\incfig}[1]{%\def\svgwidth{\columnwidth}\import{./figures/}{#1.pdf_tex}}
假設圖形的路徑是figures/riemmans-theorem.svg,輸入以下代碼將圖片插入文檔中:
\begin{figure}[ht]\centering\incfig{riemmans-theorem}\caption{Riemmans theorem}\label{fig:riemmans-theorem}\end{figure}
編譯上面的文檔,就獲得插入圖形的LaTeX排版結果:
上面的圖形文本由LaTeX渲染,可以根據需求更改字體,圖形也會相應地更新:
也就是說用Inkscape繪製的圖形,仍然保留的LaTeX的排版功能
快速創建包含圖形的LaTeX文檔
上面的步驟顯然過於繁瑣,如果在做課堂筆記的時候,急急忙忙打開Inkscape,搜索目錄在插入圖形,肯定是跟不上節奏的。
要知道Gilles小哥可是能同步跟上老師板書的大神,所以他還有「快捷方式」的秘技。
Gilles用一個自定義的Ctrl+F快捷鍵,把上面的步驟簡化為一鍵搞定。
Ctrl+F背後的腳本應該滿足下面六個要求:
1、根據LaTeX文件的位置查找圖形目錄;
2、然後檢查是否存在具有相同名稱的圖形(與pdf_tex文件同名的svg文件);
3、如果沒有同名文件,圖形模板將被複製到圖形目錄下;
4、將包含圖形標題的當前行替換為插入圖形的LaTeX代碼;
5、在Inkscape中打開新圖;
6、設置文件觀察器,每當通過按下Ctrl+S將圖形保存為svg文件時,也自動保存為pdf+LaTeX,讓之前的保存對話框不再彈出。
Gilles已經給出了在VimTeX中的設置:
inoremap <C-f> <Esc>: silent exec '.!inkscape-figures create "'.getline('.').'" "'.b:vimtex.root.'/figures/"'<CR><CR>:w<CR>nnoremap <C-f> : silent exec '!inkscape-figures edit "'.b:vimtex.root.'/figures/" > /dev/null 2>&1 &'<CR><CR>:redraw!<CR>
下面感受一下實際效果:
按下Ctrl+F,LaTeX開頭插入圖形的代碼部分自動完成。
如果想編輯一個圖形,可以按下Ctrl+F打開一個選擇對話框,搜索當前文檔中的圖形。選擇其中一個後,它會顯示Inkscape中的圖形。保存圖形時,會將插入圖形的代碼複製到剪貼板。
這些快捷方式使得添加和打開圖形變得輕而易舉,不必記每次手動將圖形保存為pdf+LaTeX格式。具體的腳本可以去GitHub項目頁下載,地址附在文末。
繪製圖形
小哥說,在大多數情況下,用Inkscape來繪製圖形,要比使用TikZ要快得多。
但是與手工繪製相比,還是要慢很多,就算用上Inkscape內置的快捷方式能夠加快速度,但也很難達到目標。
因此,小哥用Python編寫了一個定製的快捷方式管理器,來完全控制每個按鍵的「解釋」方式。
他說,這給自己畫圖帶來了很大的靈活性。
繪製形狀
從Inkscape內置的鍵盤快捷鍵開始說起。比如說,按下R,可以激活矩形繪製工具,E可以用來繪製橢圓等等。
就實現而言,這意味著快捷方式管理器會「重播」這些「鍵盤事件」,也就是說,將它們傳遞到Inkscape中,然後執行命令。
在小哥的設定中,用W和F替代了Inkscape默認的鉛筆快捷鍵和曲線工具的快捷鍵P和B。
他說,在自己右手使用滑鼠的時候,使用這些快捷鍵的會更舒服、更順手一些。
基於用左手按快捷鍵的思路,他還將Z鍵設定為「取消」,Shift+Z設定為「刪除」,X設定為很難按到的%等等。
組合鍵與常用樣式
設定繪圖樣式, 是小哥使用Inkscape做的第二件事。他用來繪圖樣式很簡單:
形狀,比如矩形或者圓形,多為黑色、淺灰色、白色或透明的,在操作的時候,可以選擇輪廓的線條。線條(包括輪廓)大多是實線、點線或虛線。它們有些非常寬,有些也帶著箭頭。整體如下圖所示:
這些繪圖的樣式是小哥經常用到的,他希望能夠快速調用起來。但是,使用Inkscape的快捷方式太麻煩了,需要很長的時間。比如,將下面的圓和方框的樣式從黑色實邊轉換成灰色虛邊:
你需要按下Ctrl+Shift+F打開樣式面板,然後通過滑鼠點擊相應的按鈕,來改變每個對象的樣式。而且,在Inkscape的快捷方式設定中,根本無法通過鍵盤做到這一點。
小哥認為,這太討人嫌了。理想情況下,完成這一操作應該只需要幾分之一秒。
這就是組合鍵發揮作用的地方。一個組合鍵就是一個快捷方式,有兩個或多個按鍵組成。
比如,小哥同時按下S和F的時候,他的快捷方式管理器,就會對選定的對象使用實線筆畫並進行灰色填充。想要筆劃變粗?同時按下S+F+G就行了。
在這樣的設定下,每個樣式屬性,都對應一個按鍵:S代表正常筆劃,F代表灰色填充,G代表加粗,A代表加粗,D代表點線等等。
這些表格中的某些樣式只響應一個鍵,比如左上角的樣式:F代表只填充灰色而不改變筆劃。這可能帶來快捷鍵衝突的問題。
比如按F也是用來調用曲線工具的快捷鍵。解決方式是空格+F,用空格來充當一個佔位符。
使用這些組合鍵,之前的問題可以通過按幾個鍵來解決了:
F+S,能夠使矩形變成灰色,並應用實線邊框。
F+H+E代表填充灰色和使用非常粗的虛線。
A+G+D則是增加箭頭,並應用點線樣式。
添加文本
繪圖的另一個重要部分是添加文本。圖形中通常會包含數學公式,小哥就想著能夠使用自己在Vim裡面設定好的「代碼片段」。
為了實現這一點,他設定按T來打開一個小的Vim窗口,在這裡可以輸入LaTeX代碼。在退出的時候,可以在Inkscape中插入一個文本節點:
正如上文所述,在文檔中插如圖時,可以用LaTeX來輸入文本。如果想要立即插入文本怎麼辦?小哥說,可以用Shift+T來做到這一點:
這兩種選擇各有優缺點。小哥主要選擇第一種方法, 因為文本是由LaTeX文檔呈現的。
這意味著字體將始終匹配,並且可以使用文檔中定義的宏。然而,一個缺點是文本的定位有時有點困難。
由於在Inkscape上很難看到最終結果,有時需要從Inkscape跳轉到PDF閱讀器上看結果,然後再回來微調。
保存和較少使用的樣式
雖然組合鍵能夠滿足90%的使用需求。但小哥有時候還想玩點新花樣:使用自定義的樣式。
比如繪製光學領域的圖形,就需要一個玻璃和射線的樣式了。想要實現這一點,首先要在Inkscape 使用默認的快捷方式創建樣式:
選擇其中的一個對象,然後按下Shift+S就可以保存這些樣式了。然後鍵入新樣式的名稱,比如「glass」,然後按回車鍵確認,之後就可以使用它了。
之後,只需要選擇一個對象,按下S,並鍵入「glass」,就可以將相應的樣式應用到這一對象上。而且,也沒必要輸入全名,如果「g」沒有其快捷鍵,只需要輸入「g」就行了,如果有,可以輸入「gl」或者「gla」。
添加和保存對象
在小哥的設置中,最後一個部分是添加和保存對象。他說,自己可以用A來添加,然後用Shift+A來保存。例如,按A並輸入「ec」,會添加一個橢圓曲線:
另一個例子是,按A並輸入「dg」,會添加一個「鍵孔」,也可以使用「Ctrl+-」從給定的形狀對其進行細分:
此外,還有一些圖像涉及到2D和3D軸圖像,在複分析以及微分幾何中,會經常用到。