選自 castel.dev

  作者:Gilles Castel

  機器之心編譯

  一般你是用手寫還是 MarkDown 做數學筆記?在這篇文章中,作者介紹瞭如何用 LaTex 和 Vim 實時做數學筆記,通過一系列炫酷的技巧,不論是表達式板書還是圖像繪製,我們都能實時跟得上。

  在

  機器學習

  的學習過程中,很多時候都需要手動推導目標函數或最優化過程。這些推導很可能是老師在黑板上一邊寫一邊解釋,有時候我們會仔細聽解釋,並顧不上記筆記與註解。因此課程音頻與視頻就很重要了。但如果我們能跟得上老師的手寫速度,那麼以後回憶這些筆記就方便很多。

  例如在最近結課的 CS224n 2019 中,Christopher Manning 在第一節課就手動推 Word2Vec 的最優化與權重更新過程。由此可見,飛一般地記數學筆記還是很有必要的。

  圖片截圖來自 CS224n 2019

  在這篇文章中,作者在攻讀數學專業學士學位的第二個學期開始用 LaTex 做課堂筆記,自此以後一直在使用,總共記下了 1700 多頁的筆記。以下是一些例子,你可以看看用 LaTex 做出筆記是什麼樣子的。

  這些包括圖表在內的筆記,都是在上課期間完成的,之後沒有修訂過。爲了使 LaTex 做筆記可行,作者在頭腦中設下以下四個目標:

  利用 LaTex 記文本和數學公式應與講師在黑板上寫字的速度保持一致:不允許延誤。

  畫圖的速度應儘量與講師保持一致。

  做筆記,如添加註解、編輯所有註解、整合最後兩堂課的內容、搜索註解等,應方便快捷。

  當我們想在 pdf 文件旁邊添加註釋時,利用 LaTex 應能夠實現這一目的。

  以下從 Vim+LaTex 到 Snip pets,作者介紹瞭如何科學地記數學筆記。

  Vim 和 LaTex

  我使用 Vim 在 LaTex 中記文本和數學公式。Vim 是一個功能強大的通用文本編輯器,可擴展性很強。我使用 Vim 寫代碼、LaTex、mark down 等一切基於文本的東西。Vim 具有一個非常陡峭的學習曲線,一旦你弄清楚了基本原理,則很難再使用那些缺少 Vim 快捷鍵綁定的編輯器。以下是我編輯 LaTex 時屏幕的樣子:

  左邊是 Vim,右邊是我的 pdf 查看器 Zathura(也有類似於 Vim 的快捷鍵綁定)。我正使用帶有 bspwm 的 Ubuntu 作爲自己的窗口管理器。我在 Vim 使用的 LaTex 插件是 vimtex。該插件提供句法高亮顯示、內容圖表以及 synctex 等。使用 vim 插件的設置如下所示:

  最後兩行的設置隱藏屬性。這是一個特徵,當你的光標不在那一行時,LaTex 代碼會被替代或隱藏。通過隱藏 \[、\] 和$等標誌符,你可以更舒服地瀏覽文件。這一特徵也以∩替代\bigcap,以∈替代\in 等。以下動畫應能夠使這一過程更清楚。

  這篇博客要解決的核心問題是:用 LaTex 做筆記如何與講師在黑板上寫字的速度保持一致。這都要歸功於 snippet。

  Snippets

  一個 snippet 是一段可重複使用的短文本,可用來編輯其他文本。例如,當我鍵入 sign 並按下 Tab 時,單詞 sign 將會補全爲一個自定義的簽名。

  Snippet 也可以是動態的:當我鍵入 today 並按下 Tab 時,單詞 today 將會被當前日期替代;鍵入 box Tab 變成一個可以自動增大的框。

  你甚至可以在另一個 snippet 中使用 snippet。

  利用 UltiSnip 創建 Snippet

  我使用插件 UltiSnip 來管理我的 snippet,其設置如下:

  定義 sign 的 snippet 的代碼如下所示:

  對於動態 snippet,你可以在倒引號``之間輸入代碼,並在 snippet 擴展時運行。我在這裏使用 bash 編譯器格式化當前日期:date + %F。

  你也可以在`!p ... `塊內部使用 Python。你可以看一下定義 box 的 snippet 代碼:

  這些 Python 代碼塊將會被變量 snip.rv 的值替代。在這些代碼塊內部,你可以訪問 snippet 的當前狀態,如 t[1] 包含第一個製表位,fn 表示當前文檔名稱。

  LaTeX snippet

  藉助於 snippet,利用 LaTeX 做筆記要比手寫快得多。一些複雜的 snippet 可以爲你節省大量時間並消除做筆記的挫敗感。讓我們開始瞭解一些簡單的 snippet。

  環境

  爲了嵌入環境,我必須在一行開端鍵入 beg。之後我鍵入環境名稱,後者會直接在\end{} 指令中映出。按下 Tab 使光標位於新創建的環境中。

  該 snippet 的代碼如下所示:

  b 意味着該 snippet 將只能在一行開端擴展,並且 A 代表自動擴展,這意味着我不需要鍵入 Tab 就可以擴展 snippet。製表位--即可以通過按下 Tab 和 Shift+Tab 跳轉到的地方--以$1、$2 等表示,同時最後一個爲$0。

  inline math 和 display math

  我最常使用的兩個 snippet 是 mk 和 dm。這些 snippet 負責數學代碼的開始。第一個是 inline math snippet,第二個是 display math snippet。

  in line math snippet 是「智能的」:它知道何時在$符號後嵌入一個位置。當我在結尾$的正後方開始鍵入一個單詞時,它添加一個位置。但是,當我鍵入一個非單詞字符時,它不添加一個位置,例如下圖的$p$-value。

  該 snippet 的代碼如下所示:

  第一行結尾處的 w 意味着該 snippet 將在詞邊界擴展,所以舉例而言,hellomk 不會擴展,而 hello mk 會擴展。

  diaplay math snippet 更簡單,但同時也相當方便;該 snippet 使我在一段時間內不會忘記結束方程式。

  上下標

  另一個有用的 snippet 主要針對下標,該 snippet 自動將 a1 更改爲 a_1 以及 a_12 更改爲 a_。

  該 snippet 代碼使用正則表達式作爲觸發器。當你在 [A-Za-z]\d 編碼的數字後面鍵入一個字符,或者在 _以及兩個數字 [A-Za-z]_\d\d 後面鍵入一個字符時,觸發器會擴展該 snippet。

  當你在使用圓括弧包裝部分正則表達式時,如 (\d\d),你可以通過 Python 中的 match.group(i) 在擴展 snippet 中使用它們。

  對於上標而言,我使用 td 自動擴展爲 ^{} 的。但是,對於平方、立方、以及一小部分其他常見上標,我使用 sr、cb、comp 等專門的 snippet。

  分數

  用於分數的 snippet 是我使用最方便的自動擴展方法之一,它可以進行以下擴展:

  第一個的代碼非常簡單:

  第二和第三個例子使用正則表達式匹配 3/、4ac、 6\pi^2/、a_2/等表達式。

  如你所見,正則表達式可能非常複雜,這裏有個圖表可以解釋:

  在第四、第五個例子中,它試圖找到匹配圓括弧。由於不能使用 Ul tiSnips 的正則表達式引擎,我轉向了 Python:

  最後一個與分數有關的 snippet 即使用你的選擇來製作分數。你可以先用它選擇一些文本,然後按下 Tab,打出/,然後再按下 Tab。

  這些代碼用到了 $ 變量表示你的選擇。

  sympy 和 Math e mat i ca

  另一個很酷但不太常用的 snippet 是利用 sympy 評估數學表達式。例如,sympy Tab 鍵擴展爲 sympy | sympy,sympy 1 + 1 sympy Tab 鍵擴展爲 2。

  Math e mat i ca 用戶也可以進行類似的操作:

  後綴 snippet

  值得分享的還有後綴 snippet,如 phat \hat,zbar \overline 等。一個類似的 snippet 是後綴向量,如 v \vec。這些 snippet 真的非常節省時間,因爲你可以藉此跟上老師板書的節奏。

  注意,我還是可以用 bar 和 hat 前綴,我以較低的優先級將它們添了進去。那些 snippet 的代碼如下:

  其他 snippet

  我還有 100 多個其他常用的 snippet,其中多數非常簡單。例如,!>變成 \mapsto,->變成\to 等。

  下載地址:https://castel.dev/tex-e0c2e8b64036f77db00411d562750c12.snippets

  上下文管理

  寫這些 snip pet 的時候需要考慮:這些 snippet 和普通文本有衝突嗎?例如,我的詞典裏有大約 72 個英文單詞、2000 個包含 sr 的荷蘭語單詞,也就是說,如果我打出 disregard,sr 就會變成^2,我會得到 di^2egard。

  解決方案是在 snippet 中加入一個上下文管理文(Con text)管理方法。使用 Vim 的句法高亮,就可以根據你是在寫數學還是文本來決定 Ul tiSnips 是否應該擴展 snippet。我的想法如下:

  現在你可以將 context "math()"添加到你只想在數學上下文中擴展的 snippet 了。

  注意,「數學上下文」這個說法也很微妙。有時候你通過使用\text{...} 將一些文本添加到數學環境中。在那種情況下,你不想讓 snip pet 擴展。然而,在\[ \text{$...$} \] 中,你又需要擴展。所以「數學上下文」這個說法有點不好界定,如下圖所示:

  實時糾正拼寫錯誤

  儘管學習數學是我做筆記的一個重要部分,但大部分時間我都在打英語單詞。我的打字技術還不錯,每分鐘 80 詞左右,但我還是會時不時地出錯。所以我在 Vim 上添加了快捷鍵綁定,糾正拼寫錯誤,以免打斷我的工作流程。我按下 Ctrl+L 鍵就可以糾正之前的拼寫錯誤,就像這樣:

  我的拼寫檢查設置如下:

  它跳轉到之前的拼寫錯誤 [s,然後選取第一個建議 1z=,接下來跳回 `]a。中間的u 使得快速糾正拼寫錯誤成爲可能。

  結論

  使用 Vim 中的 snip pet 使得書寫 LaTeX 不再那麼頭疼,反而成爲一種享受。與實時拼寫檢查結合之後,記數學筆記變得非常舒服。後續博文將討論數字繪圖及將圖嵌入 LaTex 文本等內容。雖然前期學習成本會有一些,但熟悉後板書推導就能飛一般地記載。

  本文爲機器之心編譯,轉載請聯繫本公衆號獲得授權。

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

相關文章