2010-02-04 12 views
26

Tôi muốn sử dụng latexmk để biên dịch tài liệu LaTeX của mình trong Emacs. Đặc biệt tôi cần chức năng Emacs next-error, thường được gọi với C-x `và nhảy tới lỗi LaTeX tiếp theo trong tài liệu.Cách gọi latexmk trong các emacs và chuyển sang lỗi tiếp theo

Tôi muốn gọi latexmk hoặc sử dụng C-x compile hoặc AUCTeX C-c C-c.

Đầu tiên, tôi đặt latexmk sử dụng

$pdflatex = 'pdflatex -interaction=nonstopmode'; 

Lựa chọn 1: C-x biên dịch

Tôi nhấn C-x compile và gõ latexmk -pdf foo, chạy pdflatex. Nhưng next-error sẽ không nhảy đến các lỗi, ngay cả khi * biên soạn * buffer chứa lỗi:

! Paragraph ended before \author was complete. 
<to be read again> 
        \par 
l.48 
[...] 
Compilation exited abnormally with code 12 

Làm thế nào tôi có thể tự động chuyển đến lỗi này trong dòng 48?

Lưu ý rằng câu hỏi phân tích cú pháp đầu ra latex này không liên quan trực tiếp với latexmk. Cùng một vấn đề xảy ra khi tôi chỉ làm C-x compile pdflatex -interaction=nonstopmode foo.

Phương án 2: AUCTeX

Làm thế nào tôi có thể thiết lập AUCTeX gọi latexmk -pdf thay vì pdflatex trong hồ sơ .tex của tôi? Tất nhiên, tôi muốn next-error cũng hoạt động ở đây.

CẬP NHẬT: Tôi đã bắt đầu tiền thưởng bởi vì nếu điều này làm việc nó sẽ là một công cụ tuyệt vời cho nhiều người. Tôi xem xét câu hỏi được trả lời nếu giải pháp cho phép tôi dễ dàng biên dịch tài liệu LaTeX của mình bằng cách sử dụng latexmk trong Emacs và chuyển đến lỗi bằng cách sử dụng next-error (tất nhiên, các lỗi có thể là bao gồm .tex tệp, không nhất thiết phải là chủ tệp hoặc bộ đệm hiện tại).

CẬP NHẬT: Nhờ Ivan (và Chris) để thực hiện công việc AUCTeX + Latexmk. Trong khi chờ đợi, tôi thấy rằng việc sử dụng Rubber để biên dịch LaTeX cũng là một lựa chọn tuyệt vời. Nó sẽ hiển thị thông báo lỗi theo định dạng được sử dụng bởi gcc và các trình biên dịch khác, vì vậy nó tự động hoạt động với Emacs C-x compile, ví dụ: C-x compile rubber --pdf foo và các thông báo lỗi được phân tích cú pháp chính xác.

+0

Xem thêm câu hỏi liên quan từ xa này http://stackoverflow.com/questions/738755/dont-make-me. – Frank

+0

Ngoài ra còn có 'TeX-run-compile' để bạn có thể sử dụng giao diện AucTeX để khởi động quá trình biên dịch. Hãy thử 'C-h v TeX-command-list RET' để xem danh sách đầy đủ các phương thức khác nhau có sẵn. –

+0

Xem thêm https://github.com/tom-tan/auctex-latexmk, có sẵn thông qua người quản lý gói Emacs (không chắc chắn về repo nào). – Blaisorblade

Trả lời

27

Rất tiếc, tôi không có khả năng nhận xét hoặc tôi chỉ thêm nhận xét này làm nhận xét. Câu trả lời của Chris Conway hoạt động, ngoại trừ việc nó nên sử dụng TeX-run-TeX thay vì TeX-run-command để AucTeX biết xử lý các thông báo lỗi.

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

Nó cũng có thể là khôn ngoan để thêm một cái gì đó giống như

'("%(-PDF)" 
    (lambda() 
    (if (and (not TeX-Omega-mode) 
      (or TeX-PDF-mode TeX-DVI-via-PDFTeX)) 
     "-pdf" ""))) 

để TeX-expand-list và sử dụng "latexmk %(-PDF) %s" để nó sẽ làm việc trong cả pdf và DVI mode. Cá nhân, tôi thấy dễ dàng hơn khi sử dụng tùy chỉnh đặc biệt khi bạn đang thử nghiệm.

+0

Cảm ơn, điều đó hoạt động! – Frank

+0

Nếu nhận xét của bạn nhận được 250 bounties, câu trả lời của bạn phải tuyệt vời! =) –

+0

Ồ, chúng thật tuyệt vời. :) –

9

Tương đối dễ dàng để AucTeX chạy latexmk với C-c C-c. Sau đây sẽ thêm một lựa chọn Latexmk vào danh sách các lệnh TeX:

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

Bí quyết là nhận next-error để làm việc. Nếu bạn tìm hiểu về các nguồn AucTeX, bạn có thể tìm thấy regex mà nó sử dụng trên bộ đệm đầu ra TeX; nó không tự động được áp dụng cho bộ đệm được tạo bởi lệnh TeX-run. (Bạn cũng có thể thuyết phục chế độ compile để sử dụng regex này.)

Cách tiếp cận khác là xác định lại biến LaTeX-command.Đây là một chút iffy bởi vì tôi nghĩ rằng rất nhiều chức năng AucTeX giả định họ có thể tack tùy chọn dòng lệnh vào chuỗi này và thực hiện kết quả.

+0

Wow cảm ơn cho bit tốt đẹp của mã tôi đã có một vấn đề maddening mà tôi không thể sửa chữa và bằng cách nào đó đoạn này làm mọi thứ làm việc. +1 – mcheema

3

Thêm% (chế độ) cung cấp cho latexmk một số tùy chọn khác như không tương tác nếu được đặt trong ống dẫn.

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