This serves as a thorough introduction to getting setup for all aspects of a Vim workflow for speedy LaTeX authoring using Vimtex with UltiSnip snippets and Zathura PDF viewer. Install instructions are specific for MacOS but these tools can also be installed on any Linux or Windows computer. Thanks to Gilles Castel, a Math undergrad from Belgium who came up with most snippets used, the Vim plugin setup and using Zathura in tandem. His repository with the original snippets is Found Here, and his blog post showcasing how various snippets work is Found Here.
-
Vim text editor serves as the foundation of the workflow, with Vimtex plugin for enabling LaTeX editing along with the UltiSnips plugin that enables shortcuts that expand to code snippets.
-
Zathura PDF viewer is used in tandem with Vim in a manner that changes to the LaTex are automatically reflected in the PDF output. The combination of these two tools allows for lightweight and speedy real time output on your LaTeX markdown.
The Vim that comes with MacOS will not suffice for this, a newer Vim and most of the other tools required will be installed with brew package manager. If you do not already have brew installed, proceed after installing via their official instructions.
Many users who work with LaTeX in data-heavy disciplines nowadays tend to have the Anaconda distribution installed already with their PATH variable prefixed by "install_location"/anaconda3/bin; in this case you already have Python 3. If you don't have Anaconda, you may have still installed Python separately, check Python at your terminal and see if you get a version 3.X.X, and also check for the existence of pip3. ONLY IF these tools are not there, you'll need to run:
brew install pythonAt this point, python3 and pip3 are symlinked into /usr/local/bin and you can proceed.
Before installing Vim through brew, run alias python=python3. Now simply brew install vim and unalias python. Afterwards quit all your terminals; opening a new one and running vim --version | grep python should give you +python3 in the subsequent output. UltiSnips which uses Python interpolation for more powerful editable snippets requires a Vim instance bound to a Python 3.
Copy over all text in the following .vimrc into your own at ~/.vimrc and save.
set tabstop=4
set shiftwidth=4
autocmd TextChanged,TextChangedI <buffer> silent write
set backspace=indent,eol,start
" Plugins will be downloaded under the specified directory.
call plug#begin('~/.vim/plugged')
" Declare the list of plugins.
Plug 'sirver/ultisnips'
let g:UltiSnipsExpandTrigger = '<tab>'
let g:UltiSnipsJumpForwardTrigger = '<tab>'
let g:UltiSnipsJumpBackwardTrigger = '<s-tab>'
Plug 'lervag/vimtex'
set nocompatible
let &rtp = '~/.vim/plugged/vimtex,' . &rtp
let &rtp .= ',~/.vim/plugged/vimtex/after'
filetype plugin indent on
syntax enable
let g:vimtex_latexmk_continuous=0
let g:tex_flavor='latex'
let g:Tex_DefaultTargetFormat='pdf'
let g:vimtex_view_enabled=1
let g:vimtex_view_automatic=1
let g:vimtex_view_general_viewer='zathura'
let g:vimtex_view_method='zathura'
let g:vimtex_quickfix_mode=0
let g:vimtex_compiler_latexmk = {
\ 'callback' : 0,
\}
Plug 'KeitaNakamura/tex-conceal.vim'
set conceallevel=1
let g:tex_conceal='abdmg'
hi Conceal ctermbg=none
Plug 'dylanaraps/wal'
" List ends here. Plugins become visible to Vim after this call.
call plug#end()
setlocal spell
set spelllang=en_us
inoremap <C-l> <c-g>u<Esc>[s1z=`]a<c-g>u
colorscheme wal
set background=dark
set rtp+=~/.vim/UltiSnips/greekBEFORE running the plugin install command, if you don't have the iterm2 terminal app installed and further definitely don't want to either, omit the following two lines for Vim font (first line in plugin section, second at bottom):
Plug 'dylanaraps/wal'
colorscheme walNext, open vim from terminal and type :PlugInstall; every plugin mentioned in the .vimrc will be installed into ~/.vim/plugged as the location is specified in the .vimrc file.
(Again skip following to "For a few details..." if no iterm) A dependency of the dylanaraps/wal plugin must be installed, run sudo pip3 install pywal then wal --theme base16-nord . Copy the font file colors-wal.vim from the directory ~/.cache/wal, into directory ~/.vim, but also ensure to rename the file to wal.vim. Simply running:
mv ~/.cache/wal/colors-wal.vim ~/.vim/wal.vimafter the wal --theme command will accomplish all of this.
For a few details about the non-plugin aspects of the .vimrc, the first two lines set tab size to the size of 4 spaces since I find the default 8 to be obnoxious, and towards the end the inoremap is a spellcheck for typing normal English paragraphs in LaTeX documents, misspelled words are highlighted and you can hit Tab to correct them. Also, the set rtp sets Vim's runtimepath to include another directory you will add later (besides the main LaTeX snippets you will add) to include LaTeX snippets for Greek letters. A gif showing inoremap spelling correction in action can be found in Gilles' blog post mentioned at The Top.
Vimtex requires additional binaries in order to work, that will compile the LaTeX document on user input and output a PDF which you will have open in Zathura side by side. First get the BasicTex distribution which is 90Mb, this is the Direct Download Link; Right-Click & Save As. The page the BasicTex download link is available at is Found Here, which itself is linked in this Doc Page for LatexTools. Go through the install process; it will unpack the binaries into /usr/local/texlive/2019basic/bin/x86_64-darwin. Do a cd into that directory, because there is still one more binary latexmk which they strangely decided not to include in the pkg file, I say strange since it does the actual compiling! In the directory, call its tlmgr binary to install latexmk -> sudo tlmgr install latexmk. And end it off with the necessary soft link:
sudo ln -s /usr/local/texlive/2019basic/bin/x86_64-darwin/latexmk /usr/local/binYou don't need to do this following step (another soft link) UNLESS you later get the error bibtex not executable while in the Usage section (mostly doesn't happen); if you do then remember to come here and repeat the soft link but change latexmk to bibtex.
The snippets are prohibitively long to directly include in this markdown file, but they are in this same Gist. Scroll down and see the files tex.snippets and greek/tex.snippets. The former goes in ~/.vim/UltiSnips directory, and the latter goes in ~/.vim/UltiSnips/greek/UltiSnips (remove greek_ from filename!); you'll have to mkdir greek/UltiSnips (which makes both, nested) from inside ~/.vim/UltiSnips first.
The following instructions come from this repository. Run brew tap zegervdv/zathura, then brew install zathura and brew install zathura-pdf-poppler. Next you'll need to link the plugins into place:
$ mkdir -p $(brew --prefix zathura)/lib/zathura
$ ln -s $(brew --prefix zathura-pdf-poppler)/libpdf-poppler.dylib $(brew --prefix zathura)/lib/zathura/libpdf-poppler.dylibClose all open terminals and open a new one, and open up a .tex file with vim <filename.tex>.
Start off a basic document with:
\documentclass{article}
begYou'll immediately notice that as you type beg, it automatically expands to:
\begin{}
\end{}with the cursor inside the curly brackets at \begin. Here, type document, which will add the same word inside the \end tag, and hitting Tab afterwards will bring you inside the two tags. Type some text, then to try another snippet first Esc out of Insert mode and hit v for Visual mode, and select the text you just typed by option+click at the beginning and another option+click at the end. With the text highlighted, hit Tab which deletes the text, type lr then hit Tab again which will bring back the text surrounded by \left( and \right) parentheses. This begins to show you the full power of the UltiSnip plugin, which also lets you use regex as part of Python interpolation in snippet expansion. How text selected in Visual mode can be captured to be used in a snippet is Explained Here.
Hit Esc and then \ll, this will start the Vimtex compiler in continuous mode, then in another window/tab go to the same directory where your new name.tex file is and run zathura name.pdf & and disown. Watch as each keystroke re-renders the PDF, enjoy :) .
I've modified Gilles' subscript2 snippet in the main tex.snippets file such that x_\ also expands to x_{} and leaves the cursor inside so you can type greek letters. So por ejemplo, x_\ + th + Tab expands to x_{\theta}. Notice there was no Tab for x_\, this is because the subscript notation itself is configured to autoexpand since the headline of the snippet ends in A, only the greek letters require a Tab to prevent undesired autoexpansion as MANY other LaTeX keywords can start with the same a-z letter of alphabet so \"letter" would infuriatingly give you a greek letter when you meant to type another keyword.
Any snippet (such as the subscript ones) you see with context math() as its first line will only work inside math contexts, which Gilles has defined as:
- inside a
dmblock:
(typing dm autoexpands to
[/
/]which is multiline math),
OR
- inside a
mkblock:
(typing mk autoexpands to
$ $which is single line math) .
There is truly SO MUCH you can do with UltiSnips, Gilles also has a sympy snippet where with the sympy module installed via pip, you can do symbolic integration and differentiation and it outputs LaTeX. So sympy + Tab + integrate(tanh(x),x) + Tab gives you:
x - \log{\left(\tanh{\left(x \right)} + 1 \right)}!!!!
https://www.reddit.com/r/vim/comments/7c7wd9/vim_vimtex_zathura_on_macos/
https://stackoverflow.com/questions/40077211/e185-cannot-find-color-scheme
https://github.com/dylanaraps/pywal/wiki/Getting-Started
https://github.com/dylanaraps/wal.vim
https://github.com/dylanaraps/pywal/wiki/Customization
https://latextools.readthedocs.io/en/latest/install/
https://mg.readthedocs.io/latexmk.html
https://gist.github.com/LucaCappelletti94/920186303d71c85e66e76ff989ea6b62
https://latextools.readthedocs.io/en/latest/install/
http://www.math.cmu.edu/~gautam/sj/blog/20140310-zathura-fsearch.html
https://gitter.im/SirVer/ultisnips
https://superuser.com/questions/1115159/how-do-i-install-vim-on-osx-with-python-3-support
https://jdhao.github.io/2020/01/05/ultisnips_python_interpolation/
http://witkowskibartosz.com/blog/python_snippets_in_vim_with_ultisnips.html#.Xnw9gtP7TRY
https://germaniumhq.com/2019/02/07/2019-02-07-Vim-Ultimate-Editing:-UltiSnips/
http://vimcasts.org/episodes/ultisnips-python-interpolation/