3

我正在使用以下函数在 emacs 中的乳胶文件上运行 latexmk:

(defun my-run-latex ()
  (interactive)
  (if (buffer-modified-p)
      (progn  
        (setq TeX-save-query nil) 
        (TeX-save-document (TeX-master-file))
        (TeX-command "Latexmk" 'TeX-master-file -1))
    (TeX-view)))

(取自https://stackoverflow.com/a/14699078/406686)。

假设我有一个简单的文档 ( test.tex),其中有一些错误,例如:

\documentclass{article}

\begin{document}
\error1
\error2
\end{document}

现在,如果我按例如 Space 然后 Backspace (或进行任何更改并撤消它)然后运行my-run-latex​​latexmk 运行并说所有目标都是最新的。问题是然后我丢失了错误列表,所以TeX-next-error不会有任何影响。

我想这个问题可以通过(buffer-modified-p)在这种情况下替换为阻止运行 latexmk 的东西来解决(最好通过相同的测试 latexmk 来检查自上次运行以来文件是否更改)。知道怎么做吗?

4

1 回答 1

1

latexmk使用散列来确定文件是否已更改。使用的哈希算法是md5,它不是完全安全的,但这在这方面并不重要。因此,您可以使用基于哈希的测试而不是(buffer-modified-p). 以下代码应该可以工作:

(setq current-buffer-hash nil)
(make-variable-buffer-local 'current-buffer-hash)
(defun my-run-latex ()
  (interactive)
  (if (equal current-buffer-hash
         (setq current-buffer-hash (secure-hash 'md5 (current-buffer))))
      (TeX-view)
    (setq TeX-save-query nil)
    (TeX-save-document (TeX-master-file))
    (TeX-command "Latexmk" 'TeX-master-file -1)))

正如@student 所指出的,该功能secure-hash是在 Emacs 24.2 中引入的。对于以前的版本,可以使用(md5 (current-buffer)).

于 2013-08-09T21:25:59.447 回答