乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      1700頁數(shù)學(xué)筆記火了!全程敲代碼,速度飛快易搜索,硬核小哥教你上手LaTeX Vim

       長沙7喜 2019-03-22
      又出現(xiàn)一位“神仙”本科生!

      數(shù)學(xué)課上,全程鍵盤手打1700頁筆記。

      速度緊追老師板書,公式、圖形一個不落。

      效果?請看下圖:

      不僅排版媲美教科書,而且還能夠批注,檢索關(guān)鍵詞……

      筆記被他Po到網(wǎng)上之后,便引來大量圍觀。

      不到一天,相關(guān)推文就已經(jīng)有2000多贊,Hacker News論壇上蓋了200多樓。

      甚至有網(wǎng)友評論稱:“你就是我們需要的英雄!”

      他是怎么做到的呢?秘密武器就是:LaTeX+Vim!

      這位來自歐洲的小哥非常強(qiáng)烈安利Vim文本編輯器,他說:

      用LaTeX寫數(shù)學(xué)公式,我選Vim編輯器。它強(qiáng)大、通用、可擴(kuò)展性很強(qiáng)。只要是基于文本的任務(wù)我都用它,寫代碼、編輯LaTeX、寫markdown都是。

      雖然入門階段的學(xué)習(xí)曲線超級陡峭,但只要掌握了基本的操作方式,就會欲罷不能。

      下面就讓我們看一下他完成這一壯舉的具體流程,文中提到的工具下載地址,我們都附在了最后。

      快速上手教程

      我們先看看小哥的工作環(huán)境配置。

      他用Vim編輯LaTeX的場景,就像下面這樣:

      左邊是Vim,右邊是pdf閱讀器Zathura,它也有類似Vim的快捷鍵。

      小哥用的操作系統(tǒng)是Ubuntu,使用bspwm作為窗口管理器。在Vim中,使用的LaTex插件是vimtex,它有語法高亮顯示、目錄視圖、同步對象等功能。

      然后,使用vim-plug做如下配置:

      Plug 'lervag/vimtex'
      let g:tex_flavor='latex'
      let g:vimtex_view_method='zathura'
      let g:vimtex_quickfix_mode=0
      set conceallevel=1
      let g:tex_conceal='abdmg'

      最后兩行控制的是“隱藏”功能。開啟了這個功能,除了你光標(biāo)所在的那一行之外,文本里夾雜的LaTeX代碼就都會隱藏或者替換成其他符號。

      比如說在下面動圖里,隱藏了[,],$之后,沒有了它們的干擾,整個文檔就更易讀。這個功能還會用∩替代\bigcap,∈替代\in等等。

      設(shè)置完成,接下來就到了整個教程的精華所在:

      用LaTeX記筆記,怎么才能像老師寫板書一樣快?

      這就是片段(snippets)發(fā)揮作用地方了。

      片段

      片段是什么?

      片段是一小段可復(fù)用的文本,由其他文本觸發(fā)。

      例如,輸入sign,再按下Tab鍵,這個單詞就會自動擴(kuò)展為一段簽名:

      片段也可以是動態(tài)的:輸入today并按下Tab鍵,它就會變成當(dāng)前的日期。

      而輸入box按Tab,就會出現(xiàn)一個框,還會隨著輸入文字自動變大。

      片段,甚至可以嵌套在另一個片段里用:

      怎么創(chuàng)建片段?使用UltiSnips

      管理片段的插件UltiSnips,小哥是這樣配置的:

      Plug 'sirver/ultisnips'
      let g:UltiSnipsExpandTrigger = '<tab>'
      let g:UltiSnipsJumpForwardTrigger = '<tab>'
      let g:UltiSnipsJumpBackwardTrigger = '<s-tab>'

      關(guān)于sign片段的代碼如下:

      snippet sign 'Signature'
      Yours sincerely,

      Gilles Castel
      endsnippet

      對于動態(tài)的片段,你可以將代碼放在``之間, 在片段擴(kuò)展的時候,就會運(yùn)行。下面的例子,就是用 bash 格式化當(dāng)前日期:date+%f。

      snippet today 'Date'
      `date +%F`
      endsnippet

      你也可以在!p ...代碼塊里使用Python,比如上面box片段的代碼就是這樣的:

      snippet box 'Box'
      `!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
      │ $1 │
      `!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
      $0
      endsnippet

      這些 Python 代碼塊將被變量 snip.rv 的值替換。在這些代碼塊中,你可以訪問代碼段的當(dāng)前狀態(tài),例如t[1]包含第一個制表位,fn是當(dāng)前文件名等等。

      LaTex片段

      使用片段編寫LaTeX,要比純手工編寫快得多。特別有些非常復(fù)雜的片段能幫你大大節(jié)約時間,有效防止抓狂。

      下面是一些非常有用且容易上手的片段:

      環(huán)境

      想插入一個環(huán)境,只需要在一行的開頭輸入beg。然后鍵入環(huán)境的名稱,這個名稱在\end{}命令中也是一樣。按下Tab鍵,就能夠?qū)⒐鈽?biāo)放置在新創(chuàng)建的環(huán)境中。

      這個片段的代碼如下:

      snippet beg 'begin{} / end{}' bA
      \begin{$1}
          $0
      \end{$1}
      endsnippet

      其中,b表示這個片段只會在代碼行的開頭展開,A代表自動展開,也就是說不用按Tab鍵了。制表位(Tab stop)——也就是你可以通過按Tab 和Shift+Tab跳轉(zhuǎn)到的位置——用$1、 $2、......來表示,最后一個用$0。

      行內(nèi)和數(shù)學(xué)顯示

      在記數(shù)學(xué)筆記的過程中,最常用的兩個片段是mk和dm。

      它們負(fù)責(zé)啟動數(shù)學(xué)模式。第一個片段用于“行內(nèi)數(shù)學(xué)”,第二個用于“顯示數(shù)學(xué)”。

      代碼行內(nèi)的數(shù)學(xué)片段是“智能的”:它知道什么時候在$符號后面直接輸入一個單詞,它會自動加個空格。但如果輸入一個非單詞的字符,它就不會添加空格了,比如在““$p$-value”情況下,是這樣的:

      這個片段的代碼如下:

      snippet mk 'Math' wA
      $${1}$`!p
      if t[2] and t[2][0] not in [',', '.', '?', '-', ' ']:
          snip.rv = ' '
      else:
          snip.rv = ''
      `$2
      endsnippet

      第一行末尾的w,意味著這個片段會在單詞邊界處擴(kuò)展,例如,hellomk不會擴(kuò)展,但是hello mk會。

      用于顯示數(shù)學(xué)的片段更簡單,也更加方便;有了它,你可能再也不會忘記用句號結(jié)束方程了。

      代碼:

      snippet dm 'Math' wA
      \[
      $1
      .\] $0
      endsnippet

      小寫和上標(biāo)

      另一個很有用的片段就是下標(biāo)。能夠把a(bǔ)1改為a1,把a(bǔ)_12改為a{12}。

      這個片段的觸發(fā)器是使用正則表達(dá)式。有兩種情況會擴(kuò)展片段。一是你鍵入一個字符,后面跟著一個數(shù)字,比如[A-Za-z]\d;另一種是,一個字符后面有并跟著兩個數(shù)字,比如[A-Za-z]\d\d。

      snippet '([A-Za-z])(\d)' 'auto subscript' wrA
      `!p snip.rv = match.group(1)`_`!p snip.rv = match.group(2)`
      endsnippet

      snippet '([A-Za-z])_(\d\d)' 'auto subscript2' wrA
      `!p snip.rv = match.group(1)`_{`!p snip.rv = match.group(2)`}
      endsnippet

      當(dāng)你使用括號將正則表達(dá)式的一部分裝在一個組中時,例如(\d\d),你可以在 Python中通過match.group (i)來使用它們擴(kuò)展片段。

      至于上標(biāo),可以使用td,它就會變成^{}。然而,對于平方、立方和其他一些常見的片段,可以使用專門的代碼片段,如 sr、cb等等。

      效果圖:

      代碼:

      snippet sr '^2' iA
      ^2
      endsnippet

      snippet cb '^3' iA
      ^3
      endsnippet

      snippet compl 'complement' iA
      ^{c}
      endsnippet

      snippet td 'superscript' iA
      ^{$1}$0
      endsnippet

      分?jǐn)?shù)

      分?jǐn)?shù)是一個用起來最方便的一個片段,擴(kuò)展的形式如下:

      / / → frac {}{}
      3 / → frac {3}{}
      4 pi ^ 2 / → frac {4 pi ^ 2}{}
      (1 + 2 + 3) / → frac {1 + 2 + 3}{}
      (1 + (2 + 3) /)→(1 + frac {2 + 3}{})
      (1 + (2 + 3)) / → frac {1 + (2 + 3)}{

      第一個片段的代碼很簡單:

      snippet // 'Fraction' iA
      \\frac{$1}{$2}$0
      endsnippet

      第二個和第三個示例,可以使用正則表達(dá)式來匹配3/、4ac/、6pi^2/、a2/等表達(dá)式。

      snippet '((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/' 'Fraction' wrA
      \\frac{`!p snip.rv = match.group(1)`}{$1}$0
      endsnippet

      看了上邊這些,你可能覺得正則表達(dá)式太難了。沒關(guān)系,下面有一個解釋得非常直觀的圖表:

      在第四和第五種示例下,要換一種方法。使用UltiSnips的正則表達(dá)式引擎解決不了的,Python可以:

      priority 1000
      snippet '^.*\)/' '() Fraction' wrA
      `!p
      stripped = match.string[:-1]
      depth = 0
      i = len(stripped) - 1
      while True:
          if stripped[i] == ')': depth += 1
          if stripped[i] == '(': depth -= 1
          if depth == 0: break;
          i -= 1
      snip.rv = stripped[0:i] + '\\frac{' + stripped[i+1:-1] + '}'
      `{$1}$0
      endsnippet

      這里最后要分享的關(guān)于分?jǐn)?shù)的片段,能根據(jù)你的選擇,來生成一個分?jǐn)?shù)。

      你可以先選擇一些文本,然后按Tab鍵,繼續(xù)輸入、然后再按Tab鍵。

      代碼中,使用${VISUAL}變量來表示所選的內(nèi)容。

      snippet / 'Fraction' iA
      \\frac{${VISUAL}}{$1}$0
      endsnippet

      Sympy和Mathematica

      還有一個很酷但用得不多的片段,是使用Sympy來計(jì)算數(shù)學(xué)表達(dá)式。例如,輸入sympy,然后按下Tab,可以擴(kuò)展為sympy | sympy,輸入sympy 1 + 1 sympy,按下Tab,可以擴(kuò)展為2。

      片段代碼:

      snippet sympy 'sympy block ' w
      sympy $1 sympy$0
      endsnippet

      priority 10000
      snippet 'sympy(.*)sympy' 'evaluate sympy' wr
      `!p
      from sympy import *
      x, y, z, t = symbols('x y z t')
      k, m, n = symbols('k m n', integer=True)
      f, g, h = symbols('f g h', cls=Function)
      init_printing()
      snip.rv = eval('latex(' + match.group(1).replace('\\', '') \
          .replace('^', '**') \
          .replace('{', '(') \
          .replace('}', ')') + ')')
      `
      endsnippet

      用Mathematica,也可以做類似的事情:

      片段代碼:

      priority 1000
      snippet math 'mathematica block' w
      math $1 math$0
      endsnippet

      priority 10000
      snippet 'math(.*)math' 'evaluate mathematica' wr
      `!p
      import subprocess
      code = 'ToString[' + match.group(1) + ', TeXForm]'
      snip.rv = subprocess.check_output(['wolframscript', '-code', code])
      `
      endsnippet

      后綴片段

      除了上邊這些之外,后綴片段也很值得分享。例如phat→hat{p}和zbar→overline{z}。還有類似的后綴向量,例如v,.→vec{v}和v.,→vec{v}。.和,的順序沒關(guān)系,所以可以同時按下它們兩個。

      這些片段真的可以節(jié)省時間,可以按照和老師寫板書一樣的順序來記。

      注意,bar和hat前綴也依然可以用,只要以較低的優(yōu)先級添加它們就行。

      這些片段的代碼是:

      priority 10
      snippet 'bar' 'bar' riA
      \overline{$1}$0
      endsnippet

      priority 100
      snippet '([a-zA-Z])bar' 'bar' riA
      \overline{`!p snip.rv=match.group(1)`}
      endsnippet
      priority 10
      snippet 'hat' 'hat' riA
      \hat{$1}$0
      endsnippet

      priority 100
      snippet '([a-zA-Z])hat' 'hat' riA
      \hat{`!p snip.rv=match.group(1)`}
      endsnippet
      snippet '(\\?\w+)(,\.|\.,)' 'Vector postfix' riA
      \vec{`!p snip.rv=match.group(1)`}
      endsnippet 

      其他片段

      此外,小哥還有大約100個常用的片段(下載地址附于文末),大多數(shù)都很簡單。比如,輸入!>變成\mapsto,輸入->變成\to等等。

      fun變成f: \R \to \R :,!>變成\mapsto,->變成\to,cc變成\subset。

      lim變成\lim{n \to \infty},sum變成\sum{n = 1}^{\infty},ooo變成\infty。

      特定課程的片段

      除了一些常用的片段,也可以針對特定的課程設(shè)定片段。例如,在量子力學(xué)這門課中,可以設(shè)定一些關(guān)于bra/ket符號的片段。

      <a|→\bra{a} <ψ|→\bra{\psi}='' a=''>→\ket{a}
      |ψ>→\ket{\psi}

      代碼:

      snippet '\<(.*?)\|' 'bra' riA
      \bra{`!p snip.rv = match.group(1).replace('q', f'\psi').replace('f', f'\phi')`}
      endsnippet

      snippet '\|(.*?)\>' 'ket' riA
      \ket{`!p snip.rv = match.group(1).replace('q', f'\psi').replace('f', f'\phi')`}
      endsnippet

      snippet '(.*)\\bra{(.*?)}([^\|]*?)\>' 'braket' riA
      `!p snip.rv = match.group(1)`\braket{`!p snip.rv = match.group(2)`}{`!p snip.rv = match.group(3).replace('q', f'\psi').replace('f', f'\phi')`}
      endsnippet

      上下文

      在編寫這些片段時需要考慮的一件事是,“這些片段會與長與常用的文本沖突嗎?”

      例如,在英語中大約有72個單詞包含sr,這意味著當(dāng)輸入disregard這個詞時,sr會擴(kuò)展到^2,出現(xiàn)一個di^2egard。

      這個問題的解決方案是,為代碼片段添加上下文。

      通過使用 Vim 的語法突出顯示,可以確定UltiSnips是否應(yīng)該擴(kuò)展片段,這取決于你使用的是數(shù)學(xué)還是文本。

      global !p
      texMathZones = ['texMathZone'+x for x in ['A', 'AS', 'B', 'BS', 'C',
      'CS', 'D', 'DS', 'E', 'ES', 'F', 'FS', 'G', 'GS', 'H', 'HS', 'I', 'IS',
      'J', 'JS', 'K', 'KS', 'L', 'LS', 'DS', 'V', 'W', 'X', 'Y', 'Z']]

      texIgnoreMathZones = ['texMathText']

      texMathZoneIds = vim.eval('map('+str(texMathZones)+', 'hlID(v:val)')')
      texIgnoreMathZoneIds = vim.eval('map('+str(texIgnoreMathZones)+', 'hlID(v:val)')')

      ignore = texIgnoreMathZoneIds[0]

      def math():
          synstackids = vim.eval('synstack(line('.'), col('.') - (col('.')>=2 ? 1 : 0))')
          try:
              first = next(
                  i for i in reversed(synstackids)
                  if i in texIgnoreMathZoneIds or i in texMathZoneIds
              )
              return first != ignore
          except StopIteration:
              return False
      endglobal

      現(xiàn)在,你可以將context “math()”添加到只希望在數(shù)學(xué)上下文中展開的片段中。

      context 'math()'
      snippet sr '^2' iA
      ^2
      endsnippet

      請注意,“數(shù)學(xué)上下文”是一個微妙的東西。 有時你可以使用\text{…}在數(shù)學(xué)環(huán)境中添加一些文本。在這種情況下,你不需要擴(kuò)展片段。但是,在以下情況下: \[ \text{$...$} \],它們可以擴(kuò)展。 這就是為什么math上下文的代碼有點(diǎn)復(fù)雜。下面的動圖說明了這些微妙之處。

      除了上述一些片段,你也可以根據(jù)自己的需要,來自己添加一些插件或者片段,來提高自己的效率。

      用筆還是用電腦?

      純手打記下1700頁數(shù)學(xué)筆記,awesome都不夠形容了這位小哥了,堪稱理工科學(xué)生中的“英雄”。

      并非所有人都贊同小哥的做法,強(qiáng)大的高科技工具在傳統(tǒng)面前常常會被質(zhì)疑。

      有部分網(wǎng)友認(rèn)為手寫比電腦打字印象深刻,而且要達(dá)到這位小哥的熟練程度,恐怕LaTeX和Vim得練習(xí)好幾年。

      既然用筆更方便,為什么還要用電腦來記筆記呢?原因很簡單:字太丑!

      如果記下來的內(nèi)容連自己看的欲望都沒有,怎么復(fù)習(xí)課堂筆記呢?至少用電腦記下來的排版工整,讓人賞心悅目。

      雖然國外網(wǎng)友爭論不休,但在國內(nèi)只要一個條件就可以徹底否決這個方法:不讓帶電腦進(jìn)課堂。

      對此,你怎么看?

      工具傳送門:

      Linux和Mac系統(tǒng)自帶Vim。

      Windows用戶安裝Vim:
      https://ftp./pub/vim/pc/gvim81.exe

      Vim插件管理:
      https://github.com/junegunn/vim-plug

      Vim上的LaTeX插件:
      https://github.com/lervag/vimtex

      窗口平鋪管理器:
      https://github.com/baskerville/bspwm

      管理Vim片段工具:
      https://github.com/SirVer/ultisnips

      如果你用不慣Vim,還有Emacs、Atom、VS Code、Sublime,它們都有LaTeX插件,總有一款文本編輯器適合你。

      LaTeX常見數(shù)學(xué)符號輸入方法:
      https://en./wiki/LaTeX/Mathematics

      想要熟悉更多的LaTeX使用方法,就需要系統(tǒng)地學(xué)習(xí),平時多加練習(xí)也必不可少。

      博文鏈接:

      https://v/post/lecture-notes-1/

      作者系網(wǎng)易新聞·網(wǎng)易號“各有態(tài)度”簽約作者

      訂閱AI內(nèi)參,獲取AI行業(yè)資訊

      加入社群

      量子位AI社群開始招募啦,量子位社群分:AI討論群、AI+行業(yè)群、AI技術(shù)群;

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多