在 Emacs 上,我尝试使用 Okular 进行前向搜索。目前,我有以下命令:
okular --unique %o#src:%n`pwd`/./%b
但是,这并没有像我预期的那样将我带到正确的行。所以,这里有一个问题。为了解决这个问题,我尝试阅读手动的对于 okular 我可以找到。
可疑的是,没有任何%
命令出现在那里。出现的三个命令是:
(1)%f
-文件名
(2)%l
- 文件的行号
(3)%c
- 文件的列号
%
如果您能解释一下我写的命令中出现了哪些命令,并帮助我找到在这种情况下有效的前向搜索命令,我将非常高兴。
您可能想知道的相关版本:
Emacs ------- 24.3.1
奥克拉 ------- 0.16.2
AucTeX ------- 11.86
TeXLive ------ 2012
请随时询问任何相关的问题。
PS 依我拙见,这个问题与前面的问题并不重复。我问了一个非常精确的问题,不是工作方法,而是对我已有内容的修复。:-)
但是,我确实同意这只是边界技术。
答案1
当--synctex=1
传递给 TeX 引擎时,同步TeX创建 Okular 可用于正向搜索的元数据。要让 Okular 在正确的位置打开 PDF,您必须生成 SyncTeX 元数据并像这样调用 Okular:
okular document_name#named_destination
从 TeX Live 2011 开始,语法为named_destination
:
src:<line_number><directory_containing_main_tex_file>/./<relative_path_to_file.tex>
注意<directory_containing_main_tex_file>
必须是绝对路径。这个要求是TeX Live 2011 新增,这就是为什么 AUCTeX 中的前向搜索不再“有效”的原因。
<relative_path_to_file.tex>
.tex
是从包含主文件的目录到 Emacs 中正在访问的文件的相对路径。
例子
假如你有以下两个 TeX 文件:
/tmp/foo/main.tex
:\documentclass{} \begin{document} \input{bar/stuff} \end{document}
/tmp/foo/bar/stuff.tex
:hello world \clearpage{} blah %%% Local Variables: %%% mode: latex %%% TeX-master: "../main" %%% End:
并运行:
cd /tmp/foo
pdflatex --synctex=1 main
然后执行以下命令:
okular 'main.pdf#src:3/tmp/foo/./bar/stuff.tex' &
应该跳转到第 2 页(打印“blah”的位置)。
在 AUCTeX 中启用 SyncTeX
要配置 AUCTeX 以传递--synctex=1
到 TeX 引擎并生成 PDF,请执行以下操作:
- 启用 PDF 模式:
- 类型
M-x customize-variable <RET> TeX-PDF-mode <RET>
- 切换“Tex Pdf 模式”(非零)
- 点击“状态”并选择“保存以供将来的会话”
- 类型
- 启用 SyncTeX:
- 类型
M-x customize-variable <RET> TeX-source-correlate-mode <RET>
- 切换“Tex 源相关模式”(非零)
- 点击“状态”并选择“保存以供将来的会话”
- 类型
配置 AUCTeX 以启动 Okular
要配置 AUCTeX 使用适当的命令行参数启动 Okular,请执行以下操作:
- 定义新的扩展器来获取主文件的目录
.tex
:- 类型
M-x customize-variable <RET> TeX-expand-list <RET>
- 向列表中添加新条目:
- 钥匙:
%(masterdir)
- 扩展器:
(lambda nil (file-truename (TeX-master-directory)))
- 参数:无
- 钥匙:
- 点击“状态”并选择“保存以供将来的会话”
- 类型
为 Okular 定义一个新的视图程序:
- 类型
M-x customize-variable <RET> TeX-view-program-list <RET>
向列表中添加新条目:
- 姓名:
Okular
- 选择:命令
命令:
okular --unique %o#src:%n%(masterdir)./%b
请注意,在执行命令之前
%o
,、、和会被 AUCTeX 替换,因此永远不会看到它们(它看到的是扩展)。%n
%(masterdir)
%b
okular
%o
是生成的 PDF 的名称,%n
是您正在访问的文件的行号,%(masterdir)
是包含主.tex
文件的目录的绝对路径,是从主文件到您正在访问的文件的%b
相对路径。.tex
- 姓名:
- 点击“状态”并选择“保存以供将来的会话”
- 类型
- 将 Okular 配置为 PDF 查看器:
- 类型
M-x customize-variable <RET> TeX-view-program-selection <RET>
- 将
output-pdf
查看器更改为Okular
- 点击“状态”并选择“保存以供将来的会话”
- 类型
或者您可以将以下内容放入您的.emacs
:
;; use Okular to view AUCTeX-generated PDFs
(when (require 'latex nil t)
(push '("%(masterdir)" (lambda nil (file-truename (TeX-master-directory))))
TeX-expand-list)
(push '("Okular" "okular --unique %o#src:%n%(masterdir)./%b")
TeX-view-program-list)
(push '(output-pdf "Okular") TeX-view-program-selection))
答案2
在你的.emacs
位置
(eval-after-load "tex"
'(add-to-list 'TeX-expand-list '("%a" (lambda nil (expand-file-name (buffer-file-name))))))
现在您可以使用
("okular --unique %o" (mode-io-correlate "#src:%n%a"))
用于 Okular 命令。
更新:需要说明的是,这一变化已经引入在 AUCTeX 的开发版本中,从下一个稳定版本(11.88?)开始,不再需要使用肮脏的黑客来使用 Okular 进行前向搜索。
答案3
有一天,我精心设计的 Emacs/Okular 配置无法工作,于是我偷了这个代码:
;; Quick-Fix BEGIN
(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)))
;; Quick-Fix END
(setq TeX-view-program-list
'(("Okular"
("okular --unique %u")))) ;; <<-- This is part of the quick-fix.
;; If all is in sync again, one can
;; hopefully use the regular method
;; from the next line again.
;; ("okular --unique %o" (mode-io-correlate "#src:%n%b")))))
(setq TeX-view-program-selection '((output-pdf "Okular")))
;;(setq TeX-view-program-list '(("Okular" "okular --unique %o#src:%n%(dir)./%b")))
高血压