使用这个答案 我已经能够让 emacs、syntex 和 evince 近乎完美地协同工作,以支持正向搜索(tex 文件 -> pdf)和反向搜索(pdf -> tex 文件)。我唯一缺少的是支持从多个打开的 pdf 副本中进行搜索。
更详细地说,我写技术论文时习惯打开多个 pdf 副本(在 evince 中使用 ctrl+n 打开副本),但当我这样做时,打开的副本不再链接回 emacs。也就是说,ctrl+click 在从 emacs 打开的原始 pdf 中有效,而在打开的副本(通过在 evince 中执行 ctrl+n 创建)中的 ctrl+click 不起作用。
我的猜测是,这可能更多的是一个 evince 问题,而不是 emacs 问题,但我的问题是如何才能使从第二个 pdf 进行反向搜索有效?
答案1
这是受到ttb
自己的解决方案的启发。将 emacs 注册到 dbus 信号的代码在函数中TeX-source-correlate-mode
,如下所示:
(dolist (de-app '(("gnome" "evince") ("mate" "atril") ("x" "reader")))
(when (TeX-evince-dbus-p (car de-app) (cadr de-app))
(dbus-register-signal
:session nil (format "/org/%s/%s/Window/0" (car de-app) (cadr de-app))
(format "org.%s.%s.Window" (car de-app) (cadr de-app))
"SyncSource"
'TeX-source-correlate-sync-source)))
因此(作为一种黑客解决方案),您可以运行相同的代码,并0
用 替换,i
只要i
您认为可以同时打开多个窗口即可。
因此,我把以下内容放入我的.emacs
文件中:
(defun my/add-ten-more-synctex-windows ()
(dotimes (i 10)
(dolist (de-app '(("gnome" "evince") ("mate" "atril") ("x" "reader")))
(when (TeX-evince-dbus-p (car de-app) (cadr de-app))
(dbus-register-signal
:session nil (format "/org/%s/%s/Window/%d" (car de-app) (cadr de-app) (1+ i))
(format "org.%s.%s.Window" (car de-app) (cadr de-app))
"SyncSource"
'TeX-source-correlate-sync-source)))))
(add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
(add-hook 'LaTeX-mode-hook 'my/add-ten-more-synctex-windows)
答案2
我通过编辑 atril 的代码解决了这个问题。请注意,可能还存在尚未发现的基于 emacs 的解决方案。
关于 emacs <--> atril 交互如何与 pdf -> tex 搜索一起工作的一些背景知识。在 emacs 中,我们在 dbus 路径“/org/mate/atril/Window/0”上监听消息,atril 在 dbus 路径“/org/mate/atril/Window/N”上发送消息,其中 N 是文档的 window_id(每次我们按 Ctrl+N 打开副本时,window_id 都会递增)。
因此,问题是副本正在 emacs 未监听的 dbus 路径上发送消息。实现此目的的一种巧妙方法是让 atril 始终在路径“/org/mate/atril/Window/0”上发送 synctex 命令,而不考虑 window_id。
为此:ev_window_sync_source
在 ev-window.c 中找到 ,并修改该函数中出现的函数调用的参数g_dbus_connection_emit_signal
。具体来说,只需用 替换 即可window->priv->dbus_object_path
。g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, 0)
(这适用于 github 上提供的 atril 1.18.5 代码)
答案3
Joj 的上述解决方案非常好。但它是单向的,即多个 evince 窗口指向多个 emacs 缓冲区。是否可以扩展解决方案以反向运行,即如果我单击特定的 emacs 缓冲区,它会转到特定的 evince 窗口。现在,当我单击任一 emacs 缓冲区时,它只会转到原始 evince 窗口,而不是 evince 窗口的副本。[抱歉:这是一个问题/评论,而不是答案]