forked from mirrors/org-mode
Compare commits
57 Commits
a6451f10fd
...
4e449dbbe6
Author | SHA1 | Date |
---|---|---|
TEC | 4e449dbbe6 | |
TEC | 4af1c3f34c | |
TEC | b3b1460c77 | |
TEC | 8cf5377d63 | |
TEC | 6954d4bcb1 | |
TEC | 7724d8f345 | |
TEC | 0bb567b5ab | |
TEC | 05a53017b3 | |
TEC | 1bcfc81024 | |
Karthik Chikmagalur | 4b3447a671 | |
TEC | cb2f8a16c5 | |
TEC | 9915eaa44b | |
TEC | a51426dcf7 | |
TEC | 9cda140864 | |
Karthik Chikmagalur | b739a472ef | |
TEC | 12f921b9db | |
TEC | 66dc12ade1 | |
TEC | 0828ef5b32 | |
TEC | 3ce0bb5c58 | |
TEC | 9595d28a3d | |
TEC | ed38d80e08 | |
TEC | 45c28226a5 | |
TEC | e1014298cd | |
TEC | f44ce2898a | |
TEC | 49b5623470 | |
Karthik Chikmagalur | f304ffb6a8 | |
Karthik Chikmagalur | 0b635f4ec9 | |
Karthik Chikmagalur | 6ef8622e8a | |
TEC | 52a7112297 | |
TEC | e58f5c099a | |
TEC | c1a63f3d4b | |
Karthik Chikmagalur | 287d1d1b9c | |
TEC | 4b8de1bc87 | |
TEC | ad628efa48 | |
TEC | bbb33de7a9 | |
TEC | 5d094543c8 | |
TEC | 7bc0f69e65 | |
TEC | 8f427568de | |
TEC | cea91614a5 | |
TEC | 5cad4042a3 | |
TEC | 4044b357c6 | |
TEC | 2793bf00bc | |
TEC | 22c3f9460c | |
Karthik Chikmagalur | 1f2777e33a | |
Karthik Chikmagalur | 969bcea52f | |
Karthik Chikmagalur | 943a9158a5 | |
Karthik Chikmagalur | 11e366da10 | |
Karthik Chikmagalur | b2b9249fc0 | |
Karthik Chikmagalur | 5d2f1eb919 | |
Karthik Chikmagalur | ab67f0ccbd | |
Karthik Chikmagalur | f9addbff5c | |
Karthik Chikmagalur | 83436afa07 | |
Karthik Chikmagalur | 71aa2d4c41 | |
Karthik Chikmagalur | 8780ac5905 | |
Karthik Chikmagalur | d3e4684ac9 | |
Karthik Chikmagalur | 26466696ac | |
TEC | 0e2cb4fcf3 |
|
@ -11388,16 +11388,16 @@ lines:
|
|||
:END:
|
||||
#+cindex: @LaTeX{} fragments, preview
|
||||
|
||||
#+vindex: org-latex-preview-default-process
|
||||
#+vindex: org-latex-preview-process-default
|
||||
If you have a working LaTeX installation and =dvipng=, =dvisvgm= or
|
||||
=convert= installed[fn:38], LaTeX fragments can be processed to
|
||||
produce images of the typeset expressions to be used for inclusion
|
||||
while exporting to HTML (see [[*LaTeX fragments]]), or for inline
|
||||
previewing within Org mode.
|
||||
|
||||
#+vindex: org-latex-preview-options
|
||||
#+vindex: org-latex-preview-appearance-options
|
||||
#+vindex: org-latex-preview-header
|
||||
You can customize the variables ~org-latex-preview-options~ and
|
||||
You can customize the variables ~org-latex-preview-appearance-options~ and
|
||||
~org-latex-preview-header~ to influence some aspects of the preview.
|
||||
In particular, the ~:scale~ and ~:zoom~ properties of the former can
|
||||
be used to adjust the size of the preview images.
|
||||
|
@ -23337,7 +23337,7 @@ used to create images, any LaTeX environment is handled.
|
|||
[fn:38] These are respectively available at
|
||||
[[https://sourceforge.net/projects/dvipng/]], [[http://dvisvgm.bplaced.net/]]
|
||||
and from the ImageMagick suite. Choose the converter by setting the
|
||||
variable ~org-latex-preview-default-process~ accordingly.
|
||||
variable ~org-latex-preview-process-default~ accordingly.
|
||||
|
||||
[fn:39] This works automatically for the HTML backend (it requires
|
||||
version 1.34 of the =htmlize.el= package, which you need to install).
|
||||
|
|
28
etc/ORG-NEWS
28
etc/ORG-NEWS
|
@ -421,7 +421,7 @@ Org mode's LaTeX preview system has been rewritten with several improvements and
|
|||
|
||||
When this mode is turned on, LaTeX preview overlays in the buffer can be temporarily disabled by moving the cursor into them. Moving the cursor out will display the LaTeX preview image overlay again. Additionally, editing LaTeX fragments that have previews will cause the preview images to be updated.
|
||||
|
||||
If the option ~org-latex-preview-auto-generate~ is non-nil (which see), previews for LaTeX fragments will be auto-generated as you type.
|
||||
If the option ~org-latex-preview-auto-track-inserts~ is non-nil (which see), previews for LaTeX fragments will be auto-generated as you type.
|
||||
|
||||
|
||||
**** New options
|
||||
|
@ -431,18 +431,19 @@ If the option ~org-latex-preview-auto-generate~ is non-nil (which see), previews
|
|||
This alist maps compilers in ~org-latex-compilers~ to command strings
|
||||
used for LaTeX precompilation when creating previews or LaTeX exports.
|
||||
|
||||
***** New option ~org-latex-preview-persist~ to enable preview image caching
|
||||
***** New option ~org-latex-preview-cache~ to enable preview image caching
|
||||
|
||||
When non-nil, images produced using ~org-latex-preview~ will be cached and
|
||||
persisted across Emacs sessions using ~org-persist~.
|
||||
When set to =persist=, images produced using ~org-latex-preview~ will
|
||||
be cached and persisted across Emacs sessions using
|
||||
~org-persist~. Temporary or custom directories can also be used.
|
||||
|
||||
***** New option ~org-latex-preview-persist-expiry~ to set persistence period
|
||||
|
||||
This is the number of days for which LaTeX preview images will be
|
||||
cached, assuming persistence is turned on with
|
||||
~org-latex-preview-persist~.
|
||||
~org-latex-preview-cache~.
|
||||
|
||||
***** New option ~org-latex-preview-processing-indicator~ to indicate preview processing for LaTeX fragments
|
||||
***** New option ~org-latex-preview-process-active-indicator~ to indicate preview processing for LaTeX fragments
|
||||
|
||||
This option controls the style of visual indicator for LaTeX fragments
|
||||
currently being processed.
|
||||
|
@ -452,20 +453,20 @@ currently being processed.
|
|||
When non-nil, previewed LaTeX environments in the buffer are
|
||||
renumbered automatically as required.
|
||||
|
||||
***** New option ~org-latex-preview-width~ to control the text width for LaTeX fragment previews
|
||||
***** New option =:page-width= in ~org-latex-preview-appearance-options~ to control the text width for LaTeX fragment previews
|
||||
|
||||
This option controls the width of text in preview images. This is
|
||||
relevant for displaymath-type LaTeX environments, and can be specified
|
||||
in multiple ways.
|
||||
|
||||
***** New option ~org-latex-preview-use-precompilation~ to control LaTeX precompilation
|
||||
***** New option ~org-latex-preview-process-precompiled~ to control LaTeX precompilation
|
||||
|
||||
This option controls whether LaTeX headers for buffers are precompiled
|
||||
when generating the first preview for the buffer. Precompilation can
|
||||
speed up preview generation by a moderate to large amount depending on
|
||||
the complexity of the header.
|
||||
|
||||
***** New option ~org-latex-preview-auto-generate~ to auto-generate LaTeX previews when typing
|
||||
***** New option ~org-latex-preview-auto-track-inserts~ to auto-generate LaTeX previews when typing
|
||||
|
||||
When using ~org-latex-preview-auto-mode~ (which see), setting this option to a non-nil value will cause LaTeX previews to be rendered as you type LaTeX fragments. This works however new text is added to the buffer, for example by yanking. When this option is nil and ~org-latex-preview-auto-mode~ is on, existing previews for LaTeX fragments will still be auto-regenerated when edited but no new ones will be auto-generated.
|
||||
|
||||
|
@ -473,13 +474,14 @@ When using ~org-latex-preview-auto-mode~ (which see), setting this option to a n
|
|||
|
||||
***** Mark ~org-format-latex-options~ obsolete
|
||||
|
||||
Use ~org-latex-preview-options~ instead. The replacement acts in the
|
||||
Use ~org-latex-preview-appearance-options~ instead. The replacement acts in the
|
||||
same way, except that
|
||||
- the preview image render size and display size can be independently
|
||||
controlled with the =:scale= and =:zoom= plist keys, and
|
||||
- the HTML export-specific parameters =:html-scale=,
|
||||
=:html-foreground= and =:html-background= have been
|
||||
moved to ~org-html-latex-image-options~, which see.
|
||||
=:html-foreground= and =:html-background= have been moved to
|
||||
~org-html-latex-image-options~, which see.
|
||||
- the new option =:page-width= (mentioned earlier)
|
||||
|
||||
***** Mark ~org-format-latex-header~ obsolete
|
||||
|
||||
|
@ -488,7 +490,7 @@ behaves the exact same way and is renamed for consistency.
|
|||
|
||||
***** Mark ~org-preview-latex-default-process~ obsolete
|
||||
|
||||
Use ~org-latex-preview-default-process~ instead. The replacement
|
||||
Use ~org-latex-preview-process-default~ instead. The replacement
|
||||
variable behaves the exact same way and is renamed for consistency.
|
||||
|
||||
***** Mark ~org-preview-latex-process-alist~ obsolete
|
||||
|
|
|
@ -48,10 +48,10 @@
|
|||
(defvar org-babel-tangle-lang-exts)
|
||||
(add-to-list 'org-babel-tangle-lang-exts '("latex" . "tex"))
|
||||
|
||||
(defvar org-latex-preview-header) ; From org-latex-preview.el
|
||||
(defvar org-latex-preview-options) ; From org-latex-preview.el
|
||||
(defvar org-latex-default-packages-alist) ; From org-latex-preview.el
|
||||
(defvar org-latex-packages-alist) ; From org-latex-preview.el
|
||||
(defvar org-latex-preview-header) ; From org-latex-preview.el
|
||||
(defvar org-latex-preview-appearance-options) ; From org-latex-preview.el
|
||||
(defvar org-latex-default-packages-alist) ; From org-latex-preview.el
|
||||
(defvar org-latex-packages-alist) ; From org-latex-preview.el
|
||||
|
||||
(defvar org-babel-default-header-args:latex
|
||||
'((:results . "latex") (:exports . "results"))
|
||||
|
@ -171,7 +171,7 @@ This function is called by `org-babel-execute-src-block'."
|
|||
(concat org-latex-preview-header "\n"
|
||||
(mapconcat #'identity headers "\n"))))
|
||||
(org-latex-preview-create-image
|
||||
body out-file org-latex-preview-options in-buffer)))
|
||||
body out-file org-latex-preview-appearance-options in-buffer)))
|
||||
((string= "svg" extension)
|
||||
(with-temp-file tex-file
|
||||
(insert (concat (funcall org-babel-latex-preamble params)
|
||||
|
|
24
lisp/ol.el
24
lisp/ol.el
|
@ -1065,6 +1065,9 @@ and then used in capture templates."
|
|||
if store-func
|
||||
collect store-func))
|
||||
|
||||
(defvar org-link--abbrev-functions nil
|
||||
"Alist of abbrev link expressions and functions.")
|
||||
|
||||
(defun org-link-expand-abbrev (link)
|
||||
"Replace link abbreviations in LINK string.
|
||||
Abbreviations are defined in `org-link-abbrev-alist'."
|
||||
|
@ -1079,14 +1082,27 @@ Abbreviations are defined in `org-link-abbrev-alist'."
|
|||
(setq rpl (cdr as))
|
||||
(cond
|
||||
((symbolp rpl) (funcall rpl tag))
|
||||
((string-match "%(\\([^)]+\\))" rpl)
|
||||
((string-match "%(\\([^) ]+\\))" rpl) ; %(function)
|
||||
(replace-match
|
||||
(save-match-data
|
||||
(funcall (intern-soft (match-string 1 rpl)) tag))
|
||||
t t rpl))
|
||||
((string-match "%s" rpl) (replace-match (or tag "") t t rpl))
|
||||
((string-match "%h" rpl)
|
||||
(replace-match (url-hexify-string (or tag "")) t t rpl))
|
||||
((string-match "%(\\(.+\\))" rpl) ; %(sexpr using tag)
|
||||
(replace-match
|
||||
(save-match-data
|
||||
(funcall (or (cdr (assoc (match-string 1 rpl)
|
||||
org-link--abbrev-functions))
|
||||
(cdar (push (cons (match-string 1 rpl)
|
||||
(eval (read (format
|
||||
"(lambda (tag) (%s))"
|
||||
(match-string 1 rpl)))))
|
||||
org-link--abbrev-functions)))
|
||||
tag))
|
||||
t t rpl))
|
||||
((string-match-p "%[0-<>^_]?[0-9]*\\(?:\\.[0-9]+\\)?s" rpl)
|
||||
(format-spec rpl `((?s . ,(or tag "")))))
|
||||
((string-match-p "%[0-<>^_]?[0-9]*\\(?:\\.[0-9]+\\)?h" rpl)
|
||||
(format-spec rpl `((?h . ,(url-hexify-string (or tag ""))))))
|
||||
(t (concat rpl tag)))))))
|
||||
|
||||
(defun org-link-open (link &optional arg)
|
||||
|
|
|
@ -650,13 +650,13 @@ Counting starts at 1."
|
|||
"9.0")
|
||||
|
||||
(define-obsolete-variable-alias
|
||||
'org-format-latex-options 'org-latex-preview-options "9.7")
|
||||
'org-format-latex-options 'org-latex-preview-appearance-options "9.7")
|
||||
(make-obsolete-variable
|
||||
'org-format-latex-signal-error "no longer used" "9.7")
|
||||
(define-obsolete-variable-alias
|
||||
'org-format-latex-header 'org-latex-preview-preamble "9.7")
|
||||
(define-obsolete-variable-alias
|
||||
'org-preview-latex-default-process 'org-latex-preview-default-process "9.7")
|
||||
'org-preview-latex-default-process 'org-latex-preview-process-default "9.7")
|
||||
(define-obsolete-variable-alias
|
||||
'org-preview-latex-process-alist 'org-latex-preview-process-alist "9.7")
|
||||
(define-obsolete-function-alias
|
||||
|
@ -667,8 +667,6 @@ Counting starts at 1."
|
|||
'org-latex-color-format 'org-latex-preview--format-color "9.7")
|
||||
(define-obsolete-function-alias
|
||||
'org-latex-color 'org-latex-preview--attr-color "9.7")
|
||||
(define-obsolete-function-alias
|
||||
'org-normalize-color 'org-latex-preview--normalize-color "9.7")
|
||||
;; MathML related functions from org-latex-preview.el
|
||||
(define-obsolete-variable-alias
|
||||
'org-latex-to-mathml-jar-file 'org-mathml-converter-jar-file "9.7")
|
||||
|
@ -723,6 +721,12 @@ Counting starts at 1."
|
|||
(make-obsolete
|
||||
'org-dvipng-color-format "to be removed" "9.7")
|
||||
|
||||
;; FIXME: Unused; obsoleted; to be removed.
|
||||
(defun org-normalize-color (value)
|
||||
"Return string to be used as color value for an RGB component."
|
||||
(format "%g" (/ value 65535.0)))
|
||||
(make-obsolete 'org-normalize-color "to be removed" "9.7")
|
||||
|
||||
;; FIXME: Unused; obsoleted; to be removed.
|
||||
(defcustom org-preview-latex-image-directory "ltximg/"
|
||||
"Path to store latex preview images.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -374,7 +374,7 @@ Each queued task is represented by a list with the following structure:
|
|||
|
||||
(defvar org-async--counter 0)
|
||||
|
||||
(cl-defun org-async-call (proc &key success failure filter buffer info timeout now
|
||||
(cl-defun org-async-call (proc &key success failure filter buffer info timeout now process-variables
|
||||
(dir default-directory) (coding 'utf-8))
|
||||
"Start PROC and register it with callbacks SUCCESS and FAILURE.
|
||||
|
||||
|
@ -422,7 +422,16 @@ When CODING is non-nil, both the process encode and decode system
|
|||
will be set to CODING. If unset, UTF-8 is used.
|
||||
|
||||
When NOW is non-nil, the PROC is started immediately, regardless
|
||||
of `org-async-process-limit'."
|
||||
of `org-async-process-limit'.
|
||||
|
||||
For improved performance, PROCESS-VARIABLES is a list of
|
||||
let-style bindings that should be applied to the process.
|
||||
Variables are supported on an individual basis (i.e. only certain
|
||||
variables can be set), with the default value being equivalent to:
|
||||
|
||||
:process-variables ((process-adaptive-read-buffering nil)
|
||||
(process-connection-type nil)
|
||||
(read-process-output-max 65536))"
|
||||
(cond
|
||||
;; Called with a task (as can be used with callbacks), so re-call
|
||||
;; with expanded arguments.
|
||||
|
@ -432,7 +441,13 @@ of `org-async-process-limit'."
|
|||
;; Start the async process now.
|
||||
((or now (< (length org-async--stack) org-async-process-limit))
|
||||
(let ((proc
|
||||
(let ((default-directory (or dir default-directory)))
|
||||
(let ((default-directory (or dir default-directory))
|
||||
(process-adaptive-read-buffering ; No by default
|
||||
(cadr (or (assoc 'process-adaptive-read-buffering process-variables) nil)))
|
||||
(process-connection-type ; Use a pipe by default
|
||||
(cadr (or (assoc 'process-connection-type process-variables) nil)))
|
||||
(read-process-output-max ; Can be worth changing depending on the process
|
||||
(or (assq 'read-process-output-max process-variables) read-process-output-max)))
|
||||
(cond ((processp proc) proc)
|
||||
((stringp proc)
|
||||
(start-process-shell-command
|
||||
|
|
|
@ -809,9 +809,42 @@ as `org-src-fontify-natively' is non-nil."
|
|||
(1+ pt) (1- (point)) 'face 'org-inline-src-block)))
|
||||
(font-lock-append-text-property
|
||||
(1- (point)) (point) 'face '(org-inline-src-block shadow))
|
||||
(setq pt (point)))))
|
||||
(setq pt (point)))
|
||||
(when (and org-inline-src-prettify-results
|
||||
(re-search-forward "\\= {{{results(" limit t))
|
||||
(font-lock-append-text-property pt (1+ pt) 'face 'org-inline-src-block)
|
||||
(goto-char pt))))
|
||||
t)))
|
||||
|
||||
(defun org-fontify-inline-src-results (limit)
|
||||
"Apply prettify-symbols modifications to inline results blocks.
|
||||
Performed according to `org-inline-src-prettify-results'."
|
||||
(when (and org-inline-src-prettify-results
|
||||
(re-search-forward "{{{results(\\(.+?\\))}}}" limit t))
|
||||
(remove-list-of-text-properties (match-beginning 0) (point)
|
||||
'(composition
|
||||
prettify-symbols-start
|
||||
prettify-symbols-end))
|
||||
(font-lock-append-text-property (match-beginning 0) (match-end 0)
|
||||
'face 'org-block)
|
||||
(let ((start (match-beginning 0)) (end (match-beginning 1)))
|
||||
(with-silent-modifications
|
||||
(compose-region start end (if (eq org-inline-src-prettify-results t)
|
||||
"(" (car org-inline-src-prettify-results)))
|
||||
(add-text-properties start end `(prettify-symbols-start ,start prettify-symbols-end ,end))))
|
||||
(let ((start (match-end 1)) (end (point)))
|
||||
(with-silent-modifications
|
||||
(compose-region start end (if (eq org-inline-src-prettify-results t)
|
||||
")" (cdr org-inline-src-prettify-results)))
|
||||
(add-text-properties start end `(prettify-symbols-start ,start prettify-symbols-end ,end))))
|
||||
t))
|
||||
|
||||
(defun org-toggle-inline-results-display ()
|
||||
"Toggle the literal or contracted display of inline src blocks results."
|
||||
(interactive)
|
||||
(setq org-inline-src-prettify-results (not org-inline-src-prettify-results))
|
||||
(org-restart-font-lock))
|
||||
|
||||
|
||||
;;; Escape contents
|
||||
|
||||
|
|
49
lisp/org.el
49
lisp/org.el
|
@ -4748,7 +4748,7 @@ The following commands are available:
|
|||
(org-unmodified
|
||||
(when org-startup-with-beamer-mode (org-beamer-mode))
|
||||
(when org-startup-with-inline-images (org-display-inline-images))
|
||||
(when org-startup-with-latex-preview (org-latex-preview '(16)))
|
||||
(when org-startup-with-latex-preview (org-latex-preview 'buffer))
|
||||
(unless org-inhibit-startup-visibility-stuff (org-cycle-set-startup-visibility))
|
||||
(when org-startup-truncated (setq truncate-lines t))
|
||||
(when org-startup-numerated (require 'org-num) (org-num-mode 1))
|
||||
|
@ -5189,6 +5189,15 @@ by a #."
|
|||
:version "24.1"
|
||||
:group 'org-appearance)
|
||||
|
||||
(defcustom org-inline-src-prettify-results t
|
||||
"Whether to use (ab)use prettify-symbols-mode on {{{results(...)}}}.
|
||||
Either t or a cons cell of strings which are used as substitutions
|
||||
for the start and end of inline results, respectively."
|
||||
:type '(choice boolean (cons string string))
|
||||
:package-version '(Org . "9.5")
|
||||
:group 'org-appearance
|
||||
:group 'org-babel)
|
||||
|
||||
(defun org-fontify-meta-lines-and-blocks (limit)
|
||||
(condition-case-unless-debug nil
|
||||
(org-fontify-meta-lines-and-blocks-1 limit)
|
||||
|
@ -5449,7 +5458,7 @@ Result depends on variable `org-highlight-latex-and-related'."
|
|||
(re-latex
|
||||
(when (or (memq 'latex org-highlight-latex-and-related)
|
||||
(memq 'native org-highlight-latex-and-related))
|
||||
(let ((matchers (plist-get org-latex-preview-options :matchers)))
|
||||
(let ((matchers (plist-get org-latex-preview-appearance-options :matchers)))
|
||||
(delq nil
|
||||
(mapcar (lambda (x)
|
||||
(and (member (car x) matchers) (nth 1 x)))
|
||||
|
@ -5463,7 +5472,7 @@ Result depends on variable `org-highlight-latex-and-related'."
|
|||
(append re-latex re-entities re-sub)
|
||||
"\\|"))))
|
||||
|
||||
(defvar org-latex-preview-options) ; Defined in org-latex-preview.el.
|
||||
(defvar org-latex-preview-appearance-options) ; Defined in org-latex-preview.el.
|
||||
(declare-function org-latex-preview--face-around "org-latex-preview" (start end))
|
||||
|
||||
(defun org-do-latex-and-related (limit)
|
||||
|
@ -5507,7 +5516,7 @@ highlighting was done, nil otherwise."
|
|||
(add-text-properties (+ offset (match-beginning 0)) (match-end 0)
|
||||
'(font-lock-multiline t))
|
||||
;; Refresh the face of LaTeX previews (when applicable).
|
||||
(when (eq (plist-get org-latex-preview-options :foreground)
|
||||
(when (eq (plist-get org-latex-preview-appearance-options :foreground)
|
||||
'auto)
|
||||
(dolist (ov (overlays-at start))
|
||||
(when (and (eq (overlay-get ov 'org-overlay-type)
|
||||
|
@ -5677,6 +5686,10 @@ needs to be inserted at a specific position in the font-lock sequence.")
|
|||
(list (concat "\\<" org-clock-string) '(0 'org-special-keyword t))
|
||||
;; Emphasis
|
||||
(when org-fontify-emphasized-text '(org-do-emphasis-faces))
|
||||
;; Semantic seperator
|
||||
(when org-fontify-semantic-seperator
|
||||
`("\u200b"
|
||||
(0 '(face shadow display ,org-semantic-seperator-displayed))))
|
||||
;; Checkboxes
|
||||
`(,org-list-full-item-re 3 'org-checkbox prepend lax)
|
||||
(when (cdr (assq 'checkbox org-list-automatic-rules))
|
||||
|
@ -5797,6 +5810,23 @@ needs to be inserted at a specific position in the font-lock sequence.")
|
|||
(throw 'match t))))
|
||||
nil))))
|
||||
|
||||
(defcustom org-fontify-semantic-seperator t
|
||||
"Whether to prettify the semantic seperator.
|
||||
When non-nil, `org-semantic-seperator-displayed' will be displayed in place of the semantic seperator."
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom org-semantic-seperator-displayed
|
||||
#("┃" 0 1 (display ((raise -0.3) (height 0.3))))
|
||||
"String that should be displayed in place of the semantic seperator.
|
||||
This is only relevant when `org-fontify-semantic-seperator' is non-nil."
|
||||
:type 'string)
|
||||
|
||||
(defun org-toggle-semantic-seperator-display ()
|
||||
"Toggle display of the semantic seperator."
|
||||
(interactive)
|
||||
(cl-callf not org-fontify-semantic-seperator)
|
||||
(user-error "TODO make this work better"))
|
||||
|
||||
(defun org-fontify-like-in-org-mode (s &optional odd-levels)
|
||||
"Fontify string S like in Org mode."
|
||||
(with-temp-buffer
|
||||
|
@ -19141,12 +19171,23 @@ a footnote definition, try to fill the first paragraph within."
|
|||
(save-excursion
|
||||
(goto-char beg)
|
||||
(let ((cuts (list beg)))
|
||||
;; Cut fill on line breaks.
|
||||
(while (re-search-forward "\\\\\\\\[ \t]*\n" end t)
|
||||
(when (org-element-type-p
|
||||
(save-excursion (backward-char)
|
||||
(org-element-context))
|
||||
'line-break)
|
||||
(push (point) cuts)))
|
||||
;; Cut fill on displayed equations.
|
||||
(while (re-search-forward "^[ \t]*\\\\\\[" end t)
|
||||
(let ((el (org-element-context)))
|
||||
(when (eq 'latex-fragment (org-element-type el))
|
||||
(setf cuts (append
|
||||
(list (org-element-property :end el)
|
||||
(- (org-element-property :end el) 2)
|
||||
(+ (org-element-property :begin el) 2)
|
||||
(org-element-property :begin el))
|
||||
cuts)))))
|
||||
(dolist (c (delq end cuts))
|
||||
(fill-region-as-paragraph c end justify)
|
||||
(setq end c))))
|
||||
|
|
171
lisp/ox-html.el
171
lisp/ox-html.el
|
@ -323,7 +323,7 @@ This affects IDs that are determined from the ID property.")
|
|||
pre.src-awk:before { content: 'Awk'; }
|
||||
pre.src-authinfo::before { content: 'Authinfo'; }
|
||||
pre.src-C:before { content: 'C'; }
|
||||
/* pre.src-C++ doesn't work in CSS */
|
||||
pre.src-C\\+\\+:before { content: 'C++'; }
|
||||
pre.src-clojure:before { content: 'Clojure'; }
|
||||
pre.src-css:before { content: 'CSS'; }
|
||||
pre.src-D:before { content: 'D'; }
|
||||
|
@ -1174,15 +1174,19 @@ See `format-time-string' for more information on its components."
|
|||
|
||||
(defcustom org-html-latex-image-options
|
||||
'(:foreground "Black" :background "Transparent"
|
||||
:scale 1.0 :inline nil)
|
||||
:page-width 1.0 :scale 1.0 :image-dir "ltximg" :inline nil)
|
||||
"LaTeX preview options that apply to generated images.
|
||||
This is a HTML-specific counterpart to `org-latex-preview-options', which see.
|
||||
This is a HTML-specific counterpart to
|
||||
`org-latex-preview-appearance-options', which see.
|
||||
|
||||
This also supports the extra property \":inline\", which controls the
|
||||
inlining of images, it can be:
|
||||
- t, to inline all images
|
||||
- a extension, or list of extensions, to inline those formats (e.g. \"svg\")
|
||||
- nil, to never inline images"
|
||||
This supports two extra properties,
|
||||
:image-dir an html-export counterpart of `org-latex-preview-cache', and
|
||||
:inline a list of image formats (or single format symbol) that
|
||||
should not be saved according to :image-dir, but instead
|
||||
inlined in the generated HTML. Valid format symbols are:
|
||||
- png, to inline png images using <img> with a data URI
|
||||
- svg, to inline svg images using <img> with a data URI
|
||||
- svg-embed, to inline svg images using an <svg> element"
|
||||
:group 'org-export-html
|
||||
:package-version '(Org . "9.7")
|
||||
:type 'plist)
|
||||
|
@ -3032,7 +3036,7 @@ CONTENTS is nil. INFO is a plist holding contextual information."
|
|||
;;;; LaTeX Environment
|
||||
|
||||
(defun org-html-prepare-latex-images (parse-tree _backend info)
|
||||
"Make sure that appropriate preview images exist for all LaTeX
|
||||
"Make sure that appropriate preview images exist for all LaTeX.
|
||||
TODO."
|
||||
(when (assq (plist-get info :with-latex) org-latex-preview-process-alist)
|
||||
(let* ((latex-preamble
|
||||
|
@ -3068,7 +3072,7 @@ TODO."
|
|||
(hash (org-latex-preview--hash
|
||||
processing-type latex-preamble value imagetype fg bg number))
|
||||
(options (org-combine-plists
|
||||
org-latex-preview-options
|
||||
org-latex-preview-appearance-options
|
||||
html-options
|
||||
(list :number number
|
||||
:continue-color
|
||||
|
@ -3082,14 +3086,13 @@ TODO."
|
|||
:key hash)
|
||||
fragment-info))
|
||||
(setq prev-fg fg prev-bg bg)))
|
||||
(let ((org-latex-preview-options
|
||||
(list (plist-member html-options :scale))))
|
||||
(when fragment-info
|
||||
(apply #'org-async-wait-for
|
||||
(org-latex-preview--create-image-async
|
||||
processing-type
|
||||
(nreverse fragment-info)
|
||||
:latex-preamble latex-preamble))))
|
||||
(when fragment-info
|
||||
(apply #'org-async-wait-for
|
||||
(org-latex-preview--create-image-async
|
||||
processing-type
|
||||
(nreverse fragment-info)
|
||||
:latex-preamble latex-preamble
|
||||
:appearance-options html-options)))
|
||||
(plist-put info :html-latex-preview-hash-table element-hash-table)
|
||||
nil)))
|
||||
|
||||
|
@ -3182,44 +3185,118 @@ CONTENTS is nil. INFO is a plist holding contextual information."
|
|||
(org-html--as-latex latex-fragment info))
|
||||
|
||||
(defun org-html-latex-image (element info)
|
||||
"TODO"
|
||||
"Transcode the LaTeX fragment or environment ELEMENT from Org to HTML.
|
||||
INFO is a plist holding contextual information, and it is assumed
|
||||
that an image for ELEMENT already exists within it."
|
||||
(let* ((hash (or (gethash element (plist-get info :html-latex-preview-hash-table))
|
||||
(error "Expected LaTeX preview hash to exist for element, but none found")))
|
||||
(path-info (or (org-latex-preview--get-cached hash)
|
||||
(error "Expected LaTeX preview %S to exist in the cache" hash)))
|
||||
(inline-condition (plist-get (plist-get info :html-latex-image-options) :inline))
|
||||
(image-options (plist-get info :html-latex-image-options))
|
||||
(block-p (memq (aref (org-element-property :value element) 1) '(?$ ?\[)))
|
||||
(image-source
|
||||
(if (or (eq inline-condition 't)
|
||||
(member (file-name-extension (car path-info))
|
||||
(org-ensure-list inline-condition)))
|
||||
(let ((coding-system-for-read 'utf-8)
|
||||
(file-name-handler-alist nil))
|
||||
(with-temp-buffer
|
||||
(insert-file-contents-literally (car path-info))
|
||||
(base64-encode-region (point-min) (point-max))
|
||||
(goto-char (point-min))
|
||||
(insert "data:image/svg+xml;base64,")
|
||||
(buffer-string)))
|
||||
(car path-info))))
|
||||
(org-html-latex-image--data path-info hash info block-p)))
|
||||
(unless (and (plist-get (cdr path-info) :height)
|
||||
(plist-get (cdr path-info) :depth))
|
||||
(error "Something went wrong during image generation"))
|
||||
(org-html-close-tag
|
||||
"img"
|
||||
(org-html--make-attribute-string
|
||||
(list :src image-source
|
||||
:alt (org-html-encode-plain-text
|
||||
(org-element-property :value element))
|
||||
:style (if (eq (org-element-type element) 'latex-environment)
|
||||
(format "height: %.4fem"
|
||||
(plist-get (cdr path-info) :height))
|
||||
(if (and (eq (plist-get image-options :inline) 'svg-embed)
|
||||
(eq (plist-get (cdr path-info) :image-type) 'svg))
|
||||
image-source
|
||||
(let ((scaling (org-html-latex-image--scaling path-info info)))
|
||||
(org-html-close-tag
|
||||
"img"
|
||||
(org-html--make-attribute-string
|
||||
(list :src image-source
|
||||
:alt (org-html-encode-plain-text
|
||||
(org-element-property :value element))
|
||||
:style (if block-p
|
||||
(format "height: %.4fem; display: block" (plist-get scaling :height))
|
||||
(format "height: %.4fem; vertical-align: -%.4fem; display: inline-block"
|
||||
(plist-get scaling :height) (plist-get scaling :depth)))
|
||||
:class (format "org-latex org-latex-%s" (if block-p "block" "inline"))))
|
||||
info)))))
|
||||
|
||||
(defun org-html-latex-image--scaling (image-path-info info)
|
||||
"Determine the appropriate (<height> . <depth>) of IMAGE-PATH-INFO given INFO."
|
||||
(let* ((image-options (plist-get info :html-latex-image-options))
|
||||
(rescale-factor (if (eq (plist-get (cdr image-path-info) :image-type) 'svg)
|
||||
(plist-get image-options :scale)
|
||||
1)))
|
||||
(list :height (* rescale-factor (plist-get (cdr image-path-info) :height))
|
||||
:depth (* rescale-factor (plist-get (cdr image-path-info) :depth)))))
|
||||
|
||||
(defun org-html-latex-image--data (image-path-info hash info &optional block-p)
|
||||
"Obtaine the image source for IMAGE-PATH-INFO as a string.
|
||||
This can take the form of a path, data URI, or <svg> element
|
||||
depending on HASH and INFO. BLOCK-P signals that the image
|
||||
should be a block element."
|
||||
(let* ((image-options (plist-get info :html-latex-image-options))
|
||||
(inline-condition (plist-get image-options :inline))
|
||||
(image-dir (plist-get image-options :image-dir))
|
||||
(image-format (plist-get (cdr image-path-info) :image-type))
|
||||
(source-file (car image-path-info)))
|
||||
(cond
|
||||
((or inline-condition
|
||||
(member (file-name-extension source-file)
|
||||
(org-ensure-list inline-condition)))
|
||||
(let ((coding-system-for-read 'utf-8)
|
||||
(file-name-handler-alist nil))
|
||||
(with-temp-buffer
|
||||
(insert-file-contents-literally source-file)
|
||||
(cond
|
||||
((and (eq inline-condition 'svg-embed)
|
||||
(eq image-format 'svg))
|
||||
(goto-char (point-min))
|
||||
(let ((svg-closing-tag (and (search-forward "<svg" nil t)
|
||||
(search-forward ">" nil t))))
|
||||
|
||||
(dolist (search '("<!-- This file was generated by dvisvgm [^\n]+ -->"
|
||||
" height=['\"][^\"']+[\"']"
|
||||
" width=['\"][^\"']+[\"']"))
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward search svg-closing-tag t)
|
||||
(replace-match "")))
|
||||
(goto-char (point-min))
|
||||
(when (re-search-forward "viewBox=['\"][^\"']+[\"']" svg-closing-tag t)
|
||||
(insert
|
||||
" style=\""
|
||||
(let ((scaling (org-html-latex-image--scaling image-path-info info)))
|
||||
(if block-p
|
||||
(format "height: %.4fem; display: block" (plist-get scaling :height))
|
||||
(format "height: %.4fem; vertical-align: -%.4fem; display: inline-block"
|
||||
(plist-get (cdr path-info) :height)
|
||||
(plist-get (cdr path-info) :depth)))
|
||||
:class (if (eq (org-element-type element) 'latex-environment)
|
||||
"org-latex org-latex-environment"
|
||||
"org-latex org-latex-fragment")))
|
||||
info)))
|
||||
(plist-get scaling :height) (plist-get scaling :depth))))
|
||||
"\" class=\"org-latex org-latex-"
|
||||
(if block-p "block" "inline")
|
||||
"\"")))
|
||||
(buffer-string))
|
||||
((eq image-format 'svg)
|
||||
;; Modelled after <https://codepen.io/tigt/post/optimizing-svgs-in-data-uris>.
|
||||
(concat "data:image/svg+xml,"
|
||||
(url-hexify-string
|
||||
(subst-char-in-string ?\" ?\' (buffer-string))
|
||||
'(?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n
|
||||
?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z ?A ?B
|
||||
?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P
|
||||
?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z ?0 ?1 ?2 ?3
|
||||
?4 ?5 ?6 ?7 ?8 ?9 ?- ?_ ?. ?~
|
||||
;;Special additions
|
||||
?\s ?= ?: ?/))))
|
||||
(t
|
||||
(base64-encode-region (point-min) (point-max))
|
||||
(goto-char (point-min))
|
||||
(insert "data:image/" (symbol-name image-format) ";base64,")
|
||||
(buffer-string))))))
|
||||
((stringp image-dir)
|
||||
(let* ((image-dir (expand-file-name image-dir))
|
||||
(image-path (file-name-with-extension
|
||||
(file-name-concat image-dir (substring hash 0 11))
|
||||
(file-name-extension source-file))))
|
||||
(unless (file-directory-p image-dir)
|
||||
(mkdir image-dir t))
|
||||
(unless (file-exists-p image-path)
|
||||
(copy-file source-file image-path))
|
||||
image-path))
|
||||
(t source-file))))
|
||||
|
||||
;;;; Line Break
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
(defvar engrave-faces-latex-output-style)
|
||||
(defvar engrave-faces-current-preset-style)
|
||||
(defvar engrave-faces-latex-mathescape)
|
||||
(defvar engrave-faces-latex-colorbox-strut)
|
||||
|
||||
|
||||
;;; Define Backend
|
||||
|
@ -1291,9 +1292,10 @@ will produce
|
|||
|
||||
% Define a Code environment to prettily wrap the fontified code.
|
||||
\\usepackage[breakable,xparse]{tcolorbox}
|
||||
\\providecommand{\\codefont}{\\footnotesize}
|
||||
\\DeclareTColorBox[]{Code}{o}%
|
||||
{colback=EfD!98!EFD, colframe=EfD!95!EFD,
|
||||
fontupper=\\footnotesize\\setlength{\\fboxsep}{0pt},
|
||||
fontupper=\\setlength{\\fboxsep}{0pt}\\codefont,
|
||||
colupper=EFD,
|
||||
IfNoValueTF={#1}%
|
||||
{boxsep=2pt, arc=2.5pt, outer arc=2.5pt,
|
||||
|
@ -1317,7 +1319,9 @@ as long as it:
|
|||
In the default value the colors \"EFD\" and \"EfD\" are provided
|
||||
as they are respectively the foreground and background colors,
|
||||
just in case they aren't provided by the generated preamble, so
|
||||
we can assume they are always set.
|
||||
we can assume they are always set. The command \"\\codefont\" is
|
||||
also provided (defaulting to \"\\footnotesize\"), to allow the
|
||||
font used in \"Code\" environments to be easily tweaked.
|
||||
|
||||
Within this preamble there are two recognized macro-like placeholders:
|
||||
|
||||
|
@ -1414,7 +1418,19 @@ default values of which are given by `org-latex-engraved-preamble' and
|
|||
(alist-get 'default
|
||||
(if theme
|
||||
(engrave-faces-get-theme (intern theme))
|
||||
engrave-faces-current-preset-style)))))))
|
||||
engrave-faces-current-preset-style))))))
|
||||
(gen-theme-command
|
||||
(lambda (theme)
|
||||
(format "\n\\newcommand{\\engravedtheme%s}{%%\n%s\n}"
|
||||
(replace-regexp-in-string
|
||||
"[^A-Za-z]" "" (symbol-name theme))
|
||||
(replace-regexp-in-string
|
||||
"\\\\newcommand\\\\efstrut[^\n]*\n" ""
|
||||
(replace-regexp-in-string
|
||||
"\\\\newcommand{\\(.+?\\)}\\[1\\]" "\\\\long\\\\def\\1##1"
|
||||
(replace-regexp-in-string
|
||||
"#1" "##1"
|
||||
(funcall gen-theme-spec theme))))))))
|
||||
(when (stringp engraved-theme)
|
||||
(setq engraved-theme (intern engraved-theme)))
|
||||
(when (string-match "^[ \t]*\\[FVEXTRA-SETUP\\][ \t]*\n?" engraved-preamble)
|
||||
|
@ -1450,26 +1466,24 @@ default values of which are given by `org-latex-engraved-preamble' and
|
|||
(if (require 'engrave-faces-latex nil t)
|
||||
(if engraved-themes
|
||||
(concat
|
||||
;; We don't want to re-define the efstrut, so we now need to
|
||||
;; define it seperately.
|
||||
(format "\\newcommand\\efstrut{%s}\n\n"
|
||||
engrave-faces-latex-colorbox-strut)
|
||||
;; Define default theme
|
||||
(funcall gen-theme-command engraved-theme)
|
||||
"\n"
|
||||
;; Define other themes
|
||||
(mapconcat
|
||||
(lambda (theme)
|
||||
(format
|
||||
"\n\\newcommand{\\engravedtheme%s}{%%\n%s\n}"
|
||||
(replace-regexp-in-string "[^A-Za-z]" "" (symbol-name theme))
|
||||
(replace-regexp-in-string
|
||||
"newcommand" "renewcommand"
|
||||
(replace-regexp-in-string
|
||||
"#" "##"
|
||||
(funcall gen-theme-spec theme)))))
|
||||
engraved-themes
|
||||
gen-theme-command
|
||||
(cl-remove-if (lambda (theme) (string= theme (symbol-name engraved-theme)))
|
||||
engraved-themes)
|
||||
"\n")
|
||||
"\n\n"
|
||||
(cond
|
||||
((memq engraved-theme engraved-themes)
|
||||
(concat "\\engravedtheme"
|
||||
(replace-regexp-in-string
|
||||
"[^A-Za-z]" "" engraved-theme)
|
||||
"\n"))
|
||||
(t (funcall gen-theme-spec engraved-theme))))
|
||||
;; Load the default theme
|
||||
"\n\n\\engravedtheme"
|
||||
(replace-regexp-in-string
|
||||
"[^A-Za-z]" "" (symbol-name engraved-theme))
|
||||
"\n")
|
||||
(funcall gen-theme-spec engraved-theme))
|
||||
(warn "Cannot engrave source blocks. Consider installing `engrave-faces'.")
|
||||
"% WARNING syntax highlighting unavailable as engrave-faces-latex was missing.\n")
|
||||
|
@ -2139,9 +2153,20 @@ specified in `org-latex-default-packages-alist' or
|
|||
"\n"))
|
||||
(format-file
|
||||
(and org-latex-precompile
|
||||
(org-latex--precompile
|
||||
info preamble
|
||||
(string-match-p "\\(?:\\\\input{\\|\\\\include{\\)[^/]" preamble)))))
|
||||
;; Precompilation is disabled for xelatex/lualatex for now.
|
||||
(if (member (plist-get info :latex-compiler)
|
||||
'("xelatex" "lualatex"))
|
||||
(progn
|
||||
(display-warning
|
||||
'(org latex-export disable-local-precompile)
|
||||
(format "%s does not support precompilation, disabling LaTeX precompile in this buffer.\n To re-enable, run `(setq-local org-latex-precompile t)' or reopen this buffer."
|
||||
(plist-get info :latex-compiler)))
|
||||
(setf (buffer-local-value
|
||||
'org-latex-precompile (get-buffer (plist-get info :input-buffer)))
|
||||
nil))
|
||||
(org-latex--precompile
|
||||
info preamble
|
||||
(string-match-p "\\(?:\\\\input{\\|\\\\include{\\)[^/]" preamble))))))
|
||||
(when (and format-file (not snippet?))
|
||||
(let ((preamble-parts (split-string preamble (regexp-quote header-split))))
|
||||
(setq preamble (car preamble-parts)
|
||||
|
@ -2729,8 +2754,11 @@ INFO, CODE, and LANG are provided by `org-latex-inline-src-block'."
|
|||
(defun org-latex-inline-src-block--engraved (info code lang)
|
||||
"Transcode an inline src block's content from Org to LaTeX, using engrave-faces.
|
||||
INFO, CODE, and LANG are provided by `org-latex-inline-src-block'."
|
||||
(org-latex-src--engrave-code
|
||||
code lang nil (plist-get info :latex-engraved-options) t))
|
||||
(let ((engraved-theme (plist-get info :latex-engraved-theme)))
|
||||
(org-latex-src--engrave-code
|
||||
code lang
|
||||
(and engraved-theme (intern engraved-theme)) nil
|
||||
(plist-get info :latex-engraved-options) t)))
|
||||
|
||||
(defun org-latex-inline-src-block--listings (info code lang)
|
||||
"Transcode an inline src block's content from Org to LaTeX, using lstlistings.
|
||||
|
@ -3776,7 +3804,7 @@ and FLOAT are extracted from SRC-BLOCK and INFO in `org-latex-src-block'."
|
|||
(when (eq mathescape 'yes)
|
||||
(or engrave-faces-latex-mathescape t)))))
|
||||
|
||||
(defun org-latex-src--engrave-code (content lang &optional theme options inline)
|
||||
(defun org-latex-src--engrave-code (content lang &optional theme explicit-theme-p options inline)
|
||||
"Engrave CONTENT to LaTeX in a LANG-mode buffer, and give the result.
|
||||
When the THEME symbol is non-nil, that theme will be used.
|
||||
|
||||
|
@ -3817,12 +3845,12 @@ to the Verbatim environment or Verb command."
|
|||
(concat "\\begin{Code}\n\\begin{Verbatim}" engraved-options "\n"
|
||||
engraved-code "\n\\end{Verbatim}\n\\end{Code}"))))
|
||||
(kill-buffer engraved-buffer)
|
||||
(if theme
|
||||
(concat "{\\engravedtheme"
|
||||
(if (and theme explicit-theme-p)
|
||||
(concat "\\begingroup\\engravedtheme"
|
||||
(replace-regexp-in-string "[^A-Za-z]" ""
|
||||
(symbol-name theme))
|
||||
engraved-wrapped
|
||||
"}")
|
||||
"\\endgroup")
|
||||
engraved-wrapped))
|
||||
(user-error "Cannot engrave code as `engrave-faces-latex' is unavailable.")))
|
||||
|
||||
|
@ -3856,7 +3884,9 @@ and FLOAT are extracted from SRC-BLOCK and INFO in `org-latex-src-block'."
|
|||
`(("linenos")
|
||||
("firstnumber" ,(number-to-string (1+ num-start)))))
|
||||
(and local-options `((,local-options))))))
|
||||
(engraved-theme (plist-get attributes :engraved-theme))
|
||||
(engraved-doc-theme (plist-get info :latex-engraved-theme))
|
||||
(engraved-theme (or (plist-get attributes :engraved-theme)
|
||||
engraved-doc-theme))
|
||||
(content
|
||||
(let* ((code-info (org-export-unravel-code src-block))
|
||||
(max-width
|
||||
|
@ -3882,7 +3912,8 @@ and FLOAT are extracted from SRC-BLOCK and INFO in `org-latex-src-block'."
|
|||
(org-latex-src--engrave-mathescape-p info options)))
|
||||
(org-latex-src--engrave-code
|
||||
content lang
|
||||
(when engraved-theme (intern engraved-theme))
|
||||
(and engraved-theme (intern engraved-theme))
|
||||
(not (eq engraved-theme engraved-doc-theme))
|
||||
options))))
|
||||
(concat (car float-env) body (cdr float-env))))
|
||||
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
#+latex_header: \usepackage{amsmath}
|
||||
#+latex_header: \usepackage{amssymb}
|
||||
|
||||
* Inline fragments and LaTeX environments
|
||||
:PROPERTIES:
|
||||
:ID: 0b3807b3-69af-40cb-a27a-b380d54879cc
|
||||
:END:
|
||||
|
||||
The LQR problem for a time-periodic system of the form
|
||||
\begin{align}
|
||||
\dot{x} = A(t) x + B(t) u, \quad t \in [0, \infty), \quad x(0) = x_i \label{eq:time-varying-system}\\
|
||||
A(t+T) = A(t),\ B(t + T) = B(t) \nonumber
|
||||
\end{align}
|
||||
is as follows. With a quadratic form defined on \( (x,u) \) pairs
|
||||
\begin{align}
|
||||
\label{eq:quadratic-form}
|
||||
\mathbf{q}(x, u) := \lim_{t_f \to \infty} \int_{0}^{t_f} \begin{bmatrix} x \\ u \end{bmatrix}^{\star} \begin{bmatrix}
|
||||
Q & 0 \\
|
||||
0 & r
|
||||
\end{bmatrix} \begin{bmatrix} x \\ u \end{bmatrix} =: \lim_{t_f \to \infty} \int_{0}^{t_f} q(x,u) dt
|
||||
\end{align}
|
||||
with \( q \ge 0 \) and \( r \ge 0 \), find the infimum of the quadratic form \( \mathbf{q} \) subject to the dynamics:
|
||||
\[
|
||||
\inf_{x,u} \mathbf{q}(x,u).
|
||||
\]
|
||||
\begin{align}
|
||||
\label{eq:lqr-inf-via-duality}
|
||||
\inf_{x, u} \mathbf{q}(x, u) = x_i^{\star} \bar{\lambda}(0) x_i,
|
||||
\end{align}
|
||||
where \( \bar{\lambda} \) is the maximal solution of the differential linear matrix inequality over \( [0, t] \).
|
|
@ -0,0 +1,344 @@
|
|||
;;; test-org-latex-preview.el --- tests for org-latex-preview.el -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (c) 2023 Karthik Chikmagalur
|
||||
;; Authors: Karthik Chikmagalur
|
||||
|
||||
;; This file is not part of GNU Emacs.
|
||||
|
||||
;; This program 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 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Code:
|
||||
(unless (featurep 'org-latex-preview)
|
||||
(signal 'missing-test-dependency "Support for LaTeX previews"))
|
||||
(require 'org-latex-preview)
|
||||
(require 'cl-lib)
|
||||
|
||||
(ert-deftest test-org-latex-preview/assert ()
|
||||
(should t))
|
||||
|
||||
|
||||
;; Test for executables required for preview generation
|
||||
(org-test-for-executable "latex")
|
||||
(org-test-for-executable "dvisvgm")
|
||||
(org-test-for-executable "dvipng")
|
||||
;; Should we test imagemagick?
|
||||
;; (org-test-for-executable "convert")
|
||||
|
||||
|
||||
;; fragment pre-processing tests
|
||||
|
||||
;;; Collect fragments
|
||||
(ert-deftest test-org-latex-preview/collect-fragments-inline ()
|
||||
"Test LaTeX fragment collection"
|
||||
(let ((elements
|
||||
'((latex-fragment
|
||||
(:value "\\( q \\ge 0 \\)" :begin 770 :end 784 :post-blank 1 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-fragment
|
||||
(:value "\\( r \\ge 0 \\)" :begin 788 :end 801 :post-blank 0 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments")))))))))))
|
||||
(org-test-at-id
|
||||
"0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(should
|
||||
(equal (org-latex-preview-collect-fragments 765 807) elements))
|
||||
(should
|
||||
(equal (org-latex-preview--construct-entries elements)
|
||||
'(((770 783 "\\( q \\ge 0 \\)")
|
||||
(788 801 "\\( r \\ge 0 \\)"))
|
||||
nil)))
|
||||
(should
|
||||
(equal (org-latex-preview--construct-entries elements)
|
||||
(org-latex-preview--construct-entries elements 'with-numbering))))))
|
||||
|
||||
(ert-deftest test-org-latex-preview/collect-fragments-environment ()
|
||||
"Test LaTeX fragment collection"
|
||||
(let ((elements
|
||||
'((latex-environment
|
||||
(:begin 241 :end 412 :value "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n" :post-blank 0 :post-affiliated 241 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments")))))))))
|
||||
(org-test-at-id
|
||||
"0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(should
|
||||
(equal (org-latex-preview-collect-fragments 186 426) elements))
|
||||
(should
|
||||
(equal (org-latex-preview--construct-entries elements)
|
||||
'(((241 411 "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n"))
|
||||
nil)))
|
||||
(should
|
||||
(equal (org-latex-preview--construct-entries elements 'with-numbering)
|
||||
'(((241 411 "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n"))
|
||||
(1)))))))
|
||||
|
||||
(ert-deftest test-org-latex-preview/collect-fragments-all ()
|
||||
"Test LaTeX fragment collection"
|
||||
(let ((elements
|
||||
'((latex-environment
|
||||
(:begin 241 :end 412 :value "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n" :post-blank 0 :post-affiliated 241 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))
|
||||
(latex-fragment
|
||||
(:value "\\( (x,u) \\)" :begin 460 :end 472 :post-blank 1 :parent
|
||||
(paragraph
|
||||
(:begin 412 :end 478 :contents-begin 412 :contents-end 478 :post-blank 0 :post-affiliated 412 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-environment
|
||||
(:begin 478 :end 765 :value "\\begin{align}\n\\label{eq:quadratic-form}\n\\mathbf{q}(x, u) := \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} \\begin{bmatrix} x \\\\ u \\end{bmatrix}^{\\star} \\begin{bmatrix}\nQ & 0 \\\\\n0 & r\n \\end{bmatrix} \\begin{bmatrix} x \\\\ u \\end{bmatrix} =: \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} q(x,u) dt\n\\end{align}\n" :post-blank 0 :post-affiliated 478 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))
|
||||
(latex-fragment
|
||||
(:value "\\( q \\ge 0 \\)" :begin 770 :end 784 :post-blank 1 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-fragment
|
||||
(:value "\\( r \\ge 0 \\)" :begin 788 :end 801 :post-blank 0 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-fragment
|
||||
(:value "\\( \\mathbf{q} \\)" :begin 842 :end 859 :post-blank 1 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-fragment
|
||||
(:value "\\[\n\\inf_{x,u} \\mathbf{q}(x,u).\n\\]" :begin 884 :end 917 :post-blank 0 :parent
|
||||
(paragraph
|
||||
(:begin 765 :end 918 :contents-begin 765 :contents-end 918 :post-blank 0 :post-affiliated 765 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-environment
|
||||
(:begin 918 :end 1040 :value "\\begin{align}\n\\label{eq:lqr-inf-via-duality}\n\\inf_{x, u} \\mathbf{q}(x, u) = x_i^{\\star} \\bar{\\lambda}(0) x_i,\n\\end{align}\n" :post-blank 0 :post-affiliated 918 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))
|
||||
(latex-fragment
|
||||
(:value "\\( \\bar{\\lambda} \\)" :begin 1046 :end 1066 :post-blank 1 :parent
|
||||
(paragraph
|
||||
(:begin 1040 :end 1154 :contents-begin 1040 :contents-end 1154 :post-blank 0 :post-affiliated 1040 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments"))))))))
|
||||
(latex-fragment
|
||||
(:value "\\( [0, t] \\)" :begin 1140 :end 1152 :post-blank 0 :parent
|
||||
(paragraph
|
||||
(:begin 1040 :end 1154 :contents-begin 1040 :contents-end 1154 :post-blank 0 :post-affiliated 1040 :mode nil :granularity element :parent
|
||||
(section
|
||||
(:begin 118 :end 1154 :contents-begin 118 :contents-end 1154 :robust-begin 118 :robust-end 1152 :post-blank 0 :post-affiliated 118 :mode section :granularity element :parent
|
||||
(headline
|
||||
(:raw-value "Inline fragments and LaTeX environments" :begin 76 :end 1154 :pre-blank 0 :contents-begin 118 :contents-end 1154 :robust-begin 184 :robust-end 1152 :level 1 :priority nil :tags nil :todo-keyword nil :todo-type nil :post-blank 0 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 76 :ID "0b3807b3-69af-40cb-a27a-b380d54879cc" :title "Inline fragments and LaTeX environments")))))))))))
|
||||
(org-test-at-id
|
||||
"0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(should
|
||||
(equal (org-latex-preview-collect-fragments) elements))
|
||||
(should (equal (org-latex-preview--construct-entries elements)
|
||||
'(((241 411 "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n")
|
||||
(460 471 "\\( (x,u) \\)")
|
||||
(478 764 "\\begin{align}\n\\label{eq:quadratic-form}\n\\mathbf{q}(x, u) := \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} \\begin{bmatrix} x \\\\ u \\end{bmatrix}^{\\star} \\begin{bmatrix}\nQ & 0 \\\\\n0 & r\n \\end{bmatrix} \\begin{bmatrix} x \\\\ u \\end{bmatrix} =: \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} q(x,u) dt\n\\end{align}\n")
|
||||
(770 783 "\\( q \\ge 0 \\)")
|
||||
(788 801 "\\( r \\ge 0 \\)")
|
||||
(842 858 "\\( \\mathbf{q} \\)")
|
||||
(884 917 "\\[\n\\inf_{x,u} \\mathbf{q}(x,u).\n\\]")
|
||||
(918 1039 "\\begin{align}\n\\label{eq:lqr-inf-via-duality}\n\\inf_{x, u} \\mathbf{q}(x, u) = x_i^{\\star} \\bar{\\lambda}(0) x_i,\n\\end{align}\n")
|
||||
(1046 1065 "\\( \\bar{\\lambda} \\)")
|
||||
(1140 1152 "\\( [0, t] \\)"))
|
||||
nil)))
|
||||
(should (equal (org-latex-preview--construct-entries elements 'with-numbering)
|
||||
'(((241 411 "\\begin{align}\n\\dot{x} = A(t) x + B(t) u, \\quad t \\in [0, \\infty), \\quad x(0) = x_i \\label{eq:time-varying-system}\\\\\nA(t+T) = A(t),\\ B(t + T) = B(t) \\nonumber\n\\end{align}\n")
|
||||
(460 471 "\\( (x,u) \\)")
|
||||
(478 764 "\\begin{align}\n\\label{eq:quadratic-form}\n\\mathbf{q}(x, u) := \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} \\begin{bmatrix} x \\\\ u \\end{bmatrix}^{\\star} \\begin{bmatrix}\nQ & 0 \\\\\n0 & r\n \\end{bmatrix} \\begin{bmatrix} x \\\\ u \\end{bmatrix} =: \\lim_{t_f \\to \\infty} \\int_{0}^{t_f} q(x,u) dt\n\\end{align}\n")
|
||||
(770 783 "\\( q \\ge 0 \\)")
|
||||
(788 801 "\\( r \\ge 0 \\)")
|
||||
(842 858 "\\( \\mathbf{q} \\)")
|
||||
(884 917 "\\[\n\\inf_{x,u} \\mathbf{q}(x,u).\n\\]")
|
||||
(918 1039 "\\begin{align}\n\\label{eq:lqr-inf-via-duality}\n\\inf_{x, u} \\mathbf{q}(x, u) = x_i^{\\star} \\bar{\\lambda}(0) x_i,\n\\end{align}\n")
|
||||
(1046 1065 "\\( \\bar{\\lambda} \\)")
|
||||
(1140 1152 "\\( [0, t] \\)"))
|
||||
(1 nil 2 nil nil nil nil 4 nil nil)))))))
|
||||
|
||||
;;; Set up overlays
|
||||
(ert-deftest test-org-latex-preview/ensure-overlay ()
|
||||
(org-test-at-id "0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(org-latex-preview-clear-overlays (point-min) (point-max))
|
||||
(let* ((elements (org-latex-preview-collect-fragments))
|
||||
(entries (car (org-latex-preview--construct-entries elements)))
|
||||
(ov) (all-ovs))
|
||||
(pcase-dolist(`(,beg ,end ,value) entries)
|
||||
(setq ov (org-latex-preview--ensure-overlay beg end))
|
||||
(push ov all-ovs)
|
||||
(should (eq (get-char-property beg 'org-overlay-type) 'org-latex-overlay))
|
||||
(should (eq (overlay-get ov 'org-overlay-type) 'org-latex-overlay))
|
||||
(should (eq (overlay-get ov 'evaporate) t))
|
||||
(should (eq (overlay-get ov 'priority) org-latex-preview--overlay-priority))
|
||||
(should (equal (overlay-get ov 'modification-hooks)
|
||||
(list #'org-latex-preview-auto--mark-overlay-modified)))
|
||||
(should (equal (overlay-get ov 'insert-in-front-hooks)
|
||||
(list #'org-latex-preview-auto--insert-front-handler)))
|
||||
(should (equal (overlay-get ov 'insert-behind-hooks)
|
||||
(list #'org-latex-preview-auto--insert-behind-handler))))
|
||||
(should (eq (length all-ovs) (length elements))))
|
||||
(org-latex-preview-clear-overlays (point-min) (point-max))))
|
||||
|
||||
|
||||
;; Precompilation test
|
||||
;; TODO
|
||||
|
||||
|
||||
;; Process fragments
|
||||
|
||||
;;; No precompilation, no caching
|
||||
(ert-deftest test-org-latex-preview/place-previews-1 ()
|
||||
(org-test-at-id "0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(let ((org-latex-preview-process-precompiled nil)
|
||||
(org-latex-preview-cache 'temp)
|
||||
(org-latex-preview-process-default 'dvisvgm))
|
||||
(org-latex-preview-auto-mode -1)
|
||||
(goto-char 255)
|
||||
(let ((element (org-element-context)))
|
||||
(should (eq (org-element-type element) 'latex-environment))
|
||||
(org-latex-preview-clear-cache (org-element-property :begin element)
|
||||
(org-element-property :end element))
|
||||
(apply #'org-async-wait-for
|
||||
(org-latex-preview--place-from-elements
|
||||
org-latex-preview-process-default
|
||||
(list element)))
|
||||
(let ((ov (cl-some (lambda (o) (and (eq (overlay-get o 'org-overlay-type)
|
||||
'org-latex-overlay)
|
||||
o))
|
||||
(overlays-at (point)))))
|
||||
(should (overlayp ov))
|
||||
(let ((display (overlay-get ov 'display))
|
||||
(face (overlay-get ov 'face))
|
||||
(hidden-face (overlay-get ov 'hidden-face))
|
||||
(preview-image (overlay-get ov 'preview-image)))
|
||||
;; Image properties
|
||||
(should (consp display))
|
||||
(should (eq (car display) 'image))
|
||||
(should (eq (plist-get (cdr display) :type) 'svg))
|
||||
(should (stringp (plist-get (cdr display) :file)))
|
||||
(should (string-suffix-p ".svg" (plist-get (cdr display) :file)))
|
||||
(should (eq preview-image display))
|
||||
;; Face properties
|
||||
(should (eq face 'default))
|
||||
(should (eq hidden-face face))))))))
|
||||
|
||||
(ert-deftest test-org-latex-preview/place-previews-all ()
|
||||
(org-test-at-id "0b3807b3-69af-40cb-a27a-b380d54879cc"
|
||||
(let ((org-latex-preview-process-precompiled nil)
|
||||
(org-latex-preview-cache 'temp)
|
||||
(org-latex-preview-process-default 'dvisvgm))
|
||||
(org-latex-preview-auto-mode -1)
|
||||
(org-latex-preview-clear-cache (point-min) (point-max))
|
||||
(let ((elements (org-latex-preview-collect-fragments)))
|
||||
(apply #'org-async-wait-for
|
||||
(org-latex-preview--place-from-elements
|
||||
org-latex-preview-process-default
|
||||
elements))
|
||||
(dolist (element elements)
|
||||
(let ((ov (cl-some (lambda (o) (and (eq (overlay-get o 'org-overlay-type)
|
||||
'org-latex-overlay)
|
||||
o))
|
||||
(overlays-at (org-element-property :begin element)))))
|
||||
(should (overlayp ov))
|
||||
(let ((display (overlay-get ov 'display))
|
||||
(face (overlay-get ov 'face))
|
||||
(hidden-face (overlay-get ov 'hidden-face))
|
||||
(preview-image (overlay-get ov 'preview-image)))
|
||||
;; Image properties
|
||||
(should (consp display))
|
||||
(should (eq (car display) 'image))
|
||||
(should (eq (plist-get (cdr display) :type) 'svg))
|
||||
(should (stringp (plist-get (cdr display) :file)))
|
||||
(should (string-suffix-p ".svg" (plist-get (cdr display) :file)))
|
||||
(should (eq preview-image display))
|
||||
;; Face properties
|
||||
(should (eq face 'default))
|
||||
(should (eq hidden-face face)))))
|
||||
(org-latex-preview-clear-cache (point-min) (point-max))))))
|
||||
|
||||
;; TODO: Test with precompilation
|
||||
;; TODO: Test with caching
|
||||
|
||||
|
||||
;; dvisvgm filter+callback test
|
||||
;; dvipng filter+callback test
|
||||
;; imagemagick filter+callback test
|
||||
;; TODO
|
||||
|
||||
|
||||
;; Color extraction
|
||||
;; TODO
|
||||
|
||||
|
||||
;; Scaling
|
||||
;; TODO
|
||||
|
||||
|
||||
;; Caching
|
||||
;; TODO
|
||||
|
||||
;;; clear-cache test
|
||||
|
||||
|
||||
;; Numbering
|
||||
;; TODO
|
||||
|
||||
|
||||
;; org-latex-preview-auto-mode
|
||||
;; TODO
|
||||
|
||||
|
||||
;; live previews
|
||||
;; TODO
|
||||
|
||||
|
||||
;; lualatex-specific tests
|
||||
|
||||
|
||||
;; xelatex-specific tests
|
||||
|
||||
(provide 'test-org-latex-preview)
|
||||
;;; test-org-latex-preview.el ends here
|
Loading…
Reference in New Issue