if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
" vimtex - LaTeX plugin for Vim
"
" Maintainer: Karl Yngve Lervåg
" Email: karl.yngve@gmail.com
"
function! vimtex#parser#tex(file, ...) abort " {{{1
return vimtex#parser#tex#parse(a:file, a:0 > 0 ? a:1 : {})
endfunction
" }}}1
function! vimtex#parser#preamble(file, ...) abort " {{{1
return vimtex#parser#tex#parse_preamble(a:file, a:0 > 0 ? a:1 : {})
endfunction
" }}}1
function! vimtex#parser#auxiliary(file) abort " {{{1
return vimtex#parser#auxiliary#parse(a:file)
endfunction
" }}}1
function! vimtex#parser#fls(file) abort " {{{1
return vimtex#parser#fls#parse(a:file)
endfunction
" }}}1
function! vimtex#parser#toc(...) abort " {{{1
let l:vimtex = a:0 > 0 ? a:1 : b:vimtex
let l:cache = vimtex#cache#open('parsertoc', {
\ 'persistent': 0,
\ 'default': {'entries': [], 'ftime': -1},
\})
let l:current = l:cache.get(l:vimtex.tex)
" Update cache if relevant
let l:ftime = l:vimtex.getftime()
if l:ftime > l:current.ftime
let l:cache.modified = 1
let l:current.ftime = l:ftime
let l:current.entries = vimtex#parser#toc#parse(l:vimtex.tex)
endif
return deepcopy(l:current.entries)
endfunction
" }}}1
function! vimtex#parser#bib(file, ...) abort " {{{1
return vimtex#parser#bib#parse(a:file, a:0 > 0 ? a:1 : {})
endfunction
" }}}1
function! vimtex#parser#get_externalfiles() abort " {{{1
let l:preamble = vimtex#parser#preamble(b:vimtex.tex)
let l:result = []
for l:line in filter(l:preamble, 'v:val =~# ''\\externaldocument''')
let l:name = matchstr(l:line, '{\zs[^}]*\ze}')
call add(l:result, {
\ 'tex' : l:name . '.tex',
\ 'aux' : l:name . '.aux',
\ 'opt' : matchstr(l:line, '\[\zs[^]]*\ze\]'),
\ })
endfor
return l:result
endfunction
" }}}1
function! vimtex#parser#selection_to_texfile(type, ...) range abort " {{{1
"
" Get selected lines. Method depends on type of selection, which may be
" either of
"
" 1. range from argument
" 2. Command range
" 3. Visual mapping
" 4. Operator mapping
"
if a:type ==# 'arg'
let l:lines = getline(a:1[0], a:1[1])
elseif a:type ==# 'cmd'
let l:lines = getline(a:firstline, a:lastline)
elseif a:type ==# 'visual'
let l:lines = getline(line("'<"), line("'>"))
else
let l:lines = getline(line("'["), line("']"))
endif
"
" Use only the part of the selection that is within the
"
" \begin{document} ... \end{document}
"
" environment.
"
let l:start = 0
let l:end = len(l:lines)
for l:n in range(len(l:lines))
if l:lines[l:n] =~# '\\begin\s*{document}'
let l:start = l:n + 1
elseif l:lines[l:n] =~# '\\end\s*{document}'
let l:end = l:n - 1
break
endif
endfor
"
" Check if the selection has any real content
"
if l:start >= len(l:lines)
\ || l:end < 0
\ || empty(substitute(join(l:lines[l:start : l:end], ''), '\s*', '', ''))
return {}
endif
"
" Define the set of lines to compile
"
let l:lines = vimtex#parser#preamble(b:vimtex.tex)
\ + ['\begin{document}']
\ + l:lines[l:start : l:end]
\ + ['\end{document}']
"
" Write content to temporary file
"
let l:file = {}
let l:file.root = b:vimtex.root
let l:file.base = b:vimtex.name . '_vimtex_selected.tex'
let l:file.tex = l:file.root . '/' . l:file.base
let l:file.pdf = fnamemodify(l:file.tex, ':r') . '.pdf'
let l:file.log = fnamemodify(l:file.tex, ':r') . '.log'
call writefile(l:lines, l:file.tex)
return l:file
endfunction
" }}}1
endif