我的设置是运行命令行界面 vim(使用 iTerm)和 Skim 作为我的 pdf 查看器。我想使用 Skim 设置 synctex,但我尝试过的所有方法都没有奏效。以下是我正在做的事情:
- 我正在使用 pdflatex 和 -synctex=1 进行编译
- Skim 需要 synctex 的命令和参数。我的命令是 /usr/bin/vim,我的参数是 --remote-silent +"%line" "%file"
这没用。我也尝试了提供的建议这里,它说要制作一个 bash 脚本,运行一个可以操纵我的编辑器的自动脚本。但我也无法让它工作(这似乎也相当笨重)。
我也愿意更换 pdf 查看器,所以如果您对如何让 synctex 与 iTerm vim 和其他 pdf 查看器一起工作有任何建议那就太好了。
答案1
经过一番头痛之后,我让 synctex 在 CLI vim(在 osX 终端上)和 Skim 之间工作,因此我可以向您概述我的设置:
我使用 latexmk 进行编译并执行以下操作他们的建议我的 .latexmkrc 文件看起来像
$pdf_previewer = 'open -a Skim';
$pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode';
@generated_exts = (@generated_exts, 'synctex.gz');
这对于 synctex 使用来说可能不是完全必要的,但它允许我使用 .vimrc 中的简单命令从 .tex 文档进行编译和查看,例如:
nnoremap <leader>c :w<CR> :silent !latexmk -pdf -pv -halt-on-error % <CR> <C-L><CR>
我使用的是 Skim 1.6.3 版本,直接从他们的网站。
正向搜索(.tex/vim 到 .pdf/Skim)非常简单,只需使用稍微修改过的命令(再次在我的 .vimrc 中)即可你提到的来源:
nnoremap <leader>f :w<CR>:silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> %<.pdf<CR> <C-L><CR>
编辑(2023-01-28):如果您有多文件文档,则向前搜索会更加复杂,但我刚刚解决了这个问题,因此我将其添加到后文中。上述命令搜索与当前 .tex 文档名称匹配的 pdf 文件。如果您使用的是使用 include{} 和章节/节的主 .tex 文件,则必须指定输出 pdf 的名称和当前 .tex 章节/节文档才能向前搜索。这个答案给了我足够的信息继续使用 .synctex.gz 文件自动命名输出 pdf,并且我的 .vimrc 中的前向搜索如下所示:
nnoremap <leader>f :silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> <C-r>=substitute(glob("*synctex.gz"),"synctex.gz","pdf","")<CR> % <CR><C-L>
如果您正在编译没有 .synctex.gz 文件的文档,则可以在 if 语句中组合这些方法:
nnoremap <leader>f
\ :if filereadable(glob("*.synctex.gz"))
\ <bar> silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> <C-r>=substitute(glob("*synctex.gz"),"synctex.gz","pdf","")<CR> % <CR>
\ <bar> else
\ <bar> silent !/Applications/Skim.app/Contents/SharedSupport/displayline <C-r>=line('.')<CR> %<.pdf<CR>
\ <bar> endif <CR><C-L>
编辑结束 (2023-01-28)
反向搜索(.pdf/Skim 到 .tex/vim)有点棘手。我发现我的 Mac 上的原生 vim(版本 8.0,High Sierra 10.13.6)没有 --remote 功能,所以我使用 macports 安装了 vim 版本 8.2,并使用 +huge +gtk2 +X11 +clientserver 进行构建:
sudo port install vim +huge +gtk2 +X11 +clientserver
如果您不想要/没有 macports(或 homebrew 等)或不想安装其他 vim,您可以通过从源代码构建并包含必要的部分来升级 mac 的原生 vim,但我选择这条路线是因为我喜欢保留原生内容。请注意,您还需要安装 X11。
之后,我将 Skim 中的命令(Skim > 首选项 > 同步 > PDF-Tex 同步支持)设置为/opt/local/bin/vim
(我安装的新 vim),并将选项设置为--servername VIM --remote-silent +%line "%file"
。我发现,如果我使用相同的命令()在 vim 中打开我的 .tex 文件/opt/local/bin/vim --servername VIM --remote-silent <file>
,则可以使用 Command+Shift+Click 从 Skim 进行反向搜索。
我真的不知道为什么我必须在这里指定服务器名称,但这似乎是必要的。例如,如果我打开 vim 而不指定服务器名称(或使用未内置远程支持的 vim),此功能将不起作用。Skim 也无法打开新的 vim 实例,所以我必须已经打开了文档(使用指定的命令)。这个设置对我来说是可行的,但我认为可以编写一个 Skim 调用的 shell 脚本,该脚本会查找打开的 vim 实例,如果未找到,则正确打开一个(类似于你引用的来源,但实际上适用于 CLI vim)。为了方便一些,我在 .bashrc 中编写了一个命令,专门用于打开 .tex 文件以供 Skim 使用:
lvim ()
{/opt/local/bin/vim --servername VIM --remote-silent "$1"}
所以现在我只需从终端打开我想要的 .tex 文件,然后手动 ( ) 或通过编译 ( ) 或正向搜索 ( )从 vim$lvim <file>.tex
打开 Skim ,正向和反向搜索功能就可以使用了。open -a Skim <file>.pdf
<leader>c
<leader>f
我想在这里把所有事情都说清楚,因为我还没有找到通过 synctex 将标准 CLI vim 与 Skim 配对的(有效)描述。但是,我应该指出,如果您只是在 osX 上寻找某种 vim/synctex/Skim 组合,并且不依赖 CLI vim,那么使用 macvim 肯定更容易。我使用 macports 安装了 macvim,并使用了 Skim 的 macvim 预设,它立即起作用了,包括在调用反向搜索且 .tex 文件未打开时打开一个新的 macvim 实例。