阅读提示:

本栏目已经不再维护,其中内容可能已过时。

本页主要讲述安装 VIM LaTeX Suite 后,如何配置正向、反向查找。关于 VIM LaTeX Suite 的下载地址,可以在 VIM 常用插件简介页面中找到,安装步骤请参看说明书,这里不再详细解说。

1 简介

正向搜索指的是在生成的 dvi 文件中查找 LaTeX 源代码中指定位置所对应的 dvi 段落、图表或其它元素;反向搜索指的是在生成的 dvi 文件中查找指定段落、图表或其它元素所对应源代码的位置。

众所周知,LaTeX 并不是一个“所见即所得”的编辑环境,因此许多时候我们需要通过反复编译、查看效果来调节我们编写的代码。正向搜索可以为代码的调节工作带来极大便利──当我们修改了一段代码后,只需要编译它,然后通过正向搜索直接跳转到 dvi 中与该段对应的位置,即可立即直接查看到这段代码的效果。

而反向搜索在校对稿件的时候尤其有用。当发现了错别字或病句的时候,可以通过 dvi 文件反向搜索源代码位置,快速跳转到源代码中的相应位置,以便迅速而方便地修改这个错误。

2 Linux 下针对 xdvi 的配置

2.1 修改 .tex 文件的打开方式

VIM 打开文件的时候,为了提高效率,会为文件生成一个 swap 文件,因此同一个文件是不能在多个不同的 VIM 下重复打开的。为了让反向搜索能够正常工作,我们必须让 VIM 运行在 remote 模式下。在这里,我们通过修改 .tex 的打开方式来实现这一点。

KDE 下的修改方法:

X-tex

打开 Konqueror,点“设置”→“配置 Konqueror”,在弹出的对话框中选择“文件关联”,在右侧的窗口中找到“已知类型”→“text/x-tex”,如图所示。如果不存在 text/x-tex 项的话,就自己新建一个。选中 x-tex,在右侧窗口中点击“添加”,然后在弹出的窗口中输入:

gvim --servername "latex-suite" --remote-silent "%f"

注意:VIM7 目前暂不支持为不同的文件生成不同的 ViewRule,因此在 VIM7 下暂时不能使用为不同的文件选择不同的 servername 功能。如果你使用 VIM7 的话,这里的 servername 参数请使用 latex-suite。

点击“确定”后使用“上移”按钮,将新建的打开方式移动到列表的第一位,使它成为 .tex 文件的默认打开方式。之后在 Konqueror 中双击 .tex 文件时,将使用 remote 模式的 VIM 打开。关于 remote 模式的详细介绍,请参看 VIM 的用户手册:

:help remote

2.2 修改 .vimrc,支持 xdvi

作者仅在 TeXLive 2004 下测试过 xdvi 的搜索功能,在低版本的 xdvi 下也许无法使用,请尽量升级到最新版本。

为了能正常使用正向、反向搜索需要让编译得到的 dvi 具有源代码的行号信息。我们在调用 latex 的时候提供“-src-specials”参数来生成带有行号信息的 dvi 文件。在你的 .vimrc 中添加以下内容:

let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"

为了能够使用反向搜索,必须让 xdvi 知道当前编辑器是工作在 remote 模式下的 VIM,以便在用户搜索的时候调用编辑器显示查找结果。由于 remote 模式的 servername 是根据命令行确定的,因此不同的文件 servername 不一样,如何在 VIM 里识别这个名字就成了一个问题。滇狐目前使用 autocommand 的形式获取这个参数,比较不优雅,有很重的“hack”的痕迹。如果有更好的主意,请务必与滇狐联系。在你的 .vimrc 中添加以下内容:

function RemoteLaTeX()
    let g:Tex_ViewRule_dvi="xdvi -editor 'gvim --servername \"".expand("%:p")
        \."\" --remote-silent'"
    augr remotelatex
    au!
    augr END
endfunction

配置完毕后存盘退出,现在 VIM LaTeX 套装就能够配合 xdvi 工作了。

2.3 命令行工具

使用这样的方式开启 gVim,需要在命令行给出文件的全路径,以便正确设置 servername。如果在 Konquerer 里双击打开,它把文件的全路径传递给 gVim,能够正常工作。但如果在命令行下启动 gVim 的话,手工设置正确的命令行就比较不容易了。因此,如果在命令行下编辑 LaTeX 文档,请使用这段 Shell 脚本启动 gVim:

