在Emacs + AUCtex下一次性命令编织和latexmk

San*_*ang 3 emacs auctex latexmk knitr

我想使用一个AUCtex命令编织AND latexmk Knitr文档.我不知道如何在lisp中编码,而网络搜索没有发现这样的事情.

我有一些接近的东西.需要为latexmk更改文件的扩展名.任何帮助将不胜感激.

以下行是我的.emacs文件.

(add-hook 'LaTeX-mode-hook (lambda () (push '
  ("KnitrLaTeX" "Rscript -e \"library(knitr)\; knit('%s')\" && latexmk -pdf %s" 
   TeX-run-TeX nil t :help "Run knitr and latexmk on file") 
   TeX-command-list)))
Run Code Online (Sandbox Code Playgroud)

当我运行时C-c C-c (KnitrLaTeX),emacs运行以下命令:

Running `KnitrLaTeX' on `slides.Rnw' with ``Rscript -e "library(knitr); knit('slides.Rnw')" && latexmk -pdf slides.Rnw''
Run Code Online (Sandbox Code Playgroud)

哪个错了.它应该读"... && latexmk -pdf slides.tex"

提前致谢.

law*_*ist 5

看来,您有怎样的麻烦第二的使用%s你的编译命令的尾部被解释-也就是说,你希望第二的使用%s是指slides.tex代替slides.Rnw.

虽然我不熟悉knit,但我熟悉创建用于AUCTeX的自定义变量.下面列出了一些如何创建自定义变量并将其添加到自定义变量的示例TeX-expand-list.

而不是使用的%s第二时间(即,在您的编译命令的尾端),或许可以考虑使用%(tex-file-name)替代.这假设您的*.tex文件在开始编译命令时在焦点缓冲区中打开 - 即,完整文件名将插入到编译命令中.

如果你有一个不同扩展名的文件在运行你的编译命令时在缓冲区中打开并且你想要基本名称是相同的(但具有不同的扩展名),那么你会做类似于%(pdf-file-name)- 例如,移除任何扩展名并将其替换为新扩展名.

(eval-after-load "tex" '(progn

  (add-to-list 'TeX-expand-list '("%(tex-file-name)" (lambda ()
    (concat "\"" (buffer-file-name) "\""))))

  (add-to-list 'TeX-expand-list '("%(pdf-file-name)" (lambda ()
    (concat
      "\"" (car (split-string (buffer-file-name) "\\.tex"))
      ".pdf" "\""))))

  (add-to-list 'TeX-expand-list '("%(line-number)" (lambda ()
    (format "%d" (line-number-at-pos))))) ))
Run Code Online (Sandbox Code Playgroud)