2011-09-28 11 views
16

Sto usando AUCTeX e vorrei associare una chiave, ad es. C-0, vale quanto segue:Come legare latexmk a una chiave in Emacs e farlo visualizzare errori se ci sono

  1. Salva il file attivo senza che venga richiesto.
  2. Esegue latexmk sul file attivo senza che venga richiesto.
  3. Mostra errori se latexmk riscontra uno qualsiasi.

Il mio problema è non come associare un tasto (per la quale Tyler postato un link in un commento qui sotto) ma come a venire con una funzione che compie punto 1-3.


io chiamo latexmk da

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

Questo è il mio .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'; 

sto usando Emacs 23.3 e AUCTeX 11.86.

+0

Quello che stai chiedendo è molto vicino alle funzioni che sono già disponibili nel pacchetto AucTex predefinito. Si potrebbe iniziare con questa domanda: http://stackoverflow.com/questions/2199678/how-to-call-latexmk-in-emacs-and-jump-to-next-error che otterrà il latexmk ordinato per te, quindi funzionerà sul tweaking che, se necessario, per ottenere il comportamento particolare che si desidera. – Tyler

+0

@Tyler Grazie. Come posso associare un comando di questo tipo a una chiave? –

+0

Se si segue la prima risposta, 'C-c C-c' dovrebbe compilare il proprio file tex con latexmk (potrebbe essere necessario modificare i file di configurazione per ottenere latexmk come popup di default, ma AucTex di solito sa cosa fare). Il comando effettivo che viene eseguito è 'TeX-command-master', che puoi associare usando il solito approccio: http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/ – Tyler

risposta

13

Qualcosa di simile?

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

Edit: TeX-save-document salva il file master e gli eventuali sub-file (solo se si dispone di un file, è il file master), e quando TeX-save-query è pari a zero, non vi chiederà conferma . Quindi TeX-run-TeX esegue latexmk utilizzando il meccanismo solitamente utilizzato per l'esecuzione di TeX, che include l'analisi dei messaggi di errore, ma poiché di solito avvia un processo asincrono, impostiamo TeX-process-asynchronous su nil per attendere che termini.Il modulo plist-get dall'aspetto strano è il modo documentato per verificare gli errori da TeX-run-TeX (vedere i commenti in tex-buf.el) e se ci sono errori, passiamo al primo; se non ci sono errori, mostriamo un messaggio nel minibuffer solo per divertimento.

Infine, lo local-set-key è un modo per associare un tasto alla funzione.

+0

Ti spiace spiegare il codice? –

+0

Questo è abbastanza vicino a quello che ho tweaking con. Ma sul mio sistema almeno (una finestra di Windows), LaTeX viene eseguito in modo asincrono, e quindi '(plist-get ...)' non restituisce in modo affidabile vero. Sono riuscito a lavorare consigliando 'TeX-TeX-sentinel-check', ma sembra incredibilmente hacker ... –

+0

Oh capisco, hai impostato TeX-process-asynch rono a zero, così che semplicemente non accade ... beh, dovrebbe funzionare :-) –

3

Fa questo ciò che vuoi?

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

Io non uso latexmk, ma per fare quel lavoro tutto quello che dovete fare è cambiare la stringa "LaTeX" per la stringa nome utilizzato per latexmk in TeX-command-list (che è probabilmente solo "latexmk" o "latexmk").

Sono contento che tu abbia chiesto, dato che ora mi sarà utile!

+1

I soddisfa gli articoli 1 e 2 della mia lista. Mi piacerebbe una finestra che mostra errori se ce ne sono. Sto usando '-interaction = nonstopmode' con pdflatex quindi mi piacerebbe solo vedere l'errore che si ferma con. –

+0

Scusa, non so come funziona latexmk quindi non sono sicuro di dove andare. Mi hai ispirato a indagare su come ottenere Auctex per il latexmk: dovrebbe essere possibile ottenere Auctex per capire quante volte eseguire pdflatex e bibtex senza dover continuare a colpire C-c C-c. Però ci vorrà un po 'di più. – Tyler

2

Supponendo che hai già provato la risposta in How to call latexmk in emacs, and jump to next-error aggiungere latexmk alla lista dei comandi per AUCTeX, è possibile utilizzare la seguente funzione:

(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 

E utilizzare una qualsiasi delle tecniche chiave vincolante per associarlo a C-0; ecco uno che è locale per la modalità TeX:

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

La funzione run-latexmk è basata su scavare attraverso TeX-command-master, e semplificando alle proprie esigenze. Nota che la chiamata a (next-error) potrebbe non succedere sempre, perché LaTeX potrebbe essere confuso dal tuo errore e sospendere l'attesa dell'input

+0

Ottengo "Il valore del simbolo come variabile è void: TeX-mode-map" quando provo la combinazione di tasti anche se lo avvolgo in 'eval-after-load 'tex'. –

+0

Ho anche "TeX-comando-espandi: argomento tipo errato: stringp, nil" quando provo a eseguire-latexmk. –

+0

@ N.N. Ammetto che in realtà non l'ho eseguito dal bind del tasto, ma solo 'M-x run-latexmk', e questo ha funzionato per me ... Provando ora, però, non vedo gli errori che fai. Puoi correggere l'errore "Valore del simbolo ..." avvolgendo la 'define-key' con' (add-hook 'LaTeX-mode-hook (lambda() (define-key ...)) ', che ti garantisce Sono in modalità LaTeX.Posso riprodurre l'errore di espansione di comando TeX, ma solo se lo chiamo direttamente, che il codice sopra non ... L'uso del gancio di modalità risolve entrambi i problemi, o un solo problema per te? –