发布时间:2023-09-11
浏览次数:0
本文长约4000字,建议20分钟。
本文为您整理了2019年值得您关注的34个开源项目。
又一位“神奇”本科生出现!
在物理课上,我在整个课程中通过按键打下了 1,700 页的笔记。
速度跟上老师的板书,每一个公式、图表都完好无损。
疗效如何? 请看右图:
除了排版与课本较量外,还可以批注、搜索关键词……
他的笔记发布到网上后,吸引了大量围观。
不到三天,相关推文点赞数就超过2000个,新闻峰会的层数也超过了200层。
甚至有网友评论:“你就是我们需要的英雄!”
他是怎么做到的呢? 秘密装备是:LaTeX+Vim!
这位来自法国的小伙子对安利 Vim 文本编辑器特别感兴趣。 他说:
为了在 LaTeX 中编写物理公式,我选择 Vim 编辑器。 它功能强大、用途广泛且高度可扩展。 我将它用于任何基于文本的任务sublime text 3 函数跳转,无论是编写代码、编辑 LaTeX 还是写作。 事实上,入门级的学习曲线极其陡峭,但只要掌握了基本的操作方法,你还是会欲罢不能。
让我们来看看完成这一举措的具体过程。 我们在最后附上了文章中提到的工具的下载地址。
快速入门教程
我们先来看看小弟的工作环境配置。
他使用Vim编辑LaTeX的场景如下:
左边是Vim,右边是pdf阅读器,也有类似Vim的快捷键。
我使用的操作系统使用 bspwm 作为窗口管理器。 在Vim中,使用的LaTex插件是,它具有句型高亮、目录查看、同步对象等功能。
之后使用vim-plug进行如下配置:
插头'/'
letg:='乳胶'
令:=''
让:=0
设置=1
letg:='abdmg'
最后两行控制“隐藏”功能。 开启此功能后,不仅文本中混合的LaTeX代码(除了光标所在行之外)将被隐藏或替换为其他符号。
比如下面的动画,[、]、$被隐藏之后,没有它们的干扰,整个文档会更容易阅读。 该函数将使用 ∩ 代替 \\,用 ε 代替 \\in 等。
设置完成后,我们就来到了整个教程的精髓:
如何用LaTeX做笔记像老师在黑板上写字一样快?
这就是()发挥作用的地方。
片段! 碎片是什么?
片段是一小段可重复使用的文本,由其他文本触发。
例如sublime text 3 函数跳转,如果您输入sign,然后按Tab键,该短语将被手动扩展为签名:
片段也可以是动态的:输入“今天”并按 Tab 键,它将更改为当前日期。
当您在输入框中按 Tab 时,会出现一个框,该框会随着文本输入而手动放大。
片段甚至可以嵌套在另一个片段中:
如何创建片段?使用
用于管理片段的插件配置如下:
插头'/'
let g:UltiSnipsExpandTrigger = '' let g:UltiSnipsJumpForwardTrigger = ' ' let g:UltiSnipsJumpBackwardTrigger = ' '
标志片段的代码如下:
snippet sign "Signature" Yours sincerely, Gilles Castel endsnippet
对于动态片段,您可以将代码放在``之间,它将在片段展开时运行。 下面的反例是使用bash对当前日期进行低格式处理:date+%f。
snippet today "Date" `date +%F` endsnippet
您还可以在 !p... 代码块中使用它。 例如,前面的框片段中的代码如下所示:
snippet box "Box" `!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'` │ $1 │ `!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'` $0 endsnippet
该代码块将被变量 snip.rv 的值替换。 在此代码块中,您可以访问代码段的当前状态,例如t[1]包含第一个制表位,fn是当前文件名等。
乳胶片段
使用代码片段编译 LaTeX 比手动编译要快得多。 非常复杂的作品可以帮助你节省大量时间,有效避免抑郁。
以下是一些特别有用且易于使用的片段:
环境
要插入环境,只需在行首输入 beg 即可。 然后键入环境名称,该名称与 \\end{} 命令中使用的名称相同。 按 Tab 键会将光标置于新创建的环境中。
该片段的代码如下:
求“开始{}/结束{}”bA
\\begin{$1} $0 \\end{$1} endsnippet
其中,b表示该片段只会在代码行的开头展开,A表示手动展开,即不需要按Tab键。 (通过按 Tab 和 Shift+Tab 可以跳转到的位置)由 $1、$2、... 表示,最后一个由 $0 表示。
内联和物理显示
在做物理笔记的过程中,最常用的两个片段是mk和dm。
他们负责启动物理模式。 第一个片段用于“内联物理”,第二个片段用于“显示物理”。
一行代码中的物理片段是“智能的”:它知道何时在 $ 符号之前直接键入短语,并且会手动添加一个空格。 但如果输入非短语字符,则不会添加空格。 例如,在“$p$-value”的情况下,它看起来像这样:
该片段的代码如下:
MK“数学”wA
${1}1700页数学笔记火了!全程敲代码,教你上手LaTeX+Vim(附代码)-今日头条 !p if t[2] and t[2][0] not in [',', '.', '?', '-', ' ']: snip.rv = ' ' else: snip.rv = '' `$2 endsnippet第一行末尾的 w 表示片段将在短语边界处展开,例如 , 不会展开,但 会展开。
显示物理的片段更简单、更方便; 有了它,您可能永远不会忘记以句号结束多项式。
代码:
dm“数学”wA
\\[ $1 .\\] $0 endsnippet大写和上标
另一个有用的片段是下标。 这样才能将a1改为a1,a_12改为a{12}。
此代码片段的触发器是使用正则表达式。 有两种情况会扩展片段。 一种是输入一个字符后跟一个数字,例如 [A-Za-z]\\d; 另一种是一个字符后跟两个数字,例如 [A-Za-z]\\d\\d 。
'([A-Za-z])(\\d)'"自动"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\\d),您可以使用它们通过 match.group(i) 来扩展片段。
至于上标,您可以使用 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分数
分数是使用最方便的片段。 它可以扩展如下:
/ / → 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在第二个和第三个例子中,可以使用正则表达式来匹配3/、4ac/、6pi^2/、a2/等表达式。
'((\\d+)|(\\d*)(\\\\)?([A-Za-z]+)((\\^|_)(\\{\\d+\\}|\\d))*)/' ”“WRA
\\\\压裂{`!psnip.rv=match.group(1)`}{$1}$0
看完上面的内容,你可能会觉得正则表达式太难了。 没关系,这里有一张图,解释得很直观:
在第四个和第五个示例中,采用了不同的方法。 如果使用的正则表达式引擎无法解决问题,您可以:
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我想在这里分享的最后一篇关于分数的文章可以根据您的选择在来世变成分数。
您可以选择一些文本,然后按 Tab 键,继续键入,然后再次按 Tab 键。
在代码中,使用${}变量来表示所选的内容。
/""iA
\\\\压裂{${}}{$1}$0
同情和
另一个很酷但不常用的片段是使用 Sympy 来估计物理表达式。 例如,输入sympy,然后按Tab,可以将其扩展为sympy|sympy。 如果输入+并按Tab,则可以扩展到2。
片段代码:
snippet sympy "sympy block " w sympy $1 sympy$0 endsnippet priority 10000 snippet 'sympy(.*)sympy' "evaluate sympy" wr `!pfrom 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您还可以执行类似的操作:
片段代码:
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→{z}。 类似的后缀向量还有v,.→vec{v}和v.,→vec{v}。 的顺序 。 和 , 并不重要,因此您可以同时按下它们。
这种片段确实可以节省时间,而且可以按照老师在黑板上写的顺序来记忆。
请注意,bar 和 hat 前缀仍然有效,只需以较低的优先级添加它们即可。
该片段的代码是:
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)`} endsnippetpriority 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)`} endsnippetsnippet "(\\\\?\\w+)(,\\.|\\.,)" "Vector postfix" riA \\vec{`!p snip.rv=match.group(1)`} endsnippet其他剪辑
据悉,我还有大约100个常用剪辑(文末附有下载地址),大部分都很简单。 例如,输入 !> 变为 \\,输入 -> 变为 \\to 等。
fun 设为 f:\\R\\to\\R:,!> 设为 \\,-> 设为 \\to,cc 设为 \\。
lim 为\\lim{n\\to\\infty},sum 为\\sum{n=1}^{\\infty},ooo 为\\infty。
特定课程的一部分
不仅是一些常用的片段,还可以针对特定课程设置片段。 例如,在量子热科学课程中,您可以设置一些有关bra/ket符号的片段。
→\\ket{a}
|ψ>→\\ket{\\psi}
→\\{a}{b}
代码:
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语境
编译此类片段时要考虑的一件事是,“这些片段会与常用文本冲突吗?”
例如,德语中包含 sr 的短语大约有 72 个,这意味着当输入该单词时,sr 将扩展为 ^2,并会出现 di^。
此问题的解决方案是向代码片段添加上下文。
通过使用 Vim 的句子突出显示,您可以根据您使用的是物理还是文本来确定是否应该扩展片段。
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现在,您可以将“math()”添加到您只想在物理上下文中扩展的片段。
context "math()" snippet sr "^2" iA ^2 endsnippet请注意,“数学背景”是一件微妙的事情。 有时您可以使用 \\text{...} 向物理环境添加一些文本。 在这些情况下,您不需要扩展片段。 并且,在以下情况下:\\[\\text{$...$}\\],它们可以被扩展。 这就是数学上下文的代码有点复杂的原因。 下面的动画说明了这种微妙之处。
不仅仅是上述的片段,你还可以根据自己的需要添加一些插件或者片段,以提高你的效率。
笔还是笔记本?
手写 1700 页的数学笔记不足以形容那个人。 他堪称理工科学生中的“英雄”。
并非所有人都同意我所做的事情。 强大的高科技工具在传统面前常常受到批评。
有网友觉得手写比笔记本电脑打字更有印象,但要达到那家伙的熟练程度,估计需要几年的 LaTeX 和 Vim 练习。
既然用笔更方便,为什么还要用笔记本来做笔记呢? 原因很简单:字迹太帅了!
如果你连自己写下的内容都没有阅读的欲望,那你怎么准备课堂笔记呢? 至少笔记本上写的布局是工整、顺眼的。
尽管美国网友争论不休,但在国外能完全拒绝这种方式的只有一个条件:笔记本电脑不准带进课堂。
你怎么看待这件事?
工具门户
Linux 和 Mac 系统都带有 Vim。 用户安装的 Vim: 插件管理器: LaTeX 插件: 窗口平铺管理器: 用于管理 Vim 片段的工具:
如果你不习惯 Vim,还有 Emacs、Atom、 等,它们都有 LaTeX 插件。 总有一个文本编辑器适合您。
LaTeX中常见的物理符号输入方法:
如果你想熟悉更多的LaTeX使用方法,就需要系统的学习,定期的练习也是必不可少的。
博文链接:
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码