如何在 Linux 下使用 vim、pdflatex 和开源 PDF 查看器设置 synctex?

如何在 Linux 下使用 vim、pdflatex 和开源 PDF 查看器设置 synctex?

灵感来自对此答案的评论我很好奇如何在 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 的说明这里以及一些相关观察这里。我按照这些指示得到了不同的结果。以下似乎是重要的。

  1. 确保您的 LaTeX 编译方法(取决于您的插件)使用该-synctex=1标志调用 pdflatex(或 xelatex 或其他)。

  2. 我认为类似这样的操作应该足以满足 Okular 的前向搜索要求,不过最好尝试重写或修改插件的前向搜索功能(上面的某个链接中有一些相关信息)。将其放入 .vimrc 中(并将映射更改为您喜欢的任何内容)。

    function! SyncTexForward()
         let execstr = "silent !okular --unique %:p:r.pdf\\#src:".line(".")."%:p &"
         exec execstr
    endfunction
    nmap <Leader>f :call SyncTexForward()<CR>
    
  3. 对于反向搜索,请将 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:

前言

  1. 下载这些文件
  2. 将它们压缩到 ~/bin (或 $PATH 内的内容)

向后搜索(Evince → Editor)

  1. 根据您的需要采用 »~/bin/evince« (EDITORCMD) 的第一行。(运行 »evince_backward_search« 以获取可能条目的帮助)
  2. 使用 synctex 编译您的 .tex 文件 (»pdflatex -synctex=1 myfile.tex«)
  3. 运行»evince myfile.pdf«(脚本应该运行 evince_backward_search 和 evince)
  4. 使用 »Ctrl+leftclick« 单击 evince 中的某些文本
  5. 编辑器应该跳转到相应的行

正向搜索(编辑器 → Evince)

  1. 你必须告诉你的编辑器,当按下某些键时运行»evince_forward_search $PDFFILE $LINE $TEXFILE«。
  2. 转到编辑器中的某一行并按下键
  3. 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 文件。

  • (可选)打开 GVimgvim 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。

相关内容