Thanks Ikuya, good catch! Please find attached the updated patch. Paul
>From c5c70ca6e9b0f6e48429476792da877cd605a920 Mon Sep 17 00:00:00 2001 From: Paul Nelson <ultr...@gmail.com> Date: Thu, 29 May 2025 11:14:11 +0200 Subject: [PATCH] Add LaTeX-make-inline command
* latex.el (LaTeX-make-inline): New command. (LaTeX--make-inline-finalize-region): New helper function. * tests/latex/latex-make-inline-test.el: New test file. (latex-make-inline-test--with-temp-buffer): New test macro. (LaTeX-make-inline-bracket-period) (LaTeX-make-inline-double-dollar) (LaTeX-make-inline-electric-math, LaTeX-make-inline-equation-env) (LaTeX-make-inline-noop): New test cases. * doc/auctex.texi (Quotes): Document LaTeX-make-inline. --- doc/auctex.texi | 10 ++++ latex.el | 82 +++++++++++++++++++++++++++ tests/latex/latex-make-inline-test.el | 79 ++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 tests/latex/latex-make-inline-test.el diff --git a/doc/auctex.texi b/doc/auctex.texi index 0b486c8c..9602c062 100644 --- a/doc/auctex.texi +++ b/doc/auctex.texi @@ -484,6 +484,16 @@ to prevent unmatched dollar. Note that Texinfo mode does nothing special for @kbd{$}. It inserts dollar sign(s) just in the same way as the other normal keys do. +@AUCTeX{} provides the command @code{LaTeX-make-inline} which converts the +display math environment at point to inline math. + +@deffn Command LaTeX-make-inline +Convert @LaTeX{} display math environment at point to inline math. This +command replaces the enclosing math environment such as @samp{\[...\]} or +@samp{\begin@{equation@}...\end@{equation@}} with the value of +@code{TeX-electric-math} or @samp{$...$} by default. +@end deffn + @subheading Braces To avoid unbalanced braces, it is useful to insert them pairwise. You diff --git a/latex.el b/latex.el index 797513f2..c305fa3a 100644 --- a/latex.el +++ b/latex.el @@ -9551,6 +9551,88 @@ no caption key is found, an error is issued. See also the docstring of "LARGE" "huge" "Huge") "List of LaTeX font size declarations.") +(defun LaTeX-make-inline () + "Convert LaTeX display math environment at point to inline math. +Remove the enclosing math environment (such as \\\\=[...\\\\=] or +\\begin{equation}...\\end{equation}) and replace it with inline math +surrounded by `TeX-electric-math' if non-nil, or \"$...$\", fitting the +result onto one line. Finally, leave any trailing punctuation outside +the math delimiters." + (interactive) + (when (texmathp) + (when (fboundp 'preview-clearout-at-point) + (preview-clearout-at-point)) + (save-excursion + (let ((env (car texmathp-why)) + (pos (cdr texmathp-why)) + (delims (or TeX-electric-math '("$" . "$")))) + (cond + ((member env '("\\(" "$"))) + ((member env '("\\[" "$$")) + (goto-char pos) + (when (looking-back "\n[[:space:]]*") + (forward-char 2) + (save-excursion (join-line)) + (forward-char -2)) + (delete-char 2) + (let ((start (point)) + (end-delim (if (equal env "\\[") "\\]" "$$"))) + (search-forward end-delim) + (delete-char -2) + (if (looking-back "\n[[:space:]]*") + (goto-char (match-beginning 0))) + (LaTeX--make-inline-finalize-region start (point) delims))) + (t + (goto-char pos) + (kill-whole-line) + (let ((start (point))) + (search-forward (concat "\\end{" env "}")) + (beginning-of-line) + (kill-whole-line) + (backward-char) + (LaTeX--make-inline-finalize-region start (point) delims)))))))) + +(defun LaTeX--make-inline-finalize-region (start end delims) + "Finalize the inline conversion from START to END using DELIMS." + (save-restriction + (narrow-to-region start end) + + (goto-char (point-min)) + (let ((re (concat "\\(?:" + (if (bound-and-true-p reftex-label-regexps) + (mapconcat #'identity reftex-label-regexps "\\|") + "\\\\label{[^}]*}") + "\\)"))) + (while (re-search-forward re nil t) + (replace-match ""))) + + (goto-char (point-min)) + (while (looking-at "\\s-*$") + (delete-line)) + (beginning-of-line-text) + (delete-region (point-min) (point)) + + (goto-char (point-max)) + (while (and (> (point) (point-min)) + (progn (forward-line -1) + (looking-at "\\s-*$"))) + (delete-line)) + (end-of-line) + (skip-chars-backward " \t") + (delete-region (point) (point-max)) + + (goto-char (point-min)) + (insert (car delims)) + (goto-char (point-max)) + + (while (looking-back "[.,;:!?]" (max (point-min) (- (point) 5))) + (backward-char)) + (insert (cdr delims)) + + (while (> (count-lines (point-min) (point-max)) 1) + (join-line))) + (join-line)) + (provide 'latex) ;;; latex.el ends here diff --git a/tests/latex/latex-make-inline-test.el b/tests/latex/latex-make-inline-test.el new file mode 100644 index 00000000..f4dbadf0 --- /dev/null +++ b/tests/latex/latex-make-inline-test.el @@ -0,0 +1,79 @@ +;;; latex-make-inline-test.el --- tests for LaTeX-make-inline -*- lexical-binding: t; -*- + +;; Copyright (C) 2025 Free Software Foundation, Inc. + +;; 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. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(require 'latex) + +(defmacro latex-make-inline-test--with-temp-buffer (contents &rest body) + (declare (indent 1) (debug t)) + `(with-temp-buffer + (LaTeX-mode) + (insert ,contents) + (goto-char (point-min)) + (cl-letf (((symbol-function 'preview-clearout-at-point) #'ignore)) + ,@body))) + +(ert-deftest LaTeX-make-inline-bracket-period () + "Convert \\[..\\] to $..$ and keep trailing period." + (latex-make-inline-test--with-temp-buffer + "We have\n\\[ a+b = c. \\]" + (search-forward "b") + (LaTeX-make-inline) + (should (equal (buffer-string) "We have $a+b = c$.")))) + +(ert-deftest LaTeX-make-inline-double-dollar () + "Convert $$..$$ to $..$." + (latex-make-inline-test--with-temp-buffer + "$$x!$$" + (search-forward "x") + (LaTeX-make-inline) + (should (equal (buffer-string) "$x$!")))) + +(ert-deftest LaTeX-make-inline-electric-math () + "Respect `TeX-electric-math'." + (let ((TeX-electric-math '("\\(" . "\\)"))) + (latex-make-inline-test--with-temp-buffer + "\\[ x \\]" + (search-forward "x") + (LaTeX-make-inline) + (should (equal (buffer-string) "\\(x\\)"))))) + +(ert-deftest LaTeX-make-inline-equation-env () + "Convert equation environment, drop \\label, keep comma." + (latex-make-inline-test--with-temp-buffer + "\\begin{equation}\n\\label{l}x+y,\n\\end{equation}\n" + (search-forward "x") + (let ((TeX-electric-math '("\\(" . "\\)"))) + (LaTeX-make-inline) + (should (equal (buffer-string) "\\(x+y\\),\n"))))) + +(ert-deftest LaTeX-make-inline-noop () + "Call inside inline math leaves buffer unchanged." + (latex-make-inline-test--with-temp-buffer + "Already $z$ inline." + (search-forward "z") + (LaTeX-make-inline) + (should (equal (buffer-string) "Already $z$ inline.")))) + +;;; latex-make-inline-test.el ends here -- 2.39.3 (Apple Git-145)
_______________________________________________ bug-auctex mailing list bug-auctex@gnu.org https://lists.gnu.org/mailman/listinfo/bug-auctex