在这篇文章里, 我将继续介绍一下我用 vim 编辑 Latex的技巧, 以及一些相关的配置.
在上一篇文章里, 我简单地介绍了vim的安装, latex-suite和vimtex插件的安装, 以及latex-suite中常用的命令. 上篇文章的链接是:
在这一篇文章里, 我将继续介绍一下latex-suite的其他进阶设置.
5. Latex-Suit 的宏命令(二)
5.1 LaTeX
的编译
假如我现在编译好了一个tex
文档, 文件名是testLaTeX.tex
, 如下:
% 导言区
\documentclass[a4paper]{article}
\usepackage{ams math}
% 文档区
\begin{document}
% 正文开始
This is a \LaTeX file.
\end{document}
编译好LaTeX
文档之后, 我们不必在别的编译器里编译文档, 可以考虑下面几种办法:
5.1.1 用vim自带的命令行
我们知道, 在Terminal里, 用
pdflatex testLaTeX.tex
就可以编译文档. 结果如下:
在vim里, 我们可以用它自带的命令行来运行: !
+ shell 命令. 比如, 在vim里, 我们可以用
!pdflatex %
来编译当前文档. 其中, %
代表当前文档名. 结果如下:
如何打开编译出来的pdf
文档呢? 可以用:
!open %:r.pdf
这样, 就可以用默认的pdf
浏览器来打开你的pdf
文档了. 当然, 也可以给这两个命令添加一个快捷方式. 比如, 在~/.vim/ftplugin/tex.vim
文件里, 添加:
imap <F2> <ESC>:w<CR>:!pdflatex % && open %:r.pdf<CR><CR>
nmap <F2> <ESC>:w<CR>:!pdflatex % && open %:r.pdf<CR><CR>
重新打开tex
文件, 当你再按一下<F2>
键, 就可以编译+打开文档了. 在这里, 我们解析一下这一行代码的含义.
imap
和nmap
是定义映射的命令. 开头的i
代表insert
模式的映射,n
代表normal
模式下的映射. 如果想定义一个对于所有模式的映射, 可以直接用map
来定义.<F2>
: 是映射的快捷键.<ESC>:w<CR>
: 退出编辑模式, 并保存.:!pdflatex %
: 用pdflatex
编译该文件.open %:r.pdf<CR><CR>
打开编译出来的pdf
文件.&&
: 命令的连接.~/.vim/ftplugin/tex.vim
: 这是tex
文件的local配置文件, 如果没有, 可以自己创建.
5.1.2 LaTeX-suite的编译
当然, LaTeX-suite自带一些编译文档的命令. 默认情况下, 在normal模式下,
\ll
: 编译文档\lv
: 查看文档\ls
: 查看文档, 并跳到当前光标所在的位置.
如果lv
不管用, 可能需要改一下pdf浏览器的设置. 比如, 在MacOS
中, 我用的是skim
. 安装Skim
之后, 在~/.vim/ftplugin/tex.vim
中, 我们加入下面一行:
let g:Tex_ViewRule_pdf = 'Skim'
就可以用Skim
打开对应的pdf文档. 至于Skim
的安装, 可以用brew
命令:
brew cask install skim
另外多说一句, 有些时候, 我们不光需要用pdflatex
编译, 也需要用bibtex
编译. 这时, 我们可以通过定义
let g:Tex_MultipleCompileFormats='pdf,bib,pdf,pdf'
这样一来, 按一下\ll
, 就可以以pdflatex,
BibTeX,
pdflatex’, ‘pdflatex
的顺序, 一下子编译好文档.
在我自己的tex.vim
文件里, 我还有下面一行自定义的命令:
imap <C-b> <ESC><ESC>:w<CR>\ll:only<CR>\ls
nmap <C-b> <ESC>:w<CR>\ll:only<CR>\ls
这样一来, 用Ctrl+b
, 就可以保存文档、编译文档并查看pdf文件.
5.1.3 LaTeX project的编译
在LaTeX project中, 我们可能会有很多源文件, 比如:
thesis/
main.tex
abstract.tex
intro/
intro.tex
figures/
fig1.eps
fig2.eps
chapter1/
chap1.tex
figures/
fig1.eps
conclusion/
conclusion.tex
figures/
在这个文件夹里, main.tex
是主要文件:
% file: main.tex
\documentclass{report}
\begin{document}
\input{abstract.tex}
\input{intro/intro.tex}
\input{chapter1/chap1.tex}
\input{conclusion/conclusion.tex}
\end{document}
这个时候, 在main.tex
所在的文件夹里, 创建一个空文件: main.tex.latexmain
. 这样一来, 在main.tex
相关的文件里, 用\ll
会自动找到main.tex
文件, 并编译.
5.2 Alt 命令
5.2.1 添加特殊字体
在tex
中, 我们经常会需要不同的字体. 比如\mathbb{R}
代表实数域, \mathcal{F}
代表sigma-域等等. 这时, 我们可以用LaTeX-suite中的Alt
命令来做:
R<Alt-B> --> \mathbf{R}, # 粗体
F<Alt-C> --> \mathcal{F}. # 花体
我们可以自己定义这个命令. 比如说, 我们想定义\mathbb
的相关命令, 就可以在~/.vim/ftplugin/tex.vim
中, 添加下面这个函数:
" Tex_Mathbb:
function! Tex_Mathbb()
return "\<Left>\\mathbb{\<Right>}"
endfunction
imap <A-x> <C-r>=Tex_Mathbb()<CR>
这样一来, 我们就可以:
R<Alt-x> -> \mathbb{R}
5.2.2 添加括号
LaTeX中的大号的括号有两种模式, 一个是用\left( \frac{a}{b} \right)
, 另一种是\B{b}igl( \frac{a}{b} \B{b}igr)
. 这里, 我想做到下面这种效果:
( + <Alt-g> --> \bigl( 光标 \bigr) <++>
怎么可以做到这一点呢?
可以定义如下的vim
函数:
" Map <A-g> as \bigl( \bigr)
function! Tex_bigLR()
let line = getline(line("."))
let char = line[col(".")-2]
let previous = line[col(".")-3]
let matchedbrackets = '()[]{}|?'
if char =~ '(\|\[\|{\||\|?'
let add = ''
if char =~ '{'
let add = "\\"
endif
let rhs = matchstr(matchedbrackets, char.'\zs.\ze')
if char =~ '|'
let add = '\'
let char='lvert'
let rhs='rvert'
endif
if char =~ '?'
let add = '\'
let char='lVert'
let rhs='rVert'
endif
return "\<BS>".IMAP_PutTextWithMovement('\bigl'.add.char.' <++> \bigr'.add.rhs.'<++>')
else
return ''
endif
endfunction " }}}
"定义映射
inoremap <silent> <Plug>Tex_bigLR <C-r>=Tex_bigLR()<CR>
imap <A-g> <Plug>Tex_bigLR
这样一来,
( + <Alt-g> --> \bigl( 光标 \bigr) <++>
[ + <Alt-g> --> \bigl[ 光标 \bigr] <++>
{ + <Alt-g> --> \bigl\{ 光标 \bigr\} <++>
| + <Alt-g> --> \bigl\lvert \bigr\rvert<++>
? + <Alt-g> --> \bigl\lVert 光标 \bigr\rVert <++>
<++>
就像latex-suite的其他命令一样, 再用<C-j>
就可以跳出括号外.
至于\Big
, \bigg
和\Bigg
, 可以类似地定义.
相关文章: