我想在 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”))
这可能会中断:
- 包含空格以外的特殊字符的路径名
我使用了这些有用的链接:
- https://tex.stackexchange.com/a/46157(向前搜索)
- http://emacswiki.org/emacs/AUCTeX#toc20(向后搜索、空格处理)
- http://lists.gnu.org/archive/html/emacs-orgmode/2009-11/msg01049.html(修复缺失的 setf)
我测试过
- 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。