Emacs + AUCTeX: Как получить цветной вывод pdflatex? - PullRequest
3 голосов
/ 27 октября 2011

Я использую latexmk для компиляции документов .tex через GNU Emacs + AUCTeX (мои настройки описаны в разделе решения здесь: Emacs + Synctex + Skim: как правильно настроить синхронизацию? [Ни один из существующих методов не работалправильно] )

Используя C-c C-c, документ .tex компилируется (например, с pdflatex).Вывод этого процесса можно увидеть / проверить с помощью C-c C-l.Как правило, выходных данных много, и их трудно прочитать.Есть ли способ сделать этот вывод цветным?Если я использую latexmk из терминала, я, по крайней мере, выделю важные части вывода latexmk.

1 Ответ

2 голосов
/ 02 ноября 2011

Обычный способ сделать это - добавить ключевые слова блокировки шрифта в основной режим, но выходные файлы находятся в основном режиме, так что вы, вероятно, захотите написать простой основной режим с define-derived-mode, как показано ниже, а затем посоветовать(скажем, C-c C-l), чтобы включить этот режим (конечно, есть лучшая функция для консультирования, но я не уверен, какой именно).

(define-derived-mode latex-output-mode fundamental-mode "LaTeX Output"
  "Simple mode for colorizing LaTeX output."
  (set (make-local-variable 'font-lock-defaults)
       '((("^!.*" . font-lock-warning-face) ; LaTeX error
          ("^-+$" . font-lock-builtin-face) ; latexmk divider
          ("^\\(?:Overfull\\|Underfull\\|Tight\\|Loose\\).*" . font-lock-string-face)
          ;; ..... 
          ))))
(defadvice TeX-recenter-output-buffer (after colorize-latex-output activate)
  (latex-output-mode))

С другой стороны, вы можете (как предполагает NN) перезаписать TeX-parse-error для добавления свойств текста или наложений, выделяющих интересующие вас части.Это имеет тот недостаток, что если обновляется TeX-parse-error, вам также придется обновить свою версию вручную, но в противном случае она может оказаться менее эффективной.Конечно, он будет работать только в том случае, если он уже ищет вещи, которые вы хотите выделить, а именно ошибки, предупреждения, поля переполнения / недополнения и информацию о файле.

Примером второй опции может быть:

(defun TeX-parse-error (old)
  "Goto next error.  Pop to OLD buffer if no more errors are found.
This version colorizes file name parsing helping to track down annoying bugs"
  (let ((regexp
         (concat
          ;; TeX error
          "^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|"
          ;; New file
          "(\\(\"[^\"]*?\"\\|/*\
\\(?:\\.+[^()\r\n{} \\/]*\\|[^()\r\n{} .\\/]+\
\\(?: [^()\r\n{} .\\/]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)\
\\(?:[\\/]+\\(?:\\.+[^()\r\n{} \\/]*\\|[^()\r\n{} .\\/]+\
\\(?: [^()\r\n{} .\\/]+\\)*\\(?:\\.[-0-9a-zA-Z_.]*\\)?\\)?\\)*\\)\
)*\\(?: \\|\r?$\\)\\|"
          ;; End of file
          "\\()\\))*\\|"
          ;; Hook to change line numbers
          " !\\(?:offset(\\([---0-9]+\\))\\|"
          ;; Hook to change file name
          "name(\\([^)]+\\))\\)\\|"
          ;; LaTeX bad box
          "^\\(\\(?:Overfull\\|Underfull\\|Tight\\|Loose\\)\
 \\\\.*?[0-9]+--[0-9]+\\)\\|"
          ;; LaTeX warning
          "^\\(LaTeX [A-Za-z]*\\|Package [A-Za-z]+ \\)Warning:.*")))
    (while
        (cond
         ;; Nothing found
         ((null
           (re-search-forward regexp nil t))
          ;; No more errors.
          (message "No more errors.")
          (beep)
          (TeX-pop-to-buffer old)
          nil)

         ;; TeX error
         ((match-beginning 1)
          (put-text-property (match-beginning 2) (match-end 2)
                             'face 'font-lock-warning-face)
          (when (match-beginning 2)
            (unless TeX-error-file
              (push nil TeX-error-file)
              (push nil TeX-error-offset))
            (unless (car TeX-error-offset)
              (rplaca TeX-error-file (TeX-match-buffer 2))))
          (if (looking-at "Preview ")
              t
            (TeX-error)
            nil))

         ;; LaTeX bad box
         ((match-beginning 7)
          (put-text-property (match-beginning 0) (match-end 0)
                             'face 'font-lock-doc-face)
          (if TeX-debug-bad-boxes
              (progn
                (TeX-warning (TeX-match-buffer 7))
                nil)
            (re-search-forward "\r?\n\
\\(?:.\\{79\\}\r?\n\
\\)*.*\r?$")
            t))

         ;; LaTeX warning
         ((match-beginning 8)
          (put-text-property (match-beginning 0) (match-end 0)
                             'face 'font-lock-string-face)
          (if TeX-debug-warnings
              (progn
                (TeX-warning (TeX-match-buffer 8))
                nil)
            t))

         ;; New file -- Push on stack
         ((match-beginning 3)
          (let ((file (TeX-match-buffer 3))
                (end (match-end 3)))
            (put-text-property (match-beginning 0) (match-end 0)
                               'face 'font-lock-type-face)
            ;; Strip quotation marks and remove newlines if necessary
            (when (or (eq (string-to-char file) ?\")
                      (string-match "\n" file))
              (setq file
                    (mapconcat 'identity (split-string file "[\"\n]+") "")))
            (push file TeX-error-file)
            (push nil TeX-error-offset)
            (goto-char end))
          t)

         ;; End of file -- Pop from stack
         ((match-beginning 4)
          ;; (overlay-put
          ;;  (make-overlay (match-beginning 4) (match-end 4))
          ;;  'face 'font-lock-warning-face)
          (put-text-property (match-beginning 0) (match-end 0)
                             'face 'font-lock-warning-face)
          (when (> (length TeX-error-file) 1)
            (when (string= (pop TeX-error-file) "./auctex-bug.tex")
              (goto-char (match-end 4)))
            (pop TeX-error-offset))
          (goto-char (match-end 4))
          t)

         ;; Hook to change line numbers
         ((match-beginning 5)
          (setq TeX-error-offset
                (list (string-to-number (TeX-match-buffer 5))))
          t)

         ;; Hook to change file name
         ((match-beginning 6)
          (setq TeX-error-file
                (list (TeX-match-buffer 6)))
          t)))))
...