使用 Emacs 设置 SyncTeX

使用 Emacs 设置 SyncTeX

我想在 Ubuntu 中设置 SyncTeX 和 Emacs,或者更具体地说,使用 AUCTeX 和 Evince。我该怎么做?我想要正向搜索(从源到输出)和反向搜索(从输出到源)。

我尝试了以下操作但没有成功:

  • 我尝试这样做http://www.emacswiki.org/emacs/AUCTeX#toc19描述但是当我尝试向后搜索(Ctrl+左键单击)时我在 Emacs 中收到以下消息:

    apply:参数数量错误:(lambda(file linecol)(let((buf(get-buffer file))(line(car linecol))(col(cadr linecol)))(if(null buf)(消息“抱歉,%s未打开...”文件)(switch-to-buffer buf)(goto-line(car linecol))(unless(= col -1)(move-to-column col))))),3

  • 如果我尝试解决方案http://ubuntuforums.org/showpost.php?p=11010827&postcount=12我在 Emacs 中收到以下消息:

    符号作为变量的值为空:TeX-view-program-list

  • 当我尝试http://ubuntuforums.org/showthread.php?p=11010827#post11010827Emacs 冻结了一会儿,然后我在 Emacs 中收到以下消息:

    let*: D-Bus 错误:“未收到回复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止了回复、回复超时或网络连接中断。”

我在 Ubuntu 11.10 中使用 AUCTeX 11.86、Emacs 23.3.1 和 Evince 3.2.1。

答案1

