2011-09-28 14 views
16

我正在使用AUCTeX並且我想綁定一個鍵,例如, C-0,它具有以下功能:如何將latexmk綁定到Emacs中的一個鍵,並讓它顯示錯誤(如果有)

  1. 在不提示我的情況下保存活動文件。
  2. 在沒有提示我的情況下在活動文件上運行latexmk
  3. 如果latexmk遇到任何錯誤,則顯示錯誤。

我的問題是如何綁定一個鍵(其中泰勒張貼在下面的評論的鏈接)如何拿出該項目完成1-3的功能。


我打電話Latexmk通過

(add-hook 'LaTeX-mode-hook (lambda() 
    (push 
    '("Latexmk" "latexmk %s" TeX-run-TeX nil t 
     :help "Run Latexmk on file") 
    TeX-command-list))) 

這是我.latexmkrc

$pdf_mode = 1; 
$recorder = 1; 
$latex = 'latex -recorder -halt-on-error -interaction=nonstopmode -shell-escape'; 
$pdflatex = 'pdflatex -recorder -halt-on-error -interaction=nonstopmode -shell-escape'; 

我使用Emacs 23.3和AUCTeX 11.86。

+0

您要求的內容與已經在默認AucTex軟件包中提供的功能非常接近。你可能會從這個問題開始:http://stackoverflow.com/questions/2199678/how-to-call-latexmk-in-emacs-and-jump-to-next-error這將得到latexmk爲你排序,然後工作根據需要調整,以獲得您想要的特定行爲。 – Tyler

+0

@Tyler謝謝。我怎樣才能將這樣的命令綁定到一個鍵? –

+0

如果你按照第一個答案,'C-C C-c'應該用latexmk編譯你的tex文件(你可能需要修改配置文件來讓latexmk彈出默認設置,但是AucTex通常知道該怎麼做)。運行的實際命令是'TeX-command-master',您可以使用常規方法進行綁定:http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/ – Tyler

回答

13

類似這樣?

(require 'tex-buf) 

(defun run-latexmk() 
    (interactive) 
    (let ((TeX-save-query nil) 
     (TeX-process-asynchronous nil) 
     (master-file (TeX-master-file))) 
    (TeX-save-document "") 
    (TeX-run-TeX "latexmk" "latexmk" master-file) 
    (if (plist-get TeX-error-report-switches (intern master-file)) 
     (TeX-next-error t) 
     (minibuffer-message "latexmk done")))) 

(add-hook 'LaTeX-mode-hook 
      (lambda() (local-set-key (kbd "C-0") #'run-latexmk))) 

編輯TeX-save-document保存您的主文件和所有子文件(如果你只是有一個文件,它是你的主文件),而當TeX-save-query是零,它不要求你確認。然後TeX-run-TeX使用通常用於運行TeX的機制運行latexmk,其中包括錯誤消息解析,但由於它通常啓動異步進程,因此我們將TeX-process-asynchronous設置爲零以等待它結束。奇怪的plist-get表格是用於檢查TeX-run-TeX(請參閱tex-buf.el中的註釋)中的錯誤的記錄方式,如果有錯誤,我們跳到第一個;如果沒有錯誤,我們會在迷你緩衝區中顯示一條消息,只是爲了好玩。

最後,local-set-key是將鍵綁定到函數的一種方法。

+0

您介意解釋代碼嗎 –

+0

這很接近我一直在調整,但至少在我的系統(一個窗口框),LaTeX是異步運行的,所以'(pl​​ist-get ...)'不能可靠地返回true。它通過建議'TeX-TeX-sentinel-check',但這似乎令人難以置信的惡作劇... –

+0

哦,我明白了,你設置了TeX-process-asynch ronous到零,所以根本不會發生......那麼,應該工作:-) –

3

這是做你想做的嗎?

(defun my-tex() 
"Saves the current buffer and runs LaTeX, all with no prompts or further interaction." 
    (interactive) 
    (save-buffer) 
    (TeX-command "LaTeX" 'TeX-master-file -1)) 

我不使用latexmk,而是使這項工作,所有你需要做的是轉換字符串「乳膠」爲你TeX-command-list使用latexmk(名稱字符串,它可能只是「latexmk」或「Latexmk」)。

我很高興你問,因爲這對我現在會有用!

+1

我確實滿足我列表中的第1項和第2項。我想要一個窗口顯示錯誤,如果有的話。我在pdflatex中使用'-interaction = nonstopmode',所以我只想看到它停止的錯誤。 –

+0

對不起,我不知道如何latexmk的作品,所以我不知道該去哪裏。您已經啓發我調查讓Auctex填寫latexmk - 但應該有可能讓Auctex找出多少次運行pdflatex和bibtex而不必繼續打C-c C-c。儘管如此,這需要多一點點刺激。 – Tyler

2

假設你已經在使用的How to call latexmk in emacs, and jump to next-error答案補充latexmk爲AUCTeX命令列表,您可以使用以下功能:

(defun run-latexmk() 
    (interactive) 
    (save-buffer) 
    (TeX-command "Latexmk" 'TeX-master-file 0) 
    (if (plist-get TeX-error-report-switches (intern (TeX-master-file))) 
     (next-error))) ;; 0 -> suppress confirmation 

而且使用任何的鍵綁定技術將它綁定到C-0;這裏的一個局部於TeX的模式:

(define-key TeX-mode-map (kbd "C-0") 'run-latexmk) 

run-latexmk功能基礎上,通過挖掘TeX-command-master,它簡化了您的需求。請注意,致電(next-error)可能並不總是會發生,因爲LaTeX可能會因您的錯誤而感到困惑,並暫停等待輸入

+0

當我嘗試鍵控綁定時,即使我將它包裝在'eval-after-load'tex'中,我將「Symbol的值作爲變量是void:TeX-mode-map」。 –

+0

當我嘗試運行latexmk時,我還得到了「TeX-command-expand:錯誤類型參數:stringp,nil」。 –

+0

@ N.N。我承認我沒有真正從鍵綁定中運行它,只是'M-x run-latexmk',並且這對我有效......現在嘗試它,但是,我沒有看到你所做的錯誤。你可以通過用'(add-hook'LaTeX-mode-hook(lambda()(define-key ...))''define'key'來修復「Symbol's value ...」錯誤,這可以確保你在LaTeX模式下,我可以重現TeX-command-expand錯誤,但只有直接調用它時,上面的代碼纔不會......使用模式鉤子修復這兩個問題,還是隻解決一個問題? –

相關問題