[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/auctex 4b1c7015ae 45/60: Move contents of tex-buf.el in
From: |
Tassilo Horn |
Subject: |
[elpa] externals/auctex 4b1c7015ae 45/60: Move contents of tex-buf.el into tex.el |
Date: |
Fri, 8 Apr 2022 11:52:54 -0400 (EDT) |
branch: externals/auctex
commit 4b1c7015ae77b88832af35510232e1a1b716da3a
Author: Ikumi Keita <ikumi@ikumi.que.jp>
Commit: Ikumi Keita <ikumi@ikumi.que.jp>
Move contents of tex-buf.el into tex.el
Resolve circular dependency between tex.el and tex-buf.el and get rid
of tedious `defvar' and `declare-function' business over tex-buf.
* tex-buf.el: Delete.
* Makefile.in: Delete tex-buf.el from AUCSRC.
* tex.el: Adapt defvar's and declare-function's.
Remove all autoload's for tex-buf functions.
Move all the rest of tex-buf.el at the last of tex.el.
* context.el:
* plain-tex.el:
* preview.el.in:
* style/ifluatex.el:
* style/polyglossia.el:
* tests/japanese/error-parsing.el:
* tests/tex/command-expansion.el:
* tests/tex/error-parsing.el:
* tex-bar.el:
* tex-jp.el:
Remove "(require 'tex-buf)".
Supply "(require 'tex) or "(require 'latex)" instead if necessary.
* latex.el:
* tex-info.el:
Remove defvar's and declare-function's for tex-buf.el.
---
Makefile.in | 2 +-
context.el | 1 -
latex.el | 9 +-
plain-tex.el | 1 -
preview.el.in | 1 -
style/ifluatex.el | 1 -
style/polyglossia.el | 1 -
tests/japanese/error-parsing.el | 1 -
tests/tex/command-expansion.el | 1 -
tests/tex/error-parsing.el | 1 -
tex-bar.el | 3 +-
tex-buf.el | 3521 --------------------------------------
tex-info.el | 6 -
tex-jp.el | 1 -
tex.el | 3531 ++++++++++++++++++++++++++++++++++++++-
15 files changed, 3496 insertions(+), 3585 deletions(-)
diff --git a/Makefile.in b/Makefile.in
index ed79ddf294..9ee6db0c59 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -79,7 +79,7 @@ CTANDIR = $(DIST_PREFIX)/ctan
PREVIEW_BUILD_DIR = preview-build
COMMITTER="`git config --get user.name`\ \ \<`git config --get user.email`\>"
-AUCSRC = tex.el tex-buf.el tex-style.el plain-tex.el latex.el tex-info.el \
+AUCSRC = tex.el tex-style.el plain-tex.el latex.el tex-info.el \
texmathp.el multi-prompt.el tex-mik.el font-latex.el tex-font.el \
context.el context-en.el context-nl.el tex-fold.el tex-jp.el \
toolbar-x.el tex-bar.el bib-cite.el tex-ispell.el latex-flymake.el
diff --git a/context.el b/context.el
index 19217ec6b5..afdc42791e 100644
--- a/context.el
+++ b/context.el
@@ -49,7 +49,6 @@
;;; Code:
-(require 'tex-buf)
(require 'tex)
(require 'latex) ; for functions like `TeX-look-at' and `LaTeX-split-long-menu'
(require 'plain-tex) ; for `plain-TeX-common-initialization'
diff --git a/latex.el b/latex.el
index d5bb9b04b3..a3d0a064cf 100644
--- a/latex.el
+++ b/latex.el
@@ -45,12 +45,8 @@
(declare-function turn-off-filladapt-mode "ext:filladapt"
nil)
-;; These functions are reported to be unknown when built
+;; This function is reported to be unknown when built
;; `with-native-compilation':
-(declare-function LaTeX-command-section-change-level "tex-buf"
- (arg))
-(declare-function TeX-LaTeX-sentinel "tex-buf"
- (process name))
(declare-function LaTeX-flymake "latex-flymake"
(report-fn &rest _args))
@@ -58,7 +54,6 @@
(defvar outline-heading-alist)
(defvar TeX-auto-file)
(defvar LaTeX-section-list-changed)
-(defvar TeX-error-description-list-local)
;;; Syntax
@@ -7076,8 +7071,6 @@ This happens when \\left is inserted."
(declare-function LaTeX-preview-setup "preview")
-(defvar TeX-sentinel-default-function) ;; Defined in tex-buf.el.
-
;;;###autoload
(defun TeX-latex-mode ()
;; FIXME: Use `define-derived-mode'.
diff --git a/plain-tex.el b/plain-tex.el
index dd55edee68..e8b9a18b82 100644
--- a/plain-tex.el
+++ b/plain-tex.el
@@ -29,7 +29,6 @@
;;; Code:
(require 'tex)
-(require 'tex-buf)
;;; Tool bar
diff --git a/preview.el.in b/preview.el.in
index 70c9798830..e7243c5b9d 100644
--- a/preview.el.in
+++ b/preview.el.in
@@ -40,7 +40,6 @@
(require 'tex-site)
(require 'tex)
-(require 'tex-buf)
(require 'latex)
(eval-when-compile
diff --git a/style/ifluatex.el b/style/ifluatex.el
index c32de5c267..86a7638ac9 100644
--- a/style/ifluatex.el
+++ b/style/ifluatex.el
@@ -30,7 +30,6 @@
;;; Code:
(require 'tex)
-(require 'tex-buf)
;; Silence the compiler:
(declare-function font-latex-add-keywords
diff --git a/style/polyglossia.el b/style/polyglossia.el
index 4bfb93e66f..204923b608 100644
--- a/style/polyglossia.el
+++ b/style/polyglossia.el
@@ -37,7 +37,6 @@
(require 'tex) ;Indispensable when compiling the call to `TeX-auto-add-type'.
(require 'latex)
-(require 'tex-buf)
;; Silence the compiler:
(declare-function font-latex-add-keywords
diff --git a/tests/japanese/error-parsing.el b/tests/japanese/error-parsing.el
index 36f3ca5fa9..599e1cdab3 100644
--- a/tests/japanese/error-parsing.el
+++ b/tests/japanese/error-parsing.el
@@ -22,7 +22,6 @@
;;; Code:
(require 'ert)
-(require 'tex-buf)
(setq japanese-TeX-error-messages t)
(require 'tex-jp)
diff --git a/tests/tex/command-expansion.el b/tests/tex/command-expansion.el
index 373ee3d66c..9834487fa4 100644
--- a/tests/tex/command-expansion.el
+++ b/tests/tex/command-expansion.el
@@ -22,7 +22,6 @@
;;; Code:
(require 'ert)
-(require 'tex-buf)
(require 'latex)
(ert-deftest TeX-command-expansion ()
diff --git a/tests/tex/error-parsing.el b/tests/tex/error-parsing.el
index 6cde540a05..0bca37d798 100644
--- a/tests/tex/error-parsing.el
+++ b/tests/tex/error-parsing.el
@@ -22,7 +22,6 @@
;;; Code:
(require 'ert)
-(require 'tex-buf)
(AUCTeX-set-ert-path
'TeX-test-compilation-log
diff --git a/tex-bar.el b/tex-bar.el
index 0bfd43169e..52b1478125 100644
--- a/tex-bar.el
+++ b/tex-bar.el
@@ -62,8 +62,7 @@
(require 'toolbar-x)
-;; for error handling
-(require 'tex-buf)
+(require 'tex)
;; For the symbol toolbar
(require 'latex)
diff --git a/tex-buf.el b/tex-buf.el
deleted file mode 100644
index c7fbb09f81..0000000000
--- a/tex-buf.el
+++ /dev/null
@@ -1,3521 +0,0 @@
-;;; tex-buf.el --- External commands for AUCTeX. -*- lexical-binding: t; -*-
-
-;; Copyright (C) 1991-2022 Free Software Foundation, Inc.
-
-;; Maintainer: auctex-devel@gnu.org
-;; Keywords: tex, wp
-
-;; This file is part of AUCTeX.
-
-;; AUCTeX is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
-
-;; AUCTeX is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with AUCTeX; see the file COPYING. If not, write to the Free
-;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-;; 02110-1301, USA.
-
-;;; Commentary:
-
-;; This file provides support for external commands.
-
-;;; Code:
-
-(require 'tex)
-(require 'comint)
-
-(defvar LaTeX-largest-level)
-(defvar LaTeX-section-list)
-(defvar compilation-error-regexp-alist)
-
-(declare-function LaTeX-bibliography-list "latex")
-
-;;; Customization:
-
-(defcustom TeX-process-asynchronous (not (eq system-type 'ms-dos))
- "Use asynchronous processes."
- :group 'TeX-command
- :type 'boolean)
-
-(defcustom TeX-shell
- (if (memq system-type '(ms-dos emx windows-nt))
- shell-file-name
- "/bin/sh")
- "Name of shell used to parse TeX commands."
- :group 'TeX-command
- :type 'file)
-
-(defcustom TeX-shell-command-option
- (cond ((memq system-type '(ms-dos emx windows-nt))
- shell-command-switch)
- (t ;Unix & EMX (Emacs 19 port to OS/2)
- "-c"))
- "Shell argument indicating that next argument is the command."
- :group 'TeX-command
- :type 'string)
-
-;;; Interactive Commands
-;;
-;; The general idea is, that there is one process and process buffer
-;; associated with each master file, and one process and process
-;; buffer for running TeX on a region.
-;;
-;; Some user commands operates on ``the'' process, which is the last
-;; process still running or already finished. Note that you cannot
-;; run more than one process simultaneously, including preview by
-;; preview-latex, because process filters and sentinels refer to
-;; certain set of global variables which each invokation of the
-;; process overwrites. If you dare to do, the result is thus
-;; unpredictable.
-
-(defun TeX-save-document (name-or-file-fn)
- "Save all files belonging to the current document.
-Return non-nil if document needs to be re-TeX'ed.
-In Lisp program, NAME-OR-FILE-FN specifies the current document.
-It is either the master name without extension or the function
-`TeX-master-file'."
- (interactive (list #'TeX-master-file))
- (TeX-check-files (TeX--concat-ext name-or-file-fn (TeX-output-extension))
- (cons (TeX--concat-ext name-or-file-fn) (TeX-style-list))
- TeX-file-extensions))
-
-(defun TeX--concat-ext (name-or-file-fn &optional extension)
- "Append EXTENSION to a filename specified by NAME-OR-FILE-FN.
-
-If NAME-OR-FILE-FN is a string, interpret it as the filename.
-Otherwise, assume it is a callable function and call it with
-EXTENSION as an argument and return the result without
-modification. EXTENSION is a string which should not start with
-'.'."
- (if (stringp name-or-file-fn)
- (if extension
- (concat name-or-file-fn "." extension)
- name-or-file-fn)
- (funcall name-or-file-fn extension)))
-
-(defun TeX-command-master (&optional override-confirm)
- "Run command on the current document.
-
-If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
-depend on it being positive instead of the entry in `TeX-command-list'."
- (interactive "P")
- (TeX-master-file nil nil t) ;; call to ask if necessary
- (TeX-command (TeX-command-query #'TeX-master-file)
- #'TeX-master-file override-confirm))
-
-(defcustom TeX-region-extra ""
- "String to insert in the region file between the header and the text."
- :group 'TeX-command
- :type 'string)
-
-;; This was "{\\makeatletter\\gdef\\AucTeX@cite#1[#2]#3{[#3#1#2]}\
-;; \\gdef\\cite{\\@ifnextchar[{\\AucTeX@cite{, }}\
-;; {\\AucTeX@cite{}[]}}}\n"
-;; However, that string is inappropriate for plain TeX and ConTeXt.
-;; This needs reconsideration.
-
-(defvar TeX-command-region-begin nil)
-(defvar TeX-command-region-end nil)
-;; Used for marking the last region.
-
-(make-variable-buffer-local 'TeX-command-region-begin)
-(make-variable-buffer-local 'TeX-command-region-end)
-
-(defun TeX-current-offset (&optional pos)
- "Calculate line offset of POS, or of point if POS is nil."
- (save-restriction
- (widen)
- (save-excursion
- (let ((inhibit-point-motion-hooks t)
- (inhibit-field-text-motion t))
- (if pos (goto-char pos))
- (+ (count-lines (point-min) (point))
- (if (bolp) 0 -1))))))
-
-(defun TeX-pin-region (begin end)
- "Pin the TeX region specified by BEGIN and END.
-If BEGIN is nil, the region is unpinned.
-
-In interactive use, a positive prefix arg will pin the region,
-a non-positive one will unpin it. Without a prefix arg, if
-a region is actively marked, it will get pinned. If not, a
-pinned region will get unpinned and vice versa."
- (interactive
- (if
- (if current-prefix-arg
- (> (prefix-numeric-value current-prefix-arg) 0)
- (or (TeX-active-mark)
- (null TeX-command-region-begin)))
- (list (region-beginning) (region-end))
- '(nil nil)))
- (if begin
- (progn
- (unless (markerp TeX-command-region-begin)
- (setq TeX-command-region-begin (make-marker))
- (setq TeX-command-region-end (make-marker)))
- (set-marker TeX-command-region-begin begin)
- (set-marker TeX-command-region-end end)
- (message "TeX region pinned."))
- (when (markerp TeX-command-region-begin)
- (set-marker TeX-command-region-begin nil)
- (set-marker TeX-command-region-end nil))
- (setq TeX-command-region-begin nil)
- (setq TeX-command-region-end nil)
- (message "TeX region unpinned.")))
-
-(defun TeX-region-update ()
- "Update the TeX-region file."
- ;; Note that TeX-command-region-begin is not a marker when called
- ;; from TeX-command-buffer.
- (and (or (null TeX-command-region-begin)
- (markerp TeX-command-region-begin))
- (TeX-active-mark)
- (TeX-pin-region (region-beginning) (region-end)))
- (let* ((begin (or TeX-command-region-begin (region-beginning)))
- (end (or TeX-command-region-end (region-end)))
- (TeX-region-extra
- ;; Write out counter information to region.
- (concat (and (fboundp 'preview--counter-information)
- (preview--counter-information begin))
- TeX-region-extra)))
- (TeX-region-create (TeX-region-file TeX-default-extension)
- (buffer-substring-no-properties begin end)
- (file-name-nondirectory (buffer-file-name))
- (TeX-current-offset begin))))
-
-(defun TeX-command-region (&optional override-confirm)
- "Run TeX on the current region.
-
-Query the user for a command to run on the temporary file specified by
-the variable `TeX-region'. If there is an explicitly active region,
-it is stored for later commands. If not, a previously stored region
-\(can be also be set with `TeX-pin-region') overrides the current region,
-if present.
-
-If a prefix argument OVERRIDE-CONFIRM is given, prompting will
-ignore the prompting flag from `TeX-command-list' and instead
-will prompt only if the prefix is positive.
-
-If the master file for the document has a header, it is written to the
-temporary file before the region itself. The document's header is all
-text before `TeX-header-end'.
-
-If the master file for the document has a trailer, it is written to
-the temporary file after the region itself. The document's trailer is
-all text after `TeX-trailer-start'."
- (interactive "P")
- (TeX-region-update)
- ;; In the next line, `TeX-region-file' should be called with nil
- ;; `nondirectory' argument, otherwise `TeX-command-default' called
- ;; within `TeX-command-query' won't work in included files not
- ;; placed in `TeX-master-directory'.
- (TeX-command (TeX-command-query #'TeX-region-file) #'TeX-region-file
- override-confirm))
-
-(defun TeX-command-buffer (&optional override-confirm)
- "Run TeX on the current buffer.
-
-Query the user for a command to run on the temporary file specified by
-the variable `TeX-region'. The region file will be recreated from the
-visible part of the buffer.
-
-If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
-depend on it being positive instead of the entry in `TeX-command-list'."
- (interactive "P")
- (let ((TeX-command-region-begin (point-min))
- (TeX-command-region-end (point-max)))
- (TeX-command-region override-confirm)))
-
-(defcustom TeX-record-buffer nil
- "Whether to record buffer names of generated TeX buffers.
-When non-nil, these buffers are put at the front of the list of
-recently selected ones."
- :group 'TeX-command
- :type 'boolean)
-
-(defun TeX-pop-to-buffer (buffer &optional other-window norecord)
- "Compatibility wrapper for `pop-to-buffer'.
-
-Select buffer BUFFER in some window, preferably a different one.
-BUFFER may be a buffer, a string (a buffer name), or nil.
-If BUFFER is a string which is not the name of an existing buffer,
-then this function creates a buffer with that name.
-If BUFFER is nil, then it chooses some other buffer.
-If `pop-up-windows' is non-nil, windows can be split to do this.
-If optional second arg OTHER-WINDOW is non-nil, insist on finding another
-window even if BUFFER is already visible in the selected window,
-and ignore `same-window-regexps' and `same-window-buffer-names'.
-This function returns the buffer it switched to.
-This uses the function `display-buffer' as a subroutine; see the documentation
-of `display-buffer' for additional customization information.
-
-Optional third arg NORECORD non-nil means do not put this buffer
-at the front of the list of recently selected ones."
- (pop-to-buffer buffer other-window (and norecord (not TeX-record-buffer))))
-
-(defun TeX-recenter-output-buffer (line)
- "Redisplay buffer of TeX job output so that most recent output can be seen.
-The last line of the buffer is displayed on line LINE of the window, or
-at bottom if LINE is nil."
- (interactive "P")
- (let ((buffer (TeX-active-buffer)))
- (if buffer
- (let ((old-buffer (current-buffer)))
- (TeX-pop-to-buffer buffer t t)
- (bury-buffer buffer)
- (goto-char (point-max))
- (recenter (if line
- (prefix-numeric-value line)
- (/ (window-height) 2)))
- (TeX-pop-to-buffer old-buffer nil t))
- (message "No process for this document."))))
-
-(defun TeX-kill-job ()
- "Kill the currently running TeX job."
- (interactive)
- (let ((process (TeX-active-process)))
- (if process
- (kill-process process)
- ;; Should test for TeX background process here.
- (error "No TeX process to kill"))))
-
-;; FIXME: The vars below are defined in this file, but they're defined too
-;; far down (i.e. further down than their first use), so we have to pre-declare
-;; them here to explain it to the compiler.
-;; We should move those vars's definitions earlier instead!
-(defvar TeX-current-process-region-p)
-(defvar TeX-save-query)
-(defvar TeX-parse-function)
-(defvar TeX-sentinel-function)
-(defvar TeX-sentinel-default-function)
-(defvar compilation-in-progress)
-(defvar TeX-current-page)
-(defvar TeX-error-overview-open-after-TeX-run)
-(defvar TeX-error-list)
-(defvar TeX-command-buffer)
-(defvar TeX-region)
-
-(defun TeX-home-buffer ()
- "Go to the buffer where you last issued a TeX command.
-If there is no such buffer, or you already are in that buffer, find
-the master file."
- (interactive)
- (if (or (null TeX-command-buffer)
- (null (buffer-name TeX-command-buffer))
- (eq TeX-command-buffer (current-buffer)))
- (find-file (TeX-master-file TeX-default-extension))
- (switch-to-buffer TeX-command-buffer)))
-
-(defvar TeX-error-last-visited -1
- "Index of the last visited error listed in `TeX-error-list'.
-
-This variable is intended to be set only in output buffer so it
-will be shared among all files of the same document.")
-(make-variable-buffer-local 'TeX-error-last-visited)
-
-(defun TeX-get-parse-function ()
- "Get the parse function for the current buffer."
- (with-current-buffer TeX-command-buffer
- (TeX-process-get-variable (TeX-active-master) 'TeX-parse-function)))
-
-(defun TeX-next-error (&optional arg reparse)
- "Find the next error in the TeX output buffer.
-
-A prefix ARG specifies how many error messages to move;
-negative means move back to previous error messages, if possible.
-
-If REPARSE is non-nil, reparse the error message buffer.
-
-\\[universal-argument] as a prefix means reparse the error
-message buffer and start at the first error."
- (interactive "P")
- (if (or (null (TeX-active-buffer))
- (eq 'compilation-mode (with-current-buffer TeX-command-buffer
- major-mode)))
- (next-error arg reparse)
-
- ;; Force reparsing when the function is called with a universal-argument.
- (if (consp arg) (setq reparse t arg nil))
-
- (funcall (TeX-get-parse-function) arg reparse)))
-
-(defun TeX-previous-error (arg)
- "Find the previous error in the TeX output buffer.
-
-Prefix arg N says how many error messages to move backward (or
-forward, if negative).
-
-This works only with TeX commands and if the
-`TeX-parse-all-errors' variable is non-nil."
- (interactive "p")
- (if (or (null (TeX-active-buffer))
- (eq 'compilation-mode (with-current-buffer TeX-command-buffer
- major-mode)))
- (previous-error arg)
-
- (let ((parse-function (TeX-get-parse-function)))
- (if (and TeX-parse-all-errors (equal parse-function #'TeX-parse-TeX))
- ;; When `TeX-parse-all-errors' is non-nil and the parsing function is
- ;; `TeX-parse-TeX' we can move backward in the errors.
- (TeX-parse-TeX (- arg) nil)
- ;; XXX: moving backward in the errors hasn't yet been implemented for
- ;; other parsing functions.
- (error "Jumping to previous error not supported")))))
-
-;;; Command Query
-
-(defvar TeX-error-overview-frame nil
- "The frame of the error overview.")
-
-(defconst TeX-error-overview-buffer-name "*TeX errors*"
- "Name of the buffer in which to show error list.")
-
-(defvar LaTeX-idx-md5-alist nil
- "Alist of MD5 hashes of idx file.
-
-Car is the idx file, cdr is its md5 hash.")
-
-(defvar LaTeX-idx-changed-alist nil
- "Whether the idx files changed.
-
-Car is the idx file, cdr is whether idx changed after LaTeX
-run.")
-
-(defcustom TeX-check-engine t
- "Check the correct engine has been set before running TeX commands."
- :group 'TeX-command
- :type 'boolean)
-
-(defvar TeX-check-engine-list '(default luatex omega xetex)
- "List of engines required by the loaded TeX packages.
-
-Do not set this variable directly, use
-`TeX-check-engine-add-engines' to specify required engines.")
-(make-variable-buffer-local 'TeX-check-engine-list)
-
-(defun TeX-check-engine-add-engines (&rest engines)
- "Add ENGINES to list of required engines.
-
-Set `TeX-check-engine-list' to the intersection between the list
-itself and the list of provided engines.
-
-See for example style/fontspec.el"
- (let ((list TeX-check-engine-list)
- (res nil))
- (setq TeX-check-engine-list
- ;; The following is based on the definition of `cl-intersection' of
- ;; GNU Emacs.
- (and list engines
- (if (equal list engines) list
- (or (>= (length list) (length engines))
- (setq list (prog1 engines (setq engines list))))
- (while engines
- (if (memq (car engines) list)
- (push (car engines) res))
- (pop engines))
- res)))))
-
-(defun TeX-check-engine (name)
- "Check the correct engine has been set.
-
-Look into `TeX-check-engine-list' for the required engines.
-
-NAME is the command to be run. Actually do the check only if the
-variable `TeX-check-engine' is non-nil and LaTeX is the command
-to be run."
- (and
- (string= name "LaTeX")
- TeX-check-engine
- TeX-check-engine-list
- (null (memq TeX-engine TeX-check-engine-list))
- (memq TeX-engine '(default luatex omega xetex))
- ;; The set engine is not listed in `TeX-check-engine-list'. We check only
- ;; builtin engines because we can't take care of custom ones. Do nothing if
- ;; there is no allowed engine, we don't know what to do in that case.
- (let ((length (length TeX-check-engine-list))
- (name-alist '((default . "TeX")
- (luatex . "LuaTeX")
- (omega . "Omega")
- (xetex . "XeTeX")))
- (completion-ignore-case t)
- (engine nil))
- (when
- (cond
- ;; There is exactly one allowed engine.
- ((= length 1)
- (setq engine (car TeX-check-engine-list))
- (y-or-n-p (format "%s is required to build this document.
-Do you want to use this engine? " (cdr (assoc engine name-alist)))))
- ;; More than one engine is allowed.
- ((> length 1)
- (if (y-or-n-p (format "It appears %s are required to build this
document.
-Do you want to select one of these engines? "
- (mapconcat
- (lambda (elt) (cdr (assoc elt name-alist)))
- TeX-check-engine-list ", ")))
- (setq engine
- (car (rassoc
- (completing-read
- (format
- "Choose between %s: "
- (mapconcat
- (lambda (elt) (cdr (assoc elt name-alist)))
- TeX-check-engine-list ", "))
- (mapcar
- (lambda (elt) (cdr (assoc elt name-alist)))
- TeX-check-engine-list))
- name-alist)))
- ;; Don't keep asking. If user doesn't want to change engine,
- ;; probably has a good reason. In order to do so, without adding
- ;; yet another variable we just hack `TeX-check-engine-list' and
- ;; make it nil.
- (setq TeX-check-engine-list nil))))
- (TeX-engine-set engine)
- (when (y-or-n-p "Do you want to remember the choice? ")
- (add-file-local-variable 'TeX-engine engine)
- (save-buffer))))))
-
-(defcustom TeX-check-TeX t
- "Whether AUCTeX should check if a working TeX distribution is present."
- :group 'TeX-command
- :type 'boolean)
-
-(defcustom TeX-check-TeX-command-not-found 127
- "Numerical code returned by shell for a command not found error."
- :group 'TeX-command
- :type 'integer)
-
-(defun TeX-command (name file-fn &optional override-confirm)
- "Run command NAME on the file returned by calling FILE-FN.
-
-FILE-FN is the symbol of a function returning a file name. The
-function has one optional argument, the extension to use on the
-file. Valid choices are `TeX-master-file' and `TeX-region-file'.
-
-Use the information in `TeX-command-list' to determine how to run
-the command.
-
-If OVERRIDE-CONFIRM is a prefix argument, confirmation will be
-asked if it is positive, and suppressed if it is not.
-
-Run function `TeX-check-engine' to check the correct engine has
-been set."
- (TeX-check-engine name)
-
- ;; Make sure that `TeX-command-buffer' is set always.
- ;; It isn't safe to remove similar lines in `TeX-run-command' etc.
- ;; because preview-latex calls `TeX-run-command' directly.
- (setq-default TeX-command-buffer (current-buffer))
-
- (cond ((eq file-fn #'TeX-region-file)
- (setq TeX-current-process-region-p t))
- ((eq file-fn #'TeX-master-file)
- (setq TeX-current-process-region-p nil)))
-
- ;; When we're operating on a region, we need to update the position
- ;; of point in the region file so that forward search works.
- (if (string= name "View") (TeX-region-update-point))
-
- (let ((command (TeX-command-expand (nth 1 (assoc name TeX-command-list))))
- (hook (nth 2 (assoc name TeX-command-list)))
- (confirm (if override-confirm
- (> (prefix-numeric-value override-confirm) 0)
- (nth 3 (assoc name TeX-command-list)))))
-
- ;; Verify the expanded command
- (if confirm
- (setq command
- (read-from-minibuffer (concat name " command: ") command
- nil nil)))
-
- ;; Kill the frame and buffer associated to the error overview before
running
- ;; the command, but keep them if the command to be run is View.
- (unless (string= name "View")
- (if (frame-live-p TeX-error-overview-frame)
- (delete-frame TeX-error-overview-frame))
- (if (get-buffer TeX-error-overview-buffer-name)
- (kill-buffer TeX-error-overview-buffer-name)))
-
- ;; Before running some commands, check that AUCTeX is able to find "tex"
- ;; program.
- (and TeX-check-TeX
- (member name '("TeX" "LaTeX" "AmSTeX" "ConTeXt" "ConTeXt Full"))
- (= TeX-check-TeX-command-not-found
- (call-process TeX-shell nil nil nil
- TeX-shell-command-option TeX-command))
- (error (format "ERROR: AUCTeX cannot find a working TeX distribution.
-Make sure you have one and that TeX binaries are in PATH environment
variable%s"
- (if (eq system-type 'darwin)
- ".
-If you are using OS X El Capitan or later
-remember to add /Library/TeX/texbin/ to your PATH"
- ""))))
-
- ;; Now start the process
- (let ((file (funcall file-fn)))
- (TeX-process-set-variable file 'TeX-command-next TeX-command-Show)
- (funcall hook name command file))))
-
-(defun TeX-command-expand (command &optional list)
- "Expand COMMAND for `TeX-active-master' as described in LIST.
-LIST default to `TeX-expand-list'. As a special exception,
-`%%' can be used to produce a single `%' sign in the output
-without further expansion."
- (let ((TeX-expand-command command)
- TeX-expand-pos
- TeX-command-text
- TeX-command-pos
- pat entry case-fold-search string expansion arguments)
- (setq list (cons
- (list "%%" (lambda nil
- (setq TeX-expand-pos (1+ TeX-expand-pos))
- "%"))
- (or list (TeX-expand-list)))
- pat (regexp-opt (mapcar #'car list)))
- (while (setq TeX-expand-pos (string-match pat TeX-expand-command
TeX-expand-pos))
- (setq string (match-string 0 TeX-expand-command)
- entry (assoc string list)
- expansion (car (cdr entry)) ;Second element
- arguments (cdr (cdr entry)) ;Remaining elements
- string (save-match-data
- (cond
- ((functionp expansion)
- (apply expansion arguments))
- ((boundp expansion)
- (apply (symbol-value expansion) arguments))
- (t
- (error "Nonexpansion %s" expansion)))))
- (if (stringp string)
- (setq TeX-expand-command
- (replace-match string t t TeX-expand-command))))
- TeX-expand-command))
-
-(defun TeX-active-master-with-quotes
- (&optional extension nondirectory ask extra preprocess-fn)
- "Return the current master or region file name with quote for shell.
-Pass arguments EXTENSION NONDIRECTORY ASK to `TeX-active-master'.
-If the returned file name contains space, enclose it within
-quotes `\"' when \" \\input\" is supplemented (indicated by
-dynamically bound variable `TeX-command-text' having string
-value.) Also enclose the file name within \\detokenize{} when
-the following three conditions are met:
- 1. compiling with standard (pdf)LaTeX or upLaTeX
- 2. \" \\input\" is supplemented
- 3. EXTRA is non-nil (default when expanding \"%T\")
-Adjust dynamically bound variable `TeX-expand-pos' to avoid possible
-infinite loop in `TeX-command-expand'.
-If PREPROCESS-FN is non-nil then it is called with the filename
-as an argument and the result is enclosed instead of the
-filename.
-
-Helper function of `TeX-command-expand'. Use only within entries in
-`TeX-expand-list-builtin' and `TeX-expand-list'."
- (let* ((raw (TeX-active-master extension nondirectory ask))
- ;; String `TeX-command-text' means that the file name is
- ;; given through \input command.
- (quote-for-space (if (and (stringp TeX-command-text)
- (string-match " " raw))
- "\"" ""))
- (res
- (shell-quote-argument
- (format
- (if (and extra
- (stringp TeX-command-text)
- (memq major-mode '(latex-mode doctex-mode))
- (memq TeX-engine '(default uptex)))
- ;; Since TeXLive 2018, the default encoding for LaTeX
- ;; files has been changed to UTF-8 if used with
- ;; classic TeX or pdfTeX. I.e.,
- ;; \usepackage[utf8]{inputenc} is enabled by default
- ;; in (pdf)latex.
- ;; c.f. LaTeX News issue 28
- ;; Due to this change, \detokenize is required to
- ;; recognize non-ascii characters in the file name
- ;; when \input precedes.
- "\\detokenize{ %s }" "%s")
- (concat quote-for-space
- (if preprocess-fn
- (funcall preprocess-fn raw)
- raw)
- quote-for-space)))))
- ;; Advance past the file name in order to
- ;; prevent expanding any substring of it.
- (setq TeX-expand-pos
- (+ TeX-expand-pos (length res)))
- res))
-
-(defun TeX-check-files (derived originals extensions)
- "Check if DERIVED is newer than any of the ORIGINALS.
-Try each original with each member of EXTENSIONS, in all directories
-in `TeX-check-path'. Returns true if any of the ORIGINALS with any of the
-EXTENSIONS are newer than DERIVED. Will prompt to save the buffer of any
-ORIGINALS which are modified but not saved yet."
- (let (existingoriginals
- found
- (extensions (TeX-delete-duplicate-strings extensions))
- (buffers (buffer-list)))
- (dolist (path (TeX-delete-duplicate-strings
- (mapcar (lambda (dir)
- (expand-file-name (file-name-as-directory dir)))
- (append
- TeX-check-path
- ;; In `TeX-command-default', this function is used
to
- ;; check whether bibliography databases are newer
- ;; than generated *.bbl files, but bibliography
- ;; database are relative to `TeX-master-directory'
- ;; and the test can be run also from included files
- ;; that are in directories different from
- ;; `TeX-master-directory'.
- (list (TeX-master-directory))))))
- (dolist (orig originals)
- (dolist (ext extensions)
- (let ((filepath (concat path orig "." ext)))
- (if (or (file-exists-p filepath)
- (get-file-buffer filepath))
- (setq existingoriginals (cons filepath existingoriginals)))))))
- (while buffers
- (let* ((buffer (car buffers))
- (name (buffer-file-name buffer)))
- (setq buffers (cdr buffers))
- (if (and name (member name existingoriginals))
- (progn
- (and (buffer-modified-p buffer)
- (or (not TeX-save-query)
- (y-or-n-p (concat "Save file "
- (buffer-file-name buffer)
- "? ")))
- (with-current-buffer buffer (save-buffer)))))))
- (dolist (eo existingoriginals)
- (if (file-newer-than-file-p eo derived)
- (setq found t)))
- found))
-
-(defcustom TeX-command-sequence-max-runs-same-command 4
- "Maximum number of runs of the same command."
- :type 'integer
- :group 'TeX-command)
-
-(defcustom TeX-command-sequence-max-runs 12
- "Maximum number of total runs."
- :type 'integer
- :group 'TeX-command)
-
-(defvar TeX-command-sequence-count-same-command 1
- "Counter for the runs of the same command in `TeX-command-sequence'.")
-
-(defvar TeX-command-sequence-count 1
- "Counter for the total runs of `TeX-command-sequence'.")
-
-(defvar TeX-command-sequence-last-command nil
- "Last command run in `TeX-command-sequence'.")
-
-(defvar TeX-command-sequence-sentinel nil
- "Sentinel for `TeX-command-sequence'.")
-
-(defvar TeX-command-sequence-file-function nil
- "File function for `TeX-command-sequence'.")
-
-(defvar TeX-command-sequence-command nil
- "Command argument for `TeX-command-sequence'.
-
-It is set in `TeX-command-sequence' and used in
-`TeX-command-sequence-sentinel' to call again
-`TeX-command-sequence' with the appropriate command argument.")
-
-(defun TeX-command-sequence (command &optional reset file-fn)
- "Run a sequence of TeX commands defined by COMMAND.
-
-The COMMAND argument may be
-
- * nil: no command will be run in this case
-
- * a string with a command from `TeX-command-list'
-
- * a non-nil list of strings, which are commands from
- `TeX-command-list'; the car of the list is used as command to
- be executed in the first run of `TeX-command-sequence', the
- cdr of the list will be passed to the function in the next
- run, etc.
-
- * a function name, returning a string which is command from
- `TeX-command-list'; it will be funcall'd (without arguments!)
- and used again in the next run of `TeX-command-sequence'.
-
- * with any other value the function `TeX-command-default' is
- used to determine the command to run, until a stopping
- condition is met.
-
-This function runs at most
-`TeX-command-sequence-max-runs-same-command' times the same
-command in a row, and `TeX-command-sequence-max-runs' times in
-total in any case. It ends when `TeX-command-Show' is the
-command to be run.
-
-A non-nil value for the optional argument RESET means this is the
-first run of the function and some variables need to be reset.
-
-FILE-FN is a function of zero arguments returning the current
-filename. Valid choices are `TeX-master-file' (default if
-omitted) and `TeX-region-file'."
- (setq TeX-command-sequence-file-function (or file-fn #'TeX-master-file))
- (if (null command)
- (message "No command to run.")
- (let (cmd process)
- (cond
- ((stringp command)
- (setq cmd command
- TeX-command-sequence-command nil))
- ((listp command)
- (setq cmd (pop command)
- TeX-command-sequence-command command))
- ((functionp command)
- (setq cmd (funcall command)
- TeX-command-sequence-command command))
- (t
- ;; We first call `TeX-master-file' with the third argument
- ;; (`ask') set to t, so that the master file is properly set.
- ;; This is also what `TeX-command-master' does.
- (funcall TeX-command-sequence-file-function nil nil t)
- (setq cmd (TeX-command-default TeX-command-sequence-file-function)
- TeX-command-sequence-command t)))
- (TeX-command cmd TeX-command-sequence-file-function 0)
- (when reset
- (setq TeX-command-sequence-count-same-command 1
- TeX-command-sequence-count 1
- TeX-command-sequence-last-command nil))
- (cond
- ;; Stop when the same command has been run
- ;; `TeX-command-sequence-max-runs-same-command' times in a row.
- ((>= TeX-command-sequence-count-same-command
- TeX-command-sequence-max-runs-same-command)
- (message "Stopping after running %S %d times in a row."
- TeX-command-sequence-last-command
- TeX-command-sequence-count-same-command))
- ;; Stop when there have been `TeX-command-sequence-max-runs' total
- ;; compilations.
- ((>= TeX-command-sequence-count TeX-command-sequence-max-runs)
- (message "Stopping after %d compilations." TeX-command-sequence-count))
- ;; The command just run is `TeX-command-Show'.
- ((equal command TeX-command-Show))
- ;; In any other case continue: increase counters (when needed), update
- ;; `TeX-command-sequence-last-command' and run the sentinel.
- (t
- (if (equal cmd TeX-command-sequence-last-command)
- (setq TeX-command-sequence-count-same-command
- (1+ TeX-command-sequence-count-same-command))
- (setq TeX-command-sequence-count-same-command 1))
- (setq TeX-command-sequence-count (1+ TeX-command-sequence-count)
- TeX-command-sequence-last-command cmd)
- (and (setq process (get-buffer-process (current-buffer)))
- (setq TeX-command-sequence-sentinel (process-sentinel process))
- (set-process-sentinel process
- #'TeX-command-sequence-sentinel)))))))
-
-(defcustom TeX-save-query t
- "If non-nil, ask user for permission to save files before starting TeX."
- :group 'TeX-command
- :type 'boolean)
-
-(defvar TeX-command-history nil)
-
-(defun TeX-command-default (name-or-file-fn)
- "Guess the next command to be run on NAME-OR-FILE-FN."
- (let ((command-next nil)
- (name (TeX--concat-ext name-or-file-fn)))
- (cond ((if (eq name-or-file-fn #'TeX-region-file)
- (TeX-check-files (TeX-region-file (TeX-output-extension))
- ;; Each original will be checked for all dirs
- ;; in `TeX-check-path' so this needs to be just
- ;; a filename without directory.
- (list (file-relative-name name))
- TeX-file-extensions)
- (TeX-save-document name-or-file-fn))
- TeX-command-default)
- ((and (memq major-mode '(doctex-mode latex-mode))
- ;; Want to know if bib file is newer than .bbl
- ;; We don't care whether the bib files are open in emacs
- (TeX-check-files (TeX--concat-ext name-or-file-fn "bbl")
- (mapcar #'car
- (LaTeX-bibliography-list))
- (append BibTeX-file-extensions
- TeX-Biber-file-extensions)))
- ;; We should check for bst files here as well.
- (if (bound-and-true-p LaTeX-using-Biber)
- TeX-command-Biber TeX-command-BibTeX))
- ((and
- ;; Rationale: makeindex should be run when final document is almost
- ;; complete (see
- ;; https://tex-talk.net/2012/09/dont-forget-to-run-makeindex/),
- ;; otherwise, after following latex runs, index pages may change
due
- ;; to changes in final document, resulting in extra makeindex and
- ;; latex runs.
- (member
- (setq command-next
- (TeX-process-get-variable
- name
- 'TeX-command-next
- (or (and TeX-PDF-mode (TeX-PDF-from-DVI))
- TeX-command-Show)))
- (list "Dvips" "Dvipdfmx" TeX-command-Show))
- (cdr (assoc (expand-file-name (TeX--concat-ext name-or-file-fn
"idx"))
- LaTeX-idx-changed-alist)))
- "Index")
- (command-next)
- (TeX-command-Show))))
-
-(defun TeX-command-query (name-or-file-fn)
- "Query the user for what TeX command to use."
- (let* ((default (TeX-command-default name-or-file-fn))
- (completion-ignore-case t)
- (answer (or TeX-command-force
- (completing-read
- (concat "Command (default " default "): ")
- (TeX-mode-specific-command-list major-mode) nil t
- nil 'TeX-command-history default))))
- ;; If the answer is "latex" it will not be expanded to "LaTeX"
- (setq answer (car-safe (assoc-string answer TeX-command-list t)))
- (if (and answer
- (not (string-equal answer "")))
- answer
- default)))
-
-(defvar TeX-command-next nil
- "The default command next time `TeX-command' is invoked.")
-
- (make-variable-buffer-local 'TeX-command-next)
-
-(defun TeX-printer-query (&optional queue)
- "Query the user for a printer name.
-QUEUE is non-nil when we are checking for the printer queue."
- (let (command element printer)
- (if queue
- (unless (setq element 2 command TeX-queue-command)
- (error "Need to customize `TeX-queue-command'"))
- (unless (setq element 1 command TeX-print-command)
- (error "Need to customize `TeX-print-command'")))
- (while (progn
- (setq printer (if TeX-printer-list
- (let ((completion-ignore-case t))
- (completing-read
- (format "Printer%s: "
- (if TeX-printer-default
- (format " (default %s)"
TeX-printer-default) ""))
- TeX-printer-list))
- ""))
- (setq printer (or (car-safe (assoc-string printer
TeX-printer-list t))
- printer))
- (not (if (or (null printer) (string-equal "" printer))
- (setq printer TeX-printer-default)
- (setq TeX-printer-default printer)))))
-
- (let ((expansion (let ((entry (assoc printer TeX-printer-list)))
- (or (nth element entry)
- command))))
- (if (string-match "%p" printer)
- (error "Don't use %s in printer names" "%p"))
- (while (string-match "%p" expansion)
- (setq expansion (replace-match printer t t expansion 0)))
- expansion)))
-
-(defun TeX-style-check (styles)
- "Check STYLES compared to the current style options."
- (let ((files (TeX-style-list)))
- (while (and styles
- (not (TeX-member (car (car styles)) files #'string-match)))
- (setq styles (cdr styles))))
- (if styles
- (nth 1 (car styles))
- ""))
-
-(defun TeX-output-extension ()
- "Get the extension of the current TeX output file."
- (if (listp TeX-output-extension)
- (car TeX-output-extension)
- (or (TeX-process-get-variable (TeX-active-master)
- 'TeX-output-extension
- TeX-output-extension)
- TeX-output-extension)))
-
-(defun TeX-view-mouse (event)
- "Start `TeX-view' at mouse position."
- (interactive "e")
- (with-current-buffer (window-buffer (posn-window (event-start event)))
- (goto-char (posn-point (event-start event)))
- (TeX-view)))
-
-(defun TeX-region-update-point ()
- "Syncs the location of point in the region file with the current file.
-
-Thereafter, point in the region file is on the same text as in
-the current buffer.
-
-Do nothing in case the last command hasn't operated on the region
-or `TeX-source-correlate-mode' is disabled."
- (when (and TeX-current-process-region-p TeX-source-correlate-mode)
- (let ((region-buf (get-file-buffer (TeX-region-file t)))
- (orig-line (TeX-current-offset))
- (pos-in-line (- (point) (max (line-beginning-position)
- (or TeX-command-region-begin
- (region-beginning))))))
- (when region-buf
- (with-current-buffer region-buf
- (goto-char (point-min))
- (when (re-search-forward "!offset(\\(-?[0-9]+\\)" nil t)
- (let ((offset (string-to-number (match-string 1))))
- (goto-char (point-min))
- (forward-line (- orig-line offset))
- (forward-char pos-in-line))))))))
-
-(defun TeX-view ()
- "Start a viewer without confirmation.
-The viewer is started either on region or master file,
-depending on the last command issued."
- (interactive)
- (let ((output-file (TeX-active-master (TeX-output-extension))))
- (if (file-exists-p output-file)
- (TeX-command "View" #'TeX-active-master 0)
- (message "Output file %S does not exist." output-file))))
-
-;;; Command Hooks
-
-(defvar TeX-after-compilation-finished-functions nil
- "Hook being run after TeX/LaTeX/ConTeXt finished successfully.
-The functions in this hook are run with the DVI/PDF output file
-given as argument. Using this hook can be useful for updating
-the viewer automatically after re-compilation of the document.
-
-If you use an emacs-internal viewer such as `doc-view-mode' or
-`pdf-view-mode', add `TeX-revert-document-buffer' to this hook.")
-
-(make-obsolete-variable 'TeX-after-TeX-LaTeX-command-finished-hook
- 'TeX-after-compilation-finished-functions
- "11.89")
-
-(defun TeX-revert-document-buffer (file)
- "Revert the buffer visiting FILE.
-This function is intended to be used in
-`TeX-after-compilation-finished-functions' for users that view
-their compiled document with an emacs viewer such as
-`doc-view-mode' or `pdf-view-mode'. (Note that this function
-just calls `revert-buffer' in the respective buffer and thus
-requires that the corresponding mode defines a sensible
-`revert-buffer-function'.)"
- (let ((buf (find-buffer-visiting file)))
- (when buf
- (with-current-buffer buf
- (revert-buffer nil t t)))))
-
-(defvar TeX-after-start-process-function
- #'TeX-adjust-process-coding-system
- "Function to adjust coding system of an asynchronous process.
-Called with one argument PROCESS.")
-
-(defun TeX-adjust-process-coding-system (process)
- "Adjust coding system of PROCESS to suitable value.
-Usually coding system is the same as the TeX file with eol format
-adjusted to OS default value. Take care of Japanese TeX, which
-requires special treatment."
- (if (and (boundp 'japanese-TeX-mode)
- (fboundp 'japanese-TeX-set-process-coding-system)
- (with-current-buffer TeX-command-buffer
- japanese-TeX-mode))
- (japanese-TeX-set-process-coding-system process)
- (let ((cs (coding-system-base (with-current-buffer TeX-command-buffer
- buffer-file-coding-system))))
- ;; The value of `buffer-file-coding-system' is sometimes
- ;; undecided-{unix,dos,mac}. That happens when the file
- ;; contains no multibyte chars and only end of line format is
- ;; determined. Emacs lisp reference recommends not to use
- ;; undecided-* for process coding system, so it might seem
- ;; reasonable to change `undecided' into some fixed coding
- ;; system like this:
- ;; (if (eq 'undecided cs)
- ;; (setq cs 'utf-8))
- ;; However, that can lose when the following conditions are met:
- ;; (1) The document is divided into multiple files.
- ;; (2) The command buffer contains no multibyte chars.
- ;; (3) The other files contain mutlibyte chars and saved in a
- ;; coding system other than the one chosen above.
- ;; So we leave `undecided' unchanged here. Although `undecided'
- ;; is not quite safe for the coding system for encoding, i.e.,
- ;; keyboard input to the TeX process, we expect that this does
- ;; not raise serious problems because it is pretty rare that TeX
- ;; process needs keyboard input of multibyte chars.
-
- ;; `utf-8-with-signature' (UTF-8 with BOM) doesn't suit at all
- ;; for the coding system for encoding because it always injects
- ;; 3-byte BOM in front of its return value (even when the string
- ;; to be sent has only ascii characters!) Thus we change it
- ;; into `utf-8'. On decoding, `utf-8' can decode UTF-8 with
- ;; BOM. So it is safe for both decoding and encoding.
- (if (eq cs 'utf-8-with-signature)
- (setq cs 'utf-8))
-
- ;; Eol format of TeX files can differ from OS default. TeX
- ;; binaries accept all type of eol format in the given files
- ;; and output messages according to OS default. So we set eol
- ;; format to OS default value.
- (setq cs (coding-system-change-eol-conversion
- cs
- ;; The eol of macosX is LF, not CR. So we choose
- ;; other than `unix' only for w32 system.
- ;; FIXME: what should we do for cygwin?
- (if (eq system-type 'windows-nt) 'dos 'unix)))
- (set-process-coding-system process cs cs))))
-
-(defcustom TeX-show-compilation nil
- "If non-nil, show output of TeX compilation in other window."
- :group 'TeX-command
- :type 'boolean)
-
-(defun TeX-run-command (name command file)
- "Create a process for NAME using COMMAND to process FILE.
-Return the new process."
- (let ((default TeX-command-default)
- (buffer (TeX-process-buffer-name file))
- (dir (TeX-master-directory))
- (command-buff (current-buffer)))
- (TeX-process-check file) ; Check that no process is running
- (setq-default TeX-command-buffer command-buff)
- (get-buffer-create buffer)
- (set-buffer buffer)
- (buffer-disable-undo)
- (erase-buffer)
- (set (make-local-variable 'line-number-display-limit) 0)
- (setq TeX-output-extension nil)
- (set (make-local-variable 'TeX-command-buffer) command-buff)
- (if dir (cd dir))
- (insert "Running `" name "' on `" file "' with ``" command "''\n")
- (TeX-output-mode)
- (if TeX-show-compilation
- (display-buffer buffer)
- (message "Type `%s' to display results of compilation."
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (setq TeX-parse-function #'TeX-parse-command)
- (setq TeX-command-default default)
- (setq TeX-sentinel-function
- (lambda (_process name)
- (message (concat name ": done."))))
- (if TeX-process-asynchronous
- (let ((process (start-process name buffer TeX-shell
- TeX-shell-command-option command)))
- (if TeX-after-start-process-function
- (funcall TeX-after-start-process-function process))
- (TeX-command-mode-line process)
- (set-process-filter process #'TeX-command-filter)
- (set-process-sentinel process #'TeX-command-sentinel)
- (set-marker (process-mark process) (point-max))
- (setq compilation-in-progress (cons process compilation-in-progress))
- process)
- (setq mode-line-process ": run")
- (force-mode-line-update)
- (call-process TeX-shell nil buffer nil
- TeX-shell-command-option command))))
-
-(defun TeX-run-set-command (name command)
- "Remember TeX command to use to NAME and set corresponding output extension."
- (setq TeX-command-default name
- TeX-output-extension
- (if (and (null (TeX-PDF-from-DVI)) TeX-PDF-mode) "pdf" "dvi"))
- (let ((case-fold-search t)
- (lst TeX-command-output-list))
- (while lst
- (if (string-match (car (car lst)) command)
- (setq TeX-output-extension (car (cdr (car lst)))
- lst nil)
- (setq lst (cdr lst))))))
-
-(defvar TeX-error-report-switches nil
- "Reports presence of errors after `TeX-run-TeX'.
-Actually, `TeX-run-format' sets it.
-To test whether the current buffer has a compile error from last
-run of `TeX-run-format', use
- (TeX-error-report-has-errors-p)")
-
-(defun TeX-error-report-has-errors-p ()
- "Return non-nil if current buffer has compile errors from last TeX run."
- (plist-get TeX-error-report-switches (intern (TeX-master-file))))
-
-(defun TeX-run-format (name command file)
- "Create a process for NAME using COMMAND to format FILE with TeX."
- (TeX-run-set-command name command)
- (let ((current-master (TeX-master-file))
- (buffer (TeX-process-buffer-name file))
- (process (TeX-run-command name command file)))
-
- ;; Save information in TeX-error-report-switches
- ;; Initialize error to nil (no error) for current master.
- ;; Presence of error is reported inside `TeX-TeX-sentinel-check'
-
- ;; the current master file is saved because error routines are
- ;; parsed in other buffers;
- (setq TeX-error-report-switches
- (plist-put TeX-error-report-switches
- 'TeX-current-master current-master))
- ;; reset error to nil (no error)
- (setq TeX-error-report-switches
- (plist-put TeX-error-report-switches
- (intern current-master) nil))
-
- ;; Hook to TeX debugger.
- (with-current-buffer buffer
- (TeX-parse-reset)
- (setq TeX-parse-function #'TeX-parse-TeX)
- (setq TeX-sentinel-function #'TeX-TeX-sentinel)
- (if TeX-process-asynchronous
- (progn
- ;; Updating the mode line.
- (setq TeX-current-page "[0]")
- (TeX-format-mode-line process)
- (set-process-filter process #'TeX-format-filter)))
- process)))
-
-(defun TeX-run-TeX (name command file)
- "Create a process for NAME using COMMAND to format FILE with TeX."
-
- (let ((idx-file nil) (element nil))
- ;; Store md5 hash of the index file before running LaTeX.
- (and (memq major-mode '(doctex-mode latex-mode))
- (prog1 (file-exists-p
- (setq idx-file (expand-file-name (TeX-active-master "idx"))))
- ;; In order to avoid confusion and pollution of
- ;; `LaTeX-idx-md5-alist', remove from this alist all md5 hashes of
- ;; the current index file. Note `assq-delete-all' doesn't work with
- ;; string keys and has problems with non-list elements in Emacs 21
- ;; (see file tex-site.el).
- (while (setq element (assoc idx-file LaTeX-idx-md5-alist))
- (setq LaTeX-idx-md5-alist (delq element LaTeX-idx-md5-alist))))
- (with-temp-buffer
- (insert-file-contents-literally idx-file)
- (push (cons idx-file (md5 (current-buffer))) LaTeX-idx-md5-alist))))
-
- ;; can we assume that TeX-sentinel-function will not be changed
- ;; during (TeX-run-format ..)? --pg
- ;; rather use let* ? --pg
-
- (if TeX-interactive-mode
- (TeX-run-interactive name command file)
- (let* ((sentinel-function TeX-sentinel-default-function)
- (process (TeX-run-format name command file)))
- (setq TeX-sentinel-function sentinel-function)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process)))))
-
-;; backward compatibilty
-
-(defalias 'TeX-run-LaTeX #'TeX-run-TeX)
-
-
-(defun TeX-run-BibTeX (name command file)
- "Create a process for NAME using COMMAND to format FILE with BibTeX."
- (let ((process (TeX-run-command name command file)))
- (setq TeX-sentinel-function #'TeX-BibTeX-sentinel)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-Biber (name command file)
- "Create a process for NAME using COMMAND to format FILE with Biber."
- (let ((process (TeX-run-command name command file)))
- (setq TeX-sentinel-function #'TeX-Biber-sentinel)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-dvips (name command file)
- "Create a process for NAME using COMMAND to convert FILE with dvips."
- (let ((process (TeX-run-command name command file)))
- (setq TeX-sentinel-function #'TeX-dvips-sentinel)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-dvipdfmx (name command file)
- "Create a process for NAME using COMMAND to convert FILE with dvipdfmx."
- (let ((process (TeX-run-command name command file)))
- (setq TeX-sentinel-function #'TeX-dvipdfmx-sentinel)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-ps2pdf (name command file)
- "Create a process for NAME using COMMAND to convert FILE with ps2pdf."
- (let ((process (TeX-run-command name command file)))
- (setq TeX-sentinel-function #'TeX-ps2pdf-sentinel)
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-index (name command file)
- "Create a process for NAME using COMMAND to compile the index file."
- (let ((process (TeX-run-command name command file))
- (element nil))
- (setq TeX-sentinel-function #'TeX-index-sentinel)
- ;; Same cleaning as that for `LaTeX-idx-md5-alist' in `TeX-run-TeX'.
- (while (setq element
- ;; `file' has been determined in `TeX-command-buffer', while
- ;; this function has `TeX-master-directory' as
- ;; `default-directory', then we have to expand `file'
file-name
- ;; in the same directory of `TeX-command-buffer'.
- (assoc (with-current-buffer TeX-command-buffer
- (expand-file-name (TeX-active-master "idx")))
- LaTeX-idx-changed-alist))
- (setq LaTeX-idx-changed-alist (delq element LaTeX-idx-changed-alist)))
- (if TeX-process-asynchronous
- process
- (TeX-synchronous-sentinel name file process))))
-
-(defun TeX-run-compile (_name command _file)
- "Ignore first and third argument, start compile with second argument."
- (let ((default-directory (TeX-master-directory)))
- (setq TeX-command-buffer (compile command)))
- ;; Make `compilation-mode' recognize file names with spaces.
- ;; (bug#36483)
- ;; FIXME: This is just an ad-hoc workaround and it's better to fix
- ;; the regular expression in compile.el properly, if possible. But
- ;; there was no response to such request in emacs-devel@gnu.org.
- (with-current-buffer TeX-command-buffer
- (make-local-variable 'compilation-error-regexp-alist)
- ;; Add slightly modified entry of the one associated with `comma'
- ;; in `compilation-error-regexp-alist-alist' to pick up file names
- ;; with spaces.
- (add-to-list 'compilation-error-regexp-alist
- '("^\"\\([^,\"\n\t]+\\)\", line \\([0-9]+\\)\
-\\(?:[(. pos]+\\([0-9]+\\))?\\)?[:.,; (-]\\( warning:\\|[-0-9 ]*(W)\\)?" 1 2 3
(4))
- t)))
-
-(defun TeX-run-shell (_name command _file)
- "Ignore first and third argument, start shell-command with second argument."
- (let ((default-directory (TeX-master-directory)))
- (shell-command command)
- (if (eq system-type 'ms-dos)
- (redraw-display))))
-
-(defun TeX-run-discard (_name command _file)
- "Start COMMAND as process, discarding its output.
-NAME and FILE are ignored."
- (let ((default-directory (TeX-master-directory)))
- (call-process TeX-shell
- nil 0 nil
- TeX-shell-command-option
- command)))
-
-(defun TeX-run-discard-foreground (_name command _file)
- "Call process with second argument in the foreground, discarding its output.
-With support for MS-DOS, especially when dviout is used with PC-9801 series."
- (if (and (boundp 'dos-machine-type) (eq dos-machine-type 'pc98)) ;if PC-9801
- (send-string-to-terminal "\e[2J")) ; clear screen
- (call-process TeX-shell (if (eq system-type 'ms-dos) "con") nil nil
- TeX-shell-command-option command)
- (if (eq system-type 'ms-dos)
- (redraw-display)))
-(defalias 'TeX-run-dviout #'TeX-run-discard-foreground)
-
-(defun TeX-run-background (name command _file)
- "Start process with second argument, show output when and if it arrives."
- (let ((dir (TeX-master-directory)))
- (set-buffer (get-buffer-create "*TeX background*"))
- (if dir (cd dir))
- (erase-buffer)
- (let ((process (start-process (concat name " background")
- nil TeX-shell
- TeX-shell-command-option command)))
- (if TeX-after-start-process-function
- (funcall TeX-after-start-process-function process))
- (set-process-filter process #'TeX-background-filter)
- (set-process-query-on-exit-flag process nil))))
-
-(defun TeX-run-silent (name command _file)
- "Start process with second argument."
- (let ((dir (TeX-master-directory)))
- (set-buffer (get-buffer-create "*TeX silent*"))
- (if dir (cd dir))
- (erase-buffer)
- (let ((process (start-process (concat name " silent")
- (current-buffer) TeX-shell
- TeX-shell-command-option command)))
- (if TeX-after-start-process-function
- (funcall TeX-after-start-process-function process))
- (set-process-query-on-exit-flag process nil))))
-
-(defun TeX-run-interactive (name command file)
- "Run TeX interactively.
-Run command in a buffer (in comint-shell-mode) so that it accepts user
-interaction. If you return to the file buffer after the TeX run,
-Error parsing on \\[next-error] should work with a bit of luck."
- (TeX-run-set-command name command)
- (require 'comint)
- (let ((default TeX-command-default)
- (buffer (TeX-process-buffer-name file))
- (process nil)
- (dir (TeX-master-directory))
- (command-buff (current-buffer))
- (sentinel-function TeX-sentinel-default-function)) ; inherit from
major mode
- (TeX-process-check file) ; Check that no process is running
- (setq-default TeX-command-buffer command-buff)
- (with-output-to-temp-buffer buffer)
- (set-buffer buffer)
- (set (make-local-variable 'TeX-command-buffer) command-buff)
- (setq buffer-read-only nil)
- (if dir (cd dir))
- (insert "Running `" name "' on `" file "' with ``" command "''\n")
- (comint-exec buffer name TeX-shell nil
- (list TeX-shell-command-option command))
- (comint-mode)
- (add-hook 'comint-output-filter-functions #'TeX-interactive-goto-prompt)
- (setq mode-name name)
- (setq TeX-command-default default)
- (setq process (get-buffer-process buffer))
- (if TeX-after-start-process-function
- (funcall TeX-after-start-process-function process))
- (TeX-command-mode-line process)
- (set-process-sentinel process #'TeX-command-sentinel)
- (set-marker (process-mark process) (point-max))
- (setq compilation-in-progress (cons process compilation-in-progress))
- (TeX-parse-reset)
- (setq TeX-parse-function #'TeX-parse-TeX)
- ;; use the sentinel-function that the major mode sets, not the LaTeX one
- (setq TeX-sentinel-function sentinel-function)))
-
-(defun TeX-run-function (_name command _file)
- "Execute Lisp function or function call given as the string COMMAND.
-Parameters NAME and FILE are ignored."
- (let ((fun (car (read-from-string command))))
- (if (functionp fun) (funcall fun) (eval fun t))))
-
-(defun TeX-run-discard-or-function (name command file)
- "Start COMMAND as process or execute it as a Lisp function.
-If run as a process, the output is discarded. COMMAND is
-expected to be a string. NAME and FILE are ignored."
- (if (functionp (car (read-from-string command)))
- (TeX-run-function name command file)
- (TeX-run-discard name command file)))
-
-(defun TeX-run-ispell-on-document (_command _ignored _name)
- "Run Ispell on all open files belonging to the current document.
-This function is *obsolete* and only here for compatibility
-reasons. Use `TeX-run-function' instead."
- (interactive)
- (TeX-ispell-document ""))
-
-
-;;; Command Sentinels
-
-(defun TeX-synchronous-sentinel (name file result)
- "Process TeX command output buffer after the process dies."
- (let ((buffer (TeX-process-buffer (file-name-nondirectory file))))
- (with-current-buffer buffer
-
- ;; Append post-mortem information to the buffer
- (goto-char (point-max))
- (insert "\n" mode-name (if (and result (zerop result))
- " finished" " exited") " at "
- (substring (current-time-string) 0 -5))
- (setq mode-line-process ": exit")
-
- ;; Do command specific actions.
- (setq TeX-command-next TeX-command-Show)
- (goto-char (point-min))
- (apply TeX-sentinel-function nil name nil)
-
- ;; Force mode line redisplay soon
- (force-mode-line-update))))
-
-(defun TeX-command-sentinel (process msg)
- "Process TeX command output buffer after the PROCESS dies.
-Insert MSG with some additional information."
- ;; Set `TeX-transient-master' here because `preview-parse-messages'
- ;; may open files and thereby trigger master file questions which we
- ;; don't want and need because we already know the master. Use
- ;; `TeX-master-file' instead of `TeX-active-master' to determine the
- ;; master because the region file should never be the master.
- (let* ((TeX-transient-master (TeX-master-file))
- (buffer (process-buffer process))
- (name (process-name process)))
- (cond ((null (buffer-name buffer)) ; buffer killed
- (set-process-buffer process nil)
- (set-process-sentinel process nil))
- ((memq (process-status process) '(signal exit))
- (with-current-buffer buffer
-
- ;; Append post-mortem information to the buffer
- (goto-char (point-max))
- (insert-before-markers "\n" mode-name " " msg)
- (forward-char -1)
- (insert " at "
- (substring (current-time-string) 0 -5))
- (forward-char 1)
-
- ;; Do command specific actions.
- (TeX-command-mode-line process)
- (setq TeX-command-next TeX-command-Show)
- (goto-char (point-min))
- (apply TeX-sentinel-function process name nil)
-
-
- ;; If buffer and mode line will show that the process
- ;; is dead, we can delete it now. Otherwise it
- ;; will stay around until M-x list-processes.
- (delete-process process))
-
- ;; Force mode line redisplay soon
- ;; Do this in all buffers (bug#38058 and bug#40965)
- (force-mode-line-update t))))
-
- (setq compilation-in-progress (delq process compilation-in-progress)))
-
-
-(defvar TeX-sentinel-function (lambda (_process _name) nil)
- "Hook to cleanup TeX command buffer after termination of PROCESS.
-NAME is the name of the process.")
-
-(make-variable-buffer-local 'TeX-sentinel-function)
-
-
-(defvar TeX-sentinel-default-function (lambda (_process _name) nil)
- "Default for `TeX-sentinel-function'. To be set in major mode.
-Hook to cleanup TeX command buffer after termination of PROCESS.
-NAME is the name of the process.")
-
-(make-variable-buffer-local 'TeX-sentinel-default-function)
-
-(defun TeX-TeX-sentinel (process name)
- "Cleanup TeX output buffer after running TeX.
-
-Parse the output buffer to collect errors and warnings if the
-variable `TeX-parse-all-errors' is non-nil.
-
-Open the error overview if
-`TeX-error-overview-open-after-TeX-run' is non-nil and there are
-errors or warnings to show."
- (if (TeX-TeX-sentinel-check process name)
- (progn
- (if TeX-parse-all-errors
- (TeX-parse-all-errors))
- (if (and TeX-error-overview-open-after-TeX-run
- (TeX-error-overview-make-entries
- (TeX-master-directory) (TeX-active-buffer)))
- (TeX-error-overview)))
- (message (concat name ": formatted " (TeX-current-pages)))
- (let (dvi2pdf)
- (if (with-current-buffer TeX-command-buffer
- (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
- (setq TeX-command-next dvi2pdf)
- (setq TeX-command-next TeX-command-Show)))))
-
-(defun TeX-current-pages ()
- "Return string indicating the number of pages formatted."
- (cond ((null TeX-current-page)
- "some pages")
- ((string-match "[^0-9]1[^0-9]" TeX-current-page)
- (concat TeX-current-page " page"))
- (t
- (concat TeX-current-page " pages"))))
-
-(defun TeX-TeX-sentinel-check (process name)
- "Cleanup TeX output buffer after running TeX.
-Return nil only if no errors were found."
- (save-excursion
- (goto-char (point-max))
- (cond
- ((and (string-match "ConTeXt" name) (boundp 'ConTeXt-Mark-version)
- (with-current-buffer TeX-command-buffer
- (string= ConTeXt-Mark-version "IV")))
- (when (re-search-backward " > result saved in file: \\(.*?\\), " nil t)
- (let ((output-file (TeX-match-buffer 1)))
- ;; Shave off quotation marks if present.
- (when (string-match "\\`\"\\(.*\\)\"\\'" output-file)
- (setq output-file (match-string 1 output-file)))
- (setq TeX-output-extension
- (if (string-match "\\.\\([^.]*\\)$" output-file)
- (match-string 1 output-file)
- "dvi")))
- (if (re-search-forward ", \\([0-9]+\\) shipped pages, " nil t)
- (setq TeX-current-page (concat "{" (TeX-match-buffer 1) "}")))))
- (t
- (if (re-search-backward "^Output written on \\(.*?\\) (\\([0-9]+\\) page"
- nil t)
- (let ((output-file (TeX-match-buffer 1)))
- (setq TeX-current-page (concat "{" (TeX-match-buffer 2) "}"))
- ;; Shave off quotation marks if present.
- (when (string-match "\\`\"\\(.*\\)\"\\'" output-file)
- (setq output-file (match-string 1 output-file)))
- (setq TeX-output-extension
- (if (string-match "\\.\\([^.]*\\)$" output-file)
- (match-string 1 output-file)
- "dvi")))))))
- (if process (TeX-format-mode-line process))
- (if (re-search-forward "^\\(!\\|.*:[0-9]+:\\) " nil t)
- (progn
- (message "%s errors in `%s'. Use %s to display." name (buffer-name)
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-next-error]"))
- (setq TeX-command-next TeX-command-default)
- ;; error reported to TeX-error-report-switches
- (setq TeX-error-report-switches
- (plist-put TeX-error-report-switches
- (intern (plist-get TeX-error-report-switches
- 'TeX-current-master))
- t))
- t)
- (let (dvi2pdf)
- (if (with-current-buffer TeX-command-buffer
- (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
- (setq TeX-command-next dvi2pdf)
- (setq TeX-command-next TeX-command-Show)))
- nil))
-
-;; This regexp should catch warnings of the type
-;; LaTeX Warning: ...
-;; LaTeX Font Warning: ...
-;; Package xyz123 Warning: ...
-;; Class xyz123 Warning: ...
-(defvar LaTeX-warnings-regexp
- "\\(?:LaTeX\\|Class\\|Package\\|\\*\\) [-A-Za-z0-9]* ?[Ww]arning:"
- "Regexp matching LaTeX warnings.")
-
-(defun TeX-LaTeX-sentinel-has-warnings ()
- "Return non-nil, if the output buffer contains warnings.
-Warnings can be indicated by LaTeX or packages."
- (save-excursion
- (goto-char (point-min))
- (re-search-forward (concat "^" LaTeX-warnings-regexp) nil t)))
-
-(defun TeX-LaTeX-sentinel-has-bad-boxes ()
- "Return non-nil, if LaTeX output indicates overfull or underfull boxes."
- (save-excursion
- (goto-char (point-min))
- (re-search-forward "^\\(Ov\\|Und\\)erfull \\\\" nil t)))
-
-;; should go into latex.el? --pg
-(defun TeX-LaTeX-sentinel (process name)
- "Cleanup TeX output buffer after running LaTeX.
-
-Parse the output buffer to collect errors and warnings if the
-variable `TeX-parse-all-errors' is non-nil.
-
-Open the error overview if
-`TeX-error-overview-open-after-TeX-run' is non-nil and there are
-errors or warnings to show."
- (if TeX-parse-all-errors
- (TeX-parse-all-errors))
- (if (and TeX-error-overview-open-after-TeX-run
- (TeX-error-overview-make-entries
- (TeX-master-directory) (TeX-active-buffer)))
- (TeX-error-overview))
- (cond ((TeX-TeX-sentinel-check process name))
- ((and (save-excursion
- (re-search-forward
- "^Package biblatex Warning: Please (re)run Biber on the file"
- nil t))
- (with-current-buffer TeX-command-buffer
- (and (LaTeX-bibliography-list)
- (TeX-check-files (TeX-master-file "bbl")
- (TeX-style-list)
- (append TeX-file-extensions
- BibTeX-file-extensions
- TeX-Biber-file-extensions)))))
- (message "%s%s" "You should run Biber to get citations right, "
- (TeX-current-pages))
- (setq TeX-command-next (with-current-buffer TeX-command-buffer
- TeX-command-Biber)))
- ((and (save-excursion
- (re-search-forward
- "^\\(?:LaTeX\\|Package natbib\\) Warning: Citation" nil t))
- (with-current-buffer TeX-command-buffer
- (and (LaTeX-bibliography-list)
- (TeX-check-files (TeX-master-file "bbl")
- (TeX-style-list)
- (append TeX-file-extensions
- BibTeX-file-extensions
- TeX-Biber-file-extensions)))))
- (message "%s%s" "You should run BibTeX to get citations right, "
- (TeX-current-pages))
- (setq TeX-command-next (with-current-buffer TeX-command-buffer
- TeX-command-BibTeX)))
- ((re-search-forward "Package biblatex Warning: Please rerun LaTeX" nil
t)
- (message "%s%s" "You should run LaTeX again, " (TeX-current-pages))
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "^(biblatex)\\W+Page breaks have changed" nil t)
- (message "%s%s" "You should run LaTeX again - page breaks have
changed, "
- (TeX-current-pages))
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "^\\(?:LaTeX Warning: Label(s)\\|\
-Package natbib Warning: Citation(s)\\)" nil t)
- (message "%s%s" "You should run LaTeX again to get references right, "
- (TeX-current-pages))
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward
- "^\\(?:(rerunfilecheck)\\|Package hyperref Warning:\\)\\W+\
-Rerun to get outlines right" nil t)
- (message "%s%s" "You should run LaTeX again to get outlines right, "
- (TeX-current-pages))
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "^LaTeX Warning: Reference" nil t)
- (message "%s%s%s" name ": there were unresolved references, "
- (TeX-current-pages))
- (let (dvi2pdf)
- (if (with-current-buffer TeX-command-buffer
- (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
- (setq TeX-command-next dvi2pdf)
- (setq TeX-command-next TeX-command-Show))))
- ((re-search-forward "^\\(?:LaTeX Warning: Citation\\|\
-Package natbib Warning:.*undefined citations\\)" nil t)
- (message "%s%s%s" name ": there were unresolved citations, "
- (TeX-current-pages))
- (let (dvi2pdf)
- (if (with-current-buffer TeX-command-buffer
- (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
- (setq TeX-command-next dvi2pdf)
- (setq TeX-command-next TeX-command-Show))))
- ((re-search-forward "^No file .*\\.\\(toc\\|lof\\|lot\\)\\.$" nil t)
- (message "%s" (concat "You should run LaTeX again to get "
- (upcase (match-string-no-properties 1))
- " right"))
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "Package longtable Warning: Table widths have \
-changed\\. Rerun LaTeX\\." nil t)
- (message
- "%s" "You should run LaTeX again to get table formatting right")
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "^hf-TikZ Warning: Mark '.*' changed\\. \
-Rerun to get mark in right position\\." nil t)
- (message
- "%s" "You should run LaTeX again to get TikZ marks in right
position")
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward "^\\* xsim warning: \"rerun\"" nil t)
- (message
- "%s" "You should run LaTeX again to synchronize exercise properties")
- (setq TeX-command-next TeX-command-default))
- ((re-search-forward
- "^\\(\\*\\* \\)?J?I?p?\\(La\\|Sli\\)TeX\\(2e\\)? \
-\\(Version\\|ver\\.\\|<[0-9/-]*\\(?:u[^>]*\\)?>\\)" nil t)
- (let* ((warnings (and TeX-debug-warnings
- (TeX-LaTeX-sentinel-has-warnings)))
- (bad-boxes (and TeX-debug-bad-boxes
- (TeX-LaTeX-sentinel-has-bad-boxes)))
- (add-info (when (or warnings bad-boxes)
- (concat " (with "
- (when warnings "warnings")
- (when (and warnings bad-boxes) " and ")
- (when bad-boxes "bad boxes")
- ")"))))
- (message "%s" (concat name ": successfully formatted "
- (TeX-current-pages) add-info)))
- (let (dvi2pdf)
- (if (with-current-buffer TeX-command-buffer
- (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
- (setq TeX-command-next dvi2pdf)
- (setq TeX-command-next TeX-command-Show))))
- (t
- (message "%s%s%s" name ": problems after " (TeX-current-pages))
- (setq TeX-command-next TeX-command-default)))
-
- ;; Check whether the idx file changed.
- (let (idx-file)
- (and (file-exists-p
- (setq idx-file
- (with-current-buffer TeX-command-buffer
- (expand-file-name (TeX-active-master "idx")))))
- ;; imakeidx package automatically runs makeindex, thus, we need to be
- ;; sure .ind file isn't newer than .idx.
- (TeX-check-files (with-current-buffer TeX-command-buffer
- (expand-file-name (TeX-active-master "ind")))
- (with-current-buffer TeX-command-buffer
- (list (file-name-nondirectory
(TeX-active-master))))
- '("idx"))
- (with-temp-buffer
- (insert-file-contents-literally idx-file)
- (not (equal
- ;; Compare old md5 hash of the idx file with the new one.
- (cdr (assoc idx-file LaTeX-idx-md5-alist))
- (md5 (current-buffer)))))
- (push (cons idx-file t) LaTeX-idx-changed-alist)))
-
- (unless (TeX-error-report-has-errors-p)
- (run-hook-with-args 'TeX-after-compilation-finished-functions
- (with-current-buffer TeX-command-buffer
- (expand-file-name
- (TeX-active-master (TeX-output-extension)))))))
-
-;; should go into latex.el? --pg
-(defun TeX-BibTeX-sentinel (_process _name)
- "Cleanup TeX output buffer after running BibTeX."
- (goto-char (point-max))
- (cond
- ;; Check whether BibTeX reports any warnings or errors.
- ((re-search-backward (concat
- "^(There \\(?:was\\|were\\) \\([0-9]+\\) "
- "\\(warnings?\\|error messages?\\))")
- nil t)
- ;; Tell the user their number so that she sees whether the
- ;; situation is getting better or worse.
- (message (concat "BibTeX finished with %s %s. "
- "Type `%s' to display output.")
- (match-string 1) (match-string 2)
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (t
- (message (concat "BibTeX finished successfully. "
- "Run LaTeX again to get citations right."))))
- ;; In any case, run the default next command.
- (setq TeX-command-next TeX-command-default))
-
-(defun TeX-Biber-sentinel (_process _name)
- "Cleanup TeX output buffer after running Biber."
- (goto-char (point-max))
- (cond
- ((re-search-backward "^INFO - \\(WARNINGS\\|ERRORS\\): \\([0-9]+\\)" nil t)
- (message (concat "Biber finished with %s %s. "
- "Type `%s' to display output.")
- (match-string 2) (downcase (match-string 1))
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]"))
- (setq TeX-command-next TeX-command-default))
- ((re-search-backward "^FATAL" nil t)
- (message (concat "Biber had a fatal error and did not finish! "
- "Type `%s' to display output.")
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]"))
- (setq TeX-command-next TeX-command-Biber))
- (t
- (message (concat "Biber finished successfully. "
- "Run LaTeX again to get citations right."))
- (setq TeX-command-next TeX-command-default))))
-
-(defun TeX-dvips-sentinel (_process _name)
- "Cleanup TeX output buffer after running dvips."
- (goto-char (point-max))
- (cond
- ((search-backward "TeX Output exited abnormally" nil t)
- (message "Dvips failed. Type `%s' to display output."
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (t
- (if (with-current-buffer TeX-command-buffer
- (and (equal (TeX-PDF-from-DVI) "Dvips") TeX-PDF-mode))
- (setq TeX-output-extension "ps"
- TeX-command-next "Ps2pdf"))
- (message "Dvips finished successfully. "))))
-
-(defun TeX-dvipdfmx-sentinel (_process _name)
- "Cleanup TeX output buffer after running dvipdfmx."
- (goto-char (point-max))
- (cond
- ((search-backward "TeX Output exited abnormally" nil t)
- (message "Dvipdfmx failed. Type `%s' to display output."
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (t
- (if (with-current-buffer TeX-command-buffer
- (and (equal (TeX-PDF-from-DVI) "Dvipdfmx") TeX-PDF-mode))
- (setq TeX-output-extension "pdf"
- TeX-command-next TeX-command-Show))
- (message "Dvipdfmx finished successfully. "))))
-
-(defun TeX-ps2pdf-sentinel (_process _name)
- "Cleanup TeX output buffer after running ps2pdf."
- (goto-char (point-max))
- (cond
- ((search-backward "TeX Output exited abnormally" nil t)
- (message "ps2pdf failed. Type `%s' to display output."
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (t
- (if (with-current-buffer TeX-command-buffer
- (and (equal (TeX-PDF-from-DVI) "Dvips") TeX-PDF-mode))
- (setq TeX-command-next TeX-command-Show
- TeX-output-extension "pdf"))
- (message "ps2pdf finished successfully. "))))
-
-(defun TeX-index-sentinel (_process _name)
- "Cleanup TeX output buffer after compiling index."
- (goto-char (point-max))
- (cond
- ((search-backward "TeX Output exited abnormally" nil t)
- (message "Index failed. Type `%s' to display output."
- (substitute-command-keys
- "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
- (t
- (setq TeX-command-next TeX-command-default)
- (message (concat "Index finished successfully. "
- "Run LaTeX again to get index right.")))))
-
-(defun TeX-command-sequence-sentinel (process string)
- "Call the appropriate sentinel for the current PROCESS.
-Pass two arguments PROCESS and STRING to the sentinel.
-
-If there are no errors, call back `TeX-command-sequence' using
-`TeX-command-sequence-command' as command argument, unless this
-variable is nil."
- (with-current-buffer (process-buffer process)
- (funcall TeX-command-sequence-sentinel process string)
- (if (string-match "\\(finished\\|exited\\)" string)
- (with-current-buffer TeX-command-buffer
- (unless
- (or
- (TeX-error-report-has-errors-p)
- (null TeX-command-sequence-command))
- (TeX-command-sequence TeX-command-sequence-command nil
- TeX-command-sequence-file-function))))))
-
-;;; Process Control
-
-;; COMPATIBILITY for emacs < 27
-(if (< emacs-major-version 27)
- (or (assq 'compilation-in-progress minor-mode-alist)
- (setq minor-mode-alist (cons '(compilation-in-progress " Compiling")
- minor-mode-alist))))
-
-(defun TeX-process-get-variable (name symbol &optional default)
- "Return the value in the process buffer for NAME of SYMBOL.
-
-Return DEFAULT if the process buffer does not exist or SYMBOL is not
-defined."
- (let ((buffer (TeX-process-buffer name)))
- (if (and buffer
- (local-variable-p symbol buffer))
- (with-current-buffer buffer
- (symbol-value symbol))
- default)))
-
-(defun TeX-process-set-variable (name symbol value)
- "Set the variable SYMBOL in the process buffer to VALUE.
-Return nil only if no process buffer exists."
- (let ((buffer (TeX-process-buffer name)))
- (if buffer
- (with-current-buffer buffer
- (set symbol value)
- t)
- nil)))
-
-(defun TeX-process-check (name)
- "Check if a process for the TeX document NAME already exist.
-If so, give the user the choice of aborting the process or the current
-command."
- (let (process)
- (while (and (setq process (TeX-process name))
- (eq (process-status process) 'run))
- (cond
- ((yes-or-no-p (concat "Process `"
- (process-name process)
- "' for document `"
- name
- "' running, kill it? "))
- (delete-process process))
- ((eq (process-status process) 'run)
- (error "Cannot have two processes for the same document"))))))
-
-(defun TeX-process-buffer-name (name)
- "Return name of AUCTeX buffer associated with the document NAME."
- (concat "*" (abbreviate-file-name (expand-file-name name)) " output*"))
-
-(defun TeX-process-buffer (name)
- "Return the AUCTeX buffer associated with the document NAME."
- (get-buffer (TeX-process-buffer-name name)))
-
-(defun TeX-process (name)
- "Return AUCTeX process associated with the document NAME."
- (and TeX-process-asynchronous
- (get-buffer-process (TeX-process-buffer name))))
-
-;;; Process Filters
-
-(defun TeX-command-mode-line (process)
- "Format the mode line for a buffer containing output from PROCESS."
- (setq mode-line-process (concat ": "
- (symbol-name (process-status process))))
- (force-mode-line-update))
-
-(defun TeX-command-filter (process string)
- "Filter to process normal output."
- (with-current-buffer (process-buffer process)
- (save-excursion
- (goto-char (process-mark process))
- (insert-before-markers string)
- (set-marker (process-mark process) (point)))))
-
-(defvar TeX-current-page nil
- "The page number currently being formatted, enclosed in brackets.")
-
- (make-variable-buffer-local 'TeX-current-page)
-
-(defun TeX-format-mode-line (process)
- "Format the mode line for a buffer containing TeX output from PROCESS."
- (setq mode-line-process (concat " " TeX-current-page ": "
- (symbol-name (process-status process))))
- (force-mode-line-update))
-
-(defun TeX-format-filter (process string)
- "Filter to process TeX output."
- (with-current-buffer (process-buffer process)
- (let (str pos end (pt (marker-position (process-mark process))))
- (save-excursion
- (goto-char pt)
- (insert-before-markers string)
- (set-marker (process-mark process) (point))
- ;; Remove line breaks at columns 79 and 80
- (while (> (point) pt)
- (end-of-line 0)
- (when (and (memq (- (point) (line-beginning-position)) '(79 80))
- ;; Heuristic: Don't delete the linebreak if the next line
- ;; is empty or starts with an opening parenthesis, or if
- ;; point is located after a period and in the next line no
- ;; word char follows.
- (not (memq (char-after (1+ (point))) '(?\n ?\()))
- (not (and (eq (char-before) ?.)
- (char-after (1+ (point)))
- (not (eq ?w (char-syntax (char-after (1+
(point)))))))))
- (delete-char 1)))
- (goto-char (marker-position (process-mark process)))
- ;; Determine current page
- (while (and pt
- (skip-chars-backward "^]" pt)
- (> (point) pt))
- (setq end (point))
- (backward-char)
- (skip-chars-backward "-0-9\n." (max (point-min) (- pt 128)))
- (when (and (eq ?\[ (char-before))
- (not (eq ?\] (char-after)))
- (progn
- (setq str (buffer-substring (1- (point)) end)
- pos nil)
- (while (setq pos (string-match "\n" str pos))
- (setq str (replace-match "" t t str)))
- (string-match
- "\\`\\[-?[0-9]+\\(\\.-?[0-9]+\\)\\{0,9\\}\\]\\'"
- str)))
- (setq TeX-current-page str
- pt nil)
- (TeX-format-mode-line process)))))))
-
-(defvar TeX-parse-function nil
- "Function to call to parse content of TeX output buffer.")
-(make-variable-buffer-local 'TeX-parse-function)
-
-(defun TeX-background-filter (_process string)
- "Filter to process background output."
- (let ((old-window (selected-window))
- (pop-up-windows t))
- (TeX-pop-to-buffer "*TeX background*" nil t)
- (goto-char (point-max))
- (insert string)
- (select-window old-window)))
-
-;; Copy and adaption of `comint-postoutput-scroll-to-bottom' from CVS
-;; Emacs of 2005-04-24.
-(defun TeX-interactive-goto-prompt (string)
- "Move point to prompt of an interactive TeX run."
- (let* ((selected (selected-window))
- (current (current-buffer))
- (process (get-buffer-process current)))
- (unwind-protect
- (when process
- (walk-windows
- (lambda (window)
- (when (eq (window-buffer window) current)
- (select-window window)
- (when (and (< (point) (process-mark process))
- (string-match "^\\? $" string))
- (goto-char (process-mark process)))
- (select-window selected)))
- nil t))
- (set-buffer current))))
-
-
-;;; Active Process
-
-(defvar TeX-current-process-region-p nil
- "Non-nil means that the last TeX command is on a region.")
-
-(defun TeX-active-process ()
- "Return the active process for the current buffer."
- (TeX-process (TeX-active-master)))
-
-(defun TeX-active-buffer ()
- "Return the buffer of the active process for this buffer."
- (and TeX-command-buffer
- (with-current-buffer TeX-command-buffer
- (TeX-process-buffer (TeX-active-master)))))
-
-(defun TeX-active-master (&optional extension nondirectory _ignore)
- "The master file currently being compiled.
-
-If optional argument EXTENSION is non-nil, add that file extension to
-the name. Special value t means use `TeX-default-extension'.
-
-If optional second argument NONDIRECTORY is non-nil, do not include
-the directory.
-
-The compatibility argument IGNORE is ignored."
- ;; The third argument `_ignore' is kept for symmetry with
- ;; `TeX-master-file's third argument `ask'. For example, it's used
- ;; in `TeX-active-master-with-quotes' for backward compatibility.
- ;; Keep this in mind should you want to use another argument here.
- ;; See also the similar comment in `TeX-region-file'.
- (if TeX-current-process-region-p
- (TeX-region-file extension nondirectory)
- (TeX-master-file extension nondirectory)))
-
-(defvar TeX-command-buffer nil
- "The buffer from where the last TeX command was issued.")
-
-;;; Region File
-
-
-(defvar TeX-region-hook nil
- "List of hooks to run before the region file is saved.
-The hooks are run in the region buffer, you may use the variable
-`TeX-region-master-buffer' to access the buffer of the master
-file and `TeX-region-orig-buffer' to access the buffer where
-\\[TeX-command-region] or \\[TeX-command-buffer] is invoked
-from.")
-
-(defun TeX-quote-filename (file)
- "Convert file name into a form acceptable to TeX."
- (let (pos)
- (while (setq pos (string-match "\\\\" file pos))
- (setq file (replace-match "/" t t file 0)
- pos (1+ pos)))
- (while (setq pos (string-match "[~#]" file pos))
- (setq file (replace-match "\\\\string\\&" t nil file 0)
- pos (+ pos 8))))
- ;; Use \unexpanded so that \message outputs the raw file name.
- ;; When \usepackage[utf8]{inputenc} is used in standard (pdf)latex,
- ;; \message does not output non-ascii file name in raw form without
- ;; \unexpanded, which makes AUCTeX to fail to recognize the file
- ;; names right when analysing the process output buffer.
- ;; Note that \usepackage[utf8]{inputenc} is enabled by default in
- ;; standard (pdf)latex since TeXLive 2018.
- (if (and (memq major-mode '(latex-mode doctex-mode))
- ;; Japanese upLaTeX requires the same treatment with
- ;; respect to non-ascii characters other than Japanese, in
- ;; file names within \message{}.
- ;; However, pLaTeX (non u- version) does not support
- ;; non-ascii file name encoded in UTF-8. So considering
- ;; `ptex' doesn't make sense here. We cater for only
- ;; `default' and `uptex' engines.
- (memq TeX-engine '(default uptex)))
- ;; It would fail to put entire `file' inside \unexpanded{} when
- ;; the above loop injects \string before "#" and "~". So put
- ;; only multibyte characters inside \unexpanded{}.
- ;; It is safe in upLaTeX to use \unexpanded{} on Japanese
- ;; characters though they are handled by upLaTeX in a totally
- ;; different way from inputenc.
- ;; Thus put all multibyte characters, without considering
- ;; whether they are Japanese or not, inside \unexpanded{}.
- (replace-regexp-in-string "[[:multibyte:]]+"
- "\\\\unexpanded{\\&}" file t)
- file))
-
-(defvar-local TeX-region-orig-buffer nil
- "The original buffer in which the TeX-region was created.")
-
-(defvar-local TeX-region-master-buffer nil
- "The TeX-master buffer of the document for which the TeX-region
-was created.")
-
-(defun TeX-region-create (file region original offset)
- "Create a new file named FILE with the string REGION.
-The region is taken from ORIGINAL starting at line OFFSET.
-
-The current buffer and master file is searched, in order to ensure
-that the TeX header and trailer information is also included.
-
-The OFFSET is used to provide the debugger with information about the
-original file."
- (if (fboundp 'preview--skip-preamble-region)
- (let ((temp (preview--skip-preamble-region region offset)))
- (if temp
- ;; Skip preamble for the sake of predumped formats.
- (setq region (car temp)
- offset (cdr temp)))))
-
- (let* (;; We shift buffer a lot, so we must keep track of the buffer
- ;; local variables.
- (header-end TeX-header-end)
- (trailer-start TeX-trailer-start)
-
- ;; We seach for header and trailer in the master file.
- (orig-buffer (current-buffer))
- (master-name (TeX-master-file TeX-default-extension))
- (master-buffer (find-file-noselect master-name))
-
- ;; Attempt to disable font lock.
- (font-lock-mode-hook nil)
- ;; And insert them into the FILE buffer.
- (file-buffer (let (;; Don't query for master file
- (TeX-transient-master t)
- ;; Don't choose a special mode (and call its hooks)
- (auto-mode-alist nil)
- (magic-mode-alist nil)
- (enable-local-variables nil)
- ;; Don't run any f-f hooks
- (find-file-hook nil))
- (find-file-noselect file t)))
- ;; But remember original content.
- original-content
-
- ;; We search for the header from the master file, if it is
- ;; not present in the region.
- (header (if (string-match header-end region)
- ""
- (save-excursion
- (save-restriction
- (set-buffer master-buffer)
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-min))
- ;; NOTE: We use the local value of
- ;; TeX-header-end from the master file.
- (if (not (re-search-forward TeX-header-end nil t))
- ""
- (re-search-forward "[\r\n]" nil t)
- (buffer-substring-no-properties
- (point-min) (point)))))))))
- (header-offset 0)
- first-line
- ;; We search for the trailer from the master file, if it is
- ;; not present in the region.
- (trailer-offset 0)
- (trailer (if (string-match trailer-start region)
- ""
- (save-excursion
- (save-restriction
- (set-buffer master-buffer)
- (save-excursion
- (save-restriction
- (widen)
- (goto-char (point-max))
- ;; NOTE: We use the local value of
- ;; TeX-trailer-start from the master file.
- (if (not (re-search-backward TeX-trailer-start nil
t))
- ""
- ;;(beginning-of-line 1)
- (re-search-backward "[\r\n]" nil t)
- (setq trailer-offset (TeX-current-offset))
- (buffer-substring-no-properties
- (point) (point-max))))))))))
- ;; file name should be relative to master
- (setq original (TeX-quote-filename (file-relative-name
- original (TeX-master-directory)))
- master-name (TeX-quote-filename master-name))
-
- ;; If the first line begins with "%&", put that line separately on
- ;; the very first line of the region file so that the first line
- ;; parsing will work.
- (setq first-line (if (and (> (length header) 1)
- (string= (substring header 0 2) "%&"))
- ;; This would work even if header has no newline.
- (substring header 0 (string-match "\n" header))
- ""))
- (unless (string= first-line "")
- ;; Remove first-line from header.
- (setq header (substring header (length first-line)))
- (setq first-line (concat first-line "\n")))
-
- (with-current-buffer file-buffer
- (setq buffer-read-only t
- buffer-undo-list t)
- (setq original-content (buffer-string))
- (let ((inhibit-read-only t))
- (erase-buffer)
- (setq buffer-file-coding-system
- (with-current-buffer master-buffer buffer-file-coding-system))
- (insert first-line
- "\\message{ !name(" master-name ")}"
- header
- TeX-region-extra
- "\n\\message{ !name(" original ") !offset(")
- (setq header-offset (- offset
- (1+ (TeX-current-offset))))
- (insert (int-to-string header-offset)
- ") }\n"
- region
- "\n\\message{ !name(" master-name ") !offset(")
- (insert (int-to-string (- trailer-offset
- (1+ (TeX-current-offset))))
- ") }\n"
- trailer)
- (setq TeX-region-orig-buffer orig-buffer)
- (setq TeX-region-master-buffer master-buffer)
- (run-hooks 'TeX-region-hook)
- (if (string-equal (buffer-string) original-content)
- (set-buffer-modified-p nil)
- (save-buffer 0))))))
-
-(defun TeX-region-file (&optional extension nondirectory _ignore)
- "Return TeX-region file name with EXTENSION.
-If optional second argument NONDIRECTORY is non-nil, do not include
-the directory.
-
-The compatibility argument IGNORE is ignored."
- ;; The third argument `_ignore' is kept for symmetry with `TeX-master-file's
- ;; third argument `ask'. For example, it's used in `TeX-command-sequence',
- ;; where we don't know which function has to be called. Keep this in mind
- ;; should you want to use another argument here.
- (let ((master-dir (TeX-master-directory)))
- (concat (or (TeX--master-output-dir master-dir nondirectory)
- (if nondirectory "" master-dir))
- (cond ((eq extension t)
- (concat TeX-region "." TeX-default-extension))
- (extension
- (concat TeX-region "." extension))
- (t
- TeX-region)))))
-
-(defcustom TeX-region "_region_"
- "Base name of temporary file for `TeX-command-region' and
`TeX-command-buffer'."
- :group 'TeX-command
- :type 'string)
-
-(defvar LaTeX-command-section-level nil
- "The section level used for `LaTeX-command-section'.
-Will be initialized to `LaTeX-largest-level' buffer-locally.")
-(make-variable-buffer-local 'LaTeX-command-section-level)
-
-(defun LaTeX-command-section-level ()
- "Return the value of `LaTeX-command-section-level'.
-Initialize it to `LaTeX-largest-level' if needed."
- (unless LaTeX-command-section-level
- (setq LaTeX-command-section-level LaTeX-largest-level))
- LaTeX-command-section-level)
-
-
-(defun LaTeX-command-section-change-level (arg)
- "Change `LaTeX-command-section-level' by ARG.
-`LaTeX-command-section-level' is the sectioning level used to
-determine the current section by `LaTeX-command-section'.
-The levels are defined by `LaTeX-section-list'."
- (interactive "p")
- (let ((old-level (car (rassoc (list (LaTeX-command-section-level))
- LaTeX-section-list))))
- (setq LaTeX-command-section-level (+ LaTeX-command-section-level arg))
- (cond
- ((> LaTeX-command-section-level 6)
- (setq LaTeX-command-section-level 6)
- (message "Cannot shrink LaTeX-command-section-level below
subparagraph."))
- ((< LaTeX-command-section-level 0)
- (setq LaTeX-command-section-level 0)
- (message "Cannot enlarge LaTeX-command-section-level above part."))
- (t (message "Changed level from %s to %s."
- old-level (car (rassoc (list LaTeX-command-section-level)
- LaTeX-section-list)))))))
-
-(defun LaTeX-command-section-boundaries ()
- "Return the boundaries of the current section as (start . end).
-The section is determined by `LaTeX-command-section-level'."
- (let* ((case-fold-search nil)
- (rx (concat "\\\\" (regexp-opt
- (mapcar
- (lambda (level)
- (car (rassoc (list level) LaTeX-section-list)))
- (let (r)
- (dotimes (i (1+ (LaTeX-command-section-level)))
- (push i r))
- r)))
- "{")))
- (cons (save-excursion
- (re-search-backward rx nil t)
- (point))
- (save-excursion
- (re-search-forward (concat rx "\\|\\\\end{document}") nil t)
- (forward-line 0)
- (point)))))
-
-(defun LaTeX-command-section (&optional override-confirm)
- "Run a command on the current section.
-
-What makes the current section is defined by
-`LaTeX-command-section-level' which can be enlarged or shrunken
-with `LaTeX-command-section-change-level'.
-
-Query the user for a command to run on the temporary file
-specified by the variable `TeX-region'. The region file will be
-recreated from current section.
-
-If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
-depend on it being positive instead of the entry in
-`TeX-command-list'."
- (interactive "P")
- (if (eq major-mode 'latex-mode)
- (let* ((bounds (LaTeX-command-section-boundaries))
- (TeX-command-region-begin (car bounds))
- (TeX-command-region-end (cdr bounds)))
- (TeX-command-region override-confirm))
- (error "LaTeX-command-section can only be run on LaTeX documents")))
-
-(defun TeX-command-run-all-region ()
- "Compile the current region until an error occurs or it is finished."
- (interactive)
- (TeX-region-update)
- (TeX-command-sequence t t #'TeX-region-file))
-
-(defun LaTeX-command-run-all-section ()
- "Compile the current section until an error occurs or it is finished."
- (interactive)
- (if (eq major-mode 'latex-mode)
- (let* ((bounds (LaTeX-command-section-boundaries))
- (TeX-command-region-begin (car bounds))
- (TeX-command-region-end (cdr bounds)))
- (TeX-region-update)
- (TeX-command-sequence t t #'TeX-region-file))
- (error "LaTeX-command-run-all-section can only be run on LaTeX
documents")))
-
-(defun TeX-command-run-all (arg)
- "Compile the current document until an error occurs or it is finished.
-With a prefix ARG (`\\[universal-argument] \\[TeX-command-run-all]'),
-compile the current region instead, that is, call
-`TeX-command-run-all-region'. With multiple prefix
-arguments (`\\[universal-argument] \\[universal-argument]
\\[TeX-command-run-all]'),
-compile the current section instead, that is, call
-`LaTeX-command-run-all-section'."
- (interactive "P")
- (cond
- ((null arg) (TeX-command-sequence t t))
- ((= 4 (car arg)) (TeX-command-run-all-region))
- (t (LaTeX-command-run-all-section))))
-
-;;; Parsing
-
-;;; - Global Parser Variables
-
-(defvar TeX-error-point nil
- "How far we have parsed until now.")
-
-(make-variable-buffer-local 'TeX-error-point)
-
-(defvar TeX-error-file nil
- "Stack of files in which errors have occurred.")
-
-(make-variable-buffer-local 'TeX-error-file)
-
-(defvar TeX-error-offset nil
- "Add this to any line numbers from TeX. Stack like `TeX-error-file'.")
-
-(make-variable-buffer-local 'TeX-error-offset)
-
-(defun TeX-parse-reset (&optional reparse)
- "Reset all variables used for parsing TeX output.
-If optional argument REPARSE is non-nil, reparse the output log."
- (setq TeX-error-point (point-min)
- TeX-error-offset nil
- TeX-error-file nil
- TeX-error-list nil
- TeX-error-last-visited -1)
- (if reparse
- (TeX-parse-all-errors)))
-
-;;; - Parsers Hooks
-
-;; All this parsers hooks should have the same arguments even though they will
-;; be ignored, because `TeX-next-error' can call any of these functions.
-(defun TeX-parse-command (_arg _reparse)
- "We can't parse anything but TeX."
- (error "I cannot parse %s output, sorry"
- (if (TeX-active-process)
- (process-name (TeX-active-process))
- "this")))
-
-(defun TeX-error-list-skip-warning-p (type ignore)
- "Decide if a warning of `TeX-error-list' should be skipped.
-
-TYPE is one of the types listed in `TeX-error-list', IGNORE
-is the flag to choose if the warning should be skipped."
- ;; The warning should be skipped if it...
- (or
- ;; ...is a warning and we want to ignore all warnings, or...
- (and (null TeX-debug-warnings)
- (equal type 'warning))
- ;; ...is a bad-box and we want to ignore all bad-boxes, or...
- (and (null TeX-debug-bad-boxes)
- (equal type 'bad-box))
- ;; ...is a warning to be ignored.
- (and TeX-suppress-ignored-warnings
- ignore)))
-
-(defun TeX-parse-TeX (arg reparse)
- "Find the next error produced by running TeX.
-
-ARG specifies how many error messages to move, when possible;
-negative means move back to previous error messages.
-
-If REPARSE is non-nil, reparse the output log.
-
-If the file occurs in an included file, the file is loaded (if not
-already in an Emacs buffer) and the cursor is placed at the error."
- (let ((old-buffer (current-buffer))
- max-index item)
-
- ;; Switch to the output buffer.
- (with-current-buffer (TeX-active-buffer)
- (if reparse
- (TeX-parse-reset reparse))
- (if TeX-parse-all-errors
- (progn
- (setq arg (or arg 1)
- max-index (length TeX-error-list))
- ;; This loop is needed to skip ignored warnings, when
- ;; `TeX-suppress-ignored-warnings' is non-nil and there are ignore
- ;; warnings.
- (while (null (zerop arg))
- (setq TeX-error-last-visited
- ;; Increase or decrese `TeX-error-last-visited' depending
on
- ;; the sign of `arg'. Note: `signum' is a function from
- ;; `cl' library, do not be tempted to use it.
- (if (> arg 0)
- (1+ TeX-error-last-visited)
- (1- TeX-error-last-visited))
- item (nth TeX-error-last-visited TeX-error-list))
- ;; Increase or decrease `arg' only if the warning isn't to be
- ;; skipped.
- (unless (TeX-error-list-skip-warning-p (nth 0 item) (nth 10
item))
- ;; Note: `signum' is a function from `cl' library, do not be
- ;; tempted to use it.
- (setq arg (if (> arg 0)
- (1- arg)
- (1+ arg)))))
- (if (< TeX-error-last-visited -1)
- (setq TeX-error-last-visited -1))
- (cond ((or (null item)
- (< TeX-error-last-visited 0))
- (if (> TeX-error-last-visited max-index)
- (setq TeX-error-last-visited max-index))
- (message "No more errors.")
- (beep)
- (TeX-pop-to-buffer old-buffer))
- (t
- (apply #'TeX-find-display-help item))))
-
- (goto-char TeX-error-point)
- (TeX-parse-error old-buffer)))))
-
-;;; - Parsing (La)TeX
-
-(defvar TeX-translate-location-file nil)
-(defvar TeX-translate-location-offset nil)
-(defvar TeX-translate-location-line nil)
-(defvar TeX-translate-location-string nil)
-(defvar TeX-translate-location-error nil)
-(defvar TeX-translate-location-context nil)
-
-(defvar TeX-translate-location-hook nil
- "List of functions to be called before showing an error or warning.
-
-You might want to examine and modify the dynamically bound
-variables
- `TeX-translate-location-file',
- `TeX-translate-location-offset',
- `TeX-translate-location-line',
- `TeX-translate-location-string',
- `TeX-translate-location-error', and
- `TeX-translate-location-context'
-from this hook.")
-
-;; `ignore' flag should be the always the last one in the list of information
-;; for each error/warning, because it can be set within `TeX-warning' by a
-;; custom function taking as argument all information present in
-;; `TeX-error-list' but `ignore', see `TeX-ignore-warnings'.
-(defvar TeX-error-list nil
- "List of warnings and errors.
-
-Each element of the list is a list of information for a specific
-error or warning. This is the structure of each element:
- * 0: type (error, warning, bad-box)
- * 1: file
- * 2: line
- * 3: message of the error or warning
- * 4: offset
- * 5: context, to be displayed in the help window
- * 6: string to search in the buffer, in order to find location
- of the error or warning
- * 7: for warnings referring to multiple lines (for exapmle, bad boxes),
- the last line mentioned in the warning message
- * 8: t if it is a bad-box, nil otherwise
- * 9: value of `TeX-error-point'
- * 10: whether the warning should be ignored
-
-This variable is intended to be set only in output buffer so it
-will be shared among all files of the same document.")
-(make-variable-buffer-local 'TeX-error-list)
-
-(defun TeX-parse-all-errors ()
- "Parse TeX output buffer to collect all warnings and errors."
- ;; Reset error list.
- (setq TeX-error-list nil)
- (save-excursion
- (goto-char (point-min))
- (while (TeX-parse-error nil t)))
- ;; Reset last visited error.
- (setq TeX-error-last-visited -1))
-
-(defun TeX-parse-error (old &optional store)
- "Goto next error. Pop to OLD buffer if no more errors are found.
-
-If the optional argument STORE is non-nil, the function will
-store the found warning or error in `TeX-error-list' instead of
-displaying the issue.
-
-Return non-nil if an error or warning is found."
- (let ((regexp
- (concat
- ;; TeX error
- "^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|"
- ;; New file
- "(\n?\\([^\n()]+\\)\\|"
- ;; End of file.
- "\\()\\)\\|"
- ;; Hook to change line numbers
- " !\\(?:offset(\\([---0-9]+\\))\\|"
- ;; Hook to change file name
- "name(\\([^)]+\\))\\)\\|"
- ;; Start of LaTeX bad box
- "^\\(\\(?:Overfull\\|Underfull\\|Tight\\|Loose\\) "
- ;; Horizontal bad box
- "\\(?:\\\\hbox.* at lines? [0-9]+\\(?:--[0-9]+\\)?$\\|"
- ;; Vertical bad box. See also `TeX-warning'.
- "\\\\vbox ([ a-z0-9]+) has occurred while \\\\output is active
\\[[^]]+\\]\\)\\)\\|"
- ;; LaTeX warning
- "^\\(" LaTeX-warnings-regexp ".*\\)"))
- (error-found nil))
- (while
- (cond
- ((null
- (re-search-forward regexp nil t))
- ;; No more errors.
- (unless store
- (message "No more errors.")
- (beep)
- (TeX-pop-to-buffer old))
- nil)
- ;; TeX error
- ((match-beginning 1)
- (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))))
- (setq error-found t)
- (if (looking-at "Preview ")
- t
- (TeX-error store)
- nil))
- ;; LaTeX bad box
- ((match-beginning 7)
- ;; In `TeX-error-list' we collect all warnings, also if they're going
- ;; to be actually skipped.
- (if (or store TeX-debug-bad-boxes)
- (progn
- (setq error-found t)
- (TeX-warning (TeX-match-buffer 7) (match-beginning 7) t store)
- nil)
- (re-search-forward "\r?\n\
-\\(?:.\\{79\\}\r?\n\
-\\)*.*\r?$")
- t))
- ;; LaTeX warning
- ((match-beginning 8)
- ;; In `TeX-error-list' we collect all warnings, also if they're going
- ;; to be actually skipped.
- (if (or store TeX-debug-warnings)
- (progn
- (setq error-found t)
- (TeX-warning (TeX-match-buffer 8) (match-beginning 8) nil
store)
- nil)
- t))
-
- ;; New file -- Push on stack
- ((match-beginning 3)
- (let ((file (TeX-match-buffer 3))
- (end (match-end 3)))
- ;; Strip quotation marks and remove newlines if necessary
- (when (or (eq (string-to-char file) ?\")
- (string-match "[ \t\n]" file))
- (setq file (mapconcat #'identity (split-string file "[\"\n]+")
"")))
- ;; Polish `file' string
- (setq file
- (let ((string file))
- (setq string
- (if (string-match "\\`[ \t\n\r]+" string)
- (replace-match "" t t string)
- string))
- ;; Sometimes `file' is something like
- ;; "./path/to/file.tex [9] [10 <./path/to/file>] "
- ;; where "[9]" and "[10 <./path/to/file>]" are pages of the
- ;; output file, with path to an included file. Remove
these
- ;; numbers together with whitespaces at the end of the
- ;; string.
- (if (string-match "\\( *\\(\\[[^]]+\\]\\)? *\\)*\\'"
string)
- (replace-match "" t t string)
- string)))
- (push file TeX-error-file)
- (push nil TeX-error-offset)
- (goto-char end))
- t)
-
- ;; End of file -- Pop from stack
- ((match-beginning 4)
- (when (> (length TeX-error-file) 0)
- (pop TeX-error-file)
- (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)))
- error-found))
-
-(defun TeX-find-display-help (type file line error offset context string
- line-end _bad-box error-point _ignore)
- "Find the error and display the help.
-
-For a description of arguments, see `TeX-error-list'. IGNORE
-value is not used here."
- ;; Go back to TeX-buffer
- (let ((runbuf (TeX-active-buffer))
- (master (with-current-buffer TeX-command-buffer
- (expand-file-name (TeX-master-file))))
- (command-buffer TeX-command-buffer)
- (TeX-translate-location-file file)
- (TeX-translate-location-line line)
- (TeX-translate-location-error error)
- (TeX-translate-location-offset offset)
- (TeX-translate-location-context context)
- (TeX-translate-location-string string)
- error-file-buffer start)
-
- (run-hooks 'TeX-translate-location-hook)
-
- (if TeX-translate-location-file
- (progn
- (setq error-file-buffer
- (find-file
- (expand-file-name TeX-translate-location-file
- (file-name-directory master))))
- ;; Use the major mode of `TeX-command-buffer' when visiting
- ;; the error point.
- (if (eq major-mode (default-value 'major-mode))
- (funcall (buffer-local-value 'major-mode command-buffer)))
- ;; Set the value of `TeX-command-buffer' in the next file
- ;; with an error to be displayed to the value it has in the
- ;; current buffer.
- (setq-local TeX-command-buffer command-buffer)
-
- ;; Find the location of the error or warning.
- (when TeX-translate-location-line
- (goto-char (point-min))
- (forward-line (+ TeX-translate-location-offset
- TeX-translate-location-line -1))
- (cond
- ;; Error.
- ((equal type 'error)
- (if (not (string= TeX-translate-location-string " "))
- (search-forward TeX-translate-location-string nil t)))
- ;; Warning or bad box.
- (t
- (beginning-of-line 0)
- (setq start (point))
- (goto-char (point-min))
- (forward-line (+ TeX-translate-location-offset
- line-end -1))
- (end-of-line)
- (when TeX-translate-location-string
- (search-backward TeX-translate-location-string start t)
- (search-forward TeX-translate-location-string nil t))))))
- ;; When the file cannot be determined stay here but issue a
- ;; warning.
- (message "Could not determine file for %s"
- (if (eq type 'error) "error" "warning"))
- (beep))
-
- ;; Display the help.
- (cond ((eq TeX-display-help 'expert)
- (TeX-pop-to-buffer runbuf nil t)
- (goto-char error-point)
- (if error-file-buffer
- (TeX-pop-to-buffer error-file-buffer nil t)))
- (TeX-display-help
- (TeX-help-error
- TeX-translate-location-error
- (if (equal type 'warning)
- (concat "\n" TeX-translate-location-context)
- TeX-translate-location-context)
- runbuf type))
- (t
- (message "! %s" TeX-translate-location-error)))))
-
-(defun TeX-error (&optional store)
- "Display an error.
-
-If optional argument STORE is non-nil, store the error
-information in `TeX-error-list' instead of displaying the error."
-
- (let* ( ;; We need the error message to show the user.
- (error (progn
- (re-search-forward "\\(.*\\)")
- (TeX-match-buffer 1)))
-
- ;; And the context for the help window.
- (context-start (point))
- context-available
-
- ;; And the line number to position the cursor.
- (line (cond
- ;; regular style
- ((re-search-forward "l\\.\\([0-9]+\\)" nil t)
- (setq context-available t)
- (string-to-number (TeX-match-buffer 1)))
- ;; file:line:error style
- ((save-excursion
- (re-search-backward ":\\([0-9]+\\): "
- (line-beginning-position) t))
- (string-to-number (TeX-match-buffer 1)))
- ;; nothing found
- (t 1)))
-
- ;; And a string of the context to search for.
- (string (progn
- (beginning-of-line)
- (re-search-forward " \\(\\([^ \t]*$\\)\\|\\($\\)\\)")
- (TeX-match-buffer 1)))
-
- ;; And we have now found to the end of the context.
- (context (if context-available
- (buffer-substring context-start (progn (forward-line 1)
- (end-of-line)
- (point)))
- ;; There is no real context available, so we
- ;; simply show the line with the error message.
- (buffer-substring (1- (line-beginning-position))
- context-start)))
- ;; We may use these in another buffer.
- (offset (or (car TeX-error-offset) 0))
- (file (car TeX-error-file))
- info-list)
-
- ;; Remember where we was.
- (setq TeX-error-point (point)
- info-list (list 'error file line error offset context string nil nil
- TeX-error-point nil))
- (if store
- ;; Store the error information.
- (add-to-list 'TeX-error-list info-list t)
- ;; Find the error point and display the help.
- (apply #'TeX-find-display-help info-list))))
-
-(defun TeX-warning (warning warning-start bad-box &optional store)
- "Display a warning for WARNING.
-
-WARNING-START is the position where WARNING starts. If BAD-BOX
-is non-nil, the warning refers to a bad-box, otherwise it is a
-generic warning.
-
-If optional argument STORE is non-nil, store the warning
-information in `TeX-error-list' instead of displaying the
-warning."
-
- (let* ( ;; line-string: match 1 is beginning line, match 2 is end line
- (line-string (if bad-box
- "at lines? \\([0-9]*\\)\\(?:--\\([0-9]*\\)\\)?"
- ;; Traditional messages say "on input line X",
- ;; the LaTeX3 \msg_line_context:. just reads
- ;; "on line X".
- "on \\(?:input \\)?line \\([0-9]*\\)\\."))
- ;; word-string: match 1 is the word
- (word-string (if bad-box "[][\\W() ---]\\(\\w+\\)[][\\W() ---]*$"
- ;; Match "ref" in both "Reference `ref' on page NN
- ;; undefined" and "Citation 'ref' on page NN
undefined".
- "\\(?:`\\|'\\)\\([-a-zA-Z0-9:]+\\)'"))
-
- ;; Get error-line (warning). Don't search before `warning-start' to
- ;; avoid catching completely unrelated line numbers.
- (line (when (save-excursion (re-search-backward line-string
- warning-start t))
- (string-to-number (TeX-match-buffer 1))))
- ;; If this is a bad box and the warning ends with "...at lines MM--NN"
- ;; we can use "NN" as `line-end', in any other case (including bad
- ;; boxes ending with "...at line NN") just use `line'.
- (line-end (if (and bad-box (match-beginning 2))
- (string-to-number (TeX-match-buffer 2))
- line))
-
- ;; Find the context
- (context-start (progn (cond
- ((and bad-box (string-match "\\\\hbox"
warning))
- ;; Horizontal bad box
- (end-of-line))
- (bad-box
- ;; Vertical bad box (by exclusion), don't move
- ;; point. In the output buffer, unlike in the
- ;; actual *.log file, these warnings do not
end
- ;; with "...is active []", but in the same
line
- ;; there may be something else, including a
new
- ;; file opened. Thus, point shouldn't move
- ;; from the end of the actual bad box warning.
- ;; This is why the corresponding regexp in
- ;; `TeX-parse-error' doesn't match everything
- ;; until the end of the line.
- nil)
- (t
- ;; Generic warning.
- (beginning-of-line)))
- (point)))
-
- (context (cond ((string-match LaTeX-warnings-regexp warning)
- ;; The warnings matching `LaTeX-warnings-regexp' are
- ;; emitted by \GenericWarning macro, or macros based
on
- ;; it (\ClassWarning, \PackageWarning, etc). After
- ;; such warnings there is an empty line, just look for
- ;; it to find the end.
- (beginning-of-line)
- (while (null (eolp))
- (forward-line 1))
- (buffer-substring context-start (progn (end-of-line)
- (point))))
-
- ((and bad-box (string-match "\\\\vbox" warning))
- ;; Vertical bad boxes don't provide any additional
- ;; information. In this case, reuse the `warning' as
- ;; `context' and don't move point, so that we avoid
- ;; eating the next line that may contain another
- ;; warning. See also comment for `context-start'.
- (concat "\n" warning))
-
- (t
- ;; Horizontal bad boxes.
- (forward-line 1)
- (end-of-line)
- (while (equal (current-column) 79)
- (forward-line 1)
- (end-of-line))
- (buffer-substring context-start (point)))))
-
- ;; This is where we want to be.
- (error-point (point))
-
- ;; Now find the error word.
- (string (when (save-excursion
- (re-search-backward word-string context-start t))
- (TeX-match-buffer 1)))
-
- ;; We might use these in another file.
- (offset (or (car TeX-error-offset) 0))
- (file (car TeX-error-file))
- info-list ignore)
-
- ;; Second chance to get line number right. If `line' is nil, check whether
- ;; the reference to the line number is in `context'. For example, this is
- ;; the case for warnings emitted with \ClassWarning and \PackageWarning.
- ;; XXX: maybe it suffices to evaluate `line' after `context' above, but I
- ;; don't know if there are cases in which it's important to get `line'
- ;; before `context'.
- (and (null line)
- (string-match line-string context)
- (setq line-end
- (setq line (and (match-beginning 1)
- (string-to-number (match-string 1 context))))))
-
- ;; This is where we start next time.
- (goto-char error-point)
- (setq TeX-error-point (point))
-
- ;; Explanation of what follows: we add the warning to `TeX-error-list' even
- ;; if it has to be ignored, with a flag specifying whether it is ignored.
- ;; We do so in order to be able to change between "ignore" and
"dont-ignore"
- ;; behavior by just looking to the flag, without the need to reparse the
- ;; output log.
-
- ;; Store the list of information about the warning.
- (setq info-list (list (if bad-box 'bad-box 'warning) file line warning
- offset context string line-end bad-box
- TeX-error-point)
- ;; Decide whether it should be ignored.
- ignore (and TeX-ignore-warnings
- (cond
- ((stringp TeX-ignore-warnings)
- (string-match TeX-ignore-warnings warning))
- ((fboundp TeX-ignore-warnings)
- (apply TeX-ignore-warnings info-list))))
- ;; Update `info-list'.
- info-list (append info-list (list ignore)))
-
- (if store
- ;; Store the warning information.
- (add-to-list 'TeX-error-list info-list t)
- ;; Find the warning point and display the help.
- (apply #'TeX-find-display-help info-list))))
-
-;;; Error Messages
-
-(defcustom TeX-error-description-list nil
- "User defined help messages for errors in TeX run.
-See `TeX-error-description-list-local' for its format. All
-entries have higher priority than those in
-`TeX-error-description-list-local'.
-It must not have a fallback entry that matches any error."
- :group 'TeX-output
- :type '(repeat (cons :tag "Entry"
- (regexp :tag "Match")
- (string :format "Description:\n%v"))))
-
-(defvar TeX-error-description-list-local
- '((".*" . "No help available"))
- "Buffer local help messages for errors in TeX run.
-A list of the form (ERR-REGEXP . CONTEXT) used by function
-`TeX-help-error' to display help-text on an error message or warning.
-ERR-REGEXP should be a regular expression matching the error message
-given from TeX/LaTeX, and CONTEXT should be some lines describing that
-error.
-Major modes of AUCTeX can set its own catalogue as buffer local
-value of this variable, as LaTeX mode does.
-Style files of AUCTeX can also add their own entries to buffer local
-value of this variable to provide their own help messages.
-It must end with a fallback entry that matches any error, for example
-\(\".*\" . \"No help available\")")
-
-;;; - Help
-
-(defgroup TeX-error-description-faces nil
- "Faces used in error descriptions."
- :prefix "TeX-error-description-"
- :group 'TeX-output)
-
-(defface TeX-error-description-error
- ;; This is the same as `error' face in latest GNU Emacs versions.
- '((((class color) (min-colors 88) (background light))
- :foreground "Red1" :weight bold)
- (((class color) (min-colors 88) (background dark))
- :foreground "Pink" :weight bold)
- (((class color) (min-colors 16) (background light))
- :foreground "Red1" :weight bold)
- (((class color) (min-colors 16) (background dark))
- :foreground "Pink" :weight bold)
- (((class color) (min-colors 8))
- :foreground "red" :weight bold)
- (t (:inverse-video t :weight bold)))
- "Face for \"Error\" string in error descriptions.")
-
-(defface TeX-error-description-warning
- ;; This is the same as `warning' face in latest GNU Emacs versions.
- '((((class color) (min-colors 16)) :foreground "DarkOrange" :weight bold)
- (((class color)) :foreground "yellow" :weight bold))
- "Face for \"Warning\" string in error descriptions.")
-
-(defface TeX-error-description-tex-said
- ;; This is the same as `font-lock-function-name-face' face in latest GNU
- ;; Emacs versions.
- '((((class color) (min-colors 88) (background light))
- :foreground "Blue1")
- (((class color) (min-colors 88) (background dark))
- :foreground "LightSkyBlue")
- (((class color) (min-colors 16) (background light))
- :foreground "Blue")
- (((class color) (min-colors 16) (background dark))
- :foreground "LightSkyBlue")
- (((class color) (min-colors 8))
- :foreground "blue" :weight bold)
- (t (:inverse-video t :weight bold)))
- "Face for \"TeX said\" string in error descriptions.")
-
-(defface TeX-error-description-help
- '((t (:inherit TeX-error-description-tex-said)))
- "Face for \"Help\" string in error descriptions.")
-
-(defun TeX-help-error (error output runbuffer type)
- "Print ERROR in context OUTPUT from RUNBUFFER in another window.
-TYPE is a symbol specifing if ERROR is a real error, a warning or
-a bad box."
-
- (let ((old-buffer (current-buffer))
- (log-file (with-current-buffer runbuffer
- (with-current-buffer TeX-command-buffer
- (expand-file-name (TeX-active-master "log")))))
- (error-description-list
- (append TeX-error-description-list
- (buffer-local-value 'TeX-error-description-list-local
- (buffer-local-value
- 'TeX-command-buffer
- runbuffer))))
- (TeX-error-pointer 0))
-
- ;; Find help text entry.
- (while (not (string-match (car (nth TeX-error-pointer
- error-description-list))
- error))
- (setq TeX-error-pointer (+ TeX-error-pointer 1)))
-
- (TeX-pop-to-buffer (get-buffer-create "*TeX Help*") nil t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert
- (cond
- ((equal type 'error)
- (propertize "ERROR" 'font-lock-face 'TeX-error-description-error))
- ((equal type 'warning)
- (propertize "WARNING" 'font-lock-face 'TeX-error-description-warning))
- ((equal type 'bad-box)
- (propertize "BAD BOX" 'font-lock-face
'TeX-error-description-warning)))
- ": " error
- (propertize "\n\n--- TeX said ---" 'font-lock-face
- 'TeX-error-description-tex-said)
- output
- (propertize "\n--- HELP ---\n" 'font-lock-face
- 'TeX-error-description-help)
- (let ((help (cdr (nth TeX-error-pointer
- error-description-list))))
- (save-excursion
- (if (and (= (1+ TeX-error-pointer)
- (length error-description-list))
- (let* ((log-buffer (find-buffer-visiting log-file)))
- (if log-buffer
- (progn
- (set-buffer log-buffer)
- (revert-buffer t t))
- (setq log-buffer
- (find-file-noselect log-file))
- (set-buffer log-buffer))
- (auto-save-mode nil)
- (setq buffer-read-only t)
- (goto-char (point-min))
- (search-forward error nil t 1))
- (re-search-forward "^l\\." nil t)
- (re-search-forward "^ [^\n]+$" nil t))
- (let ((start (1+ (point))))
- (forward-char 1)
- (re-search-forward "^$")
- (concat "From the .log file...\n\n"
- (buffer-substring start (point))))
- help)))))
- (goto-char (point-min))
- (TeX-special-mode)
- (TeX-pop-to-buffer old-buffer nil t)))
-
-;;; Error Overview
-
-(defvar TeX-error-overview-active-buffer nil
- "The active buffer for the current error overview.")
-
-(defvar TeX-error-overview-orig-frame nil
- "Frame from which the error overview has been launched.")
-
-(defvar TeX-error-overview-orig-window nil
- "Window from which the error overview has been launched.")
-
-(defcustom TeX-error-overview-setup nil
- "The frame setup of the error overview.
-
-The possible value is: `separate-frame' (error oveview in a
-separate frame); with a nil value the current frame is used.
-
-If the display does not support multi frame, the current frame
-will be used regardless of the value of this variable."
- :group 'TeX-output
- :type '(choice
- (const :tag "Error overview in separate frame" separate-frame)
- (const :tag "Use current frame" nil)))
-
-(defun TeX-error-overview-setup ()
- "Return the frame setup of the error overview for the current display."
- (and (display-multi-frame-p) TeX-error-overview-setup))
-
-(defun TeX-error-overview-goto-source (&optional button)
- "Go to the error point in the source.
-If optional argument BUTTON is non-nil, go to source associated
-to the selected error."
- (interactive)
- (let ((index (if button (button-get button 'id) (tabulated-list-get-id)))
- item window)
- (if index
- (progn
- ;; Select the source frame/window, if still live.
- (if (TeX-error-overview-setup)
- (if (frame-live-p TeX-error-overview-orig-frame)
- (select-frame TeX-error-overview-orig-frame)
- (error "You have deleted a vital frame---\
-please restart TeX error overview"))
- (if (window-live-p TeX-error-overview-orig-window)
- (select-window TeX-error-overview-orig-window)
- (error "You have deleted a vital window---\
-please restart TeX error overview")))
- ;; Get the error details.
- (with-current-buffer TeX-error-overview-active-buffer
- (setq item (nth index TeX-error-list)
- TeX-error-last-visited index))
- ;; Find the error and display the help.
- (with-current-buffer TeX-command-buffer
- ;; Find the error and display the help.
- (apply #'TeX-find-display-help item))
- ;; Return to the error overview.
- (if (TeX-error-overview-setup)
- (select-frame TeX-error-overview-frame)
- (if (setq window
- (get-buffer-window TeX-error-overview-buffer-name))
- ;; If error overview window is visible just select it.
- (select-window window)
- ;; Otherwise, split the help window and display the error
overview
- ;; near to it. This should be the only reason for the error
- ;; overview window not being still visible after the beginning of
- ;; the function.
- (select-window
- (get-buffer-window (cond
- ((eq TeX-display-help 'expert)
- TeX-error-overview-active-buffer)
- (TeX-display-help "*TeX Help*"))))
- (if (window-splittable-p (selected-window) t)
- (split-window-horizontally)
- (split-window-vertically))
- (switch-to-buffer TeX-error-overview-buffer-name))))
- (message "No more errors.")
- (beep))))
-
-(defun TeX-error-overview-make-entries (&optional master-dir active-buffer)
- "Generate the list of errors to be printed using `tabulated-list-entries'.
-Write file names relative to MASTER-DIR when they are not absolute.
-
-ACTIVE-BUFFER is used as buffer from which to extract the list of
-errors. If nil, defaults to `TeX-error-overview-active-buffer'."
- (with-current-buffer (or active-buffer TeX-error-overview-active-buffer)
- (let ((id 0)
- type file line msg entries)
- (mapc
- (lambda (entry)
- (setq type (nth 0 entry)
- file (nth 1 entry)
- line (nth 2 entry)
- msg (nth 3 entry))
- ;; Add the entry only if it isn't to be skipped.
- (unless (TeX-error-list-skip-warning-p type (nth 10 entry))
- (push
- (list
- ;; ID.
- id
- (vector
- ;; File.
- (if (stringp file)
- (if (file-name-absolute-p file)
- file
- (file-relative-name file master-dir))
- "")
- ;; Line.
- (if (numberp line)
- (number-to-string line)
- "")
- ;; Type.
- (cond
- ((equal type 'error)
- (propertize "Error" 'font-lock-face
'TeX-error-description-error))
- ((equal type 'warning)
- (propertize "Warning" 'font-lock-face
- 'TeX-error-description-warning))
- ((equal type 'bad-box)
- (propertize "Bad box" 'font-lock-face
- 'TeX-error-description-warning))
- (t
- ""))
- ;; Message.
- (list (if (stringp msg)
- ;; Sometimes, the message can be longer than one line,
- ;; but print here only the first one.
- (progn
- (string-match "^.*" msg)
- (match-string 0 msg))
- "")
- 'face 'link
- 'follow-link t
- 'id id
- 'action #'TeX-error-overview-goto-source)))
- entries))
- ;; Increase the `id' counter in any case.
- (setq id (1+ id)))
- TeX-error-list)
- (reverse entries))))
-
-(defun TeX-error-overview-next-error (&optional arg)
- "Move to the next line and find the associated error.
-
-A prefix ARG specifies how many error messages to move; negative
-means move back to previous error messages."
- (interactive "p")
- (if (= (forward-line arg) 0)
- (TeX-error-overview-goto-source)
- ;; If there are lines left to move we are at the beginning or at the end of
- ;; the buffer and there are no more errors.
- (message "No more errors.")
- (beep)))
-
-(defun TeX-error-overview-previous-error (&optional arg)
- "Move to the previous line and find the associated error.
-
-Prefix ARG says how many error messages to move backward (or
-forward, if negative)."
- (interactive "p")
- (TeX-error-overview-next-error (- arg)))
-
-(defun TeX-error-overview-jump-to-source ()
- "Display the help and move point to the error source."
- (interactive)
- (TeX-error-overview-goto-source)
- (pop-to-buffer
- (save-window-excursion
- (select-window TeX-error-overview-orig-window)
- (current-buffer))))
-
-(defun TeX-error-overview-goto-log ()
- "Display the current error in log buffer."
- (interactive)
- (let ((TeX-display-help 'expert))
- (TeX-error-overview-goto-source)))
-
-(defun TeX-error-overview-toggle-debug-bad-boxes ()
- "Run `TeX-toggle-debug-bad-boxes' and update entries list."
- (interactive)
- (TeX-toggle-debug-bad-boxes)
- (setq tabulated-list-entries
- (TeX-error-overview-make-entries
- (with-current-buffer TeX-command-buffer (TeX-master-directory))))
- (tabulated-list-init-header)
- (tabulated-list-print))
-
-(defun TeX-error-overview-toggle-debug-warnings ()
- "Run `TeX-toggle-debug-warnings' and update entries list."
- (interactive)
- (TeX-toggle-debug-warnings)
- (setq tabulated-list-entries
- (TeX-error-overview-make-entries
- (with-current-buffer TeX-command-buffer (TeX-master-directory))))
- (tabulated-list-init-header)
- (tabulated-list-print))
-
-(defun TeX-error-overview-toggle-suppress-ignored-warnings ()
- "Toggle visibility of ignored warnings and update entries list."
- (interactive)
- (TeX-toggle-suppress-ignored-warnings)
- (setq tabulated-list-entries
- (TeX-error-overview-make-entries
- (with-current-buffer TeX-command-buffer (TeX-master-directory))))
- (tabulated-list-init-header)
- (tabulated-list-print))
-
-(defun TeX-error-overview-quit ()
- "Delete the window or the frame of the error overview."
- (interactive)
- (if (TeX-error-overview-setup)
- (delete-frame TeX-error-overview-frame)
- (delete-window))
- (setq TeX-error-overview-orig-frame nil))
-
-(defvar TeX-error-overview-mode-map
- (let ((map (make-sparse-keymap)))
- (define-key map "b" #'TeX-error-overview-toggle-debug-bad-boxes)
- (define-key map "j" #'TeX-error-overview-jump-to-source)
- (define-key map "l" #'TeX-error-overview-goto-log)
- (define-key map "n" #'TeX-error-overview-next-error)
- (define-key map "p" #'TeX-error-overview-previous-error)
- (define-key map "q" #'TeX-error-overview-quit)
- (define-key map "w" #'TeX-error-overview-toggle-debug-warnings)
- (define-key map "x"
#'TeX-error-overview-toggle-suppress-ignored-warnings)
- (define-key map "\C-m" #'TeX-error-overview-goto-source)
- map)
- "Local keymap for `TeX-error-overview-mode' buffers.")
-
-(easy-menu-define TeX-error-overview-menu
- TeX-error-overview-mode-map
- "Menu used in TeX error overview mode."
- '("TeX errors"
- ["Next error" TeX-error-overview-next-error
- :help "Jump to the next error"]
- ["Previous error" TeX-error-overview-previous-error
- :help "Jump to the previous error"]
- ["Go to source" TeX-error-overview-goto-source
- :help "Show the error in the source"]
- ["Jump to source" TeX-error-overview-jump-to-source
- :help "Move point to the error in the source"]
- ["Go to log" TeX-error-overview-goto-log
- :help "Show the error in the log buffer"]
- "-"
- ["Debug Bad Boxes" TeX-error-overview-toggle-debug-bad-boxes
- :style toggle :selected TeX-debug-bad-boxes
- :help "Show overfull and underfull boxes"]
- ["Debug Warnings" TeX-error-overview-toggle-debug-warnings
- :style toggle :selected TeX-debug-warnings
- :help "Show warnings"]
- ["Ignore Unimportant Warnings"
- TeX-error-overview-toggle-suppress-ignored-warnings
- :style toggle :selected TeX-suppress-ignored-warnings
- :help "Hide specified warnings"]
- "-"
- ["Quit" TeX-error-overview-quit
- :help "Quit"]))
-
-(defvar TeX-error-overview-list-entries nil
- "List of errors to be used in the error overview.")
-
-(define-derived-mode TeX-error-overview-mode tabulated-list-mode
- "TeX errors"
- "Major mode for listing TeX errors."
- (setq tabulated-list-format [("File" 25 nil)
- ("Line" 4 nil :right-align t)
- ("Type" 7 nil)
- ("Message" 0 nil)]
- tabulated-list-padding 1
- tabulated-list-entries TeX-error-overview-list-entries)
- (tabulated-list-init-header)
- (tabulated-list-print))
-
-(defcustom TeX-error-overview-frame-parameters
- '((name . "TeX errors")
- (title . "TeX errors")
- (height . 10)
- (width . 80)
- (top . (- 0))
- (left . (- 0))
- (unsplittable . t)
- (minibuffer . nil)
- (vertical-scroll-bars . t)
- (tool-bar-lines . 0))
- "Parameters of the error overview frame."
- :group 'TeX-output
- :type 'alist
- :options '((name string) (title string) (height integer) (width integer)
- (top integer) (left integer) (unsplittable boolean)
- (minibuffer boolean) (vertical-scroll-bars boolean)
- (tool-bar-lines integer)))
-
-(defcustom TeX-error-overview-open-after-TeX-run nil
- "Whether to open automatically the error overview after running TeX."
- :group 'TeX-output
- :type 'boolean)
-
-(defun TeX-error-overview ()
- "Show an overview of the errors occurred in the last TeX run."
- (interactive)
- ;; Check requirements before start.
- (if (setq TeX-error-overview-active-buffer (TeX-active-buffer))
- ;; `TeX-error-overview-list-entries' is going to be used only as value
- ;; of `tabulated-list-entries' in `TeX-error-overview-mode'. In
- ;; principle, we don't need `TeX-error-overview-list-entries', but
- ;; `tabulated-list-entries' is buffer-local and we need the list of
- ;; entries before creating the error overview buffer in order to
- ;; decide whether we need to show anything.
- (if (setq TeX-error-overview-list-entries
- (TeX-error-overview-make-entries
- (TeX-master-directory)))
- (progn
- (setq TeX-error-overview-orig-window (selected-window)
- TeX-error-overview-orig-frame
- (window-frame TeX-error-overview-orig-window))
- ;; Create the error overview buffer. This is
- ;; automatically killed before running TeX commands, so if
- ;; exists it is up-to-date and doesn't need to be
- ;; re-created.
- (unless (get-buffer TeX-error-overview-buffer-name)
- (with-current-buffer
- (get-buffer-create TeX-error-overview-buffer-name)
- (TeX-error-overview-mode)))
- ;; Move point to the line associated to the last visited
- ;; error.
- (with-current-buffer TeX-error-overview-buffer-name
- (goto-char (point-min))
- (forward-line (with-current-buffer
- TeX-error-overview-active-buffer
- TeX-error-last-visited))
- ;; Create a new frame for the error overview or display the
- ;; buffer in the same frame, depending on the setup.
- (if (TeX-error-overview-setup)
- (if (frame-live-p TeX-error-overview-frame)
- ;; Do not create a duplicate frame if there is
- ;; already one, just select it.
- (select-frame-set-input-focus
- TeX-error-overview-frame)
- ;; Create a new frame and store its name.
- (select-frame
- (setq TeX-error-overview-frame
- (make-frame
- TeX-error-overview-frame-parameters)))
- (set-window-buffer (selected-window)
- TeX-error-overview-buffer-name)
- (set-window-dedicated-p (selected-window) t))
- (TeX-pop-to-buffer TeX-error-overview-buffer-name))))
- (error (concat "No error or warning to show"
- ;; Suggest to display warnings and bad boxes with the
- ;; appropriate key-bindings if there are such
- ;; messages in the output buffer. Rationale of the
- ;; test: `TeX-error-overview-list-entries' is nil,
- ;; but if `TeX-error-list' is not nil it means that
- ;; there are hidden warnings/bad boxes.
- (when (TeX-process-get-variable (TeX-active-master)
- 'TeX-error-list)
- (format ". Type `%s' and `%s' to display \
-warnings and bad boxes"
- (substitute-command-keys
-
"\\<TeX-mode-map>\\[TeX-toggle-debug-warnings]")
- (substitute-command-keys
-
"\\<TeX-mode-map>\\[TeX-toggle-debug-bad-boxes]"))))))
- (error "No process for this document")))
-
-;;; Output mode
-
-(define-derived-mode TeX-special-mode special-mode "TeX")
-
-(defvar TeX-output-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map TeX-special-mode-map)
- (define-key map "n" #'TeX-next-error)
- (define-key map "p" #'TeX-previous-error)
- (define-key map "b" #'TeX-toggle-debug-bad-boxes)
- (define-key map "w" #'TeX-toggle-debug-warnings)
- (define-key map "i" (lambda ()
- (interactive)
- (with-current-buffer TeX-command-buffer
- (TeX-interactive-mode (if TeX-interactive-mode -1
1)))))
- (define-key map "s" (lambda ()
- (interactive)
- (with-current-buffer TeX-command-buffer
- (TeX-source-correlate-mode (if
TeX-source-correlate-mode -1 1)))))
- map)
- "Keymap for `TeX-output-mode'.")
-
-(define-derived-mode TeX-output-mode TeX-special-mode "TeX Output"
- "Major mode for viewing TeX output.
-\\{TeX-output-mode-map} "
- :syntax-table nil
- (set (make-local-variable 'revert-buffer-function)
- #'TeX-output-revert-buffer)
- ;; special-mode makes it read-only which prevents input from TeX.
- (setq buffer-read-only nil))
-
-(defun TeX-output-revert-buffer (_ignore-auto _noconfirm)
- "Rerun the TeX command which of which this buffer was the output."
- (goto-char (point-min))
- (if (looking-at "Running `\\(.*\\)' on `\\(.*\\)' with ``\\(.*\\)''$")
- (let ((name (match-string 1))
- (file (match-string 2)))
- (with-current-buffer TeX-command-buffer
- (TeX-command name (if (string-match TeX-region file)
- #'TeX-region-file
- #'TeX-master-file))))
- (error "Unable to find what command to run")))
-
-(provide 'tex-buf)
-
-;;; tex-buf.el ends here
diff --git a/tex-info.el b/tex-info.el
index da9d9b963a..fc2ac2e20a 100644
--- a/tex-info.el
+++ b/tex-info.el
@@ -31,10 +31,6 @@
(require 'texinfo)
-;; Silence the compiler for Emacs compiled `--with-native-compilation':
-(declare-function TeX-TeX-sentinel "tex-buf"
- (process name))
-
;;; Environments:
(defvar Texinfo-environment-list
'(("cartouche") ("command") ("copying") ("defcv") ("deffn") ("defivar")
@@ -634,8 +630,6 @@ is assumed by default."
;;;###autoload
(defalias 'Texinfo-mode #'texinfo-mode)
-(defvar TeX-sentinel-default-function) ;; Defined in tex-buf.el.
-
;;;###autoload
(defun TeX-texinfo-mode ()
"Major mode in AUCTeX for editing Texinfo files.
diff --git a/tex-jp.el b/tex-jp.el
index 714aa7a541..4cb8229e38 100644
--- a/tex-jp.el
+++ b/tex-jp.el
@@ -35,7 +35,6 @@
;;; Code:
(require 'latex)
-(require 'tex-buf)
;;; Customization
diff --git a/tex.el b/tex.el
index eb32a37918..81997e46fa 100644
--- a/tex.el
+++ b/tex.el
@@ -1,6 +1,6 @@
;;; tex.el --- Support for TeX documents. -*- lexical-binding: t; -*-
-;; Copyright (C) 1985-2021 Free Software Foundation, Inc.
+;; Copyright (C) 1985-2022 Free Software Foundation, Inc.
;; Maintainer: auctex-devel@gnu.org
;; Keywords: tex
@@ -55,6 +55,12 @@
(bus service path interface signal handler &rest args))
(declare-function LaTeX-environment-list "latex"
nil)
+(declare-function LaTeX-bibliography-list "latex"
+ nil)
+(declare-function comint-exec
+ (buffer name command startfile switches))
+(declare-function comint-mode
+ nil)
(declare-function tex--prettify-symbols-compose-p "ext:tex-mode"
(start end match))
(declare-function gnuserv-start "ext:gnuserv"
@@ -78,22 +84,24 @@
(defvar TeX-source-specials-places)
(defvar TeX-source-specials-tex-flags)
(defvar TeX-synctex-tex-flags)
+(defvar TeX-current-process-region-p)
+(defvar TeX-region)
+(defvar TeX-region-orig-buffer)
;; Variables defined in other AUCTeX libraries:
;; latex.el:
(defvar LaTeX-default-verb-delimiter)
(defvar LaTeX-optcl)
(defvar LaTeX-optop)
+(defvar LaTeX-largest-level)
+(defvar LaTeX-section-list)
(defvar TeX-output-dir)
-;; tex-buf.el
-(defvar TeX-current-process-region-p)
-(defvar TeX-region)
-(defvar TeX-region-orig-buffer)
;; tex-ispell.el
(defvar TeX-ispell-verb-delimiters)
;; Others:
(defvar tex--prettify-symbols-alist) ; tex-mode.el
(defvar Info-file-list-for-emacs) ; info.el
(defvar ispell-parser) ; ispell.el
+(defvar compilation-error-regexp-alist) ; compile.el
(defgroup TeX-file nil
"Files used by AUCTeX."
@@ -694,38 +702,6 @@ sure \"%p\" is the first entry."
TeX-expand-list
TeX-expand-list-builtin))
-;; The following dependencies are not done with autoload cookies since
-;; they are only useful when tex.el is loaded, anyway. tex-buf.el
-;; should remain unloaded as long as one is only editing files, so
-;; requiring it here would be wrong.
-
-(autoload 'LaTeX-command-run-all-section "tex-buf" nil t)
-(autoload 'LaTeX-command-section "tex-buf" nil t)
-(autoload 'TeX-active-master "tex-buf")
-(autoload 'TeX-check-engine-add-engines "tex-buf")
-(autoload 'TeX-command "tex-buf")
-(autoload 'TeX-command-buffer "tex-buf" nil t)
-(autoload 'TeX-command-expand "tex-buf")
-(autoload 'TeX-command-master "tex-buf" nil t)
-(autoload 'TeX-command-region "tex-buf" nil t)
-(autoload 'TeX-command-run-all "tex-buf" nil t)
-(autoload 'TeX-command-run-all-region "tex-buf" nil t)
-(autoload 'TeX-current-offset "tex-buf")
-(autoload 'TeX-error-overview "tex-buf" nil t)
-(autoload 'TeX-home-buffer "tex-buf" nil t)
-(autoload 'TeX-kill-job "tex-buf" nil t)
-(autoload 'TeX-next-error "tex-buf" nil t)
-(autoload 'TeX-previous-error "tex-buf" nil t)
-(autoload 'TeX-output-extension "tex-buf")
-(autoload 'TeX-pin-region "tex-buf" nil t)
-(autoload 'TeX-pop-to-buffer "tex-buf")
-(autoload 'TeX-process-set-variable "tex-buf")
-(autoload 'TeX-recenter-output-buffer "tex-buf" nil t)
-(autoload 'TeX-region-create "tex-buf")
-(autoload 'TeX-region-file "tex-buf")
-(autoload 'TeX-save-document "tex-buf" nil t)
-(autoload 'TeX-view "tex-buf" nil t)
-
;; This variable used to be defined in tex-buf.el. It is used in
;; `TeX-mode-specific-command-menu-entries' in this file. It is now
;; (June 2021) moved into this file to avoid `void-variable' errors
@@ -5003,7 +4979,6 @@ Brace insertion is only done if point is in a math
construct and
(define-key map "\C-c\C-t\C-w" #'TeX-toggle-debug-warnings)
(define-key map "\C-c\C-t\C-x" #'TeX-toggle-suppress-ignored-warnings)
(define-key map "\C-c\C-v" #'TeX-view)
- ;; From tex-buf.el
(define-key map "\C-c\C-d" #'TeX-save-document)
(define-key map "\C-c\C-r" #'TeX-command-region)
(define-key map "\C-c\C-b" #'TeX-command-buffer)
@@ -6760,6 +6735,3486 @@ Used as function for validating a variable's
`safe-local-variable' property."
(when (> e2 (line-end-position))
(concat "..." TeX-grcl)))))))
+;;; Customization:
+
+(defcustom TeX-process-asynchronous (not (eq system-type 'ms-dos))
+ "Use asynchronous processes."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defcustom TeX-shell
+ (if (memq system-type '(ms-dos emx windows-nt))
+ shell-file-name
+ "/bin/sh")
+ "Name of shell used to parse TeX commands."
+ :group 'TeX-command
+ :type 'file)
+
+(defcustom TeX-shell-command-option
+ (cond ((memq system-type '(ms-dos emx windows-nt))
+ shell-command-switch)
+ (t ;Unix & EMX (Emacs 19 port to OS/2)
+ "-c"))
+ "Shell argument indicating that next argument is the command."
+ :group 'TeX-command
+ :type 'string)
+
+;;; Interactive Commands
+;;
+;; The general idea is, that there is one process and process buffer
+;; associated with each master file, and one process and process
+;; buffer for running TeX on a region.
+;;
+;; Some user commands operates on ``the'' process, which is the last
+;; process still running or already finished. Note that you cannot
+;; run more than one process simultaneously, including preview by
+;; preview-latex, because process filters and sentinels refer to
+;; certain set of global variables which each invokation of the
+;; process overwrites. If you dare to do, the result is thus
+;; unpredictable.
+
+(defun TeX-save-document (name-or-file-fn)
+ "Save all files belonging to the current document.
+Return non-nil if document needs to be re-TeX'ed.
+In Lisp program, NAME-OR-FILE-FN specifies the current document.
+It is either the master name without extension or the function
+`TeX-master-file'."
+ (interactive (list #'TeX-master-file))
+ (TeX-check-files (TeX--concat-ext name-or-file-fn (TeX-output-extension))
+ (cons (TeX--concat-ext name-or-file-fn) (TeX-style-list))
+ TeX-file-extensions))
+
+(defun TeX--concat-ext (name-or-file-fn &optional extension)
+ "Append EXTENSION to a filename specified by NAME-OR-FILE-FN.
+
+If NAME-OR-FILE-FN is a string, interpret it as the filename.
+Otherwise, assume it is a callable function and call it with
+EXTENSION as an argument and return the result without
+modification. EXTENSION is a string which should not start with
+'.'."
+ (if (stringp name-or-file-fn)
+ (if extension
+ (concat name-or-file-fn "." extension)
+ name-or-file-fn)
+ (funcall name-or-file-fn extension)))
+
+(defun TeX-command-master (&optional override-confirm)
+ "Run command on the current document.
+
+If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
+depend on it being positive instead of the entry in `TeX-command-list'."
+ (interactive "P")
+ (TeX-master-file nil nil t) ;; call to ask if necessary
+ (TeX-command (TeX-command-query #'TeX-master-file)
+ #'TeX-master-file override-confirm))
+
+(defcustom TeX-region-extra ""
+ "String to insert in the region file between the header and the text."
+ :group 'TeX-command
+ :type 'string)
+
+;; This was "{\\makeatletter\\gdef\\AucTeX@cite#1[#2]#3{[#3#1#2]}\
+;; \\gdef\\cite{\\@ifnextchar[{\\AucTeX@cite{, }}\
+;; {\\AucTeX@cite{}[]}}}\n"
+;; However, that string is inappropriate for plain TeX and ConTeXt.
+;; This needs reconsideration.
+
+(defvar TeX-command-region-begin nil)
+(defvar TeX-command-region-end nil)
+;; Used for marking the last region.
+
+(make-variable-buffer-local 'TeX-command-region-begin)
+(make-variable-buffer-local 'TeX-command-region-end)
+
+(defun TeX-current-offset (&optional pos)
+ "Calculate line offset of POS, or of point if POS is nil."
+ (save-restriction
+ (widen)
+ (save-excursion
+ (let ((inhibit-point-motion-hooks t)
+ (inhibit-field-text-motion t))
+ (if pos (goto-char pos))
+ (+ (count-lines (point-min) (point))
+ (if (bolp) 0 -1))))))
+
+(defun TeX-pin-region (begin end)
+ "Pin the TeX region specified by BEGIN and END.
+If BEGIN is nil, the region is unpinned.
+
+In interactive use, a positive prefix arg will pin the region,
+a non-positive one will unpin it. Without a prefix arg, if
+a region is actively marked, it will get pinned. If not, a
+pinned region will get unpinned and vice versa."
+ (interactive
+ (if
+ (if current-prefix-arg
+ (> (prefix-numeric-value current-prefix-arg) 0)
+ (or (TeX-active-mark)
+ (null TeX-command-region-begin)))
+ (list (region-beginning) (region-end))
+ '(nil nil)))
+ (if begin
+ (progn
+ (unless (markerp TeX-command-region-begin)
+ (setq TeX-command-region-begin (make-marker))
+ (setq TeX-command-region-end (make-marker)))
+ (set-marker TeX-command-region-begin begin)
+ (set-marker TeX-command-region-end end)
+ (message "TeX region pinned."))
+ (when (markerp TeX-command-region-begin)
+ (set-marker TeX-command-region-begin nil)
+ (set-marker TeX-command-region-end nil))
+ (setq TeX-command-region-begin nil)
+ (setq TeX-command-region-end nil)
+ (message "TeX region unpinned.")))
+
+(defun TeX-region-update ()
+ "Update the TeX-region file."
+ ;; Note that TeX-command-region-begin is not a marker when called
+ ;; from TeX-command-buffer.
+ (and (or (null TeX-command-region-begin)
+ (markerp TeX-command-region-begin))
+ (TeX-active-mark)
+ (TeX-pin-region (region-beginning) (region-end)))
+ (let* ((begin (or TeX-command-region-begin (region-beginning)))
+ (end (or TeX-command-region-end (region-end)))
+ (TeX-region-extra
+ ;; Write out counter information to region.
+ (concat (and (fboundp 'preview--counter-information)
+ (preview--counter-information begin))
+ TeX-region-extra)))
+ (TeX-region-create (TeX-region-file TeX-default-extension)
+ (buffer-substring-no-properties begin end)
+ (file-name-nondirectory (buffer-file-name))
+ (TeX-current-offset begin))))
+
+(defun TeX-command-region (&optional override-confirm)
+ "Run TeX on the current region.
+
+Query the user for a command to run on the temporary file specified by
+the variable `TeX-region'. If there is an explicitly active region,
+it is stored for later commands. If not, a previously stored region
+\(can be also be set with `TeX-pin-region') overrides the current region,
+if present.
+
+If a prefix argument OVERRIDE-CONFIRM is given, prompting will
+ignore the prompting flag from `TeX-command-list' and instead
+will prompt only if the prefix is positive.
+
+If the master file for the document has a header, it is written to the
+temporary file before the region itself. The document's header is all
+text before `TeX-header-end'.
+
+If the master file for the document has a trailer, it is written to
+the temporary file after the region itself. The document's trailer is
+all text after `TeX-trailer-start'."
+ (interactive "P")
+ (TeX-region-update)
+ ;; In the next line, `TeX-region-file' should be called with nil
+ ;; `nondirectory' argument, otherwise `TeX-command-default' called
+ ;; within `TeX-command-query' won't work in included files not
+ ;; placed in `TeX-master-directory'.
+ (TeX-command (TeX-command-query #'TeX-region-file) #'TeX-region-file
+ override-confirm))
+
+(defun TeX-command-buffer (&optional override-confirm)
+ "Run TeX on the current buffer.
+
+Query the user for a command to run on the temporary file specified by
+the variable `TeX-region'. The region file will be recreated from the
+visible part of the buffer.
+
+If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
+depend on it being positive instead of the entry in `TeX-command-list'."
+ (interactive "P")
+ (let ((TeX-command-region-begin (point-min))
+ (TeX-command-region-end (point-max)))
+ (TeX-command-region override-confirm)))
+
+(defcustom TeX-record-buffer nil
+ "Whether to record buffer names of generated TeX buffers.
+When non-nil, these buffers are put at the front of the list of
+recently selected ones."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defun TeX-pop-to-buffer (buffer &optional other-window norecord)
+ "Compatibility wrapper for `pop-to-buffer'.
+
+Select buffer BUFFER in some window, preferably a different one.
+BUFFER may be a buffer, a string (a buffer name), or nil.
+If BUFFER is a string which is not the name of an existing buffer,
+then this function creates a buffer with that name.
+If BUFFER is nil, then it chooses some other buffer.
+If `pop-up-windows' is non-nil, windows can be split to do this.
+If optional second arg OTHER-WINDOW is non-nil, insist on finding another
+window even if BUFFER is already visible in the selected window,
+and ignore `same-window-regexps' and `same-window-buffer-names'.
+This function returns the buffer it switched to.
+This uses the function `display-buffer' as a subroutine; see the documentation
+of `display-buffer' for additional customization information.
+
+Optional third arg NORECORD non-nil means do not put this buffer
+at the front of the list of recently selected ones."
+ (pop-to-buffer buffer other-window (and norecord (not TeX-record-buffer))))
+
+(defun TeX-recenter-output-buffer (line)
+ "Redisplay buffer of TeX job output so that most recent output can be seen.
+The last line of the buffer is displayed on line LINE of the window, or
+at bottom if LINE is nil."
+ (interactive "P")
+ (let ((buffer (TeX-active-buffer)))
+ (if buffer
+ (let ((old-buffer (current-buffer)))
+ (TeX-pop-to-buffer buffer t t)
+ (bury-buffer buffer)
+ (goto-char (point-max))
+ (recenter (if line
+ (prefix-numeric-value line)
+ (/ (window-height) 2)))
+ (TeX-pop-to-buffer old-buffer nil t))
+ (message "No process for this document."))))
+
+(defun TeX-kill-job ()
+ "Kill the currently running TeX job."
+ (interactive)
+ (let ((process (TeX-active-process)))
+ (if process
+ (kill-process process)
+ ;; Should test for TeX background process here.
+ (error "No TeX process to kill"))))
+
+;; FIXME: The vars below are defined in this file, but they're defined too
+;; far down (i.e. further down than their first use), so we have to pre-declare
+;; them here to explain it to the compiler.
+;; We should move those vars's definitions earlier instead!
+(defvar TeX-current-process-region-p)
+(defvar TeX-save-query)
+(defvar TeX-parse-function)
+(defvar TeX-sentinel-function)
+(defvar TeX-sentinel-default-function)
+(defvar compilation-in-progress)
+(defvar TeX-current-page)
+(defvar TeX-error-overview-open-after-TeX-run)
+(defvar TeX-error-list)
+(defvar TeX-command-buffer)
+(defvar TeX-region)
+
+(defun TeX-home-buffer ()
+ "Go to the buffer where you last issued a TeX command.
+If there is no such buffer, or you already are in that buffer, find
+the master file."
+ (interactive)
+ (if (or (null TeX-command-buffer)
+ (null (buffer-name TeX-command-buffer))
+ (eq TeX-command-buffer (current-buffer)))
+ (find-file (TeX-master-file TeX-default-extension))
+ (switch-to-buffer TeX-command-buffer)))
+
+(defvar TeX-error-last-visited -1
+ "Index of the last visited error listed in `TeX-error-list'.
+
+This variable is intended to be set only in output buffer so it
+will be shared among all files of the same document.")
+(make-variable-buffer-local 'TeX-error-last-visited)
+
+(defun TeX-get-parse-function ()
+ "Get the parse function for the current buffer."
+ (with-current-buffer TeX-command-buffer
+ (TeX-process-get-variable (TeX-active-master) 'TeX-parse-function)))
+
+(defun TeX-next-error (&optional arg reparse)
+ "Find the next error in the TeX output buffer.
+
+A prefix ARG specifies how many error messages to move;
+negative means move back to previous error messages, if possible.
+
+If REPARSE is non-nil, reparse the error message buffer.
+
+\\[universal-argument] as a prefix means reparse the error
+message buffer and start at the first error."
+ (interactive "P")
+ (if (or (null (TeX-active-buffer))
+ (eq 'compilation-mode (with-current-buffer TeX-command-buffer
+ major-mode)))
+ (next-error arg reparse)
+
+ ;; Force reparsing when the function is called with a universal-argument.
+ (if (consp arg) (setq reparse t arg nil))
+
+ (funcall (TeX-get-parse-function) arg reparse)))
+
+(defun TeX-previous-error (arg)
+ "Find the previous error in the TeX output buffer.
+
+Prefix arg N says how many error messages to move backward (or
+forward, if negative).
+
+This works only with TeX commands and if the
+`TeX-parse-all-errors' variable is non-nil."
+ (interactive "p")
+ (if (or (null (TeX-active-buffer))
+ (eq 'compilation-mode (with-current-buffer TeX-command-buffer
+ major-mode)))
+ (previous-error arg)
+
+ (let ((parse-function (TeX-get-parse-function)))
+ (if (and TeX-parse-all-errors (equal parse-function #'TeX-parse-TeX))
+ ;; When `TeX-parse-all-errors' is non-nil and the parsing function is
+ ;; `TeX-parse-TeX' we can move backward in the errors.
+ (TeX-parse-TeX (- arg) nil)
+ ;; XXX: moving backward in the errors hasn't yet been implemented for
+ ;; other parsing functions.
+ (error "Jumping to previous error not supported")))))
+
+;;; Command Query
+
+(defvar TeX-error-overview-frame nil
+ "The frame of the error overview.")
+
+(defconst TeX-error-overview-buffer-name "*TeX errors*"
+ "Name of the buffer in which to show error list.")
+
+(defvar LaTeX-idx-md5-alist nil
+ "Alist of MD5 hashes of idx file.
+
+Car is the idx file, cdr is its md5 hash.")
+
+(defvar LaTeX-idx-changed-alist nil
+ "Whether the idx files changed.
+
+Car is the idx file, cdr is whether idx changed after LaTeX
+run.")
+
+(defcustom TeX-check-engine t
+ "Check the correct engine has been set before running TeX commands."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defvar TeX-check-engine-list '(default luatex omega xetex)
+ "List of engines required by the loaded TeX packages.
+
+Do not set this variable directly, use
+`TeX-check-engine-add-engines' to specify required engines.")
+(make-variable-buffer-local 'TeX-check-engine-list)
+
+(defun TeX-check-engine-add-engines (&rest engines)
+ "Add ENGINES to list of required engines.
+
+Set `TeX-check-engine-list' to the intersection between the list
+itself and the list of provided engines.
+
+See for example style/fontspec.el"
+ (let ((list TeX-check-engine-list)
+ (res nil))
+ (setq TeX-check-engine-list
+ ;; The following is based on the definition of `cl-intersection' of
+ ;; GNU Emacs.
+ (and list engines
+ (if (equal list engines) list
+ (or (>= (length list) (length engines))
+ (setq list (prog1 engines (setq engines list))))
+ (while engines
+ (if (memq (car engines) list)
+ (push (car engines) res))
+ (pop engines))
+ res)))))
+
+(defun TeX-check-engine (name)
+ "Check the correct engine has been set.
+
+Look into `TeX-check-engine-list' for the required engines.
+
+NAME is the command to be run. Actually do the check only if the
+variable `TeX-check-engine' is non-nil and LaTeX is the command
+to be run."
+ (and
+ (string= name "LaTeX")
+ TeX-check-engine
+ TeX-check-engine-list
+ (null (memq TeX-engine TeX-check-engine-list))
+ (memq TeX-engine '(default luatex omega xetex))
+ ;; The set engine is not listed in `TeX-check-engine-list'. We check only
+ ;; builtin engines because we can't take care of custom ones. Do nothing if
+ ;; there is no allowed engine, we don't know what to do in that case.
+ (let ((length (length TeX-check-engine-list))
+ (name-alist '((default . "TeX")
+ (luatex . "LuaTeX")
+ (omega . "Omega")
+ (xetex . "XeTeX")))
+ (completion-ignore-case t)
+ (engine nil))
+ (when
+ (cond
+ ;; There is exactly one allowed engine.
+ ((= length 1)
+ (setq engine (car TeX-check-engine-list))
+ (y-or-n-p (format "%s is required to build this document.
+Do you want to use this engine? " (cdr (assoc engine name-alist)))))
+ ;; More than one engine is allowed.
+ ((> length 1)
+ (if (y-or-n-p (format "It appears %s are required to build this
document.
+Do you want to select one of these engines? "
+ (mapconcat
+ (lambda (elt) (cdr (assoc elt name-alist)))
+ TeX-check-engine-list ", ")))
+ (setq engine
+ (car (rassoc
+ (completing-read
+ (format
+ "Choose between %s: "
+ (mapconcat
+ (lambda (elt) (cdr (assoc elt name-alist)))
+ TeX-check-engine-list ", "))
+ (mapcar
+ (lambda (elt) (cdr (assoc elt name-alist)))
+ TeX-check-engine-list))
+ name-alist)))
+ ;; Don't keep asking. If user doesn't want to change engine,
+ ;; probably has a good reason. In order to do so, without adding
+ ;; yet another variable we just hack `TeX-check-engine-list' and
+ ;; make it nil.
+ (setq TeX-check-engine-list nil))))
+ (TeX-engine-set engine)
+ (when (y-or-n-p "Do you want to remember the choice? ")
+ (add-file-local-variable 'TeX-engine engine)
+ (save-buffer))))))
+
+(defcustom TeX-check-TeX t
+ "Whether AUCTeX should check if a working TeX distribution is present."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defcustom TeX-check-TeX-command-not-found 127
+ "Numerical code returned by shell for a command not found error."
+ :group 'TeX-command
+ :type 'integer)
+
+(defun TeX-command (name file-fn &optional override-confirm)
+ "Run command NAME on the file returned by calling FILE-FN.
+
+FILE-FN is the symbol of a function returning a file name. The
+function has one optional argument, the extension to use on the
+file. Valid choices are `TeX-master-file' and `TeX-region-file'.
+
+Use the information in `TeX-command-list' to determine how to run
+the command.
+
+If OVERRIDE-CONFIRM is a prefix argument, confirmation will be
+asked if it is positive, and suppressed if it is not.
+
+Run function `TeX-check-engine' to check the correct engine has
+been set."
+ (TeX-check-engine name)
+
+ ;; Make sure that `TeX-command-buffer' is set always.
+ ;; It isn't safe to remove similar lines in `TeX-run-command' etc.
+ ;; because preview-latex calls `TeX-run-command' directly.
+ (setq-default TeX-command-buffer (current-buffer))
+
+ (cond ((eq file-fn #'TeX-region-file)
+ (setq TeX-current-process-region-p t))
+ ((eq file-fn #'TeX-master-file)
+ (setq TeX-current-process-region-p nil)))
+
+ ;; When we're operating on a region, we need to update the position
+ ;; of point in the region file so that forward search works.
+ (if (string= name "View") (TeX-region-update-point))
+
+ (let ((command (TeX-command-expand (nth 1 (assoc name TeX-command-list))))
+ (hook (nth 2 (assoc name TeX-command-list)))
+ (confirm (if override-confirm
+ (> (prefix-numeric-value override-confirm) 0)
+ (nth 3 (assoc name TeX-command-list)))))
+
+ ;; Verify the expanded command
+ (if confirm
+ (setq command
+ (read-from-minibuffer (concat name " command: ") command
+ nil nil)))
+
+ ;; Kill the frame and buffer associated to the error overview before
running
+ ;; the command, but keep them if the command to be run is View.
+ (unless (string= name "View")
+ (if (frame-live-p TeX-error-overview-frame)
+ (delete-frame TeX-error-overview-frame))
+ (if (get-buffer TeX-error-overview-buffer-name)
+ (kill-buffer TeX-error-overview-buffer-name)))
+
+ ;; Before running some commands, check that AUCTeX is able to find "tex"
+ ;; program.
+ (and TeX-check-TeX
+ (member name '("TeX" "LaTeX" "AmSTeX" "ConTeXt" "ConTeXt Full"))
+ (= TeX-check-TeX-command-not-found
+ (call-process TeX-shell nil nil nil
+ TeX-shell-command-option TeX-command))
+ (error (format "ERROR: AUCTeX cannot find a working TeX distribution.
+Make sure you have one and that TeX binaries are in PATH environment
variable%s"
+ (if (eq system-type 'darwin)
+ ".
+If you are using OS X El Capitan or later
+remember to add /Library/TeX/texbin/ to your PATH"
+ ""))))
+
+ ;; Now start the process
+ (let ((file (funcall file-fn)))
+ (TeX-process-set-variable file 'TeX-command-next TeX-command-Show)
+ (funcall hook name command file))))
+
+(defun TeX-command-expand (command &optional list)
+ "Expand COMMAND for `TeX-active-master' as described in LIST.
+LIST default to `TeX-expand-list'. As a special exception,
+`%%' can be used to produce a single `%' sign in the output
+without further expansion."
+ (let ((TeX-expand-command command)
+ TeX-expand-pos
+ TeX-command-text
+ TeX-command-pos
+ pat entry case-fold-search string expansion arguments)
+ (setq list (cons
+ (list "%%" (lambda nil
+ (setq TeX-expand-pos (1+ TeX-expand-pos))
+ "%"))
+ (or list (TeX-expand-list)))
+ pat (regexp-opt (mapcar #'car list)))
+ (while (setq TeX-expand-pos (string-match pat TeX-expand-command
TeX-expand-pos))
+ (setq string (match-string 0 TeX-expand-command)
+ entry (assoc string list)
+ expansion (car (cdr entry)) ;Second element
+ arguments (cdr (cdr entry)) ;Remaining elements
+ string (save-match-data
+ (cond
+ ((functionp expansion)
+ (apply expansion arguments))
+ ((boundp expansion)
+ (apply (symbol-value expansion) arguments))
+ (t
+ (error "Nonexpansion %s" expansion)))))
+ (if (stringp string)
+ (setq TeX-expand-command
+ (replace-match string t t TeX-expand-command))))
+ TeX-expand-command))
+
+(defun TeX-active-master-with-quotes
+ (&optional extension nondirectory ask extra preprocess-fn)
+ "Return the current master or region file name with quote for shell.
+Pass arguments EXTENSION NONDIRECTORY ASK to `TeX-active-master'.
+If the returned file name contains space, enclose it within
+quotes `\"' when \" \\input\" is supplemented (indicated by
+dynamically bound variable `TeX-command-text' having string
+value.) Also enclose the file name within \\detokenize{} when
+the following three conditions are met:
+ 1. compiling with standard (pdf)LaTeX or upLaTeX
+ 2. \" \\input\" is supplemented
+ 3. EXTRA is non-nil (default when expanding \"%T\")
+Adjust dynamically bound variable `TeX-expand-pos' to avoid possible
+infinite loop in `TeX-command-expand'.
+If PREPROCESS-FN is non-nil then it is called with the filename
+as an argument and the result is enclosed instead of the
+filename.
+
+Helper function of `TeX-command-expand'. Use only within entries in
+`TeX-expand-list-builtin' and `TeX-expand-list'."
+ (let* ((raw (TeX-active-master extension nondirectory ask))
+ ;; String `TeX-command-text' means that the file name is
+ ;; given through \input command.
+ (quote-for-space (if (and (stringp TeX-command-text)
+ (string-match " " raw))
+ "\"" ""))
+ (res
+ (shell-quote-argument
+ (format
+ (if (and extra
+ (stringp TeX-command-text)
+ (memq major-mode '(latex-mode doctex-mode))
+ (memq TeX-engine '(default uptex)))
+ ;; Since TeXLive 2018, the default encoding for LaTeX
+ ;; files has been changed to UTF-8 if used with
+ ;; classic TeX or pdfTeX. I.e.,
+ ;; \usepackage[utf8]{inputenc} is enabled by default
+ ;; in (pdf)latex.
+ ;; c.f. LaTeX News issue 28
+ ;; Due to this change, \detokenize is required to
+ ;; recognize non-ascii characters in the file name
+ ;; when \input precedes.
+ "\\detokenize{ %s }" "%s")
+ (concat quote-for-space
+ (if preprocess-fn
+ (funcall preprocess-fn raw)
+ raw)
+ quote-for-space)))))
+ ;; Advance past the file name in order to
+ ;; prevent expanding any substring of it.
+ (setq TeX-expand-pos
+ (+ TeX-expand-pos (length res)))
+ res))
+
+(defun TeX-check-files (derived originals extensions)
+ "Check if DERIVED is newer than any of the ORIGINALS.
+Try each original with each member of EXTENSIONS, in all directories
+in `TeX-check-path'. Returns true if any of the ORIGINALS with any of the
+EXTENSIONS are newer than DERIVED. Will prompt to save the buffer of any
+ORIGINALS which are modified but not saved yet."
+ (let (existingoriginals
+ found
+ (extensions (TeX-delete-duplicate-strings extensions))
+ (buffers (buffer-list)))
+ (dolist (path (TeX-delete-duplicate-strings
+ (mapcar (lambda (dir)
+ (expand-file-name (file-name-as-directory dir)))
+ (append
+ TeX-check-path
+ ;; In `TeX-command-default', this function is used
to
+ ;; check whether bibliography databases are newer
+ ;; than generated *.bbl files, but bibliography
+ ;; database are relative to `TeX-master-directory'
+ ;; and the test can be run also from included files
+ ;; that are in directories different from
+ ;; `TeX-master-directory'.
+ (list (TeX-master-directory))))))
+ (dolist (orig originals)
+ (dolist (ext extensions)
+ (let ((filepath (concat path orig "." ext)))
+ (if (or (file-exists-p filepath)
+ (get-file-buffer filepath))
+ (setq existingoriginals (cons filepath existingoriginals)))))))
+ (while buffers
+ (let* ((buffer (car buffers))
+ (name (buffer-file-name buffer)))
+ (setq buffers (cdr buffers))
+ (if (and name (member name existingoriginals))
+ (progn
+ (and (buffer-modified-p buffer)
+ (or (not TeX-save-query)
+ (y-or-n-p (concat "Save file "
+ (buffer-file-name buffer)
+ "? ")))
+ (with-current-buffer buffer (save-buffer)))))))
+ (dolist (eo existingoriginals)
+ (if (file-newer-than-file-p eo derived)
+ (setq found t)))
+ found))
+
+(defcustom TeX-command-sequence-max-runs-same-command 4
+ "Maximum number of runs of the same command."
+ :type 'integer
+ :group 'TeX-command)
+
+(defcustom TeX-command-sequence-max-runs 12
+ "Maximum number of total runs."
+ :type 'integer
+ :group 'TeX-command)
+
+(defvar TeX-command-sequence-count-same-command 1
+ "Counter for the runs of the same command in `TeX-command-sequence'.")
+
+(defvar TeX-command-sequence-count 1
+ "Counter for the total runs of `TeX-command-sequence'.")
+
+(defvar TeX-command-sequence-last-command nil
+ "Last command run in `TeX-command-sequence'.")
+
+(defvar TeX-command-sequence-sentinel nil
+ "Sentinel for `TeX-command-sequence'.")
+
+(defvar TeX-command-sequence-file-function nil
+ "File function for `TeX-command-sequence'.")
+
+(defvar TeX-command-sequence-command nil
+ "Command argument for `TeX-command-sequence'.
+
+It is set in `TeX-command-sequence' and used in
+`TeX-command-sequence-sentinel' to call again
+`TeX-command-sequence' with the appropriate command argument.")
+
+(defun TeX-command-sequence (command &optional reset file-fn)
+ "Run a sequence of TeX commands defined by COMMAND.
+
+The COMMAND argument may be
+
+ * nil: no command will be run in this case
+
+ * a string with a command from `TeX-command-list'
+
+ * a non-nil list of strings, which are commands from
+ `TeX-command-list'; the car of the list is used as command to
+ be executed in the first run of `TeX-command-sequence', the
+ cdr of the list will be passed to the function in the next
+ run, etc.
+
+ * a function name, returning a string which is command from
+ `TeX-command-list'; it will be funcall'd (without arguments!)
+ and used again in the next run of `TeX-command-sequence'.
+
+ * with any other value the function `TeX-command-default' is
+ used to determine the command to run, until a stopping
+ condition is met.
+
+This function runs at most
+`TeX-command-sequence-max-runs-same-command' times the same
+command in a row, and `TeX-command-sequence-max-runs' times in
+total in any case. It ends when `TeX-command-Show' is the
+command to be run.
+
+A non-nil value for the optional argument RESET means this is the
+first run of the function and some variables need to be reset.
+
+FILE-FN is a function of zero arguments returning the current
+filename. Valid choices are `TeX-master-file' (default if
+omitted) and `TeX-region-file'."
+ (setq TeX-command-sequence-file-function (or file-fn #'TeX-master-file))
+ (if (null command)
+ (message "No command to run.")
+ (let (cmd process)
+ (cond
+ ((stringp command)
+ (setq cmd command
+ TeX-command-sequence-command nil))
+ ((listp command)
+ (setq cmd (pop command)
+ TeX-command-sequence-command command))
+ ((functionp command)
+ (setq cmd (funcall command)
+ TeX-command-sequence-command command))
+ (t
+ ;; We first call `TeX-master-file' with the third argument
+ ;; (`ask') set to t, so that the master file is properly set.
+ ;; This is also what `TeX-command-master' does.
+ (funcall TeX-command-sequence-file-function nil nil t)
+ (setq cmd (TeX-command-default TeX-command-sequence-file-function)
+ TeX-command-sequence-command t)))
+ (TeX-command cmd TeX-command-sequence-file-function 0)
+ (when reset
+ (setq TeX-command-sequence-count-same-command 1
+ TeX-command-sequence-count 1
+ TeX-command-sequence-last-command nil))
+ (cond
+ ;; Stop when the same command has been run
+ ;; `TeX-command-sequence-max-runs-same-command' times in a row.
+ ((>= TeX-command-sequence-count-same-command
+ TeX-command-sequence-max-runs-same-command)
+ (message "Stopping after running %S %d times in a row."
+ TeX-command-sequence-last-command
+ TeX-command-sequence-count-same-command))
+ ;; Stop when there have been `TeX-command-sequence-max-runs' total
+ ;; compilations.
+ ((>= TeX-command-sequence-count TeX-command-sequence-max-runs)
+ (message "Stopping after %d compilations." TeX-command-sequence-count))
+ ;; The command just run is `TeX-command-Show'.
+ ((equal command TeX-command-Show))
+ ;; In any other case continue: increase counters (when needed), update
+ ;; `TeX-command-sequence-last-command' and run the sentinel.
+ (t
+ (if (equal cmd TeX-command-sequence-last-command)
+ (setq TeX-command-sequence-count-same-command
+ (1+ TeX-command-sequence-count-same-command))
+ (setq TeX-command-sequence-count-same-command 1))
+ (setq TeX-command-sequence-count (1+ TeX-command-sequence-count)
+ TeX-command-sequence-last-command cmd)
+ (and (setq process (get-buffer-process (current-buffer)))
+ (setq TeX-command-sequence-sentinel (process-sentinel process))
+ (set-process-sentinel process
+ #'TeX-command-sequence-sentinel)))))))
+
+(defcustom TeX-save-query t
+ "If non-nil, ask user for permission to save files before starting TeX."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defvar TeX-command-history nil)
+
+(defun TeX-command-default (name-or-file-fn)
+ "Guess the next command to be run on NAME-OR-FILE-FN."
+ (let ((command-next nil)
+ (name (TeX--concat-ext name-or-file-fn)))
+ (cond ((if (eq name-or-file-fn #'TeX-region-file)
+ (TeX-check-files (TeX-region-file (TeX-output-extension))
+ ;; Each original will be checked for all dirs
+ ;; in `TeX-check-path' so this needs to be just
+ ;; a filename without directory.
+ (list (file-relative-name name))
+ TeX-file-extensions)
+ (TeX-save-document name-or-file-fn))
+ TeX-command-default)
+ ((and (memq major-mode '(doctex-mode latex-mode))
+ ;; Want to know if bib file is newer than .bbl
+ ;; We don't care whether the bib files are open in emacs
+ (TeX-check-files (TeX--concat-ext name-or-file-fn "bbl")
+ (mapcar #'car
+ (LaTeX-bibliography-list))
+ (append BibTeX-file-extensions
+ TeX-Biber-file-extensions)))
+ ;; We should check for bst files here as well.
+ (if (and (boundp 'LaTeX-using-Biber)
+ LaTeX-using-Biber)
+ TeX-command-Biber TeX-command-BibTeX))
+ ((and
+ ;; Rationale: makeindex should be run when final document is almost
+ ;; complete (see
+ ;; https://tex-talk.net/2012/09/dont-forget-to-run-makeindex/),
+ ;; otherwise, after following latex runs, index pages may change
due
+ ;; to changes in final document, resulting in extra makeindex and
+ ;; latex runs.
+ (member
+ (setq command-next
+ (TeX-process-get-variable
+ name
+ 'TeX-command-next
+ (or (and TeX-PDF-mode (TeX-PDF-from-DVI))
+ TeX-command-Show)))
+ (list "Dvips" "Dvipdfmx" TeX-command-Show))
+ (cdr (assoc (expand-file-name (TeX--concat-ext name-or-file-fn
"idx"))
+ LaTeX-idx-changed-alist)))
+ "Index")
+ (command-next)
+ (TeX-command-Show))))
+
+(defun TeX-command-query (name-or-file-fn)
+ "Query the user for what TeX command to use."
+ (let* ((default (TeX-command-default name-or-file-fn))
+ (completion-ignore-case t)
+ (answer (or TeX-command-force
+ (completing-read
+ (concat "Command (default " default "): ")
+ (TeX-mode-specific-command-list major-mode) nil t
+ nil 'TeX-command-history default))))
+ ;; If the answer is "latex" it will not be expanded to "LaTeX"
+ (setq answer (car-safe (assoc-string answer TeX-command-list t)))
+ (if (and answer
+ (not (string-equal answer "")))
+ answer
+ default)))
+
+(defvar TeX-command-next nil
+ "The default command next time `TeX-command' is invoked.")
+
+ (make-variable-buffer-local 'TeX-command-next)
+
+(defun TeX-printer-query (&optional queue)
+ "Query the user for a printer name.
+QUEUE is non-nil when we are checking for the printer queue."
+ (let (command element printer)
+ (if queue
+ (unless (setq element 2 command TeX-queue-command)
+ (error "Need to customize `TeX-queue-command'"))
+ (unless (setq element 1 command TeX-print-command)
+ (error "Need to customize `TeX-print-command'")))
+ (while (progn
+ (setq printer (if TeX-printer-list
+ (let ((completion-ignore-case t))
+ (completing-read
+ (format "Printer%s: "
+ (if TeX-printer-default
+ (format " (default %s)"
TeX-printer-default) ""))
+ TeX-printer-list))
+ ""))
+ (setq printer (or (car-safe (assoc-string printer
TeX-printer-list t))
+ printer))
+ (not (if (or (null printer) (string-equal "" printer))
+ (setq printer TeX-printer-default)
+ (setq TeX-printer-default printer)))))
+
+ (let ((expansion (let ((entry (assoc printer TeX-printer-list)))
+ (or (nth element entry)
+ command))))
+ (if (string-match "%p" printer)
+ (error "Don't use %s in printer names" "%p"))
+ (while (string-match "%p" expansion)
+ (setq expansion (replace-match printer t t expansion 0)))
+ expansion)))
+
+(defun TeX-style-check (styles)
+ "Check STYLES compared to the current style options."
+ (let ((files (TeX-style-list)))
+ (while (and styles
+ (not (TeX-member (car (car styles)) files #'string-match)))
+ (setq styles (cdr styles))))
+ (if styles
+ (nth 1 (car styles))
+ ""))
+
+(defun TeX-output-extension ()
+ "Get the extension of the current TeX output file."
+ (if (listp TeX-output-extension)
+ (car TeX-output-extension)
+ (or (TeX-process-get-variable (TeX-active-master)
+ 'TeX-output-extension
+ TeX-output-extension)
+ TeX-output-extension)))
+
+(defun TeX-view-mouse (event)
+ "Start `TeX-view' at mouse position."
+ (interactive "e")
+ (with-current-buffer (window-buffer (posn-window (event-start event)))
+ (goto-char (posn-point (event-start event)))
+ (TeX-view)))
+
+(defun TeX-region-update-point ()
+ "Syncs the location of point in the region file with the current file.
+
+Thereafter, point in the region file is on the same text as in
+the current buffer.
+
+Do nothing in case the last command hasn't operated on the region
+or `TeX-source-correlate-mode' is disabled."
+ (when (and TeX-current-process-region-p TeX-source-correlate-mode)
+ (let ((region-buf (get-file-buffer (TeX-region-file t)))
+ (orig-line (TeX-current-offset))
+ (pos-in-line (- (point) (max (line-beginning-position)
+ (or TeX-command-region-begin
+ (region-beginning))))))
+ (when region-buf
+ (with-current-buffer region-buf
+ (goto-char (point-min))
+ (when (re-search-forward "!offset(\\(-?[0-9]+\\)" nil t)
+ (let ((offset (string-to-number (match-string 1))))
+ (goto-char (point-min))
+ (forward-line (- orig-line offset))
+ (forward-char pos-in-line))))))))
+
+(defun TeX-view ()
+ "Start a viewer without confirmation.
+The viewer is started either on region or master file,
+depending on the last command issued."
+ (interactive)
+ (let ((output-file (TeX-active-master (TeX-output-extension))))
+ (if (file-exists-p output-file)
+ (TeX-command "View" #'TeX-active-master 0)
+ (message "Output file %S does not exist." output-file))))
+
+;;; Command Hooks
+
+(defvar TeX-after-compilation-finished-functions nil
+ "Hook being run after TeX/LaTeX/ConTeXt finished successfully.
+The functions in this hook are run with the DVI/PDF output file
+given as argument. Using this hook can be useful for updating
+the viewer automatically after re-compilation of the document.
+
+If you use an emacs-internal viewer such as `doc-view-mode' or
+`pdf-view-mode', add `TeX-revert-document-buffer' to this hook.")
+
+(make-obsolete-variable 'TeX-after-TeX-LaTeX-command-finished-hook
+ 'TeX-after-compilation-finished-functions
+ "11.89")
+
+(defun TeX-revert-document-buffer (file)
+ "Revert the buffer visiting FILE.
+This function is intended to be used in
+`TeX-after-compilation-finished-functions' for users that view
+their compiled document with an emacs viewer such as
+`doc-view-mode' or `pdf-view-mode'. (Note that this function
+just calls `revert-buffer' in the respective buffer and thus
+requires that the corresponding mode defines a sensible
+`revert-buffer-function'.)"
+ (let ((buf (find-buffer-visiting file)))
+ (when buf
+ (with-current-buffer buf
+ (revert-buffer nil t t)))))
+
+(defvar TeX-after-start-process-function
+ #'TeX-adjust-process-coding-system
+ "Function to adjust coding system of an asynchronous process.
+Called with one argument PROCESS.")
+
+(defun TeX-adjust-process-coding-system (process)
+ "Adjust coding system of PROCESS to suitable value.
+Usually coding system is the same as the TeX file with eol format
+adjusted to OS default value. Take care of Japanese TeX, which
+requires special treatment."
+ (if (and (boundp 'japanese-TeX-mode)
+ (fboundp 'japanese-TeX-set-process-coding-system)
+ (with-current-buffer TeX-command-buffer
+ japanese-TeX-mode))
+ (japanese-TeX-set-process-coding-system process)
+ (let ((cs (coding-system-base (with-current-buffer TeX-command-buffer
+ buffer-file-coding-system))))
+ ;; The value of `buffer-file-coding-system' is sometimes
+ ;; undecided-{unix,dos,mac}. That happens when the file
+ ;; contains no multibyte chars and only end of line format is
+ ;; determined. Emacs lisp reference recommends not to use
+ ;; undecided-* for process coding system, so it might seem
+ ;; reasonable to change `undecided' into some fixed coding
+ ;; system like this:
+ ;; (if (eq 'undecided cs)
+ ;; (setq cs 'utf-8))
+ ;; However, that can lose when the following conditions are met:
+ ;; (1) The document is divided into multiple files.
+ ;; (2) The command buffer contains no multibyte chars.
+ ;; (3) The other files contain mutlibyte chars and saved in a
+ ;; coding system other than the one chosen above.
+ ;; So we leave `undecided' unchanged here. Although `undecided'
+ ;; is not quite safe for the coding system for encoding, i.e.,
+ ;; keyboard input to the TeX process, we expect that this does
+ ;; not raise serious problems because it is pretty rare that TeX
+ ;; process needs keyboard input of multibyte chars.
+
+ ;; `utf-8-with-signature' (UTF-8 with BOM) doesn't suit at all
+ ;; for the coding system for encoding because it always injects
+ ;; 3-byte BOM in front of its return value (even when the string
+ ;; to be sent has only ascii characters!) Thus we change it
+ ;; into `utf-8'. On decoding, `utf-8' can decode UTF-8 with
+ ;; BOM. So it is safe for both decoding and encoding.
+ (if (eq cs 'utf-8-with-signature)
+ (setq cs 'utf-8))
+
+ ;; Eol format of TeX files can differ from OS default. TeX
+ ;; binaries accept all type of eol format in the given files
+ ;; and output messages according to OS default. So we set eol
+ ;; format to OS default value.
+ (setq cs (coding-system-change-eol-conversion
+ cs
+ ;; The eol of macosX is LF, not CR. So we choose
+ ;; other than `unix' only for w32 system.
+ ;; FIXME: what should we do for cygwin?
+ (if (eq system-type 'windows-nt) 'dos 'unix)))
+ (set-process-coding-system process cs cs))))
+
+(defcustom TeX-show-compilation nil
+ "If non-nil, show output of TeX compilation in other window."
+ :group 'TeX-command
+ :type 'boolean)
+
+(defun TeX-run-command (name command file)
+ "Create a process for NAME using COMMAND to process FILE.
+Return the new process."
+ (let ((default TeX-command-default)
+ (buffer (TeX-process-buffer-name file))
+ (dir (TeX-master-directory))
+ (command-buff (current-buffer)))
+ (TeX-process-check file) ; Check that no process is running
+ (setq-default TeX-command-buffer command-buff)
+ (get-buffer-create buffer)
+ (set-buffer buffer)
+ (buffer-disable-undo)
+ (erase-buffer)
+ (set (make-local-variable 'line-number-display-limit) 0)
+ (setq TeX-output-extension nil)
+ (set (make-local-variable 'TeX-command-buffer) command-buff)
+ (if dir (cd dir))
+ (insert "Running `" name "' on `" file "' with ``" command "''\n")
+ (TeX-output-mode)
+ (if TeX-show-compilation
+ (display-buffer buffer)
+ (message "Type `%s' to display results of compilation."
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (setq TeX-parse-function #'TeX-parse-command)
+ (setq TeX-command-default default)
+ (setq TeX-sentinel-function
+ (lambda (_process name)
+ (message (concat name ": done."))))
+ (if TeX-process-asynchronous
+ (let ((process (start-process name buffer TeX-shell
+ TeX-shell-command-option command)))
+ (if TeX-after-start-process-function
+ (funcall TeX-after-start-process-function process))
+ (TeX-command-mode-line process)
+ (set-process-filter process #'TeX-command-filter)
+ (set-process-sentinel process #'TeX-command-sentinel)
+ (set-marker (process-mark process) (point-max))
+ (setq compilation-in-progress (cons process compilation-in-progress))
+ process)
+ (setq mode-line-process ": run")
+ (force-mode-line-update)
+ (call-process TeX-shell nil buffer nil
+ TeX-shell-command-option command))))
+
+(defun TeX-run-set-command (name command)
+ "Remember TeX command to use to NAME and set corresponding output extension."
+ (setq TeX-command-default name
+ TeX-output-extension
+ (if (and (null (TeX-PDF-from-DVI)) TeX-PDF-mode) "pdf" "dvi"))
+ (let ((case-fold-search t)
+ (lst TeX-command-output-list))
+ (while lst
+ (if (string-match (car (car lst)) command)
+ (setq TeX-output-extension (car (cdr (car lst)))
+ lst nil)
+ (setq lst (cdr lst))))))
+
+(defvar TeX-error-report-switches nil
+ "Reports presence of errors after `TeX-run-TeX'.
+Actually, `TeX-run-format' sets it.
+To test whether the current buffer has a compile error from last
+run of `TeX-run-format', use
+ (TeX-error-report-has-errors-p)")
+
+(defun TeX-error-report-has-errors-p ()
+ "Return non-nil if current buffer has compile errors from last TeX run."
+ (plist-get TeX-error-report-switches (intern (TeX-master-file))))
+
+(defun TeX-run-format (name command file)
+ "Create a process for NAME using COMMAND to format FILE with TeX."
+ (TeX-run-set-command name command)
+ (let ((current-master (TeX-master-file))
+ (buffer (TeX-process-buffer-name file))
+ (process (TeX-run-command name command file)))
+
+ ;; Save information in TeX-error-report-switches
+ ;; Initialize error to nil (no error) for current master.
+ ;; Presence of error is reported inside `TeX-TeX-sentinel-check'
+
+ ;; the current master file is saved because error routines are
+ ;; parsed in other buffers;
+ (setq TeX-error-report-switches
+ (plist-put TeX-error-report-switches
+ 'TeX-current-master current-master))
+ ;; reset error to nil (no error)
+ (setq TeX-error-report-switches
+ (plist-put TeX-error-report-switches
+ (intern current-master) nil))
+
+ ;; Hook to TeX debugger.
+ (with-current-buffer buffer
+ (TeX-parse-reset)
+ (setq TeX-parse-function #'TeX-parse-TeX)
+ (setq TeX-sentinel-function #'TeX-TeX-sentinel)
+ (if TeX-process-asynchronous
+ (progn
+ ;; Updating the mode line.
+ (setq TeX-current-page "[0]")
+ (TeX-format-mode-line process)
+ (set-process-filter process #'TeX-format-filter)))
+ process)))
+
+(defun TeX-run-TeX (name command file)
+ "Create a process for NAME using COMMAND to format FILE with TeX."
+
+ (let ((idx-file nil) (element nil))
+ ;; Store md5 hash of the index file before running LaTeX.
+ (and (memq major-mode '(doctex-mode latex-mode))
+ (prog1 (file-exists-p
+ (setq idx-file (expand-file-name (TeX-active-master "idx"))))
+ ;; In order to avoid confusion and pollution of
+ ;; `LaTeX-idx-md5-alist', remove from this alist all md5 hashes of
+ ;; the current index file. Note `assq-delete-all' doesn't work with
+ ;; string keys and has problems with non-list elements in Emacs 21
+ ;; (see file tex-site.el).
+ (while (setq element (assoc idx-file LaTeX-idx-md5-alist))
+ (setq LaTeX-idx-md5-alist (delq element LaTeX-idx-md5-alist))))
+ (with-temp-buffer
+ (insert-file-contents-literally idx-file)
+ (push (cons idx-file (md5 (current-buffer))) LaTeX-idx-md5-alist))))
+
+ ;; can we assume that TeX-sentinel-function will not be changed
+ ;; during (TeX-run-format ..)? --pg
+ ;; rather use let* ? --pg
+
+ (if TeX-interactive-mode
+ (TeX-run-interactive name command file)
+ (let* ((sentinel-function TeX-sentinel-default-function)
+ (process (TeX-run-format name command file)))
+ (setq TeX-sentinel-function sentinel-function)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process)))))
+
+;; backward compatibilty
+
+(defalias 'TeX-run-LaTeX #'TeX-run-TeX)
+
+
+(defun TeX-run-BibTeX (name command file)
+ "Create a process for NAME using COMMAND to format FILE with BibTeX."
+ (let ((process (TeX-run-command name command file)))
+ (setq TeX-sentinel-function #'TeX-BibTeX-sentinel)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-Biber (name command file)
+ "Create a process for NAME using COMMAND to format FILE with Biber."
+ (let ((process (TeX-run-command name command file)))
+ (setq TeX-sentinel-function #'TeX-Biber-sentinel)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-dvips (name command file)
+ "Create a process for NAME using COMMAND to convert FILE with dvips."
+ (let ((process (TeX-run-command name command file)))
+ (setq TeX-sentinel-function #'TeX-dvips-sentinel)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-dvipdfmx (name command file)
+ "Create a process for NAME using COMMAND to convert FILE with dvipdfmx."
+ (let ((process (TeX-run-command name command file)))
+ (setq TeX-sentinel-function #'TeX-dvipdfmx-sentinel)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-ps2pdf (name command file)
+ "Create a process for NAME using COMMAND to convert FILE with ps2pdf."
+ (let ((process (TeX-run-command name command file)))
+ (setq TeX-sentinel-function #'TeX-ps2pdf-sentinel)
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-index (name command file)
+ "Create a process for NAME using COMMAND to compile the index file."
+ (let ((process (TeX-run-command name command file))
+ (element nil))
+ (setq TeX-sentinel-function #'TeX-index-sentinel)
+ ;; Same cleaning as that for `LaTeX-idx-md5-alist' in `TeX-run-TeX'.
+ (while (setq element
+ ;; `file' has been determined in `TeX-command-buffer', while
+ ;; this function has `TeX-master-directory' as
+ ;; `default-directory', then we have to expand `file'
file-name
+ ;; in the same directory of `TeX-command-buffer'.
+ (assoc (with-current-buffer TeX-command-buffer
+ (expand-file-name (TeX-active-master "idx")))
+ LaTeX-idx-changed-alist))
+ (setq LaTeX-idx-changed-alist (delq element LaTeX-idx-changed-alist)))
+ (if TeX-process-asynchronous
+ process
+ (TeX-synchronous-sentinel name file process))))
+
+(defun TeX-run-compile (_name command _file)
+ "Ignore first and third argument, start compile with second argument."
+ (let ((default-directory (TeX-master-directory)))
+ (setq TeX-command-buffer (compile command)))
+ ;; Make `compilation-mode' recognize file names with spaces.
+ ;; (bug#36483)
+ ;; FIXME: This is just an ad-hoc workaround and it's better to fix
+ ;; the regular expression in compile.el properly, if possible. But
+ ;; there was no response to such request in emacs-devel@gnu.org.
+ (with-current-buffer TeX-command-buffer
+ (make-local-variable 'compilation-error-regexp-alist)
+ ;; Add slightly modified entry of the one associated with `comma'
+ ;; in `compilation-error-regexp-alist-alist' to pick up file names
+ ;; with spaces.
+ (add-to-list 'compilation-error-regexp-alist
+ '("^\"\\([^,\"\n\t]+\\)\", line \\([0-9]+\\)\
+\\(?:[(. pos]+\\([0-9]+\\))?\\)?[:.,; (-]\\( warning:\\|[-0-9 ]*(W)\\)?" 1 2 3
(4))
+ t)))
+
+(defun TeX-run-shell (_name command _file)
+ "Ignore first and third argument, start shell-command with second argument."
+ (let ((default-directory (TeX-master-directory)))
+ (shell-command command)
+ (if (eq system-type 'ms-dos)
+ (redraw-display))))
+
+(defun TeX-run-discard (_name command _file)
+ "Start COMMAND as process, discarding its output.
+NAME and FILE are ignored."
+ (let ((default-directory (TeX-master-directory)))
+ (call-process TeX-shell
+ nil 0 nil
+ TeX-shell-command-option
+ command)))
+
+(defun TeX-run-discard-foreground (_name command _file)
+ "Call process with second argument in the foreground, discarding its output.
+With support for MS-DOS, especially when dviout is used with PC-9801 series."
+ (if (and (boundp 'dos-machine-type) (eq dos-machine-type 'pc98)) ;if PC-9801
+ (send-string-to-terminal "\e[2J")) ; clear screen
+ (call-process TeX-shell (if (eq system-type 'ms-dos) "con") nil nil
+ TeX-shell-command-option command)
+ (if (eq system-type 'ms-dos)
+ (redraw-display)))
+(defalias 'TeX-run-dviout #'TeX-run-discard-foreground)
+
+(defun TeX-run-background (name command _file)
+ "Start process with second argument, show output when and if it arrives."
+ (let ((dir (TeX-master-directory)))
+ (set-buffer (get-buffer-create "*TeX background*"))
+ (if dir (cd dir))
+ (erase-buffer)
+ (let ((process (start-process (concat name " background")
+ nil TeX-shell
+ TeX-shell-command-option command)))
+ (if TeX-after-start-process-function
+ (funcall TeX-after-start-process-function process))
+ (set-process-filter process #'TeX-background-filter)
+ (set-process-query-on-exit-flag process nil))))
+
+(defun TeX-run-silent (name command _file)
+ "Start process with second argument."
+ (let ((dir (TeX-master-directory)))
+ (set-buffer (get-buffer-create "*TeX silent*"))
+ (if dir (cd dir))
+ (erase-buffer)
+ (let ((process (start-process (concat name " silent")
+ (current-buffer) TeX-shell
+ TeX-shell-command-option command)))
+ (if TeX-after-start-process-function
+ (funcall TeX-after-start-process-function process))
+ (set-process-query-on-exit-flag process nil))))
+
+(defun TeX-run-interactive (name command file)
+ "Run TeX interactively.
+Run command in a buffer (in comint-shell-mode) so that it accepts user
+interaction. If you return to the file buffer after the TeX run,
+Error parsing on \\[next-error] should work with a bit of luck."
+ (TeX-run-set-command name command)
+ (require 'comint)
+ (let ((default TeX-command-default)
+ (buffer (TeX-process-buffer-name file))
+ (process nil)
+ (dir (TeX-master-directory))
+ (command-buff (current-buffer))
+ (sentinel-function TeX-sentinel-default-function)) ; inherit from
major mode
+ (TeX-process-check file) ; Check that no process is running
+ (setq-default TeX-command-buffer command-buff)
+ (with-output-to-temp-buffer buffer)
+ (set-buffer buffer)
+ (set (make-local-variable 'TeX-command-buffer) command-buff)
+ (setq buffer-read-only nil)
+ (if dir (cd dir))
+ (insert "Running `" name "' on `" file "' with ``" command "''\n")
+ (comint-exec buffer name TeX-shell nil
+ (list TeX-shell-command-option command))
+ (comint-mode)
+ (add-hook 'comint-output-filter-functions #'TeX-interactive-goto-prompt)
+ (setq mode-name name)
+ (setq TeX-command-default default)
+ (setq process (get-buffer-process buffer))
+ (if TeX-after-start-process-function
+ (funcall TeX-after-start-process-function process))
+ (TeX-command-mode-line process)
+ (set-process-sentinel process #'TeX-command-sentinel)
+ (set-marker (process-mark process) (point-max))
+ (setq compilation-in-progress (cons process compilation-in-progress))
+ (TeX-parse-reset)
+ (setq TeX-parse-function #'TeX-parse-TeX)
+ ;; use the sentinel-function that the major mode sets, not the LaTeX one
+ (setq TeX-sentinel-function sentinel-function)))
+
+(defun TeX-run-function (_name command _file)
+ "Execute Lisp function or function call given as the string COMMAND.
+Parameters NAME and FILE are ignored."
+ (let ((fun (car (read-from-string command))))
+ (if (functionp fun) (funcall fun) (eval fun t))))
+
+(defun TeX-run-discard-or-function (name command file)
+ "Start COMMAND as process or execute it as a Lisp function.
+If run as a process, the output is discarded. COMMAND is
+expected to be a string. NAME and FILE are ignored."
+ (if (functionp (car (read-from-string command)))
+ (TeX-run-function name command file)
+ (TeX-run-discard name command file)))
+
+(defun TeX-run-ispell-on-document (_command _ignored _name)
+ "Run Ispell on all open files belonging to the current document.
+This function is *obsolete* and only here for compatibility
+reasons. Use `TeX-run-function' instead."
+ (interactive)
+ (TeX-ispell-document ""))
+
+
+;;; Command Sentinels
+
+(defun TeX-synchronous-sentinel (name file result)
+ "Process TeX command output buffer after the process dies."
+ (let ((buffer (TeX-process-buffer (file-name-nondirectory file))))
+ (with-current-buffer buffer
+
+ ;; Append post-mortem information to the buffer
+ (goto-char (point-max))
+ (insert "\n" mode-name (if (and result (zerop result))
+ " finished" " exited") " at "
+ (substring (current-time-string) 0 -5))
+ (setq mode-line-process ": exit")
+
+ ;; Do command specific actions.
+ (setq TeX-command-next TeX-command-Show)
+ (goto-char (point-min))
+ (apply TeX-sentinel-function nil name nil)
+
+ ;; Force mode line redisplay soon
+ (force-mode-line-update))))
+
+(defun TeX-command-sentinel (process msg)
+ "Process TeX command output buffer after the PROCESS dies.
+Insert MSG with some additional information."
+ ;; Set `TeX-transient-master' here because `preview-parse-messages'
+ ;; may open files and thereby trigger master file questions which we
+ ;; don't want and need because we already know the master. Use
+ ;; `TeX-master-file' instead of `TeX-active-master' to determine the
+ ;; master because the region file should never be the master.
+ (let* ((TeX-transient-master (TeX-master-file))
+ (buffer (process-buffer process))
+ (name (process-name process)))
+ (cond ((null (buffer-name buffer)) ; buffer killed
+ (set-process-buffer process nil)
+ (set-process-sentinel process nil))
+ ((memq (process-status process) '(signal exit))
+ (with-current-buffer buffer
+
+ ;; Append post-mortem information to the buffer
+ (goto-char (point-max))
+ (insert-before-markers "\n" mode-name " " msg)
+ (forward-char -1)
+ (insert " at "
+ (substring (current-time-string) 0 -5))
+ (forward-char 1)
+
+ ;; Do command specific actions.
+ (TeX-command-mode-line process)
+ (setq TeX-command-next TeX-command-Show)
+ (goto-char (point-min))
+ (apply TeX-sentinel-function process name nil)
+
+
+ ;; If buffer and mode line will show that the process
+ ;; is dead, we can delete it now. Otherwise it
+ ;; will stay around until M-x list-processes.
+ (delete-process process))
+
+ ;; Force mode line redisplay soon
+ ;; Do this in all buffers (bug#38058 and bug#40965)
+ (force-mode-line-update t))))
+
+ (setq compilation-in-progress (delq process compilation-in-progress)))
+
+
+(defvar TeX-sentinel-function (lambda (_process _name) nil)
+ "Hook to cleanup TeX command buffer after termination of PROCESS.
+NAME is the name of the process.")
+
+(make-variable-buffer-local 'TeX-sentinel-function)
+
+
+(defvar TeX-sentinel-default-function (lambda (_process _name) nil)
+ "Default for `TeX-sentinel-function'. To be set in major mode.
+Hook to cleanup TeX command buffer after termination of PROCESS.
+NAME is the name of the process.")
+
+(make-variable-buffer-local 'TeX-sentinel-default-function)
+
+(defun TeX-TeX-sentinel (process name)
+ "Cleanup TeX output buffer after running TeX.
+
+Parse the output buffer to collect errors and warnings if the
+variable `TeX-parse-all-errors' is non-nil.
+
+Open the error overview if
+`TeX-error-overview-open-after-TeX-run' is non-nil and there are
+errors or warnings to show."
+ (if (TeX-TeX-sentinel-check process name)
+ (progn
+ (if TeX-parse-all-errors
+ (TeX-parse-all-errors))
+ (if (and TeX-error-overview-open-after-TeX-run
+ (TeX-error-overview-make-entries
+ (TeX-master-directory) (TeX-active-buffer)))
+ (TeX-error-overview)))
+ (message (concat name ": formatted " (TeX-current-pages)))
+ (let (dvi2pdf)
+ (if (with-current-buffer TeX-command-buffer
+ (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
+ (setq TeX-command-next dvi2pdf)
+ (setq TeX-command-next TeX-command-Show)))))
+
+(defun TeX-current-pages ()
+ "Return string indicating the number of pages formatted."
+ (cond ((null TeX-current-page)
+ "some pages")
+ ((string-match "[^0-9]1[^0-9]" TeX-current-page)
+ (concat TeX-current-page " page"))
+ (t
+ (concat TeX-current-page " pages"))))
+
+(defun TeX-TeX-sentinel-check (process name)
+ "Cleanup TeX output buffer after running TeX.
+Return nil only if no errors were found."
+ (save-excursion
+ (goto-char (point-max))
+ (cond
+ ((and (string-match "ConTeXt" name) (boundp 'ConTeXt-Mark-version)
+ (with-current-buffer TeX-command-buffer
+ (string= ConTeXt-Mark-version "IV")))
+ (when (re-search-backward " > result saved in file: \\(.*?\\), " nil t)
+ (let ((output-file (TeX-match-buffer 1)))
+ ;; Shave off quotation marks if present.
+ (when (string-match "\\`\"\\(.*\\)\"\\'" output-file)
+ (setq output-file (match-string 1 output-file)))
+ (setq TeX-output-extension
+ (if (string-match "\\.\\([^.]*\\)$" output-file)
+ (match-string 1 output-file)
+ "dvi")))
+ (if (re-search-forward ", \\([0-9]+\\) shipped pages, " nil t)
+ (setq TeX-current-page (concat "{" (TeX-match-buffer 1) "}")))))
+ (t
+ (if (re-search-backward "^Output written on \\(.*?\\) (\\([0-9]+\\) page"
+ nil t)
+ (let ((output-file (TeX-match-buffer 1)))
+ (setq TeX-current-page (concat "{" (TeX-match-buffer 2) "}"))
+ ;; Shave off quotation marks if present.
+ (when (string-match "\\`\"\\(.*\\)\"\\'" output-file)
+ (setq output-file (match-string 1 output-file)))
+ (setq TeX-output-extension
+ (if (string-match "\\.\\([^.]*\\)$" output-file)
+ (match-string 1 output-file)
+ "dvi")))))))
+ (if process (TeX-format-mode-line process))
+ (if (re-search-forward "^\\(!\\|.*:[0-9]+:\\) " nil t)
+ (progn
+ (message "%s errors in `%s'. Use %s to display." name (buffer-name)
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-next-error]"))
+ (setq TeX-command-next TeX-command-default)
+ ;; error reported to TeX-error-report-switches
+ (setq TeX-error-report-switches
+ (plist-put TeX-error-report-switches
+ (intern (plist-get TeX-error-report-switches
+ 'TeX-current-master))
+ t))
+ t)
+ (let (dvi2pdf)
+ (if (with-current-buffer TeX-command-buffer
+ (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
+ (setq TeX-command-next dvi2pdf)
+ (setq TeX-command-next TeX-command-Show)))
+ nil))
+
+;; This regexp should catch warnings of the type
+;; LaTeX Warning: ...
+;; LaTeX Font Warning: ...
+;; Package xyz123 Warning: ...
+;; Class xyz123 Warning: ...
+(defvar LaTeX-warnings-regexp
+ "\\(?:LaTeX\\|Class\\|Package\\|\\*\\) [-A-Za-z0-9]* ?[Ww]arning:"
+ "Regexp matching LaTeX warnings.")
+
+(defun TeX-LaTeX-sentinel-has-warnings ()
+ "Return non-nil, if the output buffer contains warnings.
+Warnings can be indicated by LaTeX or packages."
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward (concat "^" LaTeX-warnings-regexp) nil t)))
+
+(defun TeX-LaTeX-sentinel-has-bad-boxes ()
+ "Return non-nil, if LaTeX output indicates overfull or underfull boxes."
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^\\(Ov\\|Und\\)erfull \\\\" nil t)))
+
+;; should go into latex.el? --pg
+(defun TeX-LaTeX-sentinel (process name)
+ "Cleanup TeX output buffer after running LaTeX.
+
+Parse the output buffer to collect errors and warnings if the
+variable `TeX-parse-all-errors' is non-nil.
+
+Open the error overview if
+`TeX-error-overview-open-after-TeX-run' is non-nil and there are
+errors or warnings to show."
+ (if TeX-parse-all-errors
+ (TeX-parse-all-errors))
+ (if (and TeX-error-overview-open-after-TeX-run
+ (TeX-error-overview-make-entries
+ (TeX-master-directory) (TeX-active-buffer)))
+ (TeX-error-overview))
+ (cond ((TeX-TeX-sentinel-check process name))
+ ((and (save-excursion
+ (re-search-forward
+ "^Package biblatex Warning: Please (re)run Biber on the file"
+ nil t))
+ (with-current-buffer TeX-command-buffer
+ (and (LaTeX-bibliography-list)
+ (TeX-check-files (TeX-master-file "bbl")
+ (TeX-style-list)
+ (append TeX-file-extensions
+ BibTeX-file-extensions
+ TeX-Biber-file-extensions)))))
+ (message "%s%s" "You should run Biber to get citations right, "
+ (TeX-current-pages))
+ (setq TeX-command-next (with-current-buffer TeX-command-buffer
+ TeX-command-Biber)))
+ ((and (save-excursion
+ (re-search-forward
+ "^\\(?:LaTeX\\|Package natbib\\) Warning: Citation" nil t))
+ (with-current-buffer TeX-command-buffer
+ (and (LaTeX-bibliography-list)
+ (TeX-check-files (TeX-master-file "bbl")
+ (TeX-style-list)
+ (append TeX-file-extensions
+ BibTeX-file-extensions
+ TeX-Biber-file-extensions)))))
+ (message "%s%s" "You should run BibTeX to get citations right, "
+ (TeX-current-pages))
+ (setq TeX-command-next (with-current-buffer TeX-command-buffer
+ TeX-command-BibTeX)))
+ ((re-search-forward "Package biblatex Warning: Please rerun LaTeX" nil
t)
+ (message "%s%s" "You should run LaTeX again, " (TeX-current-pages))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "^(biblatex)\\W+Page breaks have changed" nil t)
+ (message "%s%s" "You should run LaTeX again - page breaks have
changed, "
+ (TeX-current-pages))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "^\\(?:LaTeX Warning: Label(s)\\|\
+Package natbib Warning: Citation(s)\\)" nil t)
+ (message "%s%s" "You should run LaTeX again to get references right, "
+ (TeX-current-pages))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward
+ "^\\(?:(rerunfilecheck)\\|Package hyperref Warning:\\)\\W+\
+Rerun to get outlines right" nil t)
+ (message "%s%s" "You should run LaTeX again to get outlines right, "
+ (TeX-current-pages))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "^LaTeX Warning: Reference" nil t)
+ (message "%s%s%s" name ": there were unresolved references, "
+ (TeX-current-pages))
+ (let (dvi2pdf)
+ (if (with-current-buffer TeX-command-buffer
+ (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
+ (setq TeX-command-next dvi2pdf)
+ (setq TeX-command-next TeX-command-Show))))
+ ((re-search-forward "^\\(?:LaTeX Warning: Citation\\|\
+Package natbib Warning:.*undefined citations\\)" nil t)
+ (message "%s%s%s" name ": there were unresolved citations, "
+ (TeX-current-pages))
+ (let (dvi2pdf)
+ (if (with-current-buffer TeX-command-buffer
+ (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
+ (setq TeX-command-next dvi2pdf)
+ (setq TeX-command-next TeX-command-Show))))
+ ((re-search-forward "^No file .*\\.\\(toc\\|lof\\|lot\\)\\.$" nil t)
+ (message "%s" (concat "You should run LaTeX again to get "
+ (upcase (match-string-no-properties 1))
+ " right"))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "Package longtable Warning: Table widths have \
+changed\\. Rerun LaTeX\\." nil t)
+ (message
+ "%s" "You should run LaTeX again to get table formatting right")
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "^hf-TikZ Warning: Mark '.*' changed\\. \
+Rerun to get mark in right position\\." nil t)
+ (message
+ "%s" "You should run LaTeX again to get TikZ marks in right
position")
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward "^\\* xsim warning: \"rerun\"" nil t)
+ (message
+ "%s" "You should run LaTeX again to synchronize exercise properties")
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-forward
+ "^\\(\\*\\* \\)?J?I?p?\\(La\\|Sli\\)TeX\\(2e\\)? \
+\\(Version\\|ver\\.\\|<[0-9/-]*\\(?:u[^>]*\\)?>\\)" nil t)
+ (let* ((warnings (and TeX-debug-warnings
+ (TeX-LaTeX-sentinel-has-warnings)))
+ (bad-boxes (and TeX-debug-bad-boxes
+ (TeX-LaTeX-sentinel-has-bad-boxes)))
+ (add-info (when (or warnings bad-boxes)
+ (concat " (with "
+ (when warnings "warnings")
+ (when (and warnings bad-boxes) " and ")
+ (when bad-boxes "bad boxes")
+ ")"))))
+ (message "%s" (concat name ": successfully formatted "
+ (TeX-current-pages) add-info)))
+ (let (dvi2pdf)
+ (if (with-current-buffer TeX-command-buffer
+ (and TeX-PDF-mode (setq dvi2pdf (TeX-PDF-from-DVI))))
+ (setq TeX-command-next dvi2pdf)
+ (setq TeX-command-next TeX-command-Show))))
+ (t
+ (message "%s%s%s" name ": problems after " (TeX-current-pages))
+ (setq TeX-command-next TeX-command-default)))
+
+ ;; Check whether the idx file changed.
+ (let (idx-file)
+ (and (file-exists-p
+ (setq idx-file
+ (with-current-buffer TeX-command-buffer
+ (expand-file-name (TeX-active-master "idx")))))
+ ;; imakeidx package automatically runs makeindex, thus, we need to be
+ ;; sure .ind file isn't newer than .idx.
+ (TeX-check-files (with-current-buffer TeX-command-buffer
+ (expand-file-name (TeX-active-master "ind")))
+ (with-current-buffer TeX-command-buffer
+ (list (file-name-nondirectory
(TeX-active-master))))
+ '("idx"))
+ (with-temp-buffer
+ (insert-file-contents-literally idx-file)
+ (not (equal
+ ;; Compare old md5 hash of the idx file with the new one.
+ (cdr (assoc idx-file LaTeX-idx-md5-alist))
+ (md5 (current-buffer)))))
+ (push (cons idx-file t) LaTeX-idx-changed-alist)))
+
+ (unless (TeX-error-report-has-errors-p)
+ (run-hook-with-args 'TeX-after-compilation-finished-functions
+ (with-current-buffer TeX-command-buffer
+ (expand-file-name
+ (TeX-active-master (TeX-output-extension)))))))
+
+;; should go into latex.el? --pg
+(defun TeX-BibTeX-sentinel (_process _name)
+ "Cleanup TeX output buffer after running BibTeX."
+ (goto-char (point-max))
+ (cond
+ ;; Check whether BibTeX reports any warnings or errors.
+ ((re-search-backward (concat
+ "^(There \\(?:was\\|were\\) \\([0-9]+\\) "
+ "\\(warnings?\\|error messages?\\))")
+ nil t)
+ ;; Tell the user their number so that she sees whether the
+ ;; situation is getting better or worse.
+ (message (concat "BibTeX finished with %s %s. "
+ "Type `%s' to display output.")
+ (match-string 1) (match-string 2)
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (t
+ (message (concat "BibTeX finished successfully. "
+ "Run LaTeX again to get citations right."))))
+ ;; In any case, run the default next command.
+ (setq TeX-command-next TeX-command-default))
+
+(defun TeX-Biber-sentinel (_process _name)
+ "Cleanup TeX output buffer after running Biber."
+ (goto-char (point-max))
+ (cond
+ ((re-search-backward "^INFO - \\(WARNINGS\\|ERRORS\\): \\([0-9]+\\)" nil t)
+ (message (concat "Biber finished with %s %s. "
+ "Type `%s' to display output.")
+ (match-string 2) (downcase (match-string 1))
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]"))
+ (setq TeX-command-next TeX-command-default))
+ ((re-search-backward "^FATAL" nil t)
+ (message (concat "Biber had a fatal error and did not finish! "
+ "Type `%s' to display output.")
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]"))
+ (setq TeX-command-next TeX-command-Biber))
+ (t
+ (message (concat "Biber finished successfully. "
+ "Run LaTeX again to get citations right."))
+ (setq TeX-command-next TeX-command-default))))
+
+(defun TeX-dvips-sentinel (_process _name)
+ "Cleanup TeX output buffer after running dvips."
+ (goto-char (point-max))
+ (cond
+ ((search-backward "TeX Output exited abnormally" nil t)
+ (message "Dvips failed. Type `%s' to display output."
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (t
+ (if (with-current-buffer TeX-command-buffer
+ (and (equal (TeX-PDF-from-DVI) "Dvips") TeX-PDF-mode))
+ (setq TeX-output-extension "ps"
+ TeX-command-next "Ps2pdf"))
+ (message "Dvips finished successfully. "))))
+
+(defun TeX-dvipdfmx-sentinel (_process _name)
+ "Cleanup TeX output buffer after running dvipdfmx."
+ (goto-char (point-max))
+ (cond
+ ((search-backward "TeX Output exited abnormally" nil t)
+ (message "Dvipdfmx failed. Type `%s' to display output."
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (t
+ (if (with-current-buffer TeX-command-buffer
+ (and (equal (TeX-PDF-from-DVI) "Dvipdfmx") TeX-PDF-mode))
+ (setq TeX-output-extension "pdf"
+ TeX-command-next TeX-command-Show))
+ (message "Dvipdfmx finished successfully. "))))
+
+(defun TeX-ps2pdf-sentinel (_process _name)
+ "Cleanup TeX output buffer after running ps2pdf."
+ (goto-char (point-max))
+ (cond
+ ((search-backward "TeX Output exited abnormally" nil t)
+ (message "ps2pdf failed. Type `%s' to display output."
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (t
+ (if (with-current-buffer TeX-command-buffer
+ (and (equal (TeX-PDF-from-DVI) "Dvips") TeX-PDF-mode))
+ (setq TeX-command-next TeX-command-Show
+ TeX-output-extension "pdf"))
+ (message "ps2pdf finished successfully. "))))
+
+(defun TeX-index-sentinel (_process _name)
+ "Cleanup TeX output buffer after compiling index."
+ (goto-char (point-max))
+ (cond
+ ((search-backward "TeX Output exited abnormally" nil t)
+ (message "Index failed. Type `%s' to display output."
+ (substitute-command-keys
+ "\\<TeX-mode-map>\\[TeX-recenter-output-buffer]")))
+ (t
+ (setq TeX-command-next TeX-command-default)
+ (message (concat "Index finished successfully. "
+ "Run LaTeX again to get index right.")))))
+
+(defun TeX-command-sequence-sentinel (process string)
+ "Call the appropriate sentinel for the current PROCESS.
+Pass two arguments PROCESS and STRING to the sentinel.
+
+If there are no errors, call back `TeX-command-sequence' using
+`TeX-command-sequence-command' as command argument, unless this
+variable is nil."
+ (with-current-buffer (process-buffer process)
+ (funcall TeX-command-sequence-sentinel process string)
+ (if (string-match "\\(finished\\|exited\\)" string)
+ (with-current-buffer TeX-command-buffer
+ (unless
+ (or
+ (TeX-error-report-has-errors-p)
+ (null TeX-command-sequence-command))
+ (TeX-command-sequence TeX-command-sequence-command nil
+ TeX-command-sequence-file-function))))))
+
+;;; Process Control
+
+;; COMPATIBILITY for emacs < 27
+(if (< emacs-major-version 27)
+ (or (assq 'compilation-in-progress minor-mode-alist)
+ (setq minor-mode-alist (cons '(compilation-in-progress " Compiling")
+ minor-mode-alist))))
+
+(defun TeX-process-get-variable (name symbol &optional default)
+ "Return the value in the process buffer for NAME of SYMBOL.
+
+Return DEFAULT if the process buffer does not exist or SYMBOL is not
+defined."
+ (let ((buffer (TeX-process-buffer name)))
+ (if (and buffer
+ (local-variable-p symbol buffer))
+ (with-current-buffer buffer
+ (symbol-value symbol))
+ default)))
+
+(defun TeX-process-set-variable (name symbol value)
+ "Set the variable SYMBOL in the process buffer to VALUE.
+Return nil only if no process buffer exists."
+ (let ((buffer (TeX-process-buffer name)))
+ (if buffer
+ (with-current-buffer buffer
+ (set symbol value)
+ t)
+ nil)))
+
+(defun TeX-process-check (name)
+ "Check if a process for the TeX document NAME already exist.
+If so, give the user the choice of aborting the process or the current
+command."
+ (let (process)
+ (while (and (setq process (TeX-process name))
+ (eq (process-status process) 'run))
+ (cond
+ ((yes-or-no-p (concat "Process `"
+ (process-name process)
+ "' for document `"
+ name
+ "' running, kill it? "))
+ (delete-process process))
+ ((eq (process-status process) 'run)
+ (error "Cannot have two processes for the same document"))))))
+
+(defun TeX-process-buffer-name (name)
+ "Return name of AUCTeX buffer associated with the document NAME."
+ (concat "*" (abbreviate-file-name (expand-file-name name)) " output*"))
+
+(defun TeX-process-buffer (name)
+ "Return the AUCTeX buffer associated with the document NAME."
+ (get-buffer (TeX-process-buffer-name name)))
+
+(defun TeX-process (name)
+ "Return AUCTeX process associated with the document NAME."
+ (and TeX-process-asynchronous
+ (get-buffer-process (TeX-process-buffer name))))
+
+;;; Process Filters
+
+(defun TeX-command-mode-line (process)
+ "Format the mode line for a buffer containing output from PROCESS."
+ (setq mode-line-process (concat ": "
+ (symbol-name (process-status process))))
+ (force-mode-line-update))
+
+(defun TeX-command-filter (process string)
+ "Filter to process normal output."
+ (with-current-buffer (process-buffer process)
+ (save-excursion
+ (goto-char (process-mark process))
+ (insert-before-markers string)
+ (set-marker (process-mark process) (point)))))
+
+(defvar TeX-current-page nil
+ "The page number currently being formatted, enclosed in brackets.")
+
+ (make-variable-buffer-local 'TeX-current-page)
+
+(defun TeX-format-mode-line (process)
+ "Format the mode line for a buffer containing TeX output from PROCESS."
+ (setq mode-line-process (concat " " TeX-current-page ": "
+ (symbol-name (process-status process))))
+ (force-mode-line-update))
+
+(defun TeX-format-filter (process string)
+ "Filter to process TeX output."
+ (with-current-buffer (process-buffer process)
+ (let (str pos end (pt (marker-position (process-mark process))))
+ (save-excursion
+ (goto-char pt)
+ (insert-before-markers string)
+ (set-marker (process-mark process) (point))
+ ;; Remove line breaks at columns 79 and 80
+ (while (> (point) pt)
+ (end-of-line 0)
+ (when (and (memq (- (point) (line-beginning-position)) '(79 80))
+ ;; Heuristic: Don't delete the linebreak if the next line
+ ;; is empty or starts with an opening parenthesis, or if
+ ;; point is located after a period and in the next line no
+ ;; word char follows.
+ (not (memq (char-after (1+ (point))) '(?\n ?\()))
+ (not (and (eq (char-before) ?.)
+ (char-after (1+ (point)))
+ (not (eq ?w (char-syntax (char-after (1+
(point)))))))))
+ (delete-char 1)))
+ (goto-char (marker-position (process-mark process)))
+ ;; Determine current page
+ (while (and pt
+ (skip-chars-backward "^]" pt)
+ (> (point) pt))
+ (setq end (point))
+ (backward-char)
+ (skip-chars-backward "-0-9\n." (max (point-min) (- pt 128)))
+ (when (and (eq ?\[ (char-before))
+ (not (eq ?\] (char-after)))
+ (progn
+ (setq str (buffer-substring (1- (point)) end)
+ pos nil)
+ (while (setq pos (string-match "\n" str pos))
+ (setq str (replace-match "" t t str)))
+ (string-match
+ "\\`\\[-?[0-9]+\\(\\.-?[0-9]+\\)\\{0,9\\}\\]\\'"
+ str)))
+ (setq TeX-current-page str
+ pt nil)
+ (TeX-format-mode-line process)))))))
+
+(defvar TeX-parse-function nil
+ "Function to call to parse content of TeX output buffer.")
+(make-variable-buffer-local 'TeX-parse-function)
+
+(defun TeX-background-filter (_process string)
+ "Filter to process background output."
+ (let ((old-window (selected-window))
+ (pop-up-windows t))
+ (TeX-pop-to-buffer "*TeX background*" nil t)
+ (goto-char (point-max))
+ (insert string)
+ (select-window old-window)))
+
+;; Copy and adaption of `comint-postoutput-scroll-to-bottom' from CVS
+;; Emacs of 2005-04-24.
+(defun TeX-interactive-goto-prompt (string)
+ "Move point to prompt of an interactive TeX run."
+ (let* ((selected (selected-window))
+ (current (current-buffer))
+ (process (get-buffer-process current)))
+ (unwind-protect
+ (when process
+ (walk-windows
+ (lambda (window)
+ (when (eq (window-buffer window) current)
+ (select-window window)
+ (when (and (< (point) (process-mark process))
+ (string-match "^\\? $" string))
+ (goto-char (process-mark process)))
+ (select-window selected)))
+ nil t))
+ (set-buffer current))))
+
+
+;;; Active Process
+
+(defvar TeX-current-process-region-p nil
+ "Non-nil means that the last TeX command is on a region.")
+
+(defun TeX-active-process ()
+ "Return the active process for the current buffer."
+ (TeX-process (TeX-active-master)))
+
+(defun TeX-active-buffer ()
+ "Return the buffer of the active process for this buffer."
+ (and TeX-command-buffer
+ (with-current-buffer TeX-command-buffer
+ (TeX-process-buffer (TeX-active-master)))))
+
+(defun TeX-active-master (&optional extension nondirectory _ignore)
+ "The master file currently being compiled.
+
+If optional argument EXTENSION is non-nil, add that file extension to
+the name. Special value t means use `TeX-default-extension'.
+
+If optional second argument NONDIRECTORY is non-nil, do not include
+the directory.
+
+The compatibility argument IGNORE is ignored."
+ ;; The third argument `_ignore' is kept for symmetry with
+ ;; `TeX-master-file's third argument `ask'. For example, it's used
+ ;; in `TeX-active-master-with-quotes' for backward compatibility.
+ ;; Keep this in mind should you want to use another argument here.
+ ;; See also the similar comment in `TeX-region-file'.
+ (if TeX-current-process-region-p
+ (TeX-region-file extension nondirectory)
+ (TeX-master-file extension nondirectory)))
+
+(defvar TeX-command-buffer nil
+ "The buffer from where the last TeX command was issued.")
+
+;;; Region File
+
+
+(defvar TeX-region-hook nil
+ "List of hooks to run before the region file is saved.
+The hooks are run in the region buffer, you may use the variable
+`TeX-region-master-buffer' to access the buffer of the master
+file and `TeX-region-orig-buffer' to access the buffer where
+\\[TeX-command-region] or \\[TeX-command-buffer] is invoked
+from.")
+
+(defun TeX-quote-filename (file)
+ "Convert file name into a form acceptable to TeX."
+ (let (pos)
+ (while (setq pos (string-match "\\\\" file pos))
+ (setq file (replace-match "/" t t file 0)
+ pos (1+ pos)))
+ (while (setq pos (string-match "[~#]" file pos))
+ (setq file (replace-match "\\\\string\\&" t nil file 0)
+ pos (+ pos 8))))
+ ;; Use \unexpanded so that \message outputs the raw file name.
+ ;; When \usepackage[utf8]{inputenc} is used in standard (pdf)latex,
+ ;; \message does not output non-ascii file name in raw form without
+ ;; \unexpanded, which makes AUCTeX to fail to recognize the file
+ ;; names right when analysing the process output buffer.
+ ;; Note that \usepackage[utf8]{inputenc} is enabled by default in
+ ;; standard (pdf)latex since TeXLive 2018.
+ (if (and (memq major-mode '(latex-mode doctex-mode))
+ ;; Japanese upLaTeX requires the same treatment with
+ ;; respect to non-ascii characters other than Japanese, in
+ ;; file names within \message{}.
+ ;; However, pLaTeX (non u- version) does not support
+ ;; non-ascii file name encoded in UTF-8. So considering
+ ;; `ptex' doesn't make sense here. We cater for only
+ ;; `default' and `uptex' engines.
+ (memq TeX-engine '(default uptex)))
+ ;; It would fail to put entire `file' inside \unexpanded{} when
+ ;; the above loop injects \string before "#" and "~". So put
+ ;; only multibyte characters inside \unexpanded{}.
+ ;; It is safe in upLaTeX to use \unexpanded{} on Japanese
+ ;; characters though they are handled by upLaTeX in a totally
+ ;; different way from inputenc.
+ ;; Thus put all multibyte characters, without considering
+ ;; whether they are Japanese or not, inside \unexpanded{}.
+ (replace-regexp-in-string "[[:multibyte:]]+"
+ "\\\\unexpanded{\\&}" file t)
+ file))
+
+(defvar-local TeX-region-orig-buffer nil
+ "The original buffer in which the TeX-region was created.")
+
+(defvar-local TeX-region-master-buffer nil
+ "The TeX-master buffer of the document for which the TeX-region
+was created.")
+
+(defun TeX-region-create (file region original offset)
+ "Create a new file named FILE with the string REGION.
+The region is taken from ORIGINAL starting at line OFFSET.
+
+The current buffer and master file is searched, in order to ensure
+that the TeX header and trailer information is also included.
+
+The OFFSET is used to provide the debugger with information about the
+original file."
+ (if (fboundp 'preview--skip-preamble-region)
+ (let ((temp (preview--skip-preamble-region region offset)))
+ (if temp
+ ;; Skip preamble for the sake of predumped formats.
+ (setq region (car temp)
+ offset (cdr temp)))))
+
+ (let* (;; We shift buffer a lot, so we must keep track of the buffer
+ ;; local variables.
+ (header-end TeX-header-end)
+ (trailer-start TeX-trailer-start)
+
+ ;; We seach for header and trailer in the master file.
+ (orig-buffer (current-buffer))
+ (master-name (TeX-master-file TeX-default-extension))
+ (master-buffer (find-file-noselect master-name))
+
+ ;; Attempt to disable font lock.
+ (font-lock-mode-hook nil)
+ ;; And insert them into the FILE buffer.
+ (file-buffer (let (;; Don't query for master file
+ (TeX-transient-master t)
+ ;; Don't choose a special mode (and call its hooks)
+ (auto-mode-alist nil)
+ (magic-mode-alist nil)
+ (enable-local-variables nil)
+ ;; Don't run any f-f hooks
+ (find-file-hook nil))
+ (find-file-noselect file t)))
+ ;; But remember original content.
+ original-content
+
+ ;; We search for the header from the master file, if it is
+ ;; not present in the region.
+ (header (if (string-match header-end region)
+ ""
+ (save-excursion
+ (save-restriction
+ (set-buffer master-buffer)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ ;; NOTE: We use the local value of
+ ;; TeX-header-end from the master file.
+ (if (not (re-search-forward TeX-header-end nil t))
+ ""
+ (re-search-forward "[\r\n]" nil t)
+ (buffer-substring-no-properties
+ (point-min) (point)))))))))
+ (header-offset 0)
+ first-line
+ ;; We search for the trailer from the master file, if it is
+ ;; not present in the region.
+ (trailer-offset 0)
+ (trailer (if (string-match trailer-start region)
+ ""
+ (save-excursion
+ (save-restriction
+ (set-buffer master-buffer)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ ;; NOTE: We use the local value of
+ ;; TeX-trailer-start from the master file.
+ (if (not (re-search-backward TeX-trailer-start nil
t))
+ ""
+ ;;(beginning-of-line 1)
+ (re-search-backward "[\r\n]" nil t)
+ (setq trailer-offset (TeX-current-offset))
+ (buffer-substring-no-properties
+ (point) (point-max))))))))))
+ ;; file name should be relative to master
+ (setq original (TeX-quote-filename (file-relative-name
+ original (TeX-master-directory)))
+ master-name (TeX-quote-filename master-name))
+
+ ;; If the first line begins with "%&", put that line separately on
+ ;; the very first line of the region file so that the first line
+ ;; parsing will work.
+ (setq first-line (if (and (> (length header) 1)
+ (string= (substring header 0 2) "%&"))
+ ;; This would work even if header has no newline.
+ (substring header 0 (string-match "\n" header))
+ ""))
+ (unless (string= first-line "")
+ ;; Remove first-line from header.
+ (setq header (substring header (length first-line)))
+ (setq first-line (concat first-line "\n")))
+
+ (with-current-buffer file-buffer
+ (setq buffer-read-only t
+ buffer-undo-list t)
+ (setq original-content (buffer-string))
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (setq buffer-file-coding-system
+ (with-current-buffer master-buffer buffer-file-coding-system))
+ (insert first-line
+ "\\message{ !name(" master-name ")}"
+ header
+ TeX-region-extra
+ "\n\\message{ !name(" original ") !offset(")
+ (setq header-offset (- offset
+ (1+ (TeX-current-offset))))
+ (insert (int-to-string header-offset)
+ ") }\n"
+ region
+ "\n\\message{ !name(" master-name ") !offset(")
+ (insert (int-to-string (- trailer-offset
+ (1+ (TeX-current-offset))))
+ ") }\n"
+ trailer)
+ (setq TeX-region-orig-buffer orig-buffer)
+ (setq TeX-region-master-buffer master-buffer)
+ (run-hooks 'TeX-region-hook)
+ (if (string-equal (buffer-string) original-content)
+ (set-buffer-modified-p nil)
+ (save-buffer 0))))))
+
+(defun TeX-region-file (&optional extension nondirectory _ignore)
+ "Return TeX-region file name with EXTENSION.
+If optional second argument NONDIRECTORY is non-nil, do not include
+the directory.
+
+The compatibility argument IGNORE is ignored."
+ ;; The third argument `_ignore' is kept for symmetry with `TeX-master-file's
+ ;; third argument `ask'. For example, it's used in `TeX-command-sequence',
+ ;; where we don't know which function has to be called. Keep this in mind
+ ;; should you want to use another argument here.
+ (let ((master-dir (TeX-master-directory)))
+ (concat (or (TeX--master-output-dir master-dir nondirectory)
+ (if nondirectory "" master-dir))
+ (cond ((eq extension t)
+ (concat TeX-region "." TeX-default-extension))
+ (extension
+ (concat TeX-region "." extension))
+ (t
+ TeX-region)))))
+
+(defcustom TeX-region "_region_"
+ "Base name of temporary file for `TeX-command-region' and
`TeX-command-buffer'."
+ :group 'TeX-command
+ :type 'string)
+
+(defvar LaTeX-command-section-level nil
+ "The section level used for `LaTeX-command-section'.
+Will be initialized to `LaTeX-largest-level' buffer-locally.")
+(make-variable-buffer-local 'LaTeX-command-section-level)
+
+(defun LaTeX-command-section-level ()
+ "Return the value of `LaTeX-command-section-level'.
+Initialize it to `LaTeX-largest-level' if needed."
+ (unless LaTeX-command-section-level
+ (setq LaTeX-command-section-level LaTeX-largest-level))
+ LaTeX-command-section-level)
+
+
+(defun LaTeX-command-section-change-level (arg)
+ "Change `LaTeX-command-section-level' by ARG.
+`LaTeX-command-section-level' is the sectioning level used to
+determine the current section by `LaTeX-command-section'.
+The levels are defined by `LaTeX-section-list'."
+ (interactive "p")
+ (let ((old-level (car (rassoc (list (LaTeX-command-section-level))
+ LaTeX-section-list))))
+ (setq LaTeX-command-section-level (+ LaTeX-command-section-level arg))
+ (cond
+ ((> LaTeX-command-section-level 6)
+ (setq LaTeX-command-section-level 6)
+ (message "Cannot shrink LaTeX-command-section-level below
subparagraph."))
+ ((< LaTeX-command-section-level 0)
+ (setq LaTeX-command-section-level 0)
+ (message "Cannot enlarge LaTeX-command-section-level above part."))
+ (t (message "Changed level from %s to %s."
+ old-level (car (rassoc (list LaTeX-command-section-level)
+ LaTeX-section-list)))))))
+
+(defun LaTeX-command-section-boundaries ()
+ "Return the boundaries of the current section as (start . end).
+The section is determined by `LaTeX-command-section-level'."
+ (let* ((case-fold-search nil)
+ (rx (concat "\\\\" (regexp-opt
+ (mapcar
+ (lambda (level)
+ (car (rassoc (list level) LaTeX-section-list)))
+ (let (r)
+ (dotimes (i (1+ (LaTeX-command-section-level)))
+ (push i r))
+ r)))
+ "{")))
+ (cons (save-excursion
+ (re-search-backward rx nil t)
+ (point))
+ (save-excursion
+ (re-search-forward (concat rx "\\|\\\\end{document}") nil t)
+ (forward-line 0)
+ (point)))))
+
+(defun LaTeX-command-section (&optional override-confirm)
+ "Run a command on the current section.
+
+What makes the current section is defined by
+`LaTeX-command-section-level' which can be enlarged or shrunken
+with `LaTeX-command-section-change-level'.
+
+Query the user for a command to run on the temporary file
+specified by the variable `TeX-region'. The region file will be
+recreated from current section.
+
+If a prefix argument OVERRIDE-CONFIRM is given, confirmation will
+depend on it being positive instead of the entry in
+`TeX-command-list'."
+ (interactive "P")
+ (if (eq major-mode 'latex-mode)
+ (let* ((bounds (LaTeX-command-section-boundaries))
+ (TeX-command-region-begin (car bounds))
+ (TeX-command-region-end (cdr bounds)))
+ (TeX-command-region override-confirm))
+ (error "LaTeX-command-section can only be run on LaTeX documents")))
+
+(defun TeX-command-run-all-region ()
+ "Compile the current region until an error occurs or it is finished."
+ (interactive)
+ (TeX-region-update)
+ (TeX-command-sequence t t #'TeX-region-file))
+
+(defun LaTeX-command-run-all-section ()
+ "Compile the current section until an error occurs or it is finished."
+ (interactive)
+ (if (eq major-mode 'latex-mode)
+ (let* ((bounds (LaTeX-command-section-boundaries))
+ (TeX-command-region-begin (car bounds))
+ (TeX-command-region-end (cdr bounds)))
+ (TeX-region-update)
+ (TeX-command-sequence t t #'TeX-region-file))
+ (error "LaTeX-command-run-all-section can only be run on LaTeX
documents")))
+
+(defun TeX-command-run-all (arg)
+ "Compile the current document until an error occurs or it is finished.
+With a prefix ARG (`\\[universal-argument] \\[TeX-command-run-all]'),
+compile the current region instead, that is, call
+`TeX-command-run-all-region'. With multiple prefix
+arguments (`\\[universal-argument] \\[universal-argument]
\\[TeX-command-run-all]'),
+compile the current section instead, that is, call
+`LaTeX-command-run-all-section'."
+ (interactive "P")
+ (cond
+ ((null arg) (TeX-command-sequence t t))
+ ((= 4 (car arg)) (TeX-command-run-all-region))
+ (t (LaTeX-command-run-all-section))))
+
+;;; Parsing
+
+;;; - Global Parser Variables
+
+(defvar TeX-error-point nil
+ "How far we have parsed until now.")
+
+(make-variable-buffer-local 'TeX-error-point)
+
+(defvar TeX-error-file nil
+ "Stack of files in which errors have occurred.")
+
+(make-variable-buffer-local 'TeX-error-file)
+
+(defvar TeX-error-offset nil
+ "Add this to any line numbers from TeX. Stack like `TeX-error-file'.")
+
+(make-variable-buffer-local 'TeX-error-offset)
+
+(defun TeX-parse-reset (&optional reparse)
+ "Reset all variables used for parsing TeX output.
+If optional argument REPARSE is non-nil, reparse the output log."
+ (setq TeX-error-point (point-min)
+ TeX-error-offset nil
+ TeX-error-file nil
+ TeX-error-list nil
+ TeX-error-last-visited -1)
+ (if reparse
+ (TeX-parse-all-errors)))
+
+;;; - Parsers Hooks
+
+;; All this parsers hooks should have the same arguments even though they will
+;; be ignored, because `TeX-next-error' can call any of these functions.
+(defun TeX-parse-command (_arg _reparse)
+ "We can't parse anything but TeX."
+ (error "I cannot parse %s output, sorry"
+ (if (TeX-active-process)
+ (process-name (TeX-active-process))
+ "this")))
+
+(defun TeX-error-list-skip-warning-p (type ignore)
+ "Decide if a warning of `TeX-error-list' should be skipped.
+
+TYPE is one of the types listed in `TeX-error-list', IGNORE
+is the flag to choose if the warning should be skipped."
+ ;; The warning should be skipped if it...
+ (or
+ ;; ...is a warning and we want to ignore all warnings, or...
+ (and (null TeX-debug-warnings)
+ (equal type 'warning))
+ ;; ...is a bad-box and we want to ignore all bad-boxes, or...
+ (and (null TeX-debug-bad-boxes)
+ (equal type 'bad-box))
+ ;; ...is a warning to be ignored.
+ (and TeX-suppress-ignored-warnings
+ ignore)))
+
+(defun TeX-parse-TeX (arg reparse)
+ "Find the next error produced by running TeX.
+
+ARG specifies how many error messages to move, when possible;
+negative means move back to previous error messages.
+
+If REPARSE is non-nil, reparse the output log.
+
+If the file occurs in an included file, the file is loaded (if not
+already in an Emacs buffer) and the cursor is placed at the error."
+ (let ((old-buffer (current-buffer))
+ max-index item)
+
+ ;; Switch to the output buffer.
+ (with-current-buffer (TeX-active-buffer)
+ (if reparse
+ (TeX-parse-reset reparse))
+ (if TeX-parse-all-errors
+ (progn
+ (setq arg (or arg 1)
+ max-index (length TeX-error-list))
+ ;; This loop is needed to skip ignored warnings, when
+ ;; `TeX-suppress-ignored-warnings' is non-nil and there are ignore
+ ;; warnings.
+ (while (null (zerop arg))
+ (setq TeX-error-last-visited
+ ;; Increase or decrese `TeX-error-last-visited' depending
on
+ ;; the sign of `arg'. Note: `signum' is a function from
+ ;; `cl' library, do not be tempted to use it.
+ (if (> arg 0)
+ (1+ TeX-error-last-visited)
+ (1- TeX-error-last-visited))
+ item (nth TeX-error-last-visited TeX-error-list))
+ ;; Increase or decrease `arg' only if the warning isn't to be
+ ;; skipped.
+ (unless (TeX-error-list-skip-warning-p (nth 0 item) (nth 10
item))
+ ;; Note: `signum' is a function from `cl' library, do not be
+ ;; tempted to use it.
+ (setq arg (if (> arg 0)
+ (1- arg)
+ (1+ arg)))))
+ (if (< TeX-error-last-visited -1)
+ (setq TeX-error-last-visited -1))
+ (cond ((or (null item)
+ (< TeX-error-last-visited 0))
+ (if (> TeX-error-last-visited max-index)
+ (setq TeX-error-last-visited max-index))
+ (message "No more errors.")
+ (beep)
+ (TeX-pop-to-buffer old-buffer))
+ (t
+ (apply #'TeX-find-display-help item))))
+
+ (goto-char TeX-error-point)
+ (TeX-parse-error old-buffer)))))
+
+;;; - Parsing (La)TeX
+
+(defvar TeX-translate-location-file nil)
+(defvar TeX-translate-location-offset nil)
+(defvar TeX-translate-location-line nil)
+(defvar TeX-translate-location-string nil)
+(defvar TeX-translate-location-error nil)
+(defvar TeX-translate-location-context nil)
+
+(defvar TeX-translate-location-hook nil
+ "List of functions to be called before showing an error or warning.
+
+You might want to examine and modify the dynamically bound
+variables
+ `TeX-translate-location-file',
+ `TeX-translate-location-offset',
+ `TeX-translate-location-line',
+ `TeX-translate-location-string',
+ `TeX-translate-location-error', and
+ `TeX-translate-location-context'
+from this hook.")
+
+;; `ignore' flag should be the always the last one in the list of information
+;; for each error/warning, because it can be set within `TeX-warning' by a
+;; custom function taking as argument all information present in
+;; `TeX-error-list' but `ignore', see `TeX-ignore-warnings'.
+(defvar TeX-error-list nil
+ "List of warnings and errors.
+
+Each element of the list is a list of information for a specific
+error or warning. This is the structure of each element:
+ * 0: type (error, warning, bad-box)
+ * 1: file
+ * 2: line
+ * 3: message of the error or warning
+ * 4: offset
+ * 5: context, to be displayed in the help window
+ * 6: string to search in the buffer, in order to find location
+ of the error or warning
+ * 7: for warnings referring to multiple lines (for exapmle, bad boxes),
+ the last line mentioned in the warning message
+ * 8: t if it is a bad-box, nil otherwise
+ * 9: value of `TeX-error-point'
+ * 10: whether the warning should be ignored
+
+This variable is intended to be set only in output buffer so it
+will be shared among all files of the same document.")
+(make-variable-buffer-local 'TeX-error-list)
+
+(defun TeX-parse-all-errors ()
+ "Parse TeX output buffer to collect all warnings and errors."
+ ;; Reset error list.
+ (setq TeX-error-list nil)
+ (save-excursion
+ (goto-char (point-min))
+ (while (TeX-parse-error nil t)))
+ ;; Reset last visited error.
+ (setq TeX-error-last-visited -1))
+
+(defun TeX-parse-error (old &optional store)
+ "Goto next error. Pop to OLD buffer if no more errors are found.
+
+If the optional argument STORE is non-nil, the function will
+store the found warning or error in `TeX-error-list' instead of
+displaying the issue.
+
+Return non-nil if an error or warning is found."
+ (let ((regexp
+ (concat
+ ;; TeX error
+ "^\\(!\\|\\(.*?\\):[0-9]+:\\) \\|"
+ ;; New file
+ "(\n?\\([^\n()]+\\)\\|"
+ ;; End of file.
+ "\\()\\)\\|"
+ ;; Hook to change line numbers
+ " !\\(?:offset(\\([---0-9]+\\))\\|"
+ ;; Hook to change file name
+ "name(\\([^)]+\\))\\)\\|"
+ ;; Start of LaTeX bad box
+ "^\\(\\(?:Overfull\\|Underfull\\|Tight\\|Loose\\) "
+ ;; Horizontal bad box
+ "\\(?:\\\\hbox.* at lines? [0-9]+\\(?:--[0-9]+\\)?$\\|"
+ ;; Vertical bad box. See also `TeX-warning'.
+ "\\\\vbox ([ a-z0-9]+) has occurred while \\\\output is active
\\[[^]]+\\]\\)\\)\\|"
+ ;; LaTeX warning
+ "^\\(" LaTeX-warnings-regexp ".*\\)"))
+ (error-found nil))
+ (while
+ (cond
+ ((null
+ (re-search-forward regexp nil t))
+ ;; No more errors.
+ (unless store
+ (message "No more errors.")
+ (beep)
+ (TeX-pop-to-buffer old))
+ nil)
+ ;; TeX error
+ ((match-beginning 1)
+ (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))))
+ (setq error-found t)
+ (if (looking-at "Preview ")
+ t
+ (TeX-error store)
+ nil))
+ ;; LaTeX bad box
+ ((match-beginning 7)
+ ;; In `TeX-error-list' we collect all warnings, also if they're going
+ ;; to be actually skipped.
+ (if (or store TeX-debug-bad-boxes)
+ (progn
+ (setq error-found t)
+ (TeX-warning (TeX-match-buffer 7) (match-beginning 7) t store)
+ nil)
+ (re-search-forward "\r?\n\
+\\(?:.\\{79\\}\r?\n\
+\\)*.*\r?$")
+ t))
+ ;; LaTeX warning
+ ((match-beginning 8)
+ ;; In `TeX-error-list' we collect all warnings, also if they're going
+ ;; to be actually skipped.
+ (if (or store TeX-debug-warnings)
+ (progn
+ (setq error-found t)
+ (TeX-warning (TeX-match-buffer 8) (match-beginning 8) nil
store)
+ nil)
+ t))
+
+ ;; New file -- Push on stack
+ ((match-beginning 3)
+ (let ((file (TeX-match-buffer 3))
+ (end (match-end 3)))
+ ;; Strip quotation marks and remove newlines if necessary
+ (when (or (eq (string-to-char file) ?\")
+ (string-match "[ \t\n]" file))
+ (setq file (mapconcat #'identity (split-string file "[\"\n]+")
"")))
+ ;; Polish `file' string
+ (setq file
+ (let ((string file))
+ (setq string
+ (if (string-match "\\`[ \t\n\r]+" string)
+ (replace-match "" t t string)
+ string))
+ ;; Sometimes `file' is something like
+ ;; "./path/to/file.tex [9] [10 <./path/to/file>] "
+ ;; where "[9]" and "[10 <./path/to/file>]" are pages of the
+ ;; output file, with path to an included file. Remove
these
+ ;; numbers together with whitespaces at the end of the
+ ;; string.
+ (if (string-match "\\( *\\(\\[[^]]+\\]\\)? *\\)*\\'"
string)
+ (replace-match "" t t string)
+ string)))
+ (push file TeX-error-file)
+ (push nil TeX-error-offset)
+ (goto-char end))
+ t)
+
+ ;; End of file -- Pop from stack
+ ((match-beginning 4)
+ (when (> (length TeX-error-file) 0)
+ (pop TeX-error-file)
+ (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)))
+ error-found))
+
+(defun TeX-find-display-help (type file line error offset context string
+ line-end _bad-box error-point _ignore)
+ "Find the error and display the help.
+
+For a description of arguments, see `TeX-error-list'. IGNORE
+value is not used here."
+ ;; Go back to TeX-buffer
+ (let ((runbuf (TeX-active-buffer))
+ (master (with-current-buffer TeX-command-buffer
+ (expand-file-name (TeX-master-file))))
+ (command-buffer TeX-command-buffer)
+ (TeX-translate-location-file file)
+ (TeX-translate-location-line line)
+ (TeX-translate-location-error error)
+ (TeX-translate-location-offset offset)
+ (TeX-translate-location-context context)
+ (TeX-translate-location-string string)
+ error-file-buffer start)
+
+ (run-hooks 'TeX-translate-location-hook)
+
+ (if TeX-translate-location-file
+ (progn
+ (setq error-file-buffer
+ (find-file
+ (expand-file-name TeX-translate-location-file
+ (file-name-directory master))))
+ ;; Use the major mode of `TeX-command-buffer' when visiting
+ ;; the error point.
+ (if (eq major-mode (default-value 'major-mode))
+ (funcall (buffer-local-value 'major-mode command-buffer)))
+ ;; Set the value of `TeX-command-buffer' in the next file
+ ;; with an error to be displayed to the value it has in the
+ ;; current buffer.
+ (setq-local TeX-command-buffer command-buffer)
+
+ ;; Find the location of the error or warning.
+ (when TeX-translate-location-line
+ (goto-char (point-min))
+ (forward-line (+ TeX-translate-location-offset
+ TeX-translate-location-line -1))
+ (cond
+ ;; Error.
+ ((equal type 'error)
+ (if (not (string= TeX-translate-location-string " "))
+ (search-forward TeX-translate-location-string nil t)))
+ ;; Warning or bad box.
+ (t
+ (beginning-of-line 0)
+ (setq start (point))
+ (goto-char (point-min))
+ (forward-line (+ TeX-translate-location-offset
+ line-end -1))
+ (end-of-line)
+ (when TeX-translate-location-string
+ (search-backward TeX-translate-location-string start t)
+ (search-forward TeX-translate-location-string nil t))))))
+ ;; When the file cannot be determined stay here but issue a
+ ;; warning.
+ (message "Could not determine file for %s"
+ (if (eq type 'error) "error" "warning"))
+ (beep))
+
+ ;; Display the help.
+ (cond ((eq TeX-display-help 'expert)
+ (TeX-pop-to-buffer runbuf nil t)
+ (goto-char error-point)
+ (if error-file-buffer
+ (TeX-pop-to-buffer error-file-buffer nil t)))
+ (TeX-display-help
+ (TeX-help-error
+ TeX-translate-location-error
+ (if (equal type 'warning)
+ (concat "\n" TeX-translate-location-context)
+ TeX-translate-location-context)
+ runbuf type))
+ (t
+ (message "! %s" TeX-translate-location-error)))))
+
+(defun TeX-error (&optional store)
+ "Display an error.
+
+If optional argument STORE is non-nil, store the error
+information in `TeX-error-list' instead of displaying the error."
+
+ (let* ( ;; We need the error message to show the user.
+ (error (progn
+ (re-search-forward "\\(.*\\)")
+ (TeX-match-buffer 1)))
+
+ ;; And the context for the help window.
+ (context-start (point))
+ context-available
+
+ ;; And the line number to position the cursor.
+ (line (cond
+ ;; regular style
+ ((re-search-forward "l\\.\\([0-9]+\\)" nil t)
+ (setq context-available t)
+ (string-to-number (TeX-match-buffer 1)))
+ ;; file:line:error style
+ ((save-excursion
+ (re-search-backward ":\\([0-9]+\\): "
+ (line-beginning-position) t))
+ (string-to-number (TeX-match-buffer 1)))
+ ;; nothing found
+ (t 1)))
+
+ ;; And a string of the context to search for.
+ (string (progn
+ (beginning-of-line)
+ (re-search-forward " \\(\\([^ \t]*$\\)\\|\\($\\)\\)")
+ (TeX-match-buffer 1)))
+
+ ;; And we have now found to the end of the context.
+ (context (if context-available
+ (buffer-substring context-start (progn (forward-line 1)
+ (end-of-line)
+ (point)))
+ ;; There is no real context available, so we
+ ;; simply show the line with the error message.
+ (buffer-substring (1- (line-beginning-position))
+ context-start)))
+ ;; We may use these in another buffer.
+ (offset (or (car TeX-error-offset) 0))
+ (file (car TeX-error-file))
+ info-list)
+
+ ;; Remember where we was.
+ (setq TeX-error-point (point)
+ info-list (list 'error file line error offset context string nil nil
+ TeX-error-point nil))
+ (if store
+ ;; Store the error information.
+ (add-to-list 'TeX-error-list info-list t)
+ ;; Find the error point and display the help.
+ (apply #'TeX-find-display-help info-list))))
+
+(defun TeX-warning (warning warning-start bad-box &optional store)
+ "Display a warning for WARNING.
+
+WARNING-START is the position where WARNING starts. If BAD-BOX
+is non-nil, the warning refers to a bad-box, otherwise it is a
+generic warning.
+
+If optional argument STORE is non-nil, store the warning
+information in `TeX-error-list' instead of displaying the
+warning."
+
+ (let* ( ;; line-string: match 1 is beginning line, match 2 is end line
+ (line-string (if bad-box
+ "at lines? \\([0-9]*\\)\\(?:--\\([0-9]*\\)\\)?"
+ ;; Traditional messages say "on input line X",
+ ;; the LaTeX3 \msg_line_context:. just reads
+ ;; "on line X".
+ "on \\(?:input \\)?line \\([0-9]*\\)\\."))
+ ;; word-string: match 1 is the word
+ (word-string (if bad-box "[][\\W() ---]\\(\\w+\\)[][\\W() ---]*$"
+ ;; Match "ref" in both "Reference `ref' on page NN
+ ;; undefined" and "Citation 'ref' on page NN
undefined".
+ "\\(?:`\\|'\\)\\([-a-zA-Z0-9:]+\\)'"))
+
+ ;; Get error-line (warning). Don't search before `warning-start' to
+ ;; avoid catching completely unrelated line numbers.
+ (line (when (save-excursion (re-search-backward line-string
+ warning-start t))
+ (string-to-number (TeX-match-buffer 1))))
+ ;; If this is a bad box and the warning ends with "...at lines MM--NN"
+ ;; we can use "NN" as `line-end', in any other case (including bad
+ ;; boxes ending with "...at line NN") just use `line'.
+ (line-end (if (and bad-box (match-beginning 2))
+ (string-to-number (TeX-match-buffer 2))
+ line))
+
+ ;; Find the context
+ (context-start (progn (cond
+ ((and bad-box (string-match "\\\\hbox"
warning))
+ ;; Horizontal bad box
+ (end-of-line))
+ (bad-box
+ ;; Vertical bad box (by exclusion), don't move
+ ;; point. In the output buffer, unlike in the
+ ;; actual *.log file, these warnings do not
end
+ ;; with "...is active []", but in the same
line
+ ;; there may be something else, including a
new
+ ;; file opened. Thus, point shouldn't move
+ ;; from the end of the actual bad box warning.
+ ;; This is why the corresponding regexp in
+ ;; `TeX-parse-error' doesn't match everything
+ ;; until the end of the line.
+ nil)
+ (t
+ ;; Generic warning.
+ (beginning-of-line)))
+ (point)))
+
+ (context (cond ((string-match LaTeX-warnings-regexp warning)
+ ;; The warnings matching `LaTeX-warnings-regexp' are
+ ;; emitted by \GenericWarning macro, or macros based
on
+ ;; it (\ClassWarning, \PackageWarning, etc). After
+ ;; such warnings there is an empty line, just look for
+ ;; it to find the end.
+ (beginning-of-line)
+ (while (null (eolp))
+ (forward-line 1))
+ (buffer-substring context-start (progn (end-of-line)
+ (point))))
+
+ ((and bad-box (string-match "\\\\vbox" warning))
+ ;; Vertical bad boxes don't provide any additional
+ ;; information. In this case, reuse the `warning' as
+ ;; `context' and don't move point, so that we avoid
+ ;; eating the next line that may contain another
+ ;; warning. See also comment for `context-start'.
+ (concat "\n" warning))
+
+ (t
+ ;; Horizontal bad boxes.
+ (forward-line 1)
+ (end-of-line)
+ (while (equal (current-column) 79)
+ (forward-line 1)
+ (end-of-line))
+ (buffer-substring context-start (point)))))
+
+ ;; This is where we want to be.
+ (error-point (point))
+
+ ;; Now find the error word.
+ (string (when (save-excursion
+ (re-search-backward word-string context-start t))
+ (TeX-match-buffer 1)))
+
+ ;; We might use these in another file.
+ (offset (or (car TeX-error-offset) 0))
+ (file (car TeX-error-file))
+ info-list ignore)
+
+ ;; Second chance to get line number right. If `line' is nil, check whether
+ ;; the reference to the line number is in `context'. For example, this is
+ ;; the case for warnings emitted with \ClassWarning and \PackageWarning.
+ ;; XXX: maybe it suffices to evaluate `line' after `context' above, but I
+ ;; don't know if there are cases in which it's important to get `line'
+ ;; before `context'.
+ (and (null line)
+ (string-match line-string context)
+ (setq line-end
+ (setq line (and (match-beginning 1)
+ (string-to-number (match-string 1 context))))))
+
+ ;; This is where we start next time.
+ (goto-char error-point)
+ (setq TeX-error-point (point))
+
+ ;; Explanation of what follows: we add the warning to `TeX-error-list' even
+ ;; if it has to be ignored, with a flag specifying whether it is ignored.
+ ;; We do so in order to be able to change between "ignore" and
"dont-ignore"
+ ;; behavior by just looking to the flag, without the need to reparse the
+ ;; output log.
+
+ ;; Store the list of information about the warning.
+ (setq info-list (list (if bad-box 'bad-box 'warning) file line warning
+ offset context string line-end bad-box
+ TeX-error-point)
+ ;; Decide whether it should be ignored.
+ ignore (and TeX-ignore-warnings
+ (cond
+ ((stringp TeX-ignore-warnings)
+ (string-match TeX-ignore-warnings warning))
+ ((fboundp TeX-ignore-warnings)
+ (apply TeX-ignore-warnings info-list))))
+ ;; Update `info-list'.
+ info-list (append info-list (list ignore)))
+
+ (if store
+ ;; Store the warning information.
+ (add-to-list 'TeX-error-list info-list t)
+ ;; Find the warning point and display the help.
+ (apply #'TeX-find-display-help info-list))))
+
+;;; Error Messages
+
+(defcustom TeX-error-description-list nil
+ "User defined help messages for errors in TeX run.
+See `TeX-error-description-list-local' for its format. All
+entries have higher priority than those in
+`TeX-error-description-list-local'.
+It must not have a fallback entry that matches any error."
+ :group 'TeX-output
+ :type '(repeat (cons :tag "Entry"
+ (regexp :tag "Match")
+ (string :format "Description:\n%v"))))
+
+(defvar TeX-error-description-list-local
+ '((".*" . "No help available"))
+ "Buffer local help messages for errors in TeX run.
+A list of the form (ERR-REGEXP . CONTEXT) used by function
+`TeX-help-error' to display help-text on an error message or warning.
+ERR-REGEXP should be a regular expression matching the error message
+given from TeX/LaTeX, and CONTEXT should be some lines describing that
+error.
+Major modes of AUCTeX can set its own catalogue as buffer local
+value of this variable, as LaTeX mode does.
+Style files of AUCTeX can also add their own entries to buffer local
+value of this variable to provide their own help messages.
+It must end with a fallback entry that matches any error, for example
+\(\".*\" . \"No help available\")")
+
+;;; - Help
+
+(defgroup TeX-error-description-faces nil
+ "Faces used in error descriptions."
+ :prefix "TeX-error-description-"
+ :group 'TeX-output)
+
+(defface TeX-error-description-error
+ ;; This is the same as `error' face in latest GNU Emacs versions.
+ '((((class color) (min-colors 88) (background light))
+ :foreground "Red1" :weight bold)
+ (((class color) (min-colors 88) (background dark))
+ :foreground "Pink" :weight bold)
+ (((class color) (min-colors 16) (background light))
+ :foreground "Red1" :weight bold)
+ (((class color) (min-colors 16) (background dark))
+ :foreground "Pink" :weight bold)
+ (((class color) (min-colors 8))
+ :foreground "red" :weight bold)
+ (t (:inverse-video t :weight bold)))
+ "Face for \"Error\" string in error descriptions.")
+
+(defface TeX-error-description-warning
+ ;; This is the same as `warning' face in latest GNU Emacs versions.
+ '((((class color) (min-colors 16)) :foreground "DarkOrange" :weight bold)
+ (((class color)) :foreground "yellow" :weight bold))
+ "Face for \"Warning\" string in error descriptions.")
+
+(defface TeX-error-description-tex-said
+ ;; This is the same as `font-lock-function-name-face' face in latest GNU
+ ;; Emacs versions.
+ '((((class color) (min-colors 88) (background light))
+ :foreground "Blue1")
+ (((class color) (min-colors 88) (background dark))
+ :foreground "LightSkyBlue")
+ (((class color) (min-colors 16) (background light))
+ :foreground "Blue")
+ (((class color) (min-colors 16) (background dark))
+ :foreground "LightSkyBlue")
+ (((class color) (min-colors 8))
+ :foreground "blue" :weight bold)
+ (t (:inverse-video t :weight bold)))
+ "Face for \"TeX said\" string in error descriptions.")
+
+(defface TeX-error-description-help
+ '((t (:inherit TeX-error-description-tex-said)))
+ "Face for \"Help\" string in error descriptions.")
+
+(defun TeX-help-error (error output runbuffer type)
+ "Print ERROR in context OUTPUT from RUNBUFFER in another window.
+TYPE is a symbol specifing if ERROR is a real error, a warning or
+a bad box."
+
+ (let ((old-buffer (current-buffer))
+ (log-file (with-current-buffer runbuffer
+ (with-current-buffer TeX-command-buffer
+ (expand-file-name (TeX-active-master "log")))))
+ (error-description-list
+ (append TeX-error-description-list
+ (buffer-local-value 'TeX-error-description-list-local
+ (buffer-local-value
+ 'TeX-command-buffer
+ runbuffer))))
+ (TeX-error-pointer 0))
+
+ ;; Find help text entry.
+ (while (not (string-match (car (nth TeX-error-pointer
+ error-description-list))
+ error))
+ (setq TeX-error-pointer (+ TeX-error-pointer 1)))
+
+ (TeX-pop-to-buffer (get-buffer-create "*TeX Help*") nil t)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (insert
+ (cond
+ ((equal type 'error)
+ (propertize "ERROR" 'font-lock-face 'TeX-error-description-error))
+ ((equal type 'warning)
+ (propertize "WARNING" 'font-lock-face 'TeX-error-description-warning))
+ ((equal type 'bad-box)
+ (propertize "BAD BOX" 'font-lock-face
'TeX-error-description-warning)))
+ ": " error
+ (propertize "\n\n--- TeX said ---" 'font-lock-face
+ 'TeX-error-description-tex-said)
+ output
+ (propertize "\n--- HELP ---\n" 'font-lock-face
+ 'TeX-error-description-help)
+ (let ((help (cdr (nth TeX-error-pointer
+ error-description-list))))
+ (save-excursion
+ (if (and (= (1+ TeX-error-pointer)
+ (length error-description-list))
+ (let* ((log-buffer (find-buffer-visiting log-file)))
+ (if log-buffer
+ (progn
+ (set-buffer log-buffer)
+ (revert-buffer t t))
+ (setq log-buffer
+ (find-file-noselect log-file))
+ (set-buffer log-buffer))
+ (auto-save-mode nil)
+ (setq buffer-read-only t)
+ (goto-char (point-min))
+ (search-forward error nil t 1))
+ (re-search-forward "^l\\." nil t)
+ (re-search-forward "^ [^\n]+$" nil t))
+ (let ((start (1+ (point))))
+ (forward-char 1)
+ (re-search-forward "^$")
+ (concat "From the .log file...\n\n"
+ (buffer-substring start (point))))
+ help)))))
+ (goto-char (point-min))
+ (TeX-special-mode)
+ (TeX-pop-to-buffer old-buffer nil t)))
+
+;;; Error Overview
+
+(defvar TeX-error-overview-active-buffer nil
+ "The active buffer for the current error overview.")
+
+(defvar TeX-error-overview-orig-frame nil
+ "Frame from which the error overview has been launched.")
+
+(defvar TeX-error-overview-orig-window nil
+ "Window from which the error overview has been launched.")
+
+(defcustom TeX-error-overview-setup nil
+ "The frame setup of the error overview.
+
+The possible value is: `separate-frame' (error oveview in a
+separate frame); with a nil value the current frame is used.
+
+If the display does not support multi frame, the current frame
+will be used regardless of the value of this variable."
+ :group 'TeX-output
+ :type '(choice
+ (const :tag "Error overview in separate frame" separate-frame)
+ (const :tag "Use current frame" nil)))
+
+(defun TeX-error-overview-setup ()
+ "Return the frame setup of the error overview for the current display."
+ (and (display-multi-frame-p) TeX-error-overview-setup))
+
+(defun TeX-error-overview-goto-source (&optional button)
+ "Go to the error point in the source.
+If optional argument BUTTON is non-nil, go to source associated
+to the selected error."
+ (interactive)
+ (let ((index (if button (button-get button 'id) (tabulated-list-get-id)))
+ item window)
+ (if index
+ (progn
+ ;; Select the source frame/window, if still live.
+ (if (TeX-error-overview-setup)
+ (if (frame-live-p TeX-error-overview-orig-frame)
+ (select-frame TeX-error-overview-orig-frame)
+ (error "You have deleted a vital frame---\
+please restart TeX error overview"))
+ (if (window-live-p TeX-error-overview-orig-window)
+ (select-window TeX-error-overview-orig-window)
+ (error "You have deleted a vital window---\
+please restart TeX error overview")))
+ ;; Get the error details.
+ (with-current-buffer TeX-error-overview-active-buffer
+ (setq item (nth index TeX-error-list)
+ TeX-error-last-visited index))
+ ;; Find the error and display the help.
+ (with-current-buffer TeX-command-buffer
+ ;; Find the error and display the help.
+ (apply #'TeX-find-display-help item))
+ ;; Return to the error overview.
+ (if (TeX-error-overview-setup)
+ (select-frame TeX-error-overview-frame)
+ (if (setq window
+ (get-buffer-window TeX-error-overview-buffer-name))
+ ;; If error overview window is visible just select it.
+ (select-window window)
+ ;; Otherwise, split the help window and display the error
overview
+ ;; near to it. This should be the only reason for the error
+ ;; overview window not being still visible after the beginning of
+ ;; the function.
+ (select-window
+ (get-buffer-window (cond
+ ((eq TeX-display-help 'expert)
+ TeX-error-overview-active-buffer)
+ (TeX-display-help "*TeX Help*"))))
+ (if (window-splittable-p (selected-window) t)
+ (split-window-horizontally)
+ (split-window-vertically))
+ (switch-to-buffer TeX-error-overview-buffer-name))))
+ (message "No more errors.")
+ (beep))))
+
+(defun TeX-error-overview-make-entries (&optional master-dir active-buffer)
+ "Generate the list of errors to be printed using `tabulated-list-entries'.
+Write file names relative to MASTER-DIR when they are not absolute.
+
+ACTIVE-BUFFER is used as buffer from which to extract the list of
+errors. If nil, defaults to `TeX-error-overview-active-buffer'."
+ (with-current-buffer (or active-buffer TeX-error-overview-active-buffer)
+ (let ((id 0)
+ type file line msg entries)
+ (mapc
+ (lambda (entry)
+ (setq type (nth 0 entry)
+ file (nth 1 entry)
+ line (nth 2 entry)
+ msg (nth 3 entry))
+ ;; Add the entry only if it isn't to be skipped.
+ (unless (TeX-error-list-skip-warning-p type (nth 10 entry))
+ (push
+ (list
+ ;; ID.
+ id
+ (vector
+ ;; File.
+ (if (stringp file)
+ (if (file-name-absolute-p file)
+ file
+ (file-relative-name file master-dir))
+ "")
+ ;; Line.
+ (if (numberp line)
+ (number-to-string line)
+ "")
+ ;; Type.
+ (cond
+ ((equal type 'error)
+ (propertize "Error" 'font-lock-face
'TeX-error-description-error))
+ ((equal type 'warning)
+ (propertize "Warning" 'font-lock-face
+ 'TeX-error-description-warning))
+ ((equal type 'bad-box)
+ (propertize "Bad box" 'font-lock-face
+ 'TeX-error-description-warning))
+ (t
+ ""))
+ ;; Message.
+ (list (if (stringp msg)
+ ;; Sometimes, the message can be longer than one line,
+ ;; but print here only the first one.
+ (progn
+ (string-match "^.*" msg)
+ (match-string 0 msg))
+ "")
+ 'face 'link
+ 'follow-link t
+ 'id id
+ 'action #'TeX-error-overview-goto-source)))
+ entries))
+ ;; Increase the `id' counter in any case.
+ (setq id (1+ id)))
+ TeX-error-list)
+ (reverse entries))))
+
+(defun TeX-error-overview-next-error (&optional arg)
+ "Move to the next line and find the associated error.
+
+A prefix ARG specifies how many error messages to move; negative
+means move back to previous error messages."
+ (interactive "p")
+ (if (= (forward-line arg) 0)
+ (TeX-error-overview-goto-source)
+ ;; If there are lines left to move we are at the beginning or at the end of
+ ;; the buffer and there are no more errors.
+ (message "No more errors.")
+ (beep)))
+
+(defun TeX-error-overview-previous-error (&optional arg)
+ "Move to the previous line and find the associated error.
+
+Prefix ARG says how many error messages to move backward (or
+forward, if negative)."
+ (interactive "p")
+ (TeX-error-overview-next-error (- arg)))
+
+(defun TeX-error-overview-jump-to-source ()
+ "Display the help and move point to the error source."
+ (interactive)
+ (TeX-error-overview-goto-source)
+ (pop-to-buffer
+ (save-window-excursion
+ (select-window TeX-error-overview-orig-window)
+ (current-buffer))))
+
+(defun TeX-error-overview-goto-log ()
+ "Display the current error in log buffer."
+ (interactive)
+ (let ((TeX-display-help 'expert))
+ (TeX-error-overview-goto-source)))
+
+(defun TeX-error-overview-toggle-debug-bad-boxes ()
+ "Run `TeX-toggle-debug-bad-boxes' and update entries list."
+ (interactive)
+ (TeX-toggle-debug-bad-boxes)
+ (setq tabulated-list-entries
+ (TeX-error-overview-make-entries
+ (with-current-buffer TeX-command-buffer (TeX-master-directory))))
+ (tabulated-list-init-header)
+ (tabulated-list-print))
+
+(defun TeX-error-overview-toggle-debug-warnings ()
+ "Run `TeX-toggle-debug-warnings' and update entries list."
+ (interactive)
+ (TeX-toggle-debug-warnings)
+ (setq tabulated-list-entries
+ (TeX-error-overview-make-entries
+ (with-current-buffer TeX-command-buffer (TeX-master-directory))))
+ (tabulated-list-init-header)
+ (tabulated-list-print))
+
+(defun TeX-error-overview-toggle-suppress-ignored-warnings ()
+ "Toggle visibility of ignored warnings and update entries list."
+ (interactive)
+ (TeX-toggle-suppress-ignored-warnings)
+ (setq tabulated-list-entries
+ (TeX-error-overview-make-entries
+ (with-current-buffer TeX-command-buffer (TeX-master-directory))))
+ (tabulated-list-init-header)
+ (tabulated-list-print))
+
+(defun TeX-error-overview-quit ()
+ "Delete the window or the frame of the error overview."
+ (interactive)
+ (if (TeX-error-overview-setup)
+ (delete-frame TeX-error-overview-frame)
+ (delete-window))
+ (setq TeX-error-overview-orig-frame nil))
+
+(defvar TeX-error-overview-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "b" #'TeX-error-overview-toggle-debug-bad-boxes)
+ (define-key map "j" #'TeX-error-overview-jump-to-source)
+ (define-key map "l" #'TeX-error-overview-goto-log)
+ (define-key map "n" #'TeX-error-overview-next-error)
+ (define-key map "p" #'TeX-error-overview-previous-error)
+ (define-key map "q" #'TeX-error-overview-quit)
+ (define-key map "w" #'TeX-error-overview-toggle-debug-warnings)
+ (define-key map "x"
#'TeX-error-overview-toggle-suppress-ignored-warnings)
+ (define-key map "\C-m" #'TeX-error-overview-goto-source)
+ map)
+ "Local keymap for `TeX-error-overview-mode' buffers.")
+
+(easy-menu-define TeX-error-overview-menu
+ TeX-error-overview-mode-map
+ "Menu used in TeX error overview mode."
+ '("TeX errors"
+ ["Next error" TeX-error-overview-next-error
+ :help "Jump to the next error"]
+ ["Previous error" TeX-error-overview-previous-error
+ :help "Jump to the previous error"]
+ ["Go to source" TeX-error-overview-goto-source
+ :help "Show the error in the source"]
+ ["Jump to source" TeX-error-overview-jump-to-source
+ :help "Move point to the error in the source"]
+ ["Go to log" TeX-error-overview-goto-log
+ :help "Show the error in the log buffer"]
+ "-"
+ ["Debug Bad Boxes" TeX-error-overview-toggle-debug-bad-boxes
+ :style toggle :selected TeX-debug-bad-boxes
+ :help "Show overfull and underfull boxes"]
+ ["Debug Warnings" TeX-error-overview-toggle-debug-warnings
+ :style toggle :selected TeX-debug-warnings
+ :help "Show warnings"]
+ ["Ignore Unimportant Warnings"
+ TeX-error-overview-toggle-suppress-ignored-warnings
+ :style toggle :selected TeX-suppress-ignored-warnings
+ :help "Hide specified warnings"]
+ "-"
+ ["Quit" TeX-error-overview-quit
+ :help "Quit"]))
+
+(defvar TeX-error-overview-list-entries nil
+ "List of errors to be used in the error overview.")
+
+(define-derived-mode TeX-error-overview-mode tabulated-list-mode
+ "TeX errors"
+ "Major mode for listing TeX errors."
+ (setq tabulated-list-format [("File" 25 nil)
+ ("Line" 4 nil :right-align t)
+ ("Type" 7 nil)
+ ("Message" 0 nil)]
+ tabulated-list-padding 1
+ tabulated-list-entries TeX-error-overview-list-entries)
+ (tabulated-list-init-header)
+ (tabulated-list-print))
+
+(defcustom TeX-error-overview-frame-parameters
+ '((name . "TeX errors")
+ (title . "TeX errors")
+ (height . 10)
+ (width . 80)
+ (top . (- 0))
+ (left . (- 0))
+ (unsplittable . t)
+ (minibuffer . nil)
+ (vertical-scroll-bars . t)
+ (tool-bar-lines . 0))
+ "Parameters of the error overview frame."
+ :group 'TeX-output
+ :type 'alist
+ :options '((name string) (title string) (height integer) (width integer)
+ (top integer) (left integer) (unsplittable boolean)
+ (minibuffer boolean) (vertical-scroll-bars boolean)
+ (tool-bar-lines integer)))
+
+(defcustom TeX-error-overview-open-after-TeX-run nil
+ "Whether to open automatically the error overview after running TeX."
+ :group 'TeX-output
+ :type 'boolean)
+
+(defun TeX-error-overview ()
+ "Show an overview of the errors occurred in the last TeX run."
+ (interactive)
+ ;; Check requirements before start.
+ (if (setq TeX-error-overview-active-buffer (TeX-active-buffer))
+ ;; `TeX-error-overview-list-entries' is going to be used only as value
+ ;; of `tabulated-list-entries' in `TeX-error-overview-mode'. In
+ ;; principle, we don't need `TeX-error-overview-list-entries', but
+ ;; `tabulated-list-entries' is buffer-local and we need the list of
+ ;; entries before creating the error overview buffer in order to
+ ;; decide whether we need to show anything.
+ (if (setq TeX-error-overview-list-entries
+ (TeX-error-overview-make-entries
+ (TeX-master-directory)))
+ (progn
+ (setq TeX-error-overview-orig-window (selected-window)
+ TeX-error-overview-orig-frame
+ (window-frame TeX-error-overview-orig-window))
+ ;; Create the error overview buffer. This is
+ ;; automatically killed before running TeX commands, so if
+ ;; exists it is up-to-date and doesn't need to be
+ ;; re-created.
+ (unless (get-buffer TeX-error-overview-buffer-name)
+ (with-current-buffer
+ (get-buffer-create TeX-error-overview-buffer-name)
+ (TeX-error-overview-mode)))
+ ;; Move point to the line associated to the last visited
+ ;; error.
+ (with-current-buffer TeX-error-overview-buffer-name
+ (goto-char (point-min))
+ (forward-line (with-current-buffer
+ TeX-error-overview-active-buffer
+ TeX-error-last-visited))
+ ;; Create a new frame for the error overview or display the
+ ;; buffer in the same frame, depending on the setup.
+ (if (TeX-error-overview-setup)
+ (if (frame-live-p TeX-error-overview-frame)
+ ;; Do not create a duplicate frame if there is
+ ;; already one, just select it.
+ (select-frame-set-input-focus
+ TeX-error-overview-frame)
+ ;; Create a new frame and store its name.
+ (select-frame
+ (setq TeX-error-overview-frame
+ (make-frame
+ TeX-error-overview-frame-parameters)))
+ (set-window-buffer (selected-window)
+ TeX-error-overview-buffer-name)
+ (set-window-dedicated-p (selected-window) t))
+ (TeX-pop-to-buffer TeX-error-overview-buffer-name))))
+ (error (concat "No error or warning to show"
+ ;; Suggest to display warnings and bad boxes with the
+ ;; appropriate key-bindings if there are such
+ ;; messages in the output buffer. Rationale of the
+ ;; test: `TeX-error-overview-list-entries' is nil,
+ ;; but if `TeX-error-list' is not nil it means that
+ ;; there are hidden warnings/bad boxes.
+ (when (TeX-process-get-variable (TeX-active-master)
+ 'TeX-error-list)
+ (format ". Type `%s' and `%s' to display \
+warnings and bad boxes"
+ (substitute-command-keys
+
"\\<TeX-mode-map>\\[TeX-toggle-debug-warnings]")
+ (substitute-command-keys
+
"\\<TeX-mode-map>\\[TeX-toggle-debug-bad-boxes]"))))))
+ (error "No process for this document")))
+
+;;; Output mode
+
+(define-derived-mode TeX-special-mode special-mode "TeX")
+
+(defvar TeX-output-mode-map
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map TeX-special-mode-map)
+ (define-key map "n" #'TeX-next-error)
+ (define-key map "p" #'TeX-previous-error)
+ (define-key map "b" #'TeX-toggle-debug-bad-boxes)
+ (define-key map "w" #'TeX-toggle-debug-warnings)
+ (define-key map "i" (lambda ()
+ (interactive)
+ (with-current-buffer TeX-command-buffer
+ (TeX-interactive-mode (if TeX-interactive-mode -1
1)))))
+ (define-key map "s" (lambda ()
+ (interactive)
+ (with-current-buffer TeX-command-buffer
+ (TeX-source-correlate-mode (if
TeX-source-correlate-mode -1 1)))))
+ map)
+ "Keymap for `TeX-output-mode'.")
+
+(define-derived-mode TeX-output-mode TeX-special-mode "TeX Output"
+ "Major mode for viewing TeX output.
+\\{TeX-output-mode-map} "
+ :syntax-table nil
+ (set (make-local-variable 'revert-buffer-function)
+ #'TeX-output-revert-buffer)
+ ;; special-mode makes it read-only which prevents input from TeX.
+ (setq buffer-read-only nil))
+
+(defun TeX-output-revert-buffer (_ignore-auto _noconfirm)
+ "Rerun the TeX command which of which this buffer was the output."
+ (goto-char (point-min))
+ (if (looking-at "Running `\\(.*\\)' on `\\(.*\\)' with ``\\(.*\\)''$")
+ (let ((name (match-string 1))
+ (file (match-string 2)))
+ (with-current-buffer TeX-command-buffer
+ (TeX-command name (if (string-match TeX-region file)
+ #'TeX-region-file
+ #'TeX-master-file))))
+ (error "Unable to find what command to run")))
+
(provide 'tex)
;; Local Variables:
- [elpa] externals/auctex f686fbca6d 16/60: Add new test, (continued)
- [elpa] externals/auctex f686fbca6d 16/60: Add new test, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 4e4c48556b 08/60: ; Trivial cleanup, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 1bc2630275 20/60: Don't change syntax of ^^A comments in doctex mode (bug#35140), Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 36655f6a5e 24/60: Revert "Fix simultaneity", Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 3df1e313ea 25/60: Adapt TeX-region-hook for lexical-binding, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex fa8842c626 26/60: Recognize macrocode*? environments in doctex-mode, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 806100f29a 27/60: Delete obsoleted variables (bug#54339), Tassilo Horn, 2022/04/08
- [elpa] externals/auctex b1a0d5df74 36/60: ; * style/algpseudocode.el: Fix position of TeX-dialect., Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 494d501e63 43/60: Adjust indenting of conditionals in styles, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 8e7d19fe84 44/60: Make tex-buf.el compile without (require 'latex), Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 4b1c7015ae 45/60: Move contents of tex-buf.el into tex.el,
Tassilo Horn <=
- [elpa] externals/auctex 7e6d83ff4e 47/60: Add news, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 45aff50ff3 48/60: Support \mathcolor in style/x?color.el, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 180cc28dfa 50/60: Apply remaining portion of Stefan's patch, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex e1c3e37e0c 56/60: ; Update copyright year, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex e83ca6a072 57/60: Update style/doc.el to package version 3.0h, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 5cf46ff8e2 52/60: Improve parsing of re-definitions, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex fd118c67d4 58/60: ; * style/doc.el (LaTeX-env-doc-no-comment): Fix docstring., Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 323eb08ca6 46/60: Assign reasonable sentinel in AmS-TeX mode, Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 5d2829aed4 49/60: Remove old defadvices (patch by Stefan Monnier), Tassilo Horn, 2022/04/08
- [elpa] externals/auctex 69b78fcc26 54/60: Don't change indentation when defining a conditional, Tassilo Horn, 2022/04/08