将Emacs AUCTeX与Sumatra PDF同步

6

通过在我的init.el文件中添加以下代码,我可以将Emacs的LaTeX缓冲区与Sumatra同步:

(setq TeX-source-correlate-mode t)
(setq TeX-source-correlate-method 'synctex)
(setq TeX-view-program-list 
  '(("Sumatra PDF" ("\"C:/bin86/SumatraPDF/SumatraPDF.exe\" -reuse-instance" 
                      (mode-io-correlate " -forward-search %b %n ") " %o"))))
(setq TeX-view-program-selection  
      '(((output-dvi style-pstricks) "dvips and start") (output-dvi "Yap") 
       (output-pdf "Sumatra PDF") (output-html "start")))

为了在PDF上双击后跳转到相关的LaTeX代码,我还在Sumatra选项中设置了Set inverse search command line为:

"c:\bin86\GNU Emacs 24.2\bin\emacsclient.exe" --no-wait +%l "%f" 

尽管同步正常工作,但我想用不同的方式编写代码。
如果我没有设置最后一个表达式(setq TeX-view-program-selection...,我将得到默认值,这些值与上面相同,除了PDF输出的值为:(output-pdf "start")。我想将其更改为“ Sumatra PDF”,并将其他值保留为默认值,也就是说,我想要求Emacs查找查看器的默认值,并仅更改PDF值。
这主要是关于变量TeX-view-program-selection的ELisp问题。谢谢帮助。
P.S.请告诉我这个问题是否最适合在tex.stackexchange上。
根据lunaryorn评论/答案的更新:
要更新TeX-view-program-selection,可以使用以下方法:
(assq-delete-all 'output-pdf  TeX-view-program-selection)
(add-to-list 'TeX-view-program-selection   '(output-pdf "Sumatra PDF"))

第一行是可选的,但它使列表看起来更加清洁。
在这两种情况下(有或没有“assq-delete-all”),我现在需要将代码插入到适当的钩子中,因为在“init.el”中,“TeX-view-program-selection”为空。

这个问题在这里没问题,但你应该真正接受一些回答来解决你的问题。 - Martin Schröder
@antonio 我已更新我的答案,以解释您的代码在正确的位置执行,即在 TeX-view-program-selection 定义之后。 - user355252
@MartinSchröder:我想我理解了你的观察。我为自己的答案准备了一步一步的解决方案,应该很容易被所有Emacs-Sumatra用户使用,并检查了绿色标记。 - antonio
5个回答

12

感谢lunaryorn的建议!我正在重新组织这些步骤,以使其他人受益。

Emacs侧

将以下内容添加到你的init.el中:

(setq TeX-PDF-mode t)
(setq TeX-source-correlate-mode t)
(setq TeX-source-correlate-method 'synctex)
(setq TeX-view-program-list
   '(("Sumatra PDF" ("\"path/to/SumatraPDF/SumatraPDF.exe\" -reuse-instance"
                      (mode-io-correlate " -forward-search %b %n ") " %o"))))

(eval-after-load 'tex
  '(progn
     (assq-delete-all 'output-pdf TeX-view-program-selection)
     (add-to-list 'TeX-view-program-selection '(output-pdf "Sumatra PDF"))))

苏门答腊侧面

在“设置”->“选项”对话框中,将设置反向搜索命令行为:

"path\to\GNU Emacs ver\bin\emacsclient.exe" --no-wait +%l "%f" 

使用方法

在Emacs中的LaTeX文档中,键入C-c C-v或在Sumatra中双击相关的PDF文件,然后……enjoy))


