一次性命令在Emacs + AUCtex下进行编织和Latexmk

3

我希望能够使用一个AUCtex命令来编制和处理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)))

当我运行C-c C-c (KnitrLaTeX)时,Emacs会运行以下命令:
Running `KnitrLaTeX' on `slides.Rnw' with ``Rscript -e "library(knitr); knit('slides.Rnw')" && latexmk -pdf slides.Rnw''

这是错误的。应该写成"... && latexmk -pdf slides.tex"
提前感谢。

我认为[tex.se]可能更适合这个。 - user1864610
1个回答

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))))) ))

这非常有效!我添加了 (add-to-list 'TeX-expand-list'("%(ppp-file-name)" (lambda () (concat "\"" (car (split-string(buffer-file-name)"\\.Rnw"))".tex" "\"")))) 并将编译命令修改为 (add-hook 'LaTeX-mode-hook (lambda () (push '("KnitrLaTeX" "Rscript -e \"library(knitr)\; knit('%s')\" && latexmk -pdf %(ppp-file-name)" TeX-run-TeX nil t :help "Run knitr and latexmk on file") TeX-command-list)))。修改后emacs运行的完整命令示例是:Rscript -e "library(knitr);knit('slides.Rnw')"&& latexmk -pdf"[path]/slides.tex"。非常感谢! - Sang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接