#!/bin/sh

if [ $# -lt 1 ]; then
    echo Usage: gvim-latex filename
else
    for i in "$@"
    do
        gvim --servername latex-suite --remote-silent "$i"
    done
fi

使用方法是:

gvim-latex my-latex-file.tex

2.4 使用方法

通过双击 .tex 文件的方式打开 remote 模式的 VIM (如果觉得有必要的话,可以再写一个 sh 脚本,用来启动 remote 模式的空 VIM),然后编辑 .tex 文件。编辑完毕后在 normal 模式下按“\ll”命令编译文件。编译成功后,将光标移动到想要查看效果的 LaTeX 源代码上方,然后在 normal 模式下按“\ls”,VIM 会打开一个 xdvi,并自动跳转到该源代码所对应的位置上。在 xdvi 中按住 Ctrl 键单击页面元素,便可在 VIM 中自动跳转到相应的源代码处。反向搜索时,最好展开 VIM 中的所有 folder。

3 Windows 下针对 yap 的配置

3.1 修改 .tex 文件的打开方式

打开资源管理器,点击“工具”→“文件夹选项”,在弹出的对话框中选择“文件类型”。在“已注册的文件类型”列表中任意选择一个,然后在键盘上快速输入“tex”,定位到 .tex 文件的打开方式项上。如果不存在 .tex 文件类型的话,点击“新建”创建一个。

选中 .tex 文件类型后,点击窗口下方的“高级”按钮,在弹出的窗口中修改默认打开方式的命令行。如果所有打开方式均没有设为默认的话,则“open”为默认打开方式。选中要编辑的打开方式,单击“编辑”按钮,在弹出的窗口中输入命令行为:

gvim.bat --servername "%1" --remote-silent "%1"

这里使用文件的全路径作为 servername,这样编辑不同的文件就可以使用不同的 gVim 而不用担心出现任何冲突,感谢华宇煜提出这个创意。

注意:VIM7 目前暂不支持为不同的文件生成不同的 ViewRule,因此在 VIM7 下暂时不能使用为不同的文件选择不同的 servername 功能。如果你使用 VIM7 的话,这里的 servername 参数请使用 latex-suite。

单击确定后退出文件夹选项对话框,之后双击 .tex 文件后将使用工作在 remote 模式的 VIM 打开。

WinTeX

3.2 修改 _vimrc,生成搜索数据

为了能正常使用正向、反向搜索需要让编译得到的 dvi 具有源代码的行号信息。我们在调用 latex 的时候提供“-src-specials”参数来生成带有行号信息的 dvi 文件。在你的 .vimrc 中添加以下内容:

let g:Tex_CompileRule_dvi="latex -src-specials -interaction=nonstopmode $*"

3.3 修改 yap 配置,支持 VIM

打开 yap,点击菜单“View”→“Options”,在弹出的对话框中选择“Inverse Search”选项页,在“Command”下方的文本框中写上:

gvim.bat --servername "%f" --remote-silent +%l "%f"

“确定”后就可以使用 yap 的反向搜索功能了。

注意:VIM7 目前暂不支持为不同的文件生成不同的 ViewRule,因此在 VIM7 下暂时不能使用为不同的文件选择不同的 servername 功能。如果你使用 VIM7 的话,这里的 servername 参数请使用 latex-suite。

无须配置正向搜索,VIM LaTeX Suite 里已经内置了正向搜索的相关配置。

Yap

3.4 使用方法

通过双击 .tex 文件的方式打开 remote 模式的 VIM (如果觉得有必要的话,可以再写一个批处理文件,用来启动 remote 模式的空 VIM),然后编辑 .tex 文件。编辑完毕后在 normal 模式下按“\ll”命令编译文件。编译成功后,将光标移动到想要查看效果的 LaTeX 源代码上方,然后在 normal 模式下按“\ls”,VIM 会打开一个 yap,并自动跳转到该源代码所对应的位置上。在 yap 中双击页面元素,便可在 VIM 中自动跳转到相应的源代码处。反向搜索时,最好展开 VIM 中的所有 folder。

4 综述

VIM LaTeX Suite 是一套非常优秀的插件,具有很强的可扩展性。如果你使用的 dvi 查看器不在上面列出的范围之内,只要查看器支持,都可以通过相关配置很方便地整合到 VIM 中。