我还需要创建一个环境变量ALTERNATE_EDITOR,指向我的runemacs.exe,并将EMACS_SERVER指向我的emacs服务器文件(在.emacs.d\server目录中)。 - Ryan
由于官方的SumatraPDF没有包含反向搜索对话框,因此可以从emacs内部提供必要的内容:(add-to-list 'TeX-view-program-list '("Sumatra PDF" ("sumatrapdf -reuse-instance" (mode-io-correlate " -forward-search %b %n -inverse-search \"emacsclientw --no-wait +%%l \"\"%%f\"\"\" ") " %o"))) - mlt
以下是正确的引用:(add-to-list 'TeX-view-program-list '("Sumatra PDF" ("sumatrapdf -reuse-instance" (mode-io-correlate " -forward-search %b %n -inverse-search \"emacsclientw --no-wait +%%l \\\"%%f\\\"\" ") " %o"))),其中的 " 会根据 TeX-expand-list 进行扩展。另外,请注意,如果您使用 Chocolatey 来安装 Emacs 和 SumatraPDF,请注意 #372 - mlt

1
请使用add-to-list代替setq。有关更多信息,请参见C-h f add-to-listTeX-view-program-selectiontex.el中定义,因此您需要在加载此库后执行此代码:
(eval-after-load 'tex
  '(progn
     (assq-delete-all 'output-pdf TeX-view-program-selection)
     (add-to-list 'TeX-view-program-selection '(output-pdf "Sumatra PDF"))))

TeX-view-program-selection 中已经有了 (output-pdf "start") 元素。如果我使用 (add-to-list 'TeX-view-program-selection '(output-pdf "Sumatra PDF")),那么就会得到带有键 output-pdf 的两个相同的配对。 - antonio
1
add-to-list会在列表的开头添加新元素,而AUCTeX将使用TeX-view-program-selection中的第一个output-pdf元素。 - user355252
鉴于格式限制,我在评论中提到了编辑问题。 - antonio
抱歉,我没有注意到你的问题编辑。现在它按预期工作了,谢谢。 - antonio

1

我曾被Windows -> Emacs的引用约定折磨得几乎发疯

如果您将SumatraPDF安装在默认位置,则可以在Windows 8.1上使用此功能。

(setq TeX-view-program-list
   '(("Sumatra PDF" ("\"C:/Program Files (x86)/SumatraPDF/SumatraPDF.exe\" -reuse-instance"
          (mode-io-correlate " -forward-search %b %n ") " %o")))))

那是一个小时左右的时间我永远无法挽回 :)


0

我已经准备好了一个批处理文件,Emacs_SumatraPDF.bat

它与sumatra-forward.el完美配合,实现前后搜索。

例如:

下载

http://www.ai.soc.i.kyoto-u.ac.jp/~shi/files/Emacs_SumatraPDF.bat

http:/william.famille-blum.org/software/sumatra/sumatra-forward.el


准备

Emacs_SumatraPDF.batSumatraPDF.exe 放置到 %Emacs_Home%/bin 文件夹下。

sumatra-forward.el 放置到 %Emacs_Home%/site-lisp 文件夹下。


使用方法

;Emacs_Home=C:/Program Files (x86)/GNU Emacs 23.4
;~\.emacs add following information


;;; Emacs_SumatraPDF.bat
;;  @info: pdf viewer 
;   @refer: 
(setq TeX-view-program-list '(
      ("Sumatra" "C:/Program Files (x86)/GNU Emacs 23.4/bin/Emacs_SumatraPDF.bat 
                   %o %t %n") ))         

(setq TeX-view-program-selection '(
     (output-pdf "Sumatra") 
     (output-dvi "Yap") 
     ((output-dvi style-pstricks) "dvips and start") 
     (output-html "start"))) 

 ;;; sumatra-forward.el
 ;;  @info: forward search. 
 ;   @refer: http:/william.famille-blum.org/blog/static.php?page=static081010-000413
 (require 'sumatra-forward)

就是这样。


此外

Emacs 4 Latex Support 是针对新手为 Windows 7 下的 Emacs 提供的 LaTeX 支持。

http://chunqishi.github.io/emacs4ls/



0
值得一提的是,默认情况下,在“设置->选项”对话框中,Set inverse search command line是不可见的。要显示此选项字段,请转到Settings->高级选项或打开SumatraPDF-settings.txt并启用EnableTeXEnhancements = true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接