From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
To: Org Mode List <emacs-orgmode@gnu.org>
Subject: [RFC] Change \[..\] and $$...$$ into elements
Date: Sat, 26 Dec 2015 14:56:46 +0100 [thread overview]
Message-ID: <87io3l5n4x.fsf@nicolasgoaziou.fr> (raw)
[-- Attachment #1: Type: text/plain, Size: 770 bytes --]
Hello,
The following patch changes status for \[..\] and $$...$$ from objects
to elements.
There are two consequences to this :
1. \[...\] and $$...$$ are not filled anymore with M-q.
2. \[...\] and $$...$$ cannot be inlined, i.e, they must start at the
beginning of a line.
In particular, the second point may introduce incompatibilities with
previous Org revisions since, e.g.,
Text \[...\] and so on...
is not recognized anymore as a LaTeX object.
Also, I'm not keen on allowing both inline and block state for the same
syntax, as it would create create a precedent.
This patch is missing documentation updates and an ORG-NEWS entry.
Feedback is welcome.
Regards,
--
Nicolas Goaziou 0x80A93738
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Make-.-and-.-elements-instead-of-objects.patch --]
[-- Type: text/x-patch, Size: 9018 bytes --]
From 946eb109ac581fc25a67af4c57afb35a09d25c18 Mon Sep 17 00:00:00 2001
From: Nicolas Goaziou <mail@nicolasgoaziou.fr>
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
next reply other threads:[~2015-12-26 13:55 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-26 13:56 Nicolas Goaziou [this message]
2015-12-29 20:25 ` [RFC] Change \[..\] and $$...$$ into elements Ethan Ligon
2015-12-30 10:45 ` Rasmus
2016-01-21 9:30 ` Nicolas Goaziou
2016-01-21 15:58 ` Rasmus
2016-01-22 19:32 ` Ethan Ligon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87io3l5n4x.fsf@nicolasgoaziou.fr \
--to=mail@nicolasgoaziou.fr \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.