如何使用 AUCTeX 和 Zathura 设置正向/反向搜索

如何使用 AUCTeX 和 Zathura 设置正向/反向搜索

我还没有找到太多关于如何设置 Zathura 与 AUCTeX/Emacs 进行正向/反向搜索的信息。有人成功做到了吗?

答案1

Zathura SyncTeX 接口最近有所改变(撰写本文时我使用的是 v0.3.2):现在没有-s激活 SyncTeX 的标志。SyncTeX 可能一直处于活动状态。

Zathura 的两个恼人的怪癖使得 SyncTeX 支持变得复杂:

  1. --synctex-forward如果文件尚未打开,Zathura 不会接受。
  2. 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 消息并使用xdotoolwmctrl(是的,两者)来升起窗口。

~/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

相关内容