我还没有找到太多关于如何设置 Zathura 与 AUCTeX/Emacs 进行正向/反向搜索的信息。有人成功做到了吗?
答案1
Zathura SyncTeX 接口最近有所改变(撰写本文时我使用的是 v0.3.2):现在没有-s
激活 SyncTeX 的标志。SyncTeX 可能一直处于活动状态。
Zathura 的两个恼人的怪癖使得 SyncTeX 支持变得复杂:
--synctex-forward
如果文件尚未打开,Zathura 不会接受。- Zathura 窗口在接收时不会窃取焦点
--synctex-forward
。
因此,我的 Emacs/AUCTeX 设置如下:
我正在运行一个 Emacs 服务器,它
emacsclient
负责查找我的框架和文件。将以下内容添加到您的 .emacs 中,让 AUCTeX 知道您想要调用
zathura-forward-search
打开编译的 pdf:
(TeX-source-correlate-mode) ; activate forward/reverse search
(TeX-PDF-mode)
(add-to-list 'TeX-view-program-list '("zathura" zathura-forward-search))
(setq TeX-view-program-selection (quote ((output-pdf "zathura") (output-dvi "xdvi"))))
该函数
zathura-forward-search
很复杂:它负责处理哪些 Zathura 进程已被 Emacs 打开并且仍然处于活动状态,因此可以安全地--synctex-forward
向哪些进程发送指令。否则,它会为该文件生成一个新的 Zathura 进程。此外,它使用小工具wmctrl
随后将焦点放在 Zathura 窗口上。这应该安装在机器上并安装在该行工作的路径中。(setq zathura-procs ()) (defun zathura-forward-search () ;; Open the compiled pdf in Zathura with synctex. This is complicated since ;; 1) Zathura refuses to acknowledge Synctex directive if the pdf is not ;; already opened ;; 2) This means we have to bookkeep open Zathura processes ourselves: first ;; open a new pdf from the beginning, if it is not already open. Then call ;; Zathura again with the synctex directive. (interactive) (let* ((zathura-launch-buf (get-buffer-create "*Zathura Output*")) (pdfname (TeX-master-file "pdf")) (zatentry (assoc pdfname zathura-procs)) (zatproc (if (and zatentry (process-live-p (cdr zatentry))) (cdr zatentry) (progn (let ((proc (progn (message "Launching Zathura") (start-process "zathura-launch" zathura-launch-buf "zathura" "-x" "emacsclient +%{line} %{input}" pdfname)))) (when zatentry (setq zathura-procs (delq zatentry zathura-procs))) (add-to-list 'zathura-procs (cons pdfname proc)) (set-process-query-on-exit-flag proc nil) proc)))) (pid (process-id zatproc)) (synctex (format "%s:0:%s" (TeX-current-line) (TeX-current-file-name-master-relative))) ) (start-process "zathura-synctex" zathura-launch-buf "zathura" "--synctex-forward" synctex pdfname) (start-process "raise-zathura-wmctrl" zathura-launch-buf "wmctrl" "-a" pdfname) ))
启动进程的错误将被打印在创建的缓冲区中
*Zathura Output*
。wmctrl
如果多个窗口的标题中包含 pdf 的名称,则调用可能无法打开正确的窗口。
答案2
几个月前,Zathura 进行了更新,--synctex-forward
如果文件尚未打开,则调用将打开该文件。因此,@jsrn 的答案实际上打开了两个 Zathura 实例,而替代方案现在要简单得多。
将其添加到您的 emacs 配置中或者'TeX-mode-hook
如果您有或更早版本应该可以工作v11.89.1
:
(add-to-list 'TeX-view-program-list
'("Zathura"
("zathura "
(mode-io-correlate " --synctex-forward %n:0:%b -x \"emacsclient +%{line} %{input}\" ")
" %o")
"zathura"))
(add-to-list 'TeX-view-program-selection
'(output-pdf "Zathura"))
一次乔达诺的改变使其成为 AUCTeX 的下一个版本,那么您只需将 Zathura 添加到视图程序选择中:
(add-to-list 'TeX-view-program-selection
'(output-pdf "Zathura"))
答案3
Zathura+AUCTeX 的前向搜索几乎完美,但缺少一件事:Zathura 的窗口不会自动升起。这里有一个 hack 解决方案,它监视 DBus 消息并使用xdotool
和wmctrl
(是的,两者)来升起窗口。
~/bin/zathura-raise.sh
:
#!/bin/bash
dbus-monitor --profile "type='method_call', path='/org/pwmt/zathura',member=SynctexView" | sed -Eune '/zathura/{s/^.*PID-([0-9]+).*$/\1/;p}' | xargs -L 1 xdotool search --pid | sed -Eune '2~2p' | xargs -L 1 wmctrl -iR
虽然您可以zathura-raise.sh
手动运行,但这里有一个systemd
服务文件zathura-raise.service
。将其保存在 中~/.config/systemd/user
,通过 启动它systemctl --user start zathura-raise.service
,通过 启用它systemctl --user enable zathura-raise.service
,然后忘掉它。
~/.config/systemd/user/zathura-raise.service
[Unit]
Description=Raise Zathura window on Synctex forward search
[Service]
ExecStart=%h/bin/zathura-raise.sh
Restart=always
[Install]
WantedBy=multi-user.target