如何在 emacs 中运行 dvi2ps2pdf 后自动打开 pdf 文件

如何在 emacs 中运行 dvi2ps2pdf 后自动打开 pdf 文件

我想让 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%fSumatraPDF将打开foo.ps

如果我替换%o%s.pdfSumatraPDF将打开两个损坏的文件foo.pdf

如果我替换SumatraPDF %ostart \"\" %s.pdfAdobe Reader将正确打开foo.pdf

这真令人沮丧。我该如何编辑代码让 SumatraPDF 接管一切?以及如何%o %f %s正确使用这些替换?对不起,我真的没有经验,但似乎它们属于不同的约定?非常感谢!

更新


在@giordano 的帮助下,我倾向于相信这是一个固有的问题SumatraPDFAdobe 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)并尝试以lispDOS命令的方式删除双引号。引号不会消失,由于缺乏经验,我失败了。

你们有什么想法吗?谢谢!

更新


感谢@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

解决方案比您目前所做的要简单得多:定义一个运行latexdvips和 的命令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,如果前一个命令成功退出,则运行以下命令,我不知道批处理类似是什么。

相关内容