Implement pretty display of sub- and superscripts.
* doc/org.texi (Subscripts and superscripts): Document that `C-c C-x \' will also format sub and superscripts. * doc/orgcard.tex: Document that `C-c C-x \' will also format sub and superscripts. * lisp/org.el (org-use-sub-superscripts): (org-pretty-entities-include-sub-superscripts): Move here from org-exp.el. (org-set-regexps-and-options): Parse subscript option and set `org-use-sub-superscripts' as a local variable. (org-match-sexp-depth): (org-create-multibrace-regexp): (org-match-substring-regexp): (org-match-substring-with-braces-regexp): Moved here from org-exp.el (org-set-font-lock-defaults): Call `org-raise-scripts'. (org-remove-font-lock-display-properties): New function. (org-unfontify-region): Call `org-remove-font-lock-display-properties'. (org-script-display): New constant. (org-raise-scripts): New function. When turning on entity display with `C-c C-x \', sub- and superscripts will also be displayed in a smaller font, and raised/lowered.
This commit is contained in:
parent
32b58fad32
commit
70d24c5d03
|
@ -8783,6 +8783,12 @@ convention, or use, on a per-file basis:
|
|||
#+OPTIONS: ^:@{@}
|
||||
@end example
|
||||
|
||||
@table @kbd
|
||||
@kindex C-c C-x \
|
||||
@item C-c C-x \
|
||||
In addition to showing entities as UTF8 characters, this command will also
|
||||
format sub- and superscripts in a WYSIWYM way.
|
||||
@end table
|
||||
|
||||
@node LaTeX fragments, Previewing LaTeX fragments, Subscripts and superscripts, Embedded LaTeX
|
||||
@subsection La@TeX{} fragments
|
||||
|
|
|
@ -704,7 +704,7 @@ some other place.
|
|||
\key{export visible part only}{C-c C-e v}
|
||||
\key{insert template of export options}{C-c C-e t}
|
||||
\key{toggle fixed width for entry or region}{C-c :}
|
||||
\key{toggle display of entities as UTF8 chars}{C-c C-x {\tt\char`\\}}
|
||||
\key{toggle pretty display of scripts, entities}{C-c C-x {\tt\char`\\}}
|
||||
|
||||
%{\bf HTML formatting}
|
||||
|
||||
|
|
|
@ -448,35 +448,6 @@ This option can also be set with the +OPTIONS line, e.g. \"f:nil\"."
|
|||
:group 'org-export-translation
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom org-export-with-sub-superscripts t
|
||||
"Non-nil means interpret \"_\" and \"^\" for export.
|
||||
When this option is turned on, you can use TeX-like syntax for sub- and
|
||||
superscripts. Several characters after \"_\" or \"^\" will be
|
||||
considered as a single item - so grouping with {} is normally not
|
||||
needed. For example, the following things will be parsed as single
|
||||
sub- or superscripts.
|
||||
|
||||
10^24 or 10^tau several digits will be considered 1 item.
|
||||
10^-12 or 10^-tau a leading sign with digits or a word
|
||||
x^2-y^3 will be read as x^2 - y^3, because items are
|
||||
terminated by almost any nonword/nondigit char.
|
||||
x_{i^2} or x^(2-i) braces or parenthesis do grouping.
|
||||
|
||||
Still, ambiguity is possible - so when in doubt use {} to enclose the
|
||||
sub/superscript. If you set this variable to the symbol `{}',
|
||||
the braces are *required* in order to trigger interpretations as
|
||||
sub/superscript. This can be helpful in documents that need \"_\"
|
||||
frequently in plain text.
|
||||
|
||||
Not all export backends support this, but HTML does.
|
||||
|
||||
This option can also be set with the +OPTIONS line, e.g. \"^:nil\"."
|
||||
:group 'org-export-translation
|
||||
:type '(choice
|
||||
(const :tag "Always interpret" t)
|
||||
(const :tag "Only with braces" {})
|
||||
(const :tag "Never interpret" nil)))
|
||||
|
||||
(defcustom org-export-with-TeX-macros t
|
||||
"Non-nil means interpret simple TeX-like macros when exporting.
|
||||
For example, HTML export converts \\alpha to α and \\AA to Å.
|
||||
|
@ -520,12 +491,6 @@ This option can also be set with the +OPTIONS line, e.g. \"::nil\"."
|
|||
:group 'org-export-translation
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom org-match-sexp-depth 3
|
||||
"Number of stacked braces for sub/superscript matching.
|
||||
This has to be set before loading org.el to be effective."
|
||||
:group 'org-export-translation
|
||||
:type 'integer)
|
||||
|
||||
(defgroup org-export-tables nil
|
||||
"Options for exporting tables in Org-mode."
|
||||
:tag "Org Export Tables"
|
||||
|
@ -2734,41 +2699,6 @@ If yes remove the column and the special lines."
|
|||
(setq s (replace-match "" t t s)))
|
||||
s)
|
||||
|
||||
(defun org-create-multibrace-regexp (left right n)
|
||||
"Create a regular expression which will match a balanced sexp.
|
||||
Opening delimiter is LEFT, and closing delimiter is RIGHT, both given
|
||||
as single character strings.
|
||||
The regexp returned will match the entire expression including the
|
||||
delimiters. It will also define a single group which contains the
|
||||
match except for the outermost delimiters. The maximum depth of
|
||||
stacked delimiters is N. Escaping delimiters is not possible."
|
||||
(let* ((nothing (concat "[^" left right "]*?"))
|
||||
(or "\\|")
|
||||
(re nothing)
|
||||
(next (concat "\\(?:" nothing left nothing right "\\)+" nothing)))
|
||||
(while (> n 1)
|
||||
(setq n (1- n)
|
||||
re (concat re or next)
|
||||
next (concat "\\(?:" nothing left next right "\\)+" nothing)))
|
||||
(concat left "\\(" re "\\)" right)))
|
||||
|
||||
(defvar org-match-substring-regexp
|
||||
(concat
|
||||
"\\([^\\]\\)\\([_^]\\)\\("
|
||||
"\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
|
||||
"\\|"
|
||||
"\\(" (org-create-multibrace-regexp "(" ")" org-match-sexp-depth) "\\)"
|
||||
"\\|"
|
||||
"\\(\\(?:\\*\\|[-+]?[^-+*!@#$%^_ \t\r\n,:\"?<>~;./{}=()]+\\)\\)\\)")
|
||||
"The regular expression matching a sub- or superscript.")
|
||||
|
||||
(defvar org-match-substring-with-braces-regexp
|
||||
(concat
|
||||
"\\([^\\]\\)\\([_^]\\)\\("
|
||||
"\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
|
||||
"\\)")
|
||||
"The regular expression matching a sub- or superscript, forcing braces.")
|
||||
|
||||
|
||||
(defun org-get-text-property-any (pos prop &optional object)
|
||||
(or (get-text-property pos prop object)
|
||||
|
|
132
lisp/org.el
132
lisp/org.el
|
@ -344,6 +344,39 @@ the following lines anywhere in the buffer:
|
|||
(const :tag "Not" nil)
|
||||
(const :tag "Globally (slow on startup in large files)" t)))
|
||||
|
||||
(defcustom org-use-sub-superscripts t
|
||||
"Non-nil means interpret \"_\" and \"^\" for export.
|
||||
When this option is turned on, you can use TeX-like syntax for sub- and
|
||||
superscripts. Several characters after \"_\" or \"^\" will be
|
||||
considered as a single item - so grouping with {} is normally not
|
||||
needed. For example, the following things will be parsed as single
|
||||
sub- or superscripts.
|
||||
|
||||
10^24 or 10^tau several digits will be considered 1 item.
|
||||
10^-12 or 10^-tau a leading sign with digits or a word
|
||||
x^2-y^3 will be read as x^2 - y^3, because items are
|
||||
terminated by almost any nonword/nondigit char.
|
||||
x_{i^2} or x^(2-i) braces or parenthesis do grouping.
|
||||
|
||||
Still, ambiguity is possible - so when in doubt use {} to enclose the
|
||||
sub/superscript. If you set this variable to the symbol `{}',
|
||||
the braces are *required* in order to trigger interpretations as
|
||||
sub/superscript. This can be helpful in documents that need \"_\"
|
||||
frequently in plain text.
|
||||
|
||||
Not all export backends support this, but HTML does.
|
||||
|
||||
This option can also be set with the +OPTIONS line, e.g. \"^:nil\"."
|
||||
:group 'org-startup
|
||||
:group 'org-export-translation
|
||||
:type '(choice
|
||||
(const :tag "Always interpret" t)
|
||||
(const :tag "Only with braces" {})
|
||||
(const :tag "Never interpret" nil)))
|
||||
|
||||
(defvaralias 'org-export-with-sub-superscripts 'org-use-sub-superscripts)
|
||||
|
||||
|
||||
(defcustom org-startup-with-beamer-mode nil
|
||||
"Non-nil means turn on `org-beamer-mode' on startup.
|
||||
This can also be configured on a per-file basis by adding one of
|
||||
|
@ -3176,6 +3209,11 @@ When nil, the \\name form remains in the buffer."
|
|||
:group 'org-appearance
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom org-pretty-entities-include-sub-superscripts t
|
||||
"Non-nil means, pretty entity display includes formatting sub/superscripts."
|
||||
:group 'org-appearance
|
||||
:type 'boolean)
|
||||
|
||||
(defvar org-emph-re nil
|
||||
"Regular expression for matching emphasis.
|
||||
After a match, the match groups contain these elements:
|
||||
|
@ -4047,9 +4085,11 @@ means to push this value onto the list in the variable.")
|
|||
(let ((re (org-make-options-regexp
|
||||
'("CATEGORY" "TODO" "COLUMNS"
|
||||
"STARTUP" "ARCHIVE" "FILETAGS" "TAGS" "LINK" "PRIORITIES"
|
||||
"CONSTANTS" "PROPERTY" "DRAWERS" "SETUPFILE" "LATEX_CLASS")
|
||||
"CONSTANTS" "PROPERTY" "DRAWERS" "SETUPFILE" "LATEX_CLASS"
|
||||
"OPTIONS")
|
||||
"\\(?:[a-zA-Z][0-9a-zA-Z_]*_TODO\\)"))
|
||||
(splitre "[ \t]+")
|
||||
(scripts org-use-sub-superscripts)
|
||||
kwds kws0 kwsa key log value cat arch tags const links hw dws
|
||||
tail sep kws1 prio props ftags drawers beamer-p
|
||||
ext-setup-or-nil setup-contents (start 0))
|
||||
|
@ -4122,6 +4162,9 @@ means to push this value onto the list in the variable.")
|
|||
'(face t fontified t) arch))
|
||||
((equal key "LATEX_CLASS")
|
||||
(setq beamer-p (equal value "beamer")))
|
||||
((equal key "OPTIONS")
|
||||
(if (string-match "\\([ \t]\\|\\`\\)\\^:\\(t\\|nil\\|{}\\)" value)
|
||||
(setq scripts (read (match-string 2 value)))))
|
||||
((equal key "SETUPFILE")
|
||||
(setq setup-contents (org-file-contents
|
||||
(expand-file-name
|
||||
|
@ -4134,6 +4177,7 @@ means to push this value onto the list in the variable.")
|
|||
"\n" setup-contents "\n"
|
||||
(substring ext-setup-or-nil start)))))
|
||||
))))
|
||||
(org-set-local 'org-use-sub-superscripts scripts)
|
||||
(when cat
|
||||
(org-set-local 'org-category (intern cat))
|
||||
(push (cons "CATEGORY" cat) props))
|
||||
|
@ -4617,6 +4661,47 @@ Here is what the match groups contain after a match:
|
|||
(defvar org-any-link-re nil
|
||||
"Regular expression matching any link.")
|
||||
|
||||
(defcustom org-match-sexp-depth 3
|
||||
"Number of stacked braces for sub/superscript matching.
|
||||
This has to be set before loading org.el to be effective."
|
||||
:group 'org-export-translation ; ??????????????????????????/
|
||||
:type 'integer)
|
||||
|
||||
(defun org-create-multibrace-regexp (left right n)
|
||||
"Create a regular expression which will match a balanced sexp.
|
||||
Opening delimiter is LEFT, and closing delimiter is RIGHT, both given
|
||||
as single character strings.
|
||||
The regexp returned will match the entire expression including the
|
||||
delimiters. It will also define a single group which contains the
|
||||
match except for the outermost delimiters. The maximum depth of
|
||||
stacked delimiters is N. Escaping delimiters is not possible."
|
||||
(let* ((nothing (concat "[^" left right "]*?"))
|
||||
(or "\\|")
|
||||
(re nothing)
|
||||
(next (concat "\\(?:" nothing left nothing right "\\)+" nothing)))
|
||||
(while (> n 1)
|
||||
(setq n (1- n)
|
||||
re (concat re or next)
|
||||
next (concat "\\(?:" nothing left next right "\\)+" nothing)))
|
||||
(concat left "\\(" re "\\)" right)))
|
||||
|
||||
(defvar org-match-substring-regexp
|
||||
(concat
|
||||
"\\([^\\]\\)\\([_^]\\)\\("
|
||||
"\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
|
||||
"\\|"
|
||||
"\\(" (org-create-multibrace-regexp "(" ")" org-match-sexp-depth) "\\)"
|
||||
"\\|"
|
||||
"\\(\\(?:\\*\\|[-+]?[^-+*!@#$%^_ \t\r\n,:\"?<>~;./{}=()]+\\)\\)\\)")
|
||||
"The regular expression matching a sub- or superscript.")
|
||||
|
||||
(defvar org-match-substring-with-braces-regexp
|
||||
(concat
|
||||
"\\([^\\]\\)\\([_^]\\)\\("
|
||||
"\\(" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
|
||||
"\\)")
|
||||
"The regular expression matching a sub- or superscript, forcing braces.")
|
||||
|
||||
(defun org-make-link-regexps ()
|
||||
"Update the link regular expressions.
|
||||
This should be called after the variable `org-link-types' has changed."
|
||||
|
@ -5249,6 +5334,7 @@ For plain list items, if they are matched by `outline-regexp', this returns
|
|||
;; Specials
|
||||
'(org-do-latex-and-special-faces)
|
||||
'(org-fontify-entities)
|
||||
'(org-raise-scripts)
|
||||
;; Code
|
||||
'(org-activate-code (1 'org-code t))
|
||||
;; COMMENT
|
||||
|
@ -5383,7 +5469,49 @@ If KWD is a number, get the corresponding match group."
|
|||
org-no-flyspell t)
|
||||
'(mouse-face t keymap t org-linked-text t
|
||||
invisible t intangible t
|
||||
org-no-flyspell t)))))
|
||||
org-no-flyspell t)))
|
||||
(org-remove-font-lock-display-properties beg end)))
|
||||
|
||||
(defun org-remove-font-lock-display-properties (beg end)
|
||||
"Remove specific display properties that have been added by font lock.
|
||||
The will remove the raise properties that are used to show superscripts
|
||||
and subscriipts."
|
||||
(let (next prop)
|
||||
(while (< beg end)
|
||||
(setq next (next-single-property-change beg 'display nil end)
|
||||
prop (get-text-property beg 'display))
|
||||
(if (member prop org-script-display)
|
||||
(put-text-property beg next 'display nil))
|
||||
(setq beg next))))
|
||||
|
||||
(defconst org-script-display '(((raise -0.3) (height 0.7))
|
||||
((raise 0.3) (height 0.7)))
|
||||
"Display properties for showing superscripts and subscripts.")
|
||||
|
||||
(defun org-raise-scripts (limit)
|
||||
"Add raise properties to sub/superscripts."
|
||||
(when (and org-pretty-entities org-pretty-entities-include-sub-superscripts)
|
||||
(if (re-search-forward
|
||||
(if (eq org-use-sub-superscripts t)
|
||||
org-match-substring-regexp
|
||||
org-match-substring-with-braces-regexp)
|
||||
limit t)
|
||||
(progn
|
||||
(put-text-property (match-beginning 3) (match-end 0)
|
||||
'display
|
||||
(if (equal (char-after (match-beginning 2)) ?^)
|
||||
(nth 1 org-script-display)
|
||||
(car org-script-display)))
|
||||
(put-text-property (match-beginning 2) (match-end 2)
|
||||
'invisible t)
|
||||
(if (and (eq (char-after (match-beginning 3)) ?{)
|
||||
(eq (char-before (match-end 3)) ?}))
|
||||
(progn
|
||||
(put-text-property (match-beginning 3) (1+ (match-beginning 3))
|
||||
'invisible t)
|
||||
(put-text-property (1- (match-end 3)) (match-end 3)
|
||||
'invisible t)))
|
||||
t))))
|
||||
|
||||
;;;; Visibility cycling, including org-goto and indirect buffer
|
||||
|
||||
|
|
Loading…
Reference in New Issue