灵感来自对此答案的评论我很好奇如何在 Linux 下使用 vim、pdflatex 和开源 PDF 查看器实际设置和使用正向/反向(逆向)搜索。
顺便说一下,提供更多详细信息:
向前搜索意味着当您在文本编辑器中的某个位置发出某个命令时,PDF 查看器会自动跳转到排版 PDF 中的相应位置。甚至可能以某种方式标记它。
反向搜索意味着在您的 PDF 查看器中发出命令(例如单击文档中的某个位置),指示 PDF 查看器向您的编辑器发送命令,然后跳转到相应的源位置。
编辑:目前我没有在 vim 中使用任何 latex 插件。通常,我用 vim 编辑的 LaTeX 文档会大量使用 \include 或 \input。
答案1
了解您正在为 vim 使用哪个 LaTeX 插件(如果有)会很有帮助。(例如 latex-suite、vim-auctex、latex-box 等)
接下来,就查看器选择而言,目前唯一广泛使用的 Linux 开源 PDF 查看器(开箱即用,支持 SyncTeX)是 Okular。这可能是您的最佳选择。
有关于使用 vim-latex 插件设置 Okular SyncTeX 的说明这里以及一些相关观察这里。我按照这些指示得到了不同的结果。以下似乎是重要的。
确保您的 LaTeX 编译方法(取决于您的插件)使用该
-synctex=1
标志调用 pdflatex(或 xelatex 或其他)。我认为类似这样的操作应该足以满足 Okular 的前向搜索要求,不过最好尝试重写或修改插件的前向搜索功能(上面的某个链接中有一些相关信息)。将其放入 .vimrc 中(并将映射更改为您喜欢的任何内容)。
function! SyncTexForward() let execstr = "silent !okular --unique %:p:r.pdf\\#src:".line(".")."%:p &" exec execstr endfunction nmap <Leader>f :call SyncTexForward()<CR>
对于反向搜索,请将 Okular 中的编辑器行设置为
gvim --servername GVIM --remote +%l %f
。如果您仅在已打开文件的情况下使用它,它也可能有效gvim --servername GVIM --remote-send "<Esc>%lgg"
。将服务器名称更改为您使用的任何名称。(不确定它是否与常规 vim 不同,但这在图形环境中没有多大意义。)
但是,我现在还没有安装 Okular,因此无法测试任何内容。(我之前给出的链接有略有不同的建议,值得一试。)我真的希望安装了 Okular 和 gvim 的人可以测试这个建议,并纠正我的错误。
\input{...}
如果您使用通过或调用的子文档,而 PDF 名称与您正在编辑的文档名称不匹配,那么所有这些建议都不会奏效。\include{...}
有办法解决这个问题,但这需要您更多地了解您已经使用的 LaTeX 插件和方法(如果有的话)。
但是,其他选择已经差不多可用了。evince 的下一个版本将通过 D-Bus 支持 SyncTeX,而且显然有人已经在开发 vim 插件来利用它。详情请见此处。但是,此版本的 evince 不太可能已经适用于您的 Linux 发行版,并且可能存在一些问题。
有提供 synctex 支持的旧版本 evince 的旧分支;随附的说明详细说明了如何使用 gvim 进行设置。它工作正常。如果您使用的是 Arch Linux,则设置起来很容易,因为它在 AUR 中。如果您不是,我不知道编译起来有多难。(在使用 Arch 之前,我曾经使用过 Ubuntu,但无法在那里运行,但这可能是我的无知。)
接下来,我编写了一些脚本,它们提供了非常有限、非常差劲但总比没有好,即 gvim 和开源的类 vim PDF 查看器 Zathura 之间的同步支持,Zathura 使用类 vim 的键绑定。你将在 Arch 论坛的这个主题中可以找到对它们的提及和详细说明。(帖子 #370)
最后,我认为这种东西很快就会进入 vim 的主要 LaTeX 插件中,这样你就不必进行那么多反复试验了。
答案2
这是 evince 的解决方案,感谢编写 gedit-synctex-plugin 的 José Aliste:
前言
- 下载这些文件
- 将它们压缩到 ~/bin (或 $PATH 内的内容)
向后搜索(Evince → Editor)
- 根据您的需要采用 »~/bin/evince« (EDITORCMD) 的第一行。(运行 »evince_backward_search« 以获取可能条目的帮助)
- 使用 synctex 编译您的 .tex 文件 (»pdflatex -synctex=1 myfile.tex«)
- 运行»evince myfile.pdf«(脚本应该运行 evince_backward_search 和 evince)
- 使用 »Ctrl+leftclick« 单击 evince 中的某些文本
- 编辑器应该跳转到相应的行
正向搜索(编辑器 → Evince)
- 你必须告诉你的编辑器,当按下某些键时运行»evince_forward_search $PDFFILE $LINE $TEXFILE«。
- 转到编辑器中的某一行并按下键
- evince 应该标记相应的行
使用 vim-latexsuite,在 ~/.vim/ftplugin/tex.vim 中写入:
函数!Tex_ForwardSearchLaTeX() 让 cmd = 'evince_forward_search'.fnamemodify(Tex_GetMainFileName(), ":p:r").'.pdf'.line(".").' '.expand("%:p") 让输出 = 系统 (cmd) 结束函数
之后,你可以在 vim 中使用 \ls 进行向前搜索
答案3
下列的frabjous 的回答并参考了一些这篇博文我得到了这个GVim + Zathura。需要做的重要事情是:
- 配置
~/.config/zathura/zathurarc
设置反向搜索
作为:
set dbus-service true
set synctex true
set synctex-editor-command "gvim --servername GVIM --remote +%{line} %{input}"
- 配置
~/.vimrc
设置正向搜索
作为:
function! SyncTexForward()
let execstr = "silent !zathura --synctex-forward ".line(".").":".col(".").":%:p %:p:r.pdf &"
exec execstr
endfunction
au FileType tex nmap <Leader>f :call SyncTexForward()<CR>
编译 tex 文件如下
pdflatex -synctex=1 paper.tex
在 Zathura 中打开 pdf 文件。
(可选)打开 GVim
gvim paper.tex --servername GVIM
只需在用 Zathura 打开的 PDF 上的某个位置Ctrl+ - 打开 GVim 实例,如果没有打开 - 并执行反向搜索。从 GVim 进行正向搜索。ClickLeaderf
答案4
当然,我来晚了。我使用的是没有任何 tex 插件的 vim + ConteXt + synctex(但这也应该适用于 LaTeX),但这是我当前的方法(将文件另存为 ftplugin 目录):
if exists("b:did_context_synctex_plugin")
finish
endif
let b:did_context_synctex_plugin = 1
function! SynctexShow()
let synctex = glob("*.synctex.gz")
if strlen(synctex) == 0
echo "no synctex file found"
else
let pdffile = substitute(synctex,"synctex.gz","pdf","")
let execline = printf(":!okular --unique '%s#src:%d %s'", shellescape(pdffile), line("."),shellescape(bufname("%")))
exec execline
end
endfunction
map <buffer> <localleader>f :call SynctexShow()<Enter><Enter>
当使用 synctex 支持创建文档时,会生成一个文件“*.synctex.gz”,因此此脚本将只查找以“synctex.gz”结尾的文件,找到当前缓冲区并将视图与 pdf 查看器同步。由于使用 synctex 文件命名 pdf(必须具有相同的基本名称),因此可以拆分 TeX 文档并使用 synctex。