我结合了这里提到的一些链接,您可以在源注释中找到链接。此代码支持:

  • 正向搜索(从 Emacs 到 Evince,通过C-c C-v
  • 向后/反向搜索(Evince 到 Emacs,通过C-Mouse-1,即在 Evince 中按 Ctrl +“左键单击”)
  • 带有空格的路径名
  • 多文件设置(如果 Evince 请求的 TeX 文件尚未打开,则将打开它们)
;SyncTeX 基础知识

;应该改进 un-urlify 和 urlify-escape-only 来处理所有特殊字符,而不仅仅是空格。
;空格的修复基于 http://emacswiki.org/emacs/AUCTeX#toc20 上的第一条评论

(defun un-urlify(fname-or-url)
  “将 file:///absolute/path 从 Gnome 转换为 /absolute/path,对特殊字符的支持非常有限”
  (如果(字符串 = (子字符串 fname-or-url 0 8)“file:///”)
      (url-unhex-string (子字符串 fname-or-url 7))
    fname-或-url))

(defun urlify-escape-only(路径)
  “处理 urlify 的特殊字符”
  (替换字符串中的正则表达式“”“%20”路径))

(defun urlify (绝对路径)
  “将 /absolute/path 转换为 file:///absolute/path 以适应 Gnome,对特殊字符的支持非常有限”
  (如果(字符串 = (子字符串绝对路径 0 1)“/”)
      (concat“file://”(urlify-escape-only 绝对路径))
      绝对路径)


;SyncTeX 向后搜索 - 基于 http://emacswiki.org/emacs/AUCTeX#toc20,转载于 https://tex.stackexchange.com/a/49840/21017

(defun th-evince-sync(文件行号和其余忽略)
  (let* ((fname (取消 urlify 文件))
         (buf(查找文件 fname))
         (线(车线col))
         (col(cadr 线col)))
    (如果(空缓冲区)
        (消息“[Synctex]:无法打开 %s” fname)
      (切换到缓冲区 buf)
      (转至行(汽车行列))
      (除非(= col -1)
        (移至列 col)))))

(defvar *dbus-evince-signal* nil)

(defun enable-evince-sync()
  (需要'dbus)
  ;cl 是 setf 所必需的,取自:http://lists.gnu.org/archive/html/emacs-orgmode/2009-11/msg01049.html
  (需要'cl)
  (当(和
         (eq 窗口系统'x)
         (fboundp'dbus 寄存器信号))
    (除非 *dbus-evince-signal*
      (setf *dbus-evince-信号*
            (dbus 寄存器信号
             :会话无“/ org / gnome / evince / Window / 0”
             “org.gnome.evince.Window” “同步源”
             'th-evince-sync)))))

(添加钩子‘LaTeX-mode-hook’启用-evince-sync)


;SyncTeX 正向搜索 - 基于 https://tex.stackexchange.com/a/46157

;; 通用时间,需要通过 evince
(defun utime()
  (让((高(nth 0(当前时间)))
        (低(第 n 个 1(当前时间))))
   (+ (* 高 (lsh 1 16) ) 低)))

;; 向前搜索。
;; 改编自 http://dud.inf.tu-dresden.de/~ben/evince_synctex.tar.gz
(defun auctex-evince-forward-sync(pdffile texfile 行)
  (让((dbus 名称
     (dbus 调用方法:会话
               “org.gnome.evince.Daemon”;服务
               “/org/gnome/evince/Daemon”;路径
               “org.gnome.evince.Daemon”;接口
               “查找文档”
               (urlify pdf文件)
               t ;如果文件未打开,则打开一个新窗口。
               )))
    (dbus 调用方法:会话
          dbus 名称
          “/org/gnome/evince/Window/0”
          “org.gnome.evince.窗口”
          “同步视图”
          (urlify-escape-only texfile)
          (列表:struct:int32 行:int32 1)
  (utime))))

(defun auctex-evince-view()
  (让((pdf(文件真名(连接默认目录
                    (TeX 主文件(TeX 输出扩展名)))))
    (tex(缓冲区文件名))
    (行(位置处的行号)))
    (auctex-evince-forward-sync pdf tex 行)))

;; 新的视图条目:通过 D-bus 的 Evince。
(setq TeX-view-program-list'())
(添加到列表'TeX-view-program-list
         '(“EvinceDbus” auctex-evince-view))

;; 通过 D-bus 将 Evince 添加到程序选择列表的前面
;;覆盖 PDF 查看的其他设置。
(setq TeX 视图程序选择'())
(添加到列表'TeX-view-program-selection
         '(输出 PDF“EvinceDbus”))

这可能会中断:

  • 包含空格以外的特殊字符的路径名

我使用了这些有用的链接:

我测试过

  • Emacs 24.2
  • Evince 3.4.0
  • OpenSUSE 12.2

答案2

你使用什么?(Linux、Windows、Mac)

如果您使用的是 Linux,那么 Okular 可能是最简单的 PDF 查看器,可以使用 emacs 设置 synctex 向前/向后搜索。安装 Okular 后,您可以将以下代码添加到 .emacs 配置文件中:

;; Okular

(setq TeX-view-program-list '(("Okular" "okular --unique %u")))

(add-hook 'LaTeX-mode-hook '(lambda ()
                  (add-to-list 'TeX-expand-list
                       '("%u" Okular-make-url))))

(defun Okular-make-url () (concat
               "file://"
               (expand-file-name (funcall file (TeX-output-extension) t)
                         (file-name-directory (TeX-master-file)))
               "#src:"
               (TeX-current-line)
               (expand-file-name (TeX-master-directory))
               "./"
               (TeX-current-file-name-master-relative)))

(setq TeX-view-program-selection '((output-pdf "Okular")))

答案3

我发布了一个针对您问题的解决方法这里。我会将相关部分粘贴到这里,以方便您查看,以防其他人遇到同样的问题。祝您好运!


我必须添加几行才能使其正常工作。

最初,我收到了以下错误:

Symbol's value as variable is void: TeX-view-program-list

然后我在第 38 行和第 39 行之间添加了以下行:

(setq TeX-view-program-list '())

不幸的是,我开始收到错误:

Symbol's value as variable is void: TeX-view-program-selection

因此我在第 43 行和第 44 行之间添加了以下行:

(setq TeX-view-program-selection '())

它解决了问题。我不知道为什么:-P这是一个反复试验的问题。现在一切都正常了。

编辑:正如 percusse 所建议的,我认为最好将我的两个答案合并为一个。以下是完整解释:

请查看我的 ~/.emacs 文件中有关正向和反向搜索的相关部分(见下文)。在添加我提到的两行和另外三行(只是为了选择 pdflatex、启动服务器并选择并激活 synctex)后,我在我的系统(Debian Wheezy + Gnome 3.2.1 + Emacs 23.3.1 + Evince 3.2.1)中获得了一个具有反向和正向搜索的 evince + emacs + auctex 工作环境。

当然,本文的所有功劳都归功于作者,参考了前面提到的链接。我将其粘贴在这里只是为了方便您阅读。

;; Forward/inverse search with evince using D-bus.

(server-start)
(add-hook 'LaTeX-mode-hook 'TeX-PDF-mode)
(add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
(setq TeX-source-correlate-method 'synctex)

(if (require 'dbus "dbus" t)
(progn
  ;; universal time, need by evince
  (defun utime ()
(let ((high (nth 0 (current-time)))
      (low (nth 1 (current-time))))
  (+ (* high (lsh 1 16) ) low)))

  ;; Forward search.
  ;; Adapted from http://dud.inf.tu-dresden.de/~ben/evince_synctex.tar.gz
  (defun auctex-evince-forward-sync (pdffile texfile line)
    (let ((dbus-name
       (dbus-call-method :session
                 "org.gnome.evince.Daemon"  ; service
                 "/org/gnome/evince/Daemon" ; path
                 "org.gnome.evince.Daemon"  ; interface
                 "FindDocument"
                 (concat "file://" pdffile)
                 t     ; Open a new window if the file is not opened.
                 )))
      (dbus-call-method :session
            dbus-name
            "/org/gnome/evince/Window/0"
            "org.gnome.evince.Window"
            "SyncView"
            texfile
            (list :struct :int32 line :int32 1)
    (utime))))

  (defun auctex-evince-view ()
    (let ((pdf (file-truename (concat default-directory
                      (TeX-master-file (TeX-output-extension)))))
      (tex (buffer-file-name))
      (line (line-number-at-pos)))
      (auctex-evince-forward-sync pdf tex line)))

  ;; New view entry: Evince via D-bus.
  (setq TeX-view-program-list '())
  (add-to-list 'TeX-view-program-list
           '("EvinceDbus" auctex-evince-view))

  ;; Prepend Evince via D-bus to program selection list
  ;; overriding other settings for PDF viewing.
  (setq TeX-view-program-selection '())
  (add-to-list 'TeX-view-program-selection
           '(output-pdf "EvinceDbus"))

  ;; Inverse search.
  ;; Adapted from: http://www.mail-archive.com/[email protected]/msg04175.html
  (defun auctex-evince-inverse-sync (file linecol timestamp)
    (let ((buf (get-file-buffer (substring file 7)))
      (line (car linecol))
      (col (cadr linecol)))
      (if (null buf)
      (message "Sorry, %s is not opened..." file)
    (switch-to-buffer buf)
    (goto-line (car linecol))
    (unless (= col -1)
      (move-to-column col)))))

  (dbus-register-signal
   :session nil "/org/gnome/evince/Window/0"
   "org.gnome.evince.Window" "SyncSource"
   'auctex-evince-inverse-sync)))

答案4

如果有人没有运行 DE(gnome/kde 等),则使用上述脚本时,emacs 可能会抛出以下错误胜利者

D-Bus error: "No connection to bus", :session

然后运行

eval `dbus-launch` 
export DBUS_SESSION_BUS_ADDRESS 

在启动 emacs 之前从终端启动。或者将其修改为.xinitrc

我使用 TexLive 2011、CVS 的 AucTex、emacs 24.1、evince 3.4.0 并且不使用 DE。

相关内容