From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: [RFC] Turn \[...\] constructs into full-fledged elements Date: Sat, 09 May 2015 11:50:33 +0200 Message-ID: <873836xeom.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:51282) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yr1Nf-0002zm-Nh for emacs-orgmode@gnu.org; Sat, 09 May 2015 05:49:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yr1Nd-0000mY-Un for emacs-orgmode@gnu.org; Sat, 09 May 2015 05:49:11 -0400 Received: from relay3-d.mail.gandi.net ([2001:4b98:c:538::195]:47376) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yr1Nd-0000mU-L0 for emacs-orgmode@gnu.org; Sat, 09 May 2015 05:49:09 -0400 Received: from selenimh (unknown [IPv6:2a01:6600:8080:9601::2de]) (Authenticated sender: mail@nicolasgoaziou.fr) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 2D7C8A80AC for ; Sat, 9 May 2015 11:49:07 +0200 (CEST) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode List --=-=-= Content-Type: text/plain Hello, I wasn't initially for such a change, but the more I think about it the more I think it makes sense. The point is to make \[...\] an element, which means that: - it cannot be inlined anymore, i.e., it has to start on a new line, - it cannot be filled anymore. So basically, \[...\] will be closer to LaTeX definition. WDYT? Regards, -- Nicolas Goaziou 0x80A93738 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Make-.-an-element-instead-of-an-object.patch >From 8dba4429684684ce29ce2a984a075550313b7027 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sat, 9 May 2015 11:29:48 +0200 Subject: [PATCH] Make \[...\] an element instead of an object * lisp/org-element.el (org-element--set-regexps): Update regexp. (org-element--latex-begin-environment): (org-element--latex-end-environment): Remove variable. Change it into a function. (org-element-latex-environment-parser): (org-element-paragraph-parser): Use function. (org-element-latex-fragment-parser): Remove \[...\] constructs. * lisp/org.el (org-latex-regexps): Update regexp for \[...\]. * testing/lisp/test-org-element.el (test-org-element/latex-environment-parser): Add a test. (test-org-element/latex-fragment-parser): Remove a test. With this change \[...\] are considered elements and cannot be inlined anymore. As a consequence, they will not be filled anymore and stop paragraphs. However such inline constructs are no longer recognized. --- lisp/org-element.el | 40 +++++++++++++++++++--------------------- lisp/org.el | 2 +- testing/lisp/test-org-element.el | 12 +++++++----- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 9037b37..31af3bc 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -172,7 +172,7 @@ specially in `org-element--object-lex'.") ;; Horizontal rules. "-\\{5,\\}[ \t]*$" "\\|" ;; LaTeX environments. - "\\\\begin{\\([A-Za-z0-9*]+\\)}" "\\|" + "\\\\\\(begin{\\([A-Za-z0-9*]+\\)}\\|\\[\\)" "\\|" ;; Clock lines. (regexp-quote org-clock-string) "\\|" ;; Lists. @@ -2122,16 +2122,17 @@ CONTENTS is nil." ;;;; Latex Environment (defconst org-element--latex-begin-environment - "^[ \t]*\\\\begin{\\([A-Za-z0-9*]+\\)}" + "^[ \t]*\\\\\\(?:begin{\\([A-Za-z0-9*]+\\)}\\|\\[\\)" "Regexp matching the beginning of a LaTeX environment. -The environment is captured by the first group. +The environment is captured by the first group. See also +`org-element--latex-end-environment'.") -See also `org-element--latex-end-environment'.") - -(defconst org-element--latex-end-environment - "\\\\end{%s}[ \t]*$" - "Format string matching the ending of a LaTeX environment. -See also `org-element--latex-begin-environment'.") +(defun org-element--latex-end-environment (environment) + "Build regexp matching the end of a LaTeX environment. +See also `org-element--latex-begin-environment'." + (if environment + (format "\\\\end{%s}[ \t]*$" (regexp-quote environment)) + "\\][ \t]*$")) (defun org-element-latex-environment-parser (limit affiliated) "Parse a LaTeX environment. @@ -2150,9 +2151,8 @@ Assume point is at the beginning of the latex environment." (let ((case-fold-search t) (code-begin (point))) (looking-at org-element--latex-begin-environment) - (if (not (re-search-forward (format org-element--latex-end-environment - (regexp-quote (match-string 1))) - limit t)) + (if (not (re-search-forward + (org-element--latex-end-environment (match-string 1)) limit t)) ;; Incomplete latex environment: parse it as a paragraph. (org-element-paragraph-parser limit affiliated) (let* ((code-end (progn (forward-line) (point))) @@ -2254,8 +2254,7 @@ Assume point is at the beginning of the paragraph." ((looking-at org-element--latex-begin-environment) (save-excursion (re-search-forward - (format org-element--latex-end-environment - (regexp-quote (match-string 1))) + (org-element--latex-end-environment (match-string 1)) limit t))) ((looking-at "[ \t]*#\\+\\(\\S-+\\)\\[.*\\]:") (member-ignore-case (match-string 1) @@ -2961,13 +2960,12 @@ Assume point is at the beginning of the LaTeX fragment." '(?\s ?\t ?\n ?, ?.))) (looking-at "\\(\\s.\\|\\s-\\|\\s(\\|\\s)\\|\\s\"\\|$\\)") (point))) - (case (char-after (1+ (point))) - (?\( (search-forward "\\)" nil t)) - (?\[ (search-forward "\\]" nil t)) - (otherwise - ;; Macro. - (and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*") - (match-end 0)))))) + (if (eq (char-after (1+ (point))) ?\() + (search-forward "\\)" nil t) + ;; Macro. + (and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\ +\\|\\({[^{}\n]*}\\)\\)*") + (match-end 0))))) (post-blank (if (not after-fragment) (throw 'no-object nil) (goto-char after-fragment) (skip-chars-forward " \t"))) diff --git a/lisp/org.el b/lisp/org.el index ac9d06d..1fbc8c9 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -543,7 +543,7 @@ An entry can be toggled between COMMENT and normal with ("$1" "\\([^$]\\|^\\)\\(\\$[^ \r\n,;.$]\\$\\)\\(\\s.\\|\\s-\\|\\s(\\|\\s)\\|\\s\"\\|\000\\|$\\)" 2 nil) ("$" "\\([^$]\\|^\\)\\(\\(\\$\\([^ \r\n,;.$][^$\n\r]*?\\(\n[^$\n\r]*?\\)\\{0,2\\}[^ \r\n,.$]\\)\\$\\)\\)\\(\\s.\\|\\s-\\|\\s(\\|\\s)\\|\\s\"\\|\000\\|$\\)" 2 nil) ("\\(" "\\\\([^\000]*?\\\\)" 0 nil) - ("\\[" "\\\\\\[[^\000]*?\\\\\\]" 0 nil) + ("\\[" "^[ \t]*\\\\\\[[^\000]*?\\\\\\][ \t]*$" 0 nil) ("$$" "\\$\\$[^\000]*?\\$\\$" 0 nil)) "Regular expressions for matching embedded LaTeX.") diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index d7eb8e4..a0ac8e6 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -1375,9 +1375,15 @@ Paragraph" (ert-deftest test-org-element/latex-environment-parser () "Test `latex-environment' parser." + ;; Standard test. (should (org-test-with-temp-text "\\begin{equation}\ne^{i\\pi}+1=0\n\\end{equation}" (org-element-map (org-element-parse-buffer) 'latex-environment 'identity))) + ;; Allow shorthand for "equation*" environment. + (should + (eq 'latex-environment + (org-test-with-temp-text "\\[e^{i\\pi}+1=0\n\\]" + (org-element-type (org-element-at-point))))) ;; Allow nested environments. (should (equal @@ -1420,7 +1426,7 @@ e^{i\\pi}+1=0 (should-not (eq 'latex-environment (org-test-with-temp-text "\\begin{env*}{arg}something\\end{env}" - (org-element-type (org-element-at-point))))) + (org-element-type (org-element-at-point))))) ;; LaTeX environments must be on separate lines. (should-not (eq 'latex-environment @@ -1476,10 +1482,6 @@ e^{i\\pi}+1=0 (eq 'latex-fragment (org-test-with-temp-text "\\(a\\)" (org-element-type (org-element-context))))) - (should - (eq 'latex-fragment - (org-test-with-temp-text "\\[a\\]" - (org-element-type (org-element-context))))) ;; Test fragment at the beginning of an item. (should (eq 'latex-fragment -- 2.4.0 --=-=-=--