From: "Feng Shu" <tumashu@163.com>
To: emacs-orgmode <emacs-orgmode@gnu.org>
Cc: Feng Shu <tumashu@163.com>
Subject: Re: (V9) [PATCH] New feature: Use dvisvgm to preview latex formular
Date: Thu, 19 May 2016 22:01:24 +0800 [thread overview]
Message-ID: <87oa82b0zv.fsf_-_@163.com> (raw)
In-Reply-To: <877feqwd60.fsf@saiph.selenimh> (Nicolas Goaziou's message of "Thu, 19 May 2016 12:32:55 +0200")
[-- Attachment #1: Type: text/plain, Size: 193 bytes --]
Thank you for patiently help, this is v9 patch, inhert feature is
removed from this patch, I need to think it over, maybe submit
patch in the future.
please comment again, thanks again :-)
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-New-feature-Use-dvisvgm-to-preview-latex-formular.patch --]
[-- Type: text/x-diff, Size: 31697 bytes --]
From e18b7a4430ff90d6bcb828e3898ef25c61aba4bd Mon Sep 17 00:00:00 2001
From: Feng Shu <tumashu@163.com>
Date: Tue, 17 May 2016 21:24:35 +0800
Subject: [PATCH] New feature: Use dvisvgm to preview latex formular
* ox-html.el (org-html-with-latex): Add dvisvgm support.
(org-html-with-latex): Add dvisvgm support.
(org-html-format-latex): "ltxpng" -> "ltximg".
(org-html-latex-environment): Add dvisvgm support.
(org-html-latex-fragment): Add dvisvgm support.
* org.el (org-preview-latex-default-process): New variable.
(org-latex-create-formula-image-program): Rename it to `org-preview-latex-default-process'.
(org-latex-preview-ltximg-directory): Rename it to `org-preview-latex-image-directory'.
(org-preview-latex-image-directory): New variable.
(org--format-latex-make-overlay): Add optional image-type, which used to deal with svg.
(org-toggle-latex-fragment): "org-ltxpng" -> "org-ltximg".
(org-format-latex): Add dvisvgm support.
(org-create-formula-image): Big refactor, merge dvipng and imagemagick backend's feature.
Add dvisvgm feature.
(org-preview-latex-process-alist): Add new variable, which used to set
latex preview processes.
(org-create-formula-image-with-dvipng): Useless, removed.
(org-create-formula-image-with-imagemagick): Useless, removed.
* org.texi (@LaTeX{} fragments): Add dvisvgm information.
(Previewing @LaTeX{} fragments): Add dvisvgm information.
(Math formatting in HTML export): Add dvisvgm information.
(Working with @LaTeX{} math snippets): Add dvisvgm information.
---
doc/org.texi | 43 ++++---
lisp/org.el | 383 +++++++++++++++++++++++++++++++-------------------------
lisp/ox-html.el | 43 +++----
3 files changed, 259 insertions(+), 210 deletions(-)
diff --git a/doc/org.texi b/doc/org.texi
index 025baaa..54f3c5a 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -10395,10 +10395,10 @@ snippets will be identified as @LaTeX{} source code:
@item
Environments of any kind@footnote{When MathJax is used, only the
environments recognized by MathJax will be processed. When
-@file{dvipng} program or @file{imagemagick} suite is used to create images,
-any @LaTeX{} environment will be handled.}. The only requirement is that the
-@code{\begin} statement appears on a new line, at the beginning of the line
-or after whitespaces only.
+@file{dvipng} program, @file{dvisvgm} program or @file{imagemagick} suite is
+used to create images, any @LaTeX{} environment will be handled.}. The only
+requirement is that the @code{\begin} statement appears on a new line, at the
+beginning of the line or after whitespaces only.
@item
Text within the usual @LaTeX{} math delimiters. To avoid conflicts with
currency specifications, single @samp{$} characters are only recognized as
@@ -10445,12 +10445,12 @@ lines:
@subsection Previewing @LaTeX{} fragments
@cindex @LaTeX{} fragments, preview
-@vindex org-latex-create-formula-image-program
-If you have a working @LaTeX{} installation and either @file{dvipng} or
-@file{convert} installed@footnote{These are respectively available at
-@url{http://sourceforge.net/projects/dvipng/} and from the @file{imagemagick}
-suite. Choose the converter by setting the variable
-@code{org-latex-create-formula-image-program} accordingly.}, @LaTeX{}
+@vindex org-preview-latex-default-process
+If you have a working @LaTeX{} installation and @file{dvipng}, @file{dvisvgm}
+or @file{convert} installed@footnote{These are respectively available at
+@url{http://sourceforge.net/projects/dvipng/}, @url{http://dvisvgm.bplaced.net/}
+and from the @file{imagemagick} suite. Choose the converter by setting the
+variable @code{org-preview-latex-default-process} accordingly.}, @LaTeX{}
fragments can be processed to produce images of the typeset expressions to be
used for inclusion while exporting to HTML (see @pxref{@LaTeX{} fragments}),
or for inline previewing within Org mode.
@@ -11715,6 +11715,7 @@ You could use @code{http} addresses just as well.
@subsection Math formatting in HTML export
@cindex MathJax
@cindex dvipng
+@cindex dvisvgm
@cindex imagemagick
@LaTeX{} math snippets (@pxref{@LaTeX{} fragments}) can be displayed in two
@@ -11739,13 +11740,18 @@ template can be configure via @code{org-html-mathjax-template}.
If you prefer, you can also request that @LaTeX{} fragments are processed
into small images that will be inserted into the browser page. Before the
availability of MathJax, this was the default method for Org files. This
-method requires that the @file{dvipng} program or @file{imagemagick} suite is
-available on your system. You can still get this processing with
+method requires that the @file{dvipng} program, @file{dvisvgm} or
+@file{imagemagick} suite is available on your system. You can still get
+this processing with
@example
#+OPTIONS: tex:dvipng
@end example
+@example
+#+OPTIONS: tex:dvisvgm
+@end example
+
or:
@example
@@ -12910,6 +12916,7 @@ and open the formula file with the system-registered application.
@end table
@cindex dvipng
+@cindex dvisvgm
@cindex imagemagick
@item PNG images
@@ -12919,16 +12926,20 @@ This option is activated on a per-file basis with
#+OPTIONS: tex:dvipng
@end example
+@example
+#+OPTIONS: tex:dvisvgm
+@end example
+
or:
@example
#+OPTIONS: tex:imagemagick
@end example
-With this option, @LaTeX{} fragments are processed into PNG images and the
-resulting images are embedded in the exported document. This method requires
-that the @file{dvipng} program or @file{imagemagick} suite be available on
-your system.
+With this option, @LaTeX{} fragments are processed into PNG or SVG images and
+the resulting images are embedded in the exported document. This method requires
+that the @file{dvipng} program, @file{dvisvgm} or @file{imagemagick} suite be
+available on your system.
@end enumerate
@node Working with MathML or OpenDocument formula files
diff --git a/lisp/org.el b/lisp/org.el
index 93d66ad..9b1fa69 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -3980,21 +3980,110 @@ When using LaTeXML set this option to
(const :tag "None" nil)
(string :tag "\nShell command")))
-(defcustom org-latex-create-formula-image-program 'dvipng
- "Program to convert LaTeX fragments with.
-
-dvipng Process the LaTeX fragments to dvi file, then convert
- dvi files to png files using dvipng.
- This will also include processing of non-math environments.
-imagemagick Convert the LaTeX fragments to pdf files and use imagemagick
- to convert pdf files to png files"
+(define-obsolete-variable-alias
+ 'org-latex-create-formula-image-program
+ 'org-preview-latex-default-process "25.1")
+
+(defcustom org-preview-latex-default-process 'dvipng
+ "The default process to convert LaTeX fragments to image files.
+All available processes and theirs documents can be found in
+`org-preview-latex-process-alist'."
:group 'org-latex
:version "24.1"
- :type '(choice
- (const :tag "dvipng" dvipng)
- (const :tag "imagemagick" imagemagick)))
+ :type '(symbol :tag "LaTeX preview process" :value dvipng))
+
+(defcustom org-preview-latex-process-alist
+ '((dvipng
+ :programs ("latex" "dvipng" "gs")
+ :document "Compile a LaTeX fragment file to dvi file,
+ then convert the dvi file to png file using dvipng."
+ :message "you need to install programs: latex, dvipng and ghostscript."
+ :image-input-type "dvi"
+ :image-output-type "png"
+ :image-size-adjust (1.0 . 1.0)
+ :latex-compiler ("latex -interaction nonstopmode -output-directory %o %f")
+ :image-converter ("dvipng -fg %F -bg %B -D %D -T tight -o %b.png %f"))
+ (dvisvgm
+ :programs ("latex" "dvisvgm" "gs")
+ :document "Compile a LaTeX fragment file to a dvi file, then convert
+ the dvi file to svg file using dvisvgm program."
+ :message "you need to install programs: latex, dvisvgm and ghostscript."
+ :use-xcolor t
+ :image-input-type "dvi"
+ :image-output-type "svg"
+ :image-size-adjust (1.7 . 1.5)
+ :latex-compiler ("latex -interaction nonstopmode -output-directory %o %f")
+ :image-converter ("dvisvgm %f -n -b min -c %S -o %b.svg"))
+ (imagemagick
+ :programs ("latex" "convert" "gs")
+ :document "Compile a LaTeX fragment file to pdf file, then use imagemagick
+ to convert the pdf file to png file."
+ :message "you need to install programs: latex, imagemagick and ghostscript."
+ :use-xcolor t
+ :image-input-type "pdf"
+ :image-output-type "png"
+ :image-size-adjust (1.0 . 1.0)
+ :latex-compiler ("latex -interaction nonstopmode -output-directory %o %f")
+ :image-converter ("convert -density %S -trim -antialias %f -quality 100 %b.png")))
+ "List definitions of external processes for LaTeX previewing.
+Org mode can use some external commands to generate TeX snippet's image for
+previewing or inserting into HTML files, e.g. dvipng, dvisvgm or imagemagick.
+This variable tells `org-create-formula-image' how to use external commands.
+
+ :name symbol, the process name.
+ :programs list of strings, required programs.
+ :document string, the process document.
+ :message string, message it when required programs can't be found.
+ :image-input-type string, input file type of image converter, for example: \"dvi\".
+ :image-output-type string, output file type of image converter, for example: \"png\".
+ :use-xcolor boolean, when non-nil, `LaTeX' \"xcolor\" macro is used
+ to deal with background and foreground color of image.
+ Otherwise, dvipng style background and foregroud color
+ format are generated. You may then refer to them in
+ command options with \"%F\" and \"%B\".
+ :image-size-adjust cons of numbers, the car element is used to adjust `LaTeX' image
+ size showed in buffer and the cdr element is for HTML file.
+ This option is only useful for process developers, users should
+ use variable `org-format-latex-options' instead.
+ :post-clean list of strings, files matched are to be cleaned up once the
+ image is generated. When nil, the files with \".dvi\", \".xdv\",
+ \".pdf\", \".tex\", \".aux\", \".log\", \".svg\", \".png\", \".jpg\",
+ \".jpeg\" or \".out\" extension will be cleaned up.
+ :latex-header list of string, the `LaTeX' header of snippet file, When nil,
+ the fallback value is used instead, which is controlled by
+ `org-format-latex-header', `org-latex-default-packages-alist' and
+ `org-latex-packages-alist', which see.
+ :latex-compiler list of `LaTeX' commands, each of them will be given to the shell
+ as a command. Place-holders \"%t\", \"%b\" and \"%o\" are replaced
+ with values defined below.
+ :image-converter list of image converter command strings, each of them is given to
+ the shell as a command and support any of the following place-holders
+ defined below.
+
+Place-holders used by `:image-converter' and `:latex-compiler':
+
+1. %i input file name.
+2. %b base name of input file.
+3. %o base directory of input file.
+
+Place-holders only used by `:image-converter':
+
+1. %F foreground of image
+2. %B background of image
+3. %D dpi, which is used to adjust image size by some
+ processing commands.
+4. %S the image size scale ratio, which is used to
+ adjust image size by some processing commands."
+ :group 'org-latex
+ :version "25.1"
+ :type '(alist :tag "LaTeX to image backends"
+ :value-type (plist)))
+
+(define-obsolete-variable-alias
+ 'org-latex-preview-ltxpng-directory
+ 'org-preview-latex-image-directory "25.1")
-(defcustom org-latex-preview-ltxpng-directory "ltxpng/"
+(defcustom org-preview-latex-image-directory "ltximg/"
"Path to store latex preview images.
A relative path here creates many directories relative to the
processed org files paths. An absolute path puts all preview
@@ -18997,9 +19086,12 @@ looks only before point, not after."
(org-in-regexp
"\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*")))
-(defun org--format-latex-make-overlay (beg end image)
- "Build an overlay between BEG and END using IMAGE file."
- (let ((ov (make-overlay beg end)))
+(defun org--format-latex-make-overlay (beg end image &optional imagetype)
+ "Build an overlay between BEG and END using IMAGE file.
+Argument IMAGETYPE is the extension of the displayed image,
+as a string. It defaults to \"png\"."
+ (let ((ov (make-overlay beg end))
+ (imagetype (or (intern imagetype) 'png)))
(overlay-put ov 'org-overlay-type 'org-latex-overlay)
(overlay-put ov 'evaporate t)
(overlay-put ov
@@ -19009,10 +19101,10 @@ looks only before point, not after."
(if (featurep 'xemacs)
(progn
(overlay-put ov 'invisible t)
- (overlay-put ov 'end-glyph (make-glyph (vector 'png :file image))))
+ (overlay-put ov 'end-glyph (make-glyph (vector imagetype :file image))))
(overlay-put ov
'display
- (list 'image :type 'png :file image :ascent 'center)))))
+ (list 'image :type imagetype :file image :ascent 'center)))))
(defun org--list-latex-overlays (&optional beg end)
"List all Org LaTeX overlays in current buffer.
@@ -19093,7 +19185,7 @@ for all fragments in the buffer."
(narrow-to-region beg end))))))
(let ((file (buffer-file-name (buffer-base-buffer))))
(org-format-latex
- (concat org-latex-preview-ltxpng-directory "org-ltxpng")
+ (concat org-preview-latex-image-directory "org-ltximg")
;; Emacs cannot overlay images from remote hosts.
;; Create it in `temporary-file-directory' instead.
(if (or (not file) (file-remote-p file))
@@ -19140,8 +19232,8 @@ Some of the options can be changed using the variable
(goto-char (org-element-property :end context))
(skip-chars-backward " \r\t\n")
(point))))
- (cl-case processing-type
- (mathjax
+ (cond
+ ((eq processing-type 'mathjax)
;; Prepare for MathJax processing.
(if (not (string-match "\\`\\$\\$?" value))
(goto-char end)
@@ -19149,11 +19241,13 @@ Some of the options can be changed using the variable
(if (string= (match-string 0 value) "$$")
(insert "\\[" (substring value 2 -2) "\\]")
(insert "\\(" (substring value 1 -1) "\\)"))))
- ((dvipng imagemagick)
+ ((assq processing-type org-preview-latex-process-alist)
;; Process to an image.
(cl-incf cnt)
(goto-char beg)
- (let* ((face (face-at-point))
+ (let* ((processing-info
+ (cdr (assq processing-type org-preview-latex-process-alist)))
+ (face (face-at-point))
;; Get the colors from the face at point.
(fg
(let ((color (plist-get org-format-latex-options
@@ -19173,9 +19267,10 @@ Some of the options can be changed using the variable
org-latex-packages-alist
org-format-latex-options
forbuffer value fg bg))))
+ (imagetype (or (plist-get processing-info :image-output-type) "png"))
(absprefix (expand-file-name prefix dir))
- (linkfile (format "%s_%s.png" prefix hash))
- (movefile (format "%s_%s.png" absprefix hash))
+ (linkfile (format "%s_%s.%s" prefix hash imagetype))
+ (movefile (format "%s_%s.%s" absprefix hash imagetype))
(sep (and block-type "\n\n"))
(link (concat sep "[[file:" linkfile "]]" sep))
(options
@@ -19197,7 +19292,7 @@ Some of the options can be changed using the variable
(when (eq (overlay-get o 'org-overlay-type)
'org-latex-overlay)
(delete-overlay o)))
- (org--format-latex-make-overlay beg end movefile)
+ (org--format-latex-make-overlay beg end movefile imagetype)
(goto-char end))
(delete-region beg end)
(insert
@@ -19206,7 +19301,7 @@ Some of the options can be changed using the variable
(replace-regexp-in-string "\"" "" value)
'org-latex-src-embed-type
(if block-type 'paragraph 'character)))))))
- (mathml
+ ((eq processing-type 'mathml)
;; Process to MathML.
(unless (org-format-latex-mathml-available-p)
(user-error "LaTeX to MathML converter not configured"))
@@ -19216,8 +19311,8 @@ Some of the options can be changed using the variable
(delete-region beg end)
(insert (org-format-latex-as-mathml
value block-type prefix dir)))
- (otherwise
- (error "Unknown conversion type %s for LaTeX fragments"
+ (t
+ (error "Unknown conversion process %s for LaTeX fragments"
processing-type)))))))))))
(defun org-create-math-formula (latex-frag &optional mathml-file)
@@ -19314,31 +19409,6 @@ inspection."
;; Failed conversion. Return the LaTeX fragment verbatim
latex-frag)))
-(defun org-create-formula-image (string tofile options buffer &optional type)
- "Create an image from LaTeX source using dvipng or convert.
-This function calls either `org-create-formula-image-with-dvipng'
-or `org-create-formula-image-with-imagemagick' depending on the
-value of `org-latex-create-formula-image-program' or on the value
-of the optional TYPE variable.
-
-Note: ultimately these two function should be combined as they
-share a good deal of logic."
- (org-check-external-command
- "latex" "needed to convert LaTeX fragments to images")
- (funcall
- (cl-case (or type org-latex-create-formula-image-program)
- (dvipng
- (org-check-external-command
- "dvipng" "needed to convert LaTeX fragments to images")
- #'org-create-formula-image-with-dvipng)
- (imagemagick
- (org-check-external-command
- "convert" "you need to install imagemagick")
- #'org-create-formula-image-with-imagemagick)
- (t (error
- "Invalid value of `org-latex-create-formula-image-program'")))
- string tofile options buffer))
-
(declare-function org-export-get-backend "ox" (name))
(declare-function org-export--get-global-options "ox" (&optional backend))
(declare-function org-export--get-inbuffer-options "ox" (&optional backend))
@@ -19369,133 +19439,104 @@ horizontal and vertical directions."
(/ (display-mm-height) 25.4)))
(error "Attempt to calculate the dpi of a non-graphic display")))
-;; This function borrows from Ganesh Swami's latex2png.el
-(defun org-create-formula-image-with-dvipng (string tofile options buffer)
- "This calls dvipng."
- (require 'ox-latex)
- (let* ((tmpdir (if (featurep 'xemacs)
- (temp-directory)
- temporary-file-directory))
+(defun org-create-formula-image (string tofile options buffer &optional processing-type)
+ "Create an image from LaTeX source using external processes.
+
+The `LaTeX' STRING will be saved to a temporary `LaTeX' file,
+then converted to a image file by process PROCESSING-TYPE defined
+in `org-preview-latex-process-alist', the image file generated will
+eventually be moved to TOFILE.
+
+The OPTIONS control the size, foreground color and background color
+of image generated.
+
+When BUFFER non-nil, this function is used to `LaTeX' previewing,
+otherwise, used to deal with LaTeX snippts showed in HTML file."
+ (let* ((processing-type (or processing-type 'dvipng))
+ (processing-info
+ (cdr (assq processing-type org-preview-latex-process-alist)))
+ (programs (plist-get processing-info :programs))
+ (error-message (or (plist-get processing-info :message) ""))
+ (use-xcolor (plist-get processing-info :use-xcolor))
+ (image-input-type (plist-get processing-info :image-input-type))
+ (image-output-type (plist-get processing-info :image-output-type))
+ (post-clean (or (plist-get processing-info :post-clean)
+ '(".dvi" ".xdv" ".pdf" ".tex" ".aux" ".log"
+ ".svg" ".png" ".jpg" ".jpeg" ".out")))
+ (latex-header (or (plist-get processing-info :latex-header)
+ (org-create-formula--latex-header)))
+ (latex-compiler (plist-get processing-info :latex-compiler))
+ (image-converter (plist-get processing-info :image-converter))
+ (tmpdir temporary-file-directory)
(texfilebase (make-temp-name
(expand-file-name "orgtex" tmpdir)))
(texfile (concat texfilebase ".tex"))
- (dvifile (concat texfilebase ".dvi"))
- (pngfile (concat texfilebase ".png"))
- (scale (or (plist-get options (if buffer :scale :html-scale)) 1.0))
- ;; This assumes that the display has the same pixel width in
- ;; the horizontal and vertical directions
- (dpi (number-to-string (* scale (if buffer (org--get-display-dpi) 120))))
+ (font-height (face-attribute 'default :height nil))
+ (image-size-adjust (or (plist-get processing-info :image-size-adjust)
+ '(1.0 . 1.0)))
+ (scale (* (if buffer (car image-size-adjust) (cdr image-size-adjust))
+ (or (plist-get options (if buffer :scale :html-scale)) 1.0)))
+ (dpi (* scale (floor (if buffer font-height 140.0))))
(fg (or (plist-get options (if buffer :foreground :html-foreground))
"Black"))
(bg (or (plist-get options (if buffer :background :html-background))
- "Transparent")))
- (if (eq fg 'default) (setq fg (org-dvipng-color :foreground))
- (unless (string= fg "Transparent") (setq fg (org-dvipng-color-format fg))))
- (if (eq bg 'default) (setq bg (org-dvipng-color :background))
- (unless (string= bg "Transparent") (setq bg (org-dvipng-color-format bg))))
- (let ((latex-header (org-create-formula--latex-header)))
+ "Transparent"))
+ (log-buf (get-buffer-create "*Org Preview LaTeX Output*"))
+ (resize-mini-windows nil) ;Fix emacs flicker when generate image.
+ image-input-file image-output-file)
+ (dolist (program programs)
+ (org-check-external-command program error-message))
+ (if use-xcolor
+ (progn (if (eq fg 'default)
+ (setq fg (org-latex-color :foreground))
+ (setq fg (org-latex-color-format fg)))
+ (if (eq bg 'default)
+ (setq bg (org-latex-color :background))
+ (setq bg (org-latex-color-format
+ (if (string= bg "Transparent") "white" bg))))
+ (with-temp-file texfile
+ (insert latex-header)
+ (insert "\n\\begin{document}\n"
+ "\\definecolor{fg}{rgb}{" fg "}\n"
+ "\\definecolor{bg}{rgb}{" bg "}\n"
+ "\n\\pagecolor{bg}\n"
+ "\n{\\color{fg}\n"
+ string
+ "\n}\n"
+ "\n\\end{document}\n")))
+ (if (eq fg 'default)
+ (setq fg (org-dvipng-color :foreground))
+ (unless (string= fg "Transparent")
+ (setq fg (org-dvipng-color-format fg))))
+ (if (eq bg 'default)
+ (setq bg (org-dvipng-color :background))
+ (unless (string= bg "Transparent")
+ (setq bg (org-dvipng-color-format bg))))
(with-temp-file texfile
(insert latex-header)
(insert "\n\\begin{document}\n" string "\n\\end{document}\n")))
- (let ((dir default-directory))
- (ignore-errors
- (cd tmpdir)
- (call-process "latex" nil nil nil texfile))
- (cd dir))
- (if (not (file-exists-p dvifile))
- (progn (message "Failed to create dvi file from %s" texfile) nil)
- (ignore-errors
- (if (featurep 'xemacs)
- (call-process "dvipng" nil nil nil
- "-fg" fg "-bg" bg
- "-T" "tight"
- "-o" pngfile
- dvifile)
- (call-process "dvipng" nil nil nil
- "-fg" fg "-bg" bg
- "-D" dpi
- ;;"-x" scale "-y" scale
- "-T" "tight"
- "-o" pngfile
- dvifile)))
- (if (not (file-exists-p pngfile))
- (if org-format-latex-signal-error
- (error "Failed to create png file from %s" texfile)
- (message "Failed to create png file from %s" texfile)
- nil)
- ;; Use the requested file name and clean up
- (copy-file pngfile tofile 'replace)
- (dolist (e '(".dvi" ".tex" ".aux" ".log" ".png" ".out"))
- (when (file-exists-p (concat texfilebase e))
- (delete-file (concat texfilebase e))))
- pngfile))))
-
-(declare-function org-latex-compile "ox-latex" (texfile &optional snippet))
-(defun org-create-formula-image-with-imagemagick (string tofile options buffer)
- "This calls convert, which is included into imagemagick."
- (require 'ox-latex)
- (let* ((tmpdir (if (featurep 'xemacs)
- (temp-directory)
- temporary-file-directory))
- (texfilebase (make-temp-name
- (expand-file-name "orgtex" tmpdir)))
- (texfile (concat texfilebase ".tex"))
- (pdffile (concat texfilebase ".pdf"))
- (pngfile (concat texfilebase ".png"))
- (scale (or (plist-get options (if buffer :scale :html-scale)) 1.0))
- (dpi (number-to-string (* scale (if buffer (org--get-display-dpi) 120))))
- (fg (or (plist-get options (if buffer :foreground :html-foreground))
- "black"))
- (bg (or (plist-get options (if buffer :background :html-background))
- "white")))
- (if (eq fg 'default) (setq fg (org-latex-color :foreground))
- (setq fg (org-latex-color-format fg)))
- (if (eq bg 'default) (setq bg (org-latex-color :background))
- (setq bg (org-latex-color-format
- (if (string= bg "Transparent") "white" bg))))
- (let ((latex-header (org-create-formula--latex-header)))
- (with-temp-file texfile
- (insert latex-header)
- (insert "\n\\begin{document}\n"
- "\\definecolor{fg}{rgb}{" fg "}\n"
- "\\definecolor{bg}{rgb}{" bg "}\n"
- "\n\\pagecolor{bg}\n"
- "\n{\\color{fg}\n"
- string
- "\n}\n"
- "\n\\end{document}\n")))
- (org-latex-compile texfile t)
- (if (not (file-exists-p pdffile))
- (progn (message "Failed to create pdf file from %s" texfile) nil)
- (ignore-errors
- (if (featurep 'xemacs)
- (call-process "convert" nil nil nil
- "-density" "96"
- "-trim"
- "-antialias"
- pdffile
- "-quality" "100"
- ;; "-sharpen" "0x1.0"
- pngfile)
- (call-process "convert" nil nil nil
- "-density" dpi
- "-trim"
- "-antialias"
- pdffile
- "-quality" "100"
- ;; "-sharpen" "0x1.0"
- pngfile)))
- (if (not (file-exists-p pngfile))
- (if org-format-latex-signal-error
- (error "Failed to create png file from %s" texfile)
- (message "Failed to create png file from %s" texfile)
- nil)
- ;; Use the requested file name and clean up
- (copy-file pngfile tofile 'replace)
- (dolist (e '(".pdf" ".tex" ".aux" ".log" ".png"))
- (when (file-exists-p (concat texfilebase e))
- (delete-file (concat texfilebase e))))
- pngfile))))
+
+ (setq image-input-file
+ (org-compile-file
+ texfile latex-compiler image-input-type
+ (format "Please adjust '%s' part of `org-preview-latex-process-alist'." processing-type)
+ log-buf))
+
+ (setq image-output-file
+ (org-compile-file
+ image-input-file image-converter image-output-type
+ (format "Please adjust '%S' part of `org-preview-latex-process-alist'." processing-type)
+ log-buf
+ `((?F . ,(shell-quote-argument fg))
+ (?B . ,(shell-quote-argument bg))
+ (?D . ,(shell-quote-argument (format "%s" dpi)))
+ (?S . ,(shell-quote-argument (format "%s" (/ dpi 140.0)))))))
+
+ (copy-file image-output-file tofile 'replace)
+ (dolist (e post-clean)
+ (when (file-exists-p (concat texfilebase e))
+ (delete-file (concat texfilebase e))))
+ image-output-file))
(defun org-splice-latex-header (tpl def-pkg pkg snippets-p &optional extra)
"Fill a LaTeX header template TPL.
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index b188c38..530109e 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -816,24 +816,21 @@ fragments.
This option can also be set with the +OPTIONS line,
e.g. \"tex:mathjax\". Allowed values are:
-nil Ignore math snippets.
-`verbatim' Keep everything in verbatim
-`dvipng' Process the LaTeX fragments to images. This will also
- include processing of non-math environments.
-`imagemagick' Convert the LaTeX fragments to pdf files and use
- imagemagick to convert pdf files to png files.
-`mathjax' Do MathJax preprocessing and arrange for MathJax.js to
- be loaded.
-t Synonym for `mathjax'."
+1. t Synonym for `mathjax'.
+2. nil Ignore math snippets.
+3. `verbatim' Keep everything in verbatim
+4. `mathjax' Do MathJax preprocessing and arrange for MathJax.js to
+ be loaded.
+5. other symbol Any symbol of process defined in
+ `org-preview-latex-process-alist', e.g. 'dvipng."
:group 'org-export-html
:version "24.4"
:package-version '(Org . "8.0")
:type '(choice
(const :tag "Do not process math in any way" nil)
- (const :tag "Use dvipng to make images" dvipng)
- (const :tag "Use imagemagick to make images" imagemagick)
+ (const :tag "Leave math verbatim" verbatim)
(const :tag "Use MathJax to display math" mathjax)
- (const :tag "Leave math verbatim" verbatim)))
+ (symbol :tag "Convert to image to display math" :value dvipng)))
;;;; Links :: Generic
@@ -2759,10 +2756,10 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(defun org-html-format-latex (latex-frag processing-type info)
"Format a LaTeX fragment LATEX-FRAG into HTML.
-PROCESSING-TYPE designates the tool used for conversion. It is
-a symbol among `mathjax', `dvipng', `imagemagick', `verbatim' nil
-and t. See `org-html-with-latex' for more information. INFO is
-a plist containing export properties."
+PROCESSING-TYPE designates the tool used for conversion. It can be
+`mathjax', `verbatim', nil, t or symbols in `org-preview-latex-process-alist'.
+for example: `dvipng', `dvisvgm' or `imagemagick'. See `org-html-with-latex'
+for more information.INFO is a plist containing export properties."
(let ((cache-relpath "") (cache-dir ""))
(unless (eq processing-type 'mathjax)
(let ((bfn (or (buffer-file-name)
@@ -2777,7 +2774,7 @@ a plist containing export properties."
"\n")
"\n")))))
(setq cache-relpath
- (concat "ltxpng/"
+ (concat (file-name-as-directory org-preview-latex-image-directory)
(file-name-sans-extension
(file-name-nondirectory bfn)))
cache-dir (file-name-directory bfn))
@@ -2798,10 +2795,10 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(latex-frag (org-remove-indentation
(org-element-property :value latex-environment)))
(attributes (org-export-read-attribute :attr_html latex-environment)))
- (case processing-type
- ((t mathjax)
+ (cond
+ ((member processing-type '(t mathjax))
(org-html-format-latex latex-frag 'mathjax info))
- ((dvipng imagemagick)
+ ((assq processing-type org-preview-latex-process-alist)
(let ((formula-link
(org-html-format-latex latex-frag processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
@@ -2819,10 +2816,10 @@ CONTENTS is nil. INFO is a plist holding contextual information."
CONTENTS is nil. INFO is a plist holding contextual information."
(let ((latex-frag (org-element-property :value latex-fragment))
(processing-type (plist-get info :with-latex)))
- (case processing-type
- ((t mathjax)
+ (cond
+ ((member processing-type '(t mathjax))
(org-html-format-latex latex-frag 'mathjax info))
- ((dvipng imagemagick)
+ ((assq processing-type org-preview-latex-process-alist)
(let ((formula-link
(org-html-format-latex latex-frag processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
--
2.1.4
next prev parent reply other threads:[~2016-05-19 14:15 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-14 6:30 [PATCH] New feature: Use dvisvgm to preview latex formular Feng Shu
2016-05-14 8:47 ` numbchild
2016-05-14 14:56 ` Feng Shu
2016-05-15 2:27 ` Feng Shu
2016-05-15 6:02 ` (version 3) " Feng Shu
2016-05-15 12:14 ` Feng Shu
2016-05-15 22:32 ` Nicolas Goaziou
2016-05-16 5:32 ` Feng Shu
2016-05-16 13:18 ` Nicolas Goaziou
2016-05-16 15:06 ` tumashu
2016-05-16 5:33 ` Feng Shu
2016-05-16 13:19 ` Nicolas Goaziou
2016-05-16 12:05 ` (v6) " Feng Shu
2016-05-16 21:17 ` Nicolas Goaziou
2016-05-16 22:17 ` tumashu
2016-05-17 1:15 ` tumashu
2016-05-18 6:30 ` (V8) " Feng Shu
2016-05-19 8:22 ` Nicolas Goaziou
2016-05-19 9:18 ` tumashu
2016-05-19 10:32 ` Nicolas Goaziou
2016-05-19 14:01 ` Feng Shu [this message]
2016-05-21 9:38 ` (V9) " Nicolas Goaziou
2016-05-21 12:22 ` Feng Shu
2016-05-21 13:35 ` Rasmus
2016-05-15 12:16 ` (version 4) " Feng Shu
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=87oa82b0zv.fsf_-_@163.com \
--to=tumashu@163.com \
--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.