2014-07-22 2 views
4

.Rnw 뜨개질을 한 후 LaTeX을 시작하고 싶습니다. 가장 큰 문제는 뜨개질 만 latexing 시작하는 후를 완료 열등한 버퍼를 기다릴 이맥스를하는 것입니다이맥스가 자동으로 Rnw 파일을 라텍스 뜨기로 만들었습니다.

(defun knit() 
    (interactive) 
    (setq rproc (ess-get-process ess-current-process-name)) 
    (setq c "knit('foo.rnw')\n") 
    (process-send-string rproc c) 
    ;; Wait for ESS to finish 
    (shell-command-to-string "cd foo/path & pdflatex foo")) 

: 메타 코드는 뭔가처럼 shoudl. 흥미로운 기능이 두 가지 발견되었습니다 : (ess-wait-for-process ...) (열등한 ess-mark-as-busy ...)`가능성이 있지만 작동하지 않을 수 있습니다.

(shell-command-to-string ...은 예시에 불과합니다.

(TeX-command "LaTeX" 'rnw-to-tex-ext -1)) 

knit2pdf() 갈 다른 경로가 될 수도 있지만, 나는 AUCTeX의 이익을 잃게됩니다 : 최종 선택이 될 수 있습니다.


추신 : 내 질문은 SE 로봇에 의해 "주관적이고 닫힐 것 같은"것으로 간주됩니다!?

답변

1

나는 texi2pdf을 사용하고 R은 니트 후에 처리하지만 분명히 knit2pdf에 해당합니다. 나는 system을 사용하여 과 비슷한 방법으로 knit 명령 뒤에 R 내에서 원하는 tex 명령을 호출 할 수 있는지 궁금합니다.

나는 emacs 전문가가 아니지만 여기에 가치가있는 것은 내 .emacs 파일에있는 기능입니다.

; use knitr (was Sweave) script as compile function for Rnw files 
(defun ess-swv-SweaveSh() 
    "Use knitr script to knit an Rnw file and create a pdf." 
    (interactive) 
    (let 
    ((compilation-buffer-name-function (function (lambda(ign)(concat "*" (buffer-file-name) "*"))))) 
    (compile (concat "Rscript -e \".n <- '" (buffer-file-name) "'; library(knitr); knit(.n); library(tools); texi2pdf(sub('Rnw$','tex',.n))\"")) 
) 
) 
+0

knit2pdf 단지 +의 texi2pdf 니트되고, 당신은 단지 .Rnw – antonio

+0

깔끔한 감사를 통과 연장을 걱정할 필요가 없습니다! 나는 이것이 OP에 유용하지 않다고 가정하고,'knit2pdf'가 그들에게 유용하지 않다고 지정했다. 다른 대답이 없으므로 다른 아이디어를 추가하겠습니다 ... – Aaron

+0

가능한 해결책을 찾았습니다. 제발 좀 봐. – antonio

1

가능한 해결책은 하위 ESS 프로세스의 속성 인 'busy을 점검하는 것입니다. while 루프가 nil을 기다리는 동안 명령 에코를 차단합니다. 이것이 (redisplay)입니다. 친애하는 것을 강조하기 위해서 새로 고침 지연 (sleep-for .5)도 설정했습니다.
ESS가 멈 추면 60 초 후에 루프가 존재합니다. 중량 코드가있는 경우 조정하십시오.

마지막으로 AUCTeX에 ​​라텍스를 부착했습니다. 따라서 LaTeX-command-styleTeX-expand-list 문서의 도움으로 맞춤 설정할 수 있습니다.

이 함수는 니트 및 라텍스 파일의 적절한 이름을 자동으로 설정하고 R 작업 디렉토리를 니트 할 .Rnw 파일로 설정하여 다른 스크립트를 소스하거나 데이터를로드 할 수 있습니다.
M-x knit으로 어디에서나 실행하거나 단축키와 연결할 수 있습니다. 이 함수는 뜨개질하기 전에 최종 변경 사항이있는 버퍼를 저장하고 사용할 수없는 경우 하위 R 버퍼를 엽니 다. 그렇지 않으면 기존의 것을 사용합니다.

(defun knit() 
    "Save the buffer, knit and latex" 
    (interactive) ; You will associate this to you favourite key 

    (let* (
    ;; Get names & path 
     (cur-dir (file-name-directory (buffer-file-name))) 
    (rnw-name (file-name-nondirectory (buffer-file-name))) 
    (tex-name (concat (file-name-base (buffer-file-name)) ".tex")) 

    ;; Create knit command 
    (cmd (format "require(knitr); setwd('%s'); knit('%s')" cur-dir rnw-name)) 

    ;; Time the knitting 
    (start-time (float-time)) 
    (wait 60) ; Lifeboat to exit loop if smt wrong 
    ) 

    ;; Save rnw buffer... you are lazy, I know) 
    (save-buffer) 


    ;; Send string to R at low-level 
    ;;(setq rproc (ess-get-process ess-current-process-name)) 
    ;;(process-send-string rproc c) 

    ;; or Send line with the ESS wrapper 
    (ess-eval-linewise cmd) 

    ;; While loop to check when 
    (setq start-time (float-time) 
     wait 60) ; Lifeboat to exit loop after x secs 

    ;; Wait for 'busy property nil, nut not more than wait seconds 
    (setq rproc (ess-get-process ess-current-process-name)) 
    (while (< (- (float-time) start-time) wait) 
     (sleep-for .5) 
     ;; (accept-process-output rproc .5) ;alt. way for process-send-string 
     (redisplay) 
     (if (not (process-get rproc 'busy)) 
     (setq wait 0) 
    (message "Knitting... "))) 
    (message "Knitting finished, starting latexing") 

    ;; Set LaTeX your fav options. See TeX-expand-list for % pars 
    (setq LaTeX-command-style '(("" "%(PDF)%(latex) -file-line-error %S%(PDFout)"))) 
    ;; TeX-command requires a 'file function (anonymous here) returning the filename. 
    ;; TeX-command/TeX-expand-list say 'file has one opt arg: extension. 
    ;; Actually they are 2, despite the second seems always passed true. 
    (TeX-command "LaTeX" (lambda (&optional ext dummy) tex-name)))) 
+0

위대한과 나는 그것이 아직 표시된 대답이 아닌지 궁금해. 그 이후로이'knit' 함수에 대한 업데이트가 있습니까? 이 함수를'TeX-command-list'에 어떻게 추가할까요? – doctorate

관련 문제