branch: externals/auctex commit 464e1b4d07010cc65d78e52d81e85cfd454c1fc4 Author: Arash Esbati <ar...@gnu.org> Commit: Arash Esbati <ar...@gnu.org>
Fix style/xltabular.el * style/xltabular.el (LaTeX-xltabular-skipping-regexp): New variable. (LaTeX-env-xltabular): (LaTeX-item-xltabular): New function. ("xltabular"): Use the above functions in the style hook. --- style/xltabular.el | 76 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 6 deletions(-) diff --git a/style/xltabular.el b/style/xltabular.el index e78b4e9..af34313 100644 --- a/style/xltabular.el +++ b/style/xltabular.el @@ -29,27 +29,91 @@ ;; This file adds support for `xltabular.sty' (v0.05) from 2017/10/26. ;; `xltabular.sty' is part of TeXLive. +(defvar LaTeX-xltabular-skipping-regexp + (concat "[ \t]*" (regexp-opt '("[l]" "[r]" "[c]" "")) "[ \t]*{[^}]*}[ \t]*") + "Regexp matching between \\begin{xltabular} and column specification. +For xltabular environment only. See `LaTeX-insert-ampersands' for detail. + +This regexp assumes that the width specification contains neither +nested curly brace pair nor escaped \"}\".") + +(defun LaTeX-env-xltabular (environment) + "Insert a xltabular ENVIRONMENT with spec, caption and label." + ;; xltabular has the following syntax: + ;; \begin{xltabular}[hPos]{width}{ l X ...} + ;; Optional <hPos> comes before <width>, hence we cannot use + ;; `LaTeX-env-tabular*' here and has to cook our own function which + ;; is a combination of `LaTeX-env-tabular*' and + ;; `LaTeX-env-longtable': + (let* ((pos (completing-read (TeX-argument-prompt t nil "Position") + '("l" "r" "c"))) + (width (TeX-read-string "Width: " LaTeX-default-width)) + (fmt (TeX-read-string "Format: " LaTeX-default-format)) + (caption (TeX-read-string "Caption: ")) + (short-caption (when (>= (length caption) LaTeX-short-caption-prompt-length) + (TeX-read-string "(Optional) Short caption: ")))) + (setq LaTeX-default-format fmt) + (LaTeX-insert-environment environment + (concat + (unless (zerop (length pos)) + (concat LaTeX-optop pos LaTeX-optcl)) + (concat TeX-grop width TeX-grcl) + (concat TeX-grop fmt TeX-grcl))) + ;; top caption -- do nothing if user skips caption + (unless (zerop (length caption)) + ;; insert `\caption[short-caption]{caption': + (insert TeX-esc "caption") + (when (and short-caption (not (string= short-caption ""))) + (insert LaTeX-optop short-caption LaTeX-optcl)) + (insert TeX-grop caption) + ;; ask for a label and insert it + (LaTeX-label environment 'environment) + ;; the longtable `\caption' is equivalent to a + ;; `\multicolumn', so it needs a `\\' at the + ;; end of the line. Prior to that, add } to + ;; close `\caption{' + (insert TeX-grcl "\\\\") + ;; fill the caption + (LaTeX-fill-paragraph) + ;; Insert a new line and indent + (LaTeX-newline) + (indent-according-to-mode)) + ;; Insert suitable number of &'s, suppress line break + (LaTeX-item-xltabular t))) + +(defun LaTeX-item-xltabular (&optional suppress) + "Insert line break macro on the last line and suitable number of &'s. +For xltabular environment only. + +If SUPPRESS is non-nil, do not insert line break macro." + (unless suppress + (save-excursion + (end-of-line 0) + (just-one-space) + (TeX-insert-macro "\\"))) + (LaTeX-insert-ampersands + LaTeX-xltabular-skipping-regexp #'LaTeX-array-count-columns)) + (TeX-add-style-hook "xltabular" (lambda () ;; ltablex loads both tabularx and longtable (TeX-run-style-hooks "ltablex") - ;; `LaTeX-env-longtable' is provided by `longtable.el': - (LaTeX-add-environments - '("xltabular" LaTeX-env-longtable)) + ;; Add xltabular with `LaTeX-env-xltabular':: + (LaTeX-add-environments '("xltabular" LaTeX-env-xltabular)) ;; Use the enhanced table formatting. Append to ;; `LaTeX-indent-environment-list' in order not to override custom settings. - (add-to-list (make-variable-buffer-local 'LaTeX-indent-environment-list) + (add-to-list (make-local-variable 'LaTeX-indent-environment-list) '("xltabular" LaTeX-indent-tabular) t) ;; Append xltabular to `LaTeX-label-alist', in order not to ;; override possible custome values. (add-to-list 'LaTeX-label-alist '("xltabular" . LaTeX-table-label) t) - ;; Append xltabular to `LaTeX-item-list' with `LaTeX-item-longtable' - (add-to-list 'LaTeX-item-list '("xltabular" . LaTeX-item-longtable) t) + ;; Append xltabular to `LaTeX-item-list' with `LaTeX-item-xltabular' + (add-to-list 'LaTeX-item-list '("xltabular" . LaTeX-item-xltabular) t) ;; Tell RefTeX -- This is the same entry as for "longtable" in ;; `reftex-label-alist-builtin':