1

我使用 emacs+AucTeX 编写 LaTeX 文件。文件底部.tex是一些局部变量:

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "master-file"
%%% End: 

这些是由 AucTeX 在我创建文件时添加的。

我想做的是编写一个 lisp 函数,它将执行以下操作:

  1. 检查是否存在特定的局部变量(调用它pdf-copy-path
  2. 如果此变量存在,请检查它是否是格式正确的(unix)目录路径
  3. 如果是,请将输出 pdf 复制到该文件夹

输出 pdf 与当前文件同名.tex,但带有.pdf扩展名。

我的 lisp-fu 无法做到这一点,而且我不知道如何让函数检查当前文件中的局部变量。任何指针表示赞赏。

我为这个问题选择了 SO 而不是 SU,因为这似乎是一个关于 lisp 编程的问题,而不是其他任何问题。

4

1 回答 1

2

我不知道您是否真的想要一个完整的解决方案,或者宁愿自己探索更多,但这里有一些应该有所帮助的事情。如果您遇到困难,请再次发布:

  • 该变量file-local-variables-alist包含您要查找的值。您想使用其中一个assoc函数从 alist 中获取 pdf-copy-path 的值。

  • file-exists-p您可以使用该函数检查文件是否存在,以及它是否是具有file-attributes(第一个元素)的目录。

  • 然后使用copy-file.

(FWIW,我认为输出 PDF 输出将匹配 TeX-master 而不是当前文件。)

[2011-03-24 编辑 - 提供代码]

这应该适用于具有局部变量块的 TeX 文件,例如

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "master"
%%% pdf-copy-path: "/pdf/copy/path"
%%% End: 

请注意 TeX-master 值和 pdf-copy-path 值周围的双引号。TeX-master 也可以t

(defun copy-master-pdf ()
  "Copies the TeX master pdf file into the path defined by the
file-local variable `pdf-copy-path', given that both exist."
  (interactive)
  ;; make sure we have local variables, and the right ones
  (when (and (boundp 'file-local-variables-alist)
             (assoc 'pdf-copy-path file-local-variables-alist)
             (assoc 'TeX-master file-local-variables-alist))
    (let* ((path (cdr (assoc 'pdf-copy-path file-local-variables-alist)))
           (master (cdr (assoc 'TeX-master file-local-variables-alist)))
           (pdf (cond ((stringp master)
                      ;; When master is a string, it should name another file.
                       (concat (file-name-sans-extension master) ".pdf"))
                      ((and master (buffer-file-name))
                      ;; When master is t, the current file is the master.
                       (concat (file-name-sans-extension buffer-file-name) ".pdf"))
                      (t ""))))
      (when (and (file-exists-p pdf)
                 (file-directory-p path))
        ;; The 1 tells copy-file to ask before clobbering
        (copy-file pdf path 1)))))
于 2011-02-14T15:25:28.923 回答