>From 946eb109ac581fc25a67af4c57afb35a09d25c18 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sat, 9 May 2015 11:29:48 +0200 Subject: [PATCH] Make \[...\] and $$...$$ elements instead of objects * 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 \[...\] and $$...$$ constructs. * lisp/org.el (org-latex-regexps): * lisp/ox-latex.el (org-latex--wrap-latex-math-block): Propagate changes. * testing/lisp/test-org-element.el (test-org-element/latex-environment-parser): Add a test. (test-org-element/latex-fragment-parser): Update test. With this change \[...\] and $$...$$ are considered elements and cannot be inlined anymore. As a consequence, they will not be filled anymore but will stop paragraphs. --- lisp/org-element.el | 58 +++++++++++++++++++--------------------- lisp/org.el | 4 +-- lisp/ox-latex.el | 2 +- testing/lisp/test-org-element.el | 27 ++++++++++++++----- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index d6695c8..24ca339 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -173,7 +173,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. @@ -216,7 +216,7 @@ specially in `org-element--object-lex'.") ;; Objects starting with "$": latex fragment. "\\$" ;; Objects starting with "\": line break, - ;; entity, latex fragment. + ;; entity. "\\\\\\(?:[a-zA-Z[(]\\|\\\\[ \t]*$\\|_ +\\)" ;; Objects starting with raw text: inline Babel ;; source block, inline Babel call. @@ -2112,16 +2112,19 @@ containing `:key', `:value', `:begin', `:end', `:post-blank' and ;;;; 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. - -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'.") +The environment is captured by the first group. See also +`org-element--latex-end-environment'.") + +(defun org-element--latex-end-environment (environment) + "Build regexp matching the end of a LaTeX environment. +See also `org-element--latex-begin-environment'." + (concat (pcase environment + ("$$" "\\$\\$") + ("\\[" "\\]") + (e (format "\\\\end{%s}" (regexp-quote (substring e 7 -1))))) + "[ \t]*$")) (defun org-element-latex-environment-parser (limit affiliated) "Parse a LaTeX environment. @@ -2140,9 +2143,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))) @@ -2242,8 +2244,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) @@ -2928,22 +2929,17 @@ Assume point is at the beginning of the LaTeX fragment." (let* ((begin (point)) (after-fragment (if (eq (char-after) ?$) - (if (eq (char-after (1+ (point))) ?$) - (search-forward "$$" nil t 2) - (and (not (eq (char-before) ?$)) - (search-forward "$" nil t 2) - (not (memq (char-before (match-beginning 0)) - '(?\s ?\t ?\n ?, ?.))) - (looking-at "\\(\\s.\\|\\s-\\|\\s(\\|\\s)\\|\\s\"\\|$\\)") - (point))) - (pcase (char-after (1+ (point))) - (?\( (search-forward "\\)" nil t)) - (?\[ (search-forward "\\]" nil t)) - (_ - ;; Macro. - (and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\ + (and (search-forward "$" nil t 2) + (not (memq (char-before (match-beginning 0)) + '(?\s ?\t ?\n ?, ?.))) + (looking-at "\\(\\s.\\|\\s-\\|\\s(\\|\\s)\\|\\s\"\\|$\\)") + (point)) + (if (eq (char-after (1+ (point))) ?\() + (search-forward "\\)" nil t) + ;; Macro. + (and (looking-at "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\ \\|\\({[^{}\n]*}\\)\\)*") - (match-end 0)))))) + (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 dd5d7ac..417329e 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -529,8 +529,8 @@ 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) - ("$$" "\\$\\$[^\000]*?\\$\\$" 0 nil)) + ("\\[" "^[ \t]*\\(\\\\\\[[^\000]*?\\\\\\]\\)[ \t]*$" 1 nil) + ("$$" "^[ \t]*\\(\\$\\$[^\000]*?\\$\\$\\)[ \t]*$" 1 nil)) "Regular expressions for matching embedded LaTeX.") ;;;; Node Property diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 5b4af9e..1d006ca 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -2651,7 +2651,7 @@ containing export options. Modify DATA by side-effect and return it." (`latex-fragment (let ((value (org-element-property :value obj))) (or (string-prefix-p "\\(" value) - (string-match-p "\\`\\$[^$]" value)))) + (string-prefix-p "$" value)))) ((or `subscript `superscript) t))))) (org-element-map data '(entity latex-fragment subscript superscript) (lambda (object) diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 12cf2dd..158da08 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -1381,9 +1381,21 @@ Paragraph" (ert-deftest test-org-element/latex-environment-parser () "Test `latex-environment' parser." + ;; Standard test. + (should + (eq 'latex-environment + (org-test-with-temp-text + "\\begin{equation}\ne^{i\\pi}+1=0\n\\end{equation}" + (org-element-type (org-element-at-point))))) + ;; Allow shorthand for "equation*" environment. (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))) + (eq 'latex-environment + (org-test-with-temp-text "\\[e^{i\\pi}+1=0\n\\]" + (org-element-type (org-element-at-point))))) + (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 @@ -1426,7 +1438,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,13 +1488,14 @@ e^{i\\pi}+1=0 (org-element-type (org-element-context))))) (should (eq 'latex-fragment - (org-test-with-temp-text "$$a$$" + (org-test-with-temp-text "\\(a\\)" (org-element-type (org-element-context))))) - (should + ;; The following constructs are elements, not objects. + (should-not (eq 'latex-fragment - (org-test-with-temp-text "\\(a\\)" + (org-test-with-temp-text "$$a$$" (org-element-type (org-element-context))))) - (should + (should-not (eq 'latex-fragment (org-test-with-temp-text "\\[a\\]" (org-element-type (org-element-context))))) -- 2.6.4