Одноразовая команда для вязания и latexmk под Emacs + AUCtex

Я хочу связать документы Knitr AND latexmk с помощью одной команды AUCtex. Я не знаю, как писать код на лиспе, а веб-поиск ничего подобного не обнаружил.

У меня есть кое-что близкое. Для 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"

Заранее спасибо.


person Sang    schedule 25.10.2013    source источник
comment
Думаю, лучше для этого подойдет TeX - LaTeX   -  person    schedule 25.10.2013


Ответы (1)


Похоже, у вас возникли проблемы с тем, как второе использование %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))))) ))
person lawlist    schedule 25.10.2013
comment
Это прекрасно работает! Я добавил (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" Большое вам спасибо! - person Sang; 28.10.2013