写在前面
Disclaimer
- I am a die-hard linux user, so maybe my opinion is biased.
- Although I’ve been using vim for 3 years, I’m not an expert by any means, so it’s possible that there are better ways.
- My charming vim only works for me, which doesn’t mean that I can assure that your precious time you invest will bring any efficiency in return. Microsoft is nice for ordinary people.
Apple, Inc? Absolutely no. Especially today. Playing 3A games on Windows and exploring the unknown world on Linux are romances of a masculine man. No one has a reason to lock himself in a Walled Garden except those giant babies who fear seeing the big world outside.
苹果更不是为你服务的 是要做你爹
苹果: 生态懂吗 光买一件够吗
反正我本来是mac黑,结果经常帮朋友修电脑解决问题,现在比机主都懂mac,笑死。万把块的东西,买之前还是推荐找好它的定位跟自己的需求。
长期只使用苹果产品的人容易产生一种大脑病变,用其它什么玩意都感觉设计垃圾,就用苹果的神经病逻辑感觉贼棒。。。
First, have a real Linux desktop as a real man
在 linux 上用 vim 和 LaTeX 会比在 windows 上更加舒适:
- 配环境更方便(节省大量时间
- 编译速度快得多
- 调用外部脚本更方便且速度更快(windows另启一个新进程也就慢个几十倍吧)
反正我是没有成功在 windows 上配置好和 linux 上一样舒适的环境,I’m vegetable.
然而 Xournal++ 和 write(配合我的看了惠狐博文推荐才买的WacomBambooSlate数位本导出的svg文件会挺方便,使用 write 时,按住ctrl shift alt space
都有相应的功能,inkscape 可以 ungroup all, onenote2016 不能编辑 svg 就很难受) 在键盘输入的文字和手写输入的文字的混排方面和比起 onenote2016 还是差了点(熟记Xournal++的快捷键可以弥补一点)。
事实上,onenote2016 虽然有许多小bugs, 但确实不错,目前我已知的 linux 桌面上好用的手写软件就这两个。欢迎打脸。
Xournal++ 使用技巧:
- 我使用 wacom 入门级2048级压感数位板搭配24寸2k屏(穷),对脊椎比较好
- 如果你用 Arch Linux,正版 wacom 数位板
yay
装个包插上笔记本电脑的 usb A 口就能用了 - 在 Xournal++ 的 Edit->Preferences->InputSystem 勾选 Enable new input system(Requires restart) 和 Merge bottuon events with stylus tip events
- 在 Xournal++ 的 Edit->Preferences->view-cursor 里面勾选大图标
- 在系统设置里面设置 wacom 数位板快捷键
排版用 LaTeX 还是 word? 这个是小马过河的问题。
- 我有个软件工程的朋友,对 tex 很了解,骂 tex 反人类,tex 语言设计得差,LaTeX 代码是屎山,说还不如用 word, word 也可以写 LaTeX 公式!又说 markdown 十分简洁。
- 我又有一个数院的朋友,用 windows 和 LaTeX ide。说 texlive 相当难装,每次升级也很麻烦。
- 我只会用几个宏包,只会用 article beamer book 等文档类。机缘巧合是 linux 和 vim 用户,对 LaTeX 又是另外一番体会。LaTeX排版还是比较方便的,而且排版出来的东西十分美观,大部分情况只要调包就行了。也许 LaTeX 确实很烂,但是用 vim 却能如此优雅地编辑 LaTeX, 我对 vim 的作者及 vimtex 的作者的崇敬之情油然而生。
我觉得 tex 适合用来输出,不适合用来“输入”– 把知识理解吸收并印到脑子里你只需要纸、笔和大脑.(长期记忆可能需要 anki + vim,写好的 LaTeX 笔记可以方便地导入 anki, 不过这是题外话了)。或者你要电子化手写笔记,完全可以用类似于,比如说,WacomBambooSlate数位本 或者 OneNote2016离线笔记 + 触控笔或数位板,这样可以用 syncthing 同步 onenote 的离线笔记到 linux 的 windows 虚拟机 (牙膏厂用户可以使用 gvt-g) 上使用。 Btw, onenote for windows10 sucks。
文本格式有很多好处,而且可以用 Pandoc 愉快地把 .tex 转换为多种格式。Read the fancy manual and FAQs of pandoc,这里就不赘述了。 比如,你可以将 markdown 格式转换成 pdf 或者 docx。 你甚至可以事先做宏定义然后在 markdown 用,不过 docx 就无法识别这些宏(那些觉得 UnicodeMath 好用的人直接去用 MS Office 得了)。 因为其本质还是先把 markdown 转换为 tex,再将 tex 编译为 pdf。编译速度该慢还是慢。 如果你有大量的宏定义,还是推荐直接写 tex,而不推荐 markdown。你去看下 vim 的 tex 的 syntax 文件就知道了原因了。并且 vim 可以更好地利用 tex 中的文本对象,快速增删改查,而 markdown 的语法本来就是故意设计得简单的,这种情况下反而不方便。
这里补充说明下
- LaTeX 模版:以.cls 结尾的文本文件,比如,ArchLinux官方包的安装路径是在
/usr/share/texmf-dist/tex/LaTeX/
目录下;使用时只要将.cls 之前的该文本文件的名字放在 documentclass 的花括号里面就行了。vimtex 对 vim 本身的gf
命令做了修改,把光标放在花括号里面的 cls 名字上,按gf
就可以跳转进该文件. - 可以直接设置
fontset=windows
(wiki和视频,非常简单),或者自行配置字体,若你不懂字体,这里有个例子(别忘了更新字体缓存fc-cache -f -v
)。Arch 不配置的话默认Fandol,由于 Fandol 缺字,会出现字体警告如 “Fandol balabala”,vim 的 quickfix 会很乱
也可以 texdoc ctex
搜索 fontset,配置一下 ctex-fontset-⟨name⟩.def
。
用料
- texlive
- vim 及我自用的和 TeX 有关的插件
- vimtex (最重要)
- fcitx.vim 自动切换输入法
- aperezdc/vim-template
- SirVer/ultisnips 和 honza/vim-snippets
- easymotion
- fzf 和 ripgrep
- 我用 ycm,你选择自己喜欢的补全插件就好
- tagbar 或 vista
- vim-gutentags
- textobj 全家桶
在 Linux 上安装 TeX Live
两种方法都可以,这完全是个人喜好的问题。
方法一
查阅 texlive-zh-cn
使用 Unix installer 安装:使用国内开源镜像站,wget/curl 下载 install-tl,执行 install-tl 脚本,修改环境变量。
装完后别忘了装 archlinuxcn/texlive-dummy 之类的包.
(若只装中英文大约占用 4G 多的硬盘空间,3G 都是文档,我使用 500G nvme 和 1T 机械硬盘的游戏本,不明白为什么这么多人说 texlive 大。。。)
texlive 年更,更新方法看这篇
方法二
使用linux发行版源上的 texlive
(archlinux 源上的没文档, 大约 1.5G)
优点
- 统一管理
- 方便快捷:对照着 ArchLinux Wiki 直接用 pacman 安装所需的包即可,参考 https://wiki.archlinux.org/index.php/TeX_Live
缺点
无法使用 texdoc
命令 来查看文档,不过有在线文档。
或者 aur 似乎有 texlive-most-doc 和 texlive-full。
我自己是用方法一的(虽然tlmgr很烂),我觉得不必用 pacman 去更这种东西…… 而且文档真的很重要我网慢,LaTeX 很多东西不是记的,而是查的
用这个函数调用texdoc
let g:vimtex_doc_handlers = ['MyHandler']
function! MyHandler(context)
call vimtex#doc#make_selection(a:context)
if !empty(a:context.selected)
execute '!texdoc' a:context.selected '&'
endif
return 1
endfunction
可以直接在 vim 中查看文档(vimtex 默认应该是对着光标下宏包名按K键调用)。
这种情况用异步其实更费时间?:help job_start
cnoremap <expr> !! 'AsyncRun! -mode=hide '
:AsyncRun! -mode=hide texdoc xxx
更直接的方法?用tmux分个屏,自己敲texdoc xxx
。
vim 的一些配置
Vimtex
我曾 google “vim LaTeX”,一堆使用 vim-latexsuite 的文章。 我个人并不推荐。 而是主张使用 vimtex README 上所推荐的:vimtex 搭配 Ultisnips.
vimtex 自定义了几个文本对象,比如 cae
去 change around environment, =ae
去对齐整个环境
- 一些文本对象
- 使用
dsc
/dse
/ds$
/dsd
删除周围的命令 (command),环境 (environment),delimiter - 使用
csc
/cse
/cs$
/csd
修改周围的命令 (command),环境 (environment),delimiter - 使用
tsc
/tse
使命令 (command) 或者环境 (environment) 在加*
和不加*
之间互相切换 - 使用
tsd
/tsD
使括号在()
和\left(\right)
两状态互相切换 - 常规使用中新增文本对象(i 表示 inner 或 inside)
iP
inside 章节im
inside itemie
inside 环境id
inside delimiter- 同理
a
表示 around,aP
就是 around 章节
- 使用
- 一些 map
你需要什么,就自己定义什么
“itemize”, “enumerate” 环境中按回车自动添加 \item
。 注,下面的 ^M
可以在插入模式按 Ctrl v
加 回车 来输入
autocmd Filetype tex call vimtex#imaps#add_map({
\ 'lhs' : '<CR>',
\ 'rhs' : '^M\item ',
\ 'leader' : '',
\ 'wrapper' : 'vimtex#imaps#wrap_environment',
\ 'context' : ["itemize", "enumerate"],
\})
- 跳转
]]
: 在章节间移动]m
: 在环境间移动]n
: 在数学环境间移动]r
: 在 beamer 的 frame 间移动]*
: 在注释间移动%
: 在广义的括号,begin end 之间移动
- 希腊字母:在数学环境中输入 `f 就可以输入希腊字母 Φ,此功能位于
vimtex/autoload/vimtex/imaps.vim
119 行
我把宏录制设置为 Q
,把 easymotion 的 prefix 设置为 q
,享受 easymotion 的所有功能,使用qw
, qe
,在单词间跳转,q/
搜索字串,qq
搜索两个字母,用 qf
某个字母来搜索字母或汉字,
按 ctrl o
返回。
- 即时编译
此功能其实是调用 latexmk 之类的一些自动编译脚本,请查看 latexmk 和 vimtex 的文档使用 vim 编辑
.tex
时 输入:VimtexCompile
即可打开预览(当:w
时会自动刷新)。
如果你使用 whichkey, 不妨输入 <localleader>l
查看所有的快捷键。
也可以输入 :Vimtex<TAB>
列出命令,把你需要的命令都以<localleader>
为前缀 map 一下。如
在~/.vim/ftplugin/tex.vim
写入
nnoremap <buffer> <localleader>r :VimtexCompile<CR>
nnoremap <buffer> <localleader>e :VimtexError<CR>
nnoremap <buffer> <localleader>v :VimtexView<CR>
<localleader>r
编译,或停止编译<localleader>e
打开 quickfix 快速跳转到出错的地方<localleader>v
正向查找
ale 异步检查错误:
使用 ]l
跳转到 ale 提示出错的地方, ctrl o
跳转回去,]
表示跳转,l
表示 local,:lopen
打开 quickfix。 (推荐 tpope/vim-unimpaired
)
:ALEInfo
查看支持的 linter,fixers
ale 的很多 linters, fixers 需要自己装。languagetool 是开源的英文语法检查工具,有则改之无则加勉吧。
例子:
let g:ale_linters = {
\ 'tex': ['chktex', 'lacheck', 'texlab', 'languagetool', 'textidote'],
\ }
let g:ale_fixers = {'tex': ['latexindent']}
如:为了使用 latexindent:
# pacman -S perl-unicode-linebreak perl-file-homedir perl-yaml-tiny
有时候警告太烦人可以通过修改 ~/.chktexrc
禁用某一类型的警告。
反向查找: 请 :help vimtex
自己阅读文档,vimtex 同时支持 vim/gvim 和 neovim 及多种pdf阅读器,每种阅读器设置方法可能有所不同。
请阅读 vimtex 文档! 请阅读 vimtex 文档! 请阅读 vimtex 文档!
利用 okular
K 家的 okular 功能强大okular -h
,可以点菜单 > 设置 > 配置键盘快捷键,可以结合 ripgrep-all
跳转到任意 page
这里用终端下的 vim 和 okular 举一个简单的反向查找小例子:
在 .vimrc
中写入
let g:vimtex_view_general_viewer = 'okular'
let g:vimtex_view_general_options = '--unique file:@pdf#src:@line@tex'
let g:vimtex_view_general_options_latexmk = '--unique'
在 okular 菜单,设置 > 编辑器 输入vim --remote-expr "vimtex#view#reverse_goto(%l, '%f')"
打开终端,输入
vim --servername VIM main.tex # 创建一个名为 VIM 的 server 并打开 main.tex
在 vim 中使用默认按键<localleader>lv
(你可以改 map 也可以用 whichkey) 正向查找,在 okular 中按 ctrl 1
调整为浏览模式(光标为“小手”),再对准你想要跳转的地方按 shift+鼠标左键
(别的pdf阅读器可能是ctrl+鼠标左键
, whatever)反向查找。
我自用的双向搜索的配置:
~/.zshrc
中:
alias vit='vim --servername TEX'
alias vitv='vim --servername TEX -c 'VimtexView''
alias -s tex='vim --servername TEX -c 'VimtexView''
okular 中:
vim --servername TEX --remote-expr "vimtex#view#reverse_goto(%l, '%f')"
LaTeX 的管理
用 syncthing 同步 pdf 到手机
我用这个脚本,把所有 pdf 放到同一个文件夹 ,然后用软链接链回去,方便在手机和平板上阅读和批注。
在电脑上 对 LaTeX 的管理
你可以在终端中输入
find ~/Desktop/university/ -name main.tex | fzf --preview 'bat --style=numbers --color=always {} | head -33' | xargs -ro vim --servername TEX -c 'VimtexView'
来浏览你的笔记。
若你是 X11 用户,可以用 pdftoppm 把 LaTeX.out/main.pdf
变成 jpg 存储到 ~/.cache/xxx
; fzf 搜索,再用 这个 在终端预览pdf就像ranger一样,写个脚本,按回车打开 vim 和 pdf 阅读器。
TODO 公式的预览
用 ueberzug 实现公式图片在光标附近预览,类似于 inline preview 的效果;预先设置 preamble,让任意复杂公式都能显示。
其中用到了 /usr/bin/convert 由 imagemagick 7.1.0.4-2 所拥有
参见 arch linux wiki 的 imagemagick 条目
before.tex
例子:
\documentclass[convert={density=300,size=1080x800,outext=.png}]{standalone}
% 你的宏包
% 你的宏定义
\begin{document}
$\begin{aligned}
after.tex
例子:
\end{aligned}$
\end{document}
当光标在 equation 或 align 等等环境中,按某个快捷键,就能在光标附近显示图片,无论公式中宏定义有多么复杂(需要你自己把宏定义写到before.tex
里面的)。
vim-template
用 vim 打开任意空文件就会根据你的后缀(如.latexmkrc) 出现相应的模版
再比如多文件的情况,在每个 tex 文件的第一行写入%! TEX root = ./main.tex
,让 vimtex 知道谁是主文件。%!
开头的命令称为编译元数据,并不是 TeX 或 LaTeX 的指令。
不论是用 \input{preamble}
还是 UltiSnips 还是 shell 脚本都可以快速创建 preamble。
你可以创建自己的模板:在 vim 配置文件中写入
let g:templates_directory = '$HOME/.vim/templates'
文件的命名模式是”=template=<pattern>
”
你可以在 preamble 中调整纸张颜色(眼科说好):
\usepackage{xcolor}
\definecolor{mybackground}{RGB}{204,232,207}
\pagecolor{mybackground}
Ultisnips
请自行查看 UltiSnips 文档!
请自行查看 UltiSnips 文档!
请自行查看 UltiSnips 文档!
这个可以说的太多了,简单说说吧
用 visual 模式选中按 tab,再按 b<tab>
,可以把文本放入环境中。
利用 snip.v.text
可以对 选中的文本进行处理。
推荐 https://castel.dev/post/lecture-notes-1/ 的 snips
(后来我基本上抄袭学习他的代码块
vimtex 有了新的判断数学环境的方法:
定义bool函数
global !p
def isMath():
return vim.eval('vimtex#syntax#in_mathzone()') == '1'
endglobal
在只需要在数学环境使用的 snippet 前面加上:
context "isMath()"
即可。
例子:
context "isMath()"
snippet "\<(.*?)\|" "bra" riA
\bra{`!p snip.rv = match.group(1).replace('q', f'\psi').replace('f', f'\phi')`}
endsnippet
f-string(使用时用f做前缀), 亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法。
再比如这段代码中我 设 name 为 eric, 先把|2>
替换成 |ERIC>
再替换为|eric>
snippet "\|(.*?)\>" "ket" riA
\ket{`!p name = 'eric'
snip.rv = match.group(1).replace('2', f'{name.upper()}').replace(f'{name.upper()}', f'{name.lower()}')` }
endsnippet
综上,UltiSnips 可以方便地调用 python,很多你想不到的, UltiSnips 也能做到。
建议不要有了 snippets 就丢了 LaTeX 的宏,结合使用效果更佳。
正确地使用宏能增加 LaTeX 的可读性,比如说哈密顿算符,我用的时候不想去思考它是什么字体,而是直接输入 \Ham
代表它就是哈密顿算符, 有些东西配置一次就把它永远忘掉(写好注释,文学编程),不然占用大脑内存:
% 用 \Ham 表示 Hamiltonian Operator
\DeclareMathOperator{\Ham}{\hat{\mathcal{H}}}
然后在 ~/.vim/after/syntax/tex.vim
里面给 \Ham
设置你喜欢的 conceal,如ℋ。:help tex-conceal
以及 :help syntax
【注】: 确保你的字体支持此功能,比如 MS Windows 的 Courier_New 就会把符号映射成豆腐块。
You Complete Me
Vanilla vim 按<c-x><c-o>
使用 omni 补全,我建议你了解下 Vim 的 <c-x>
补全系统。
vimtex 支持很多补全插件,选择你喜欢的即可。我用 you complete me
,详情请 :help vimtex
搜索 you complete me.
或者魔改下 vimtex/autoload/vimtex/re.vim
糢糊补全
注意把 let g:ycm_cache_omnifunc = 1
打开以让 ycm 支持糢糊补全,如输入 \ncmd
补全 \newcommand
。
ycm 和 ultisnips 的快捷键
我用 <tab>
作为 UltiSnips 的快捷键,用 <C-n>
作为 ycm 的选择下一个的快捷键(自动上屏),用 <C-e>
退出补全,但这纯粹是我的个人喜好,我认为这样很方便,你当然可以它他修改成各种 IDE 的样子。
魔改 ycmd/completers/general/general_completer_store.py
我不想让 ycm 在 .tex 里糢糊补全一大串 buffer 里的中文:
diff --git a/ycmd/completers/general/general_completer_store.py b/ycmd/completers/general/general_completer_store.py
index f6cf8699..96144de2 100644
--- a/ycmd/completers/general/general_completer_store.py
+++ b/ycmd/completers/general/general_completer_store.py
@@ -55,6 +55,8 @@ class GeneralCompleterStore( Completer ):
if candidates:
return candidates
for completer in self._non_filename_completers:
+ if 'tex' in request_data[ 'filetypes' ] and completer == self._identifier_completer:
+ continue
candidates += completer.ComputeCandidates( request_data )
return candidates
拼写检查
在~/.vim/ftplugin/tex.vim
写入
setlocal spell spelllang=en_us,cjk "忽略中文对英文进行拼写检查
setlocal spellfile=~/.vim/spell/en.utf-8.add
setlocal spellfile+=~/.vim/spell/LaTeX.utf-8.add
与其他软件交互
python/sagetex/matlab/julia + vim-slime + tmux + LaTeX 一起用:
python: ipython
julia: julia
matlab: matlab -nodesktop -nosplash
+ workspace
+ figure
matlab 的补全
可以把syntax的函数名和关键字加到omni里面去;没有高亮的函数名,可以自己加到 syntax 文件里面去。
" https://vim.fandom.com/wiki/Completion_using_a_syntax_file
if has("autocmd") && exists("+omnifunc")
autocmd Filetype *
\ if &omnifunc == "" |
\ setlocal omnifunc=syntaxcomplete#Complete |
\ endif
endif
插图
我真搞不懂为什么有人非要复制粘贴图片,word 用习惯了?
好,满足你,这是一个截图的小脚本,并把路径复制到剪贴板。 你可以配合 asyncrun 使用:
:AsyncRun! -mode=hide tex-screenshot
或者你再写个 vimscript 让它更好用。
比起复制粘贴,用 python 或者其他更专业的软件生成图片可能会更好,把路径写死,保存到 ./figures
下,图片有更改的时候,latexmk, latexrun 等软件会自动更新。
平时记笔记直接使用 pdf 或 svg 插图会更加方便
\usepackage{svg}
或参见 https://castel.dev/post/lecture-notes-2/
Arch 用户安装 inkscape
pacman -S inkscape
合作
简单学下 git 吧,立刻生产力飞升。国内 gitee 网速还是挺快的。git 常用的无非就那几个命令 commit reset restore merge clean stash rebase diff
…
好像确实还不少… 不过 tpope 的 fugitive 已经包了一层了,动动手指敲几个键就能优雅地完成复杂的工作。
Anyway, 如果你不能说服你的同学或老师学 git,不妨试试 overleaf,绑定信用卡,会有 7 天试用期,有三种同步服务 dropbox, git bridge, github。这样你就可以用 vim 写 LaTeX 用 git 推送了。
Reference
- LaTeX 加背景色
- yinflying 的个人网址:Linux 下用 vim 写 MatLab 程序 (链接找不到了…)
- https://t.me/vimzh_real/61855