使用Vim编辑并显示投影仪中的单个幻灯片的PDF

时间:2011-08-05 11:41:41

标签: vim latex beamer

我使用Vim作为我的文本编辑器,我非常喜欢beamer作为幻灯片演示工具。 但是,编译大型投影仪演示文稿可能需要一些时间(可能需要10或20秒)。 对于普通的LaTeX文档,这个时间通常很好,因为内容通常只是起作用。在beamer幻灯片中,有时会出现文本在幻灯片上的适应性问题。当幻灯片涉及更复杂的图形,文本等布局时,情况也是如此。

我想使用Vim设置一个快捷命令,它只是将活动幻灯片编译为PDF(由光标定义在相关的frame环境之间。

我意识到文档的序言和其他几个功能会影响幻灯片的确切格式。但是,我认为近似就足够了。也许仅仅编译序言和活动幻灯片就足够了。

任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:2)

这是一个小功能,可以执行您想要的操作(将前导码和当前帧复制到单独的文件中并编译它):

function! CompileCurrentSlide()
   let tmpfile = "current-slide.tex"
   silent! exe '1,/\s*\\begin{document}/w! '.tmpfile
   silent! exe '.+1?\\begin{frame}?,.-1/\\end{frame}/w! >> '.tmpfile
   silent! exe '/\s*\\end{document}/w! >> '.tmpfile
   silent! exe '!pdflatex -halt-on-error '.tmpfile.' >/dev/null'
endfunction
" 
noremap <silent><buffer> zz :silent call <SID>CompileCurrentSlide()<CR>

按zz将编译光标所在的任何帧,并将输出放在“current-slide.pdf”中。您可以使用您想要的任何其他选项替换-halt-on-error。该脚本不会打开一个单独的窗口,就像上一个答案中的函数一样;你只需继续编辑主文件。我不是一个vim专家,所以可能有更好的方法来做到这一点,但上面在创建几个Beamer演示文稿时对我来说很好。

答案 1 :(得分:1)

以下函数应创建仅包含前导码和当前帧的新临时文件。它以分割方式打开文件,从那时起,您应该能够单独编译该文件并使用您执行的任何程序进行查看。我不太了解tex,甚至不太了解beamer,所以你可能需要调整它以更好地满足你的需求。

function! CompileBeamer()
  " Collect the lines for the current frame:
  let frame = []
  if searchpair('\\begin{frame}', '', '\\end{frame}', 'bW') > 0
    let frame = s:LinesUpto('\\end{frame}')
    call add(frame, getline('.')) " add the end tag as well
  endif

  " Go to the start, and collect all the lines up to the first "frame" item.
  call cursor(1, 1)
  let preamble = s:LinesUpto('\\begin{frame}')

  let body = preamble + frame

  " Open up a temporary file and put the selected lines in it.
  let filename = tempname().'.tex'
  exe "split ".filename
  call append(0, body)
  set nomodified
endfunction

function! s:LinesUpto(pattern)
  let line = getline('.')
  let lines = []

  while line !~ a:pattern && line('.') < line('$')
    call add(lines, line)
    call cursor(line('.') + 1, 1)
    let line = getline('.')
  endwhile

  return lines
endfunction