我正在使用以下函数在emacs中的latex-file上运行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
不会有任何影响。
我想这个问题可以通过在这种情况下用阻止运行latexmk的东西替换(buffer-modified-p)
来解决(最好通过相同的测试latexmk来检查自上次运行以来文件是否发生了变化)。知道怎么做吗?
答案 0 :(得分:1)
latexmk
使用hashing来确定文件是否已更改。使用的哈希算法是md5
,它不是完全安全的,但这在这方面并不重要。因此,您可以使用hash-based测试而不是(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))
。