我想让 emacs 在输入后自动打开 pdf 文件,因此我在文件C-c C-c dvi2ps2pdf RET
中添加了以下代码.emacs
;;dvi2ps2pdf
(add-to-list 'TeX-command-list
(list "dvi2ps2pdf" " dvips %s.dvi | ps2pdf %s.ps %s.pdf | SumatraPDF %o"
'TeX-run-command nil t))
它工作得很好,直到我发现如果 tex 文件包含以下内容foo.tex
,它就会失败,\usepackage{psfrag}
% foo.tex
\documentclass{article}
\usepackage{psfrag}
\begin{document}
\[ e^x=\sum_{n=0}^{\infty}\frac{x^n}{n!}\]
\end{document}
SumatraPDF 将打开foo.dvi
而不是foo.pdf
。
如果我输入C-c C-n
并重新开始,只要我不编译并生成新的,它就会再次正常工作foo.div
。
经过编译并foo.div
创建,
如果我替换%o
为%f
,SumatraPDF
将打开foo.ps
如果我替换%o
为%s.pdf
,SumatraPDF
将打开两个损坏的文件foo
和.pdf
如果我替换SumatraPDF %o
为start \"\" %s.pdf
,Adobe Reader
将正确打开foo.pdf
这真令人沮丧。我该如何编辑代码让 SumatraPDF 接管一切?以及如何%o
%f
%s
正确使用这些替换?对不起,我真的没有经验,但似乎它们属于不同的约定?非常感谢!
更新
在@giordano 的帮助下,我倾向于相信这是一个固有的问题SumatraPDF
(Adobe Reader
我也这么认为)。
我认为在 Linux 或 Mac 上没有问题。然而,在 Windows 上,在DOS
命令中,我发现以下内容是相同的,例如,
copy foo.pdf bar.pdf
copy "foo".pdf bar.pdf
copy "foo.pdf" bar.pdf
- ...
其他外部命令(例如dvips
和 )ps2pdf
也不区分大小写。但是,SumatraPDF 将foo.pdf
或"foo.pdf"
视为同一个文件,并将"foo".pdf
视为两个单独的文件foo
,甚至.pdf
和 会打开它们。
我认为这就是为什么SumatraPDF
总是无法打开的原因%s.pdf
。这是一个文件名解析缺陷,如果我是对的,SumatraPDF
它不打算像.pdf
在 Windows 系统上那样打开文件,它应该能够自动检测到。
附言
我还尝试操作字符串%s.pdf
(=“foo”.pdf)并尝试以lisp
或DOS
命令的方式删除双引号。引号不会消失,由于缺乏经验,我失败了。
你们有什么想法吗?谢谢!
更新
感谢@giordano,我尝试了一下cygwin
。(我已经cygwin
安装了 doc view,一点问题都没有。)事实证明,它SumatraPDF
在 cygwin 上运行良好,即它接受诸如"foo".pdf
. 之类的文件名,所以我决定将所有命令行调用重定向到 cygwin。我在.emacs
文件中添加了以下内容(参见emacswiki),
;; Sets your shell to use cygwin's bash, if Emacs finds it's running
;; under Windows and c:\cygwin exists. Assumes that C:\cygwin\bin is
;; not already in your Windows Path (it generally should not be).
;;
(let* ((cygwin-root "c:/cygwin")
(cygwin-bin (concat cygwin-root "/bin")))
(when (and (eq 'windows-nt system-type)
(file-readable-p cygwin-root))
(setq exec-path (cons cygwin-bin exec-path))
(setenv "PATH" (concat cygwin-bin ";" (getenv "PATH")))
;; By default use the Windows HOME.
;; Otherwise, uncomment below to set a HOME
;; (setenv "HOME" (concat cygwin-root "/home/eric"))
;; NT-emacs assumes a Windows shell. Change to bash.
(setq shell-file-name "bash")
(setenv "SHELL" shell-file-name)
(setq explicit-shell-file-name shell-file-name)))
此后,SumatraPDF
识别%s.pdf
就正常了。
不过,还有一个问题。dvi2ps
在 cygwin 上运行不同,无法继续,我提出了问题别的地方。
附言
的代码SumatraPDF
已经得到改进,以适应类似情况"foo".pdf
。希望我们能看到它是如何工作的很快。
答案1
解决方案比您目前所做的要简单得多:定义一个运行latex
、dvips
和 的命令ps2pdf
。这样,当TeX-PDF-mode
处于活动状态时,PDF 将由您的默认 PDF 查看器打开,而无需进行任何进一步的更改。在您的 init 文件中,您可以添加类似以下内容:
(add-to-list
'TeX-command-list
'("dvi2ps2pdf" "%(latex) %s && dvips %s.dvi && ps2pdf %s.ps %s.pdf" TeX-run-command nil t))
我不熟悉 DOS 批处理脚本,在 UNIX shell 中&&
是逻辑 AND,如果前一个命令成功退出,则运行以下命令,我不知道批处理类似是什么。