Vim Latex 的使用和配置技巧 (二)

作者: 李老师的好学生 | 来源:发表于2019-05-19 19:18 被阅读0次

    在这篇文章里, 我将继续介绍一下我用 vim 编辑 Latex的技巧, 以及一些相关的配置.

    在上一篇文章里, 我简单地介绍了vim的安装, latex-suite和vimtex插件的安装, 以及latex-suite中常用的命令. 上篇文章的链接是:

    Vim Latex 的使用和配置技巧 (一)

    在这一篇文章里, 我将继续介绍一下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>键, 就可以编译+打开文档了. 在这里, 我们解析一下这一行代码的含义.

    • imapnmap是定义映射的命令. 开头的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, 可以类似地定义.

    相关文章

      网友评论

        本文标题:Vim Latex 的使用和配置技巧 (二)

        本文链接:https://www.haomeiwen.com/subject/qbwqzqtx.html