From: "Feng Shu" <tumashu@163.com>
To: orgmode-devel <emacs-orgmode@gnu.org>
Cc: Feng Shu <tumashu@163.com>
Subject: Re: [PATCH] New feature: Use dvisvgm to preview latex formular
Date: Sat, 14 May 2016 22:56:00 +0800 [thread overview]
Message-ID: <87lh3chenz.fsf@163.com> (raw)
In-Reply-To: <87lh3dxibp.fsf@163.com> (Feng Shu's message of "Sat, 14 May 2016 14:30:18 +0800")
[-- Attachment #1: Type: text/plain, Size: 84 bytes --]
"Feng Shu" <tumashu@163.com> writes:
This is version 2, make diff more easy read.
[-- 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: 26431 bytes --]
From 66804cf5642256a38beb0b84ad8194562f34bfce Mon Sep 17 00:00:00 2001
From: Feng Shu <tumashu@163.com>
Date: Sat, 14 May 2016 22:42:53 +0800
Subject: [PATCH] New feature: Use dvisvgm to preview latex formular
Tester should set like below:
(setq org-latex-create-formula-image-program 'dvisvgm)
(setq org-latex-pdf-process
'(:fetcher my-org-latex-pdf-process-format))
(defun my-org-latex-pdf-process-format (&optional texfile snippet caller-info)
(cond
(snippet '("latex -interaction nonstopmode -output-directory %o %f"))
(t '("%latex -interaction nonstopmode -output-directory %o %f"
"%latex -interaction nonstopmode -output-directory %o %f"
"%latex -interaction nonstopmode -output-directory %o %f"))))
* ox-latex.el (org-latex-pdf-process): Add a new config method, :fetcher.
(org-latex-compile): Add a new optional argument: caller-info,
which used to record the caller's info
* 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-latex-create-formula-image-program): Add dvisvgm.
(org-latex-preview-ltximg-directory): Rename from `org-latex-preview-ltximg-directory'.
(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): Add dvisvgm case.
(org-create-formula-image-with-dvisvgm): New function, deal with latex formula with dvisvgm command.
* 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 | 39 +++++++++-----
lisp/org.el | 101 ++++++++++++++++++++++++++++------
lisp/ox-html.el | 19 ++++---
lisp/ox-latex.el | 161 +++++++++++++++++++++++++++++++++++--------------------
4 files changed, 225 insertions(+), 95 deletions(-)
diff --git a/doc/org.texi b/doc/org.texi
index 17b01c2..286fabb 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -10393,10 +10393,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
@@ -10444,10 +10444,10 @@ lines:
@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
+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-latex-create-formula-image-program} 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}),
@@ -11713,6 +11713,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
@@ -11737,13 +11738,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
@@ -12908,6 +12914,7 @@ and open the formula file with the system-registered application.
@end table
@cindex dvipng
+@cindex dvisvgm
@cindex imagemagick
@item PNG images
@@ -12917,16 +12924,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 f45d5d0..d86042c 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -3985,15 +3985,22 @@ When using LaTeXML set this option to
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.
+dvisvgm Process the LaTeX fragments to dvi/xdv file, then convert
+ dvi/xdv files to svg 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"
:group 'org-latex
:version "24.1"
:type '(choice
(const :tag "dvipng" dvipng)
+ (const :tag "dvisvgm" dvisvgm)
(const :tag "imagemagick" imagemagick)))
-(defcustom org-latex-preview-ltxpng-directory "ltxpng/"
+(defalias 'org-latex-preview-ltxpng-directory 'org-latex-preview-ltximg-directory)
+(make-obsolete 'org-latex-preview-ltxpng-directory 'org-latex-preview-ltximg-directory
+ "Org mode version 9.0")
+(defcustom org-latex-preview-ltximg-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
@@ -18996,9 +19003,10 @@ looks only before point, not after."
(org-in-regexp
"\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*")))
-(defun org--format-latex-make-overlay (beg end image)
+(defun org--format-latex-make-overlay (beg end image &optional imagetype)
"Build an overlay between BEG and END using IMAGE file."
- (let ((ov (make-overlay beg end)))
+ (let ((ov (make-overlay beg end))
+ (imagetype (or imagetype 'png)))
(overlay-put ov 'org-overlay-type 'org-latex-overlay)
(overlay-put ov 'evaporate t)
(overlay-put ov
@@ -19008,10 +19016,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.
@@ -19092,7 +19100,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-latex-preview-ltximg-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))
@@ -19123,7 +19131,7 @@ Some of the options can be changed using the variable
checkdir-flag)
(goto-char (point-min))
;; Optimize overlay creation: (info "(elisp) Managing Overlays").
- (when (and overlays (memq processing-type '(dvipng imagemagick)))
+ (when (and overlays (memq processing-type '(dvipng dvisvgm imagemagick)))
(overlay-recenter (point-max)))
(while (re-search-forward math-regexp nil t)
(unless (and overlays
@@ -19148,7 +19156,7 @@ 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)
+ ((dvipng dvisvgm imagemagick)
;; Process to an image.
(cl-incf cnt)
(goto-char beg)
@@ -19172,9 +19180,10 @@ Some of the options can be changed using the variable
org-latex-packages-alist
org-format-latex-options
forbuffer value fg bg))))
+ (imagetype (if (eq processing-type 'dvisvgm) 'svg '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
@@ -19196,7 +19205,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
@@ -19315,10 +19324,10 @@ inspection."
(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.
+This function calls `org-create-formula-image-with-dvipng'
+`org-create-formula-image-with-dvisvgm' 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."
@@ -19330,6 +19339,10 @@ share a good deal of logic."
(org-check-external-command
"dvipng" "needed to convert LaTeX fragments to images")
#'org-create-formula-image-with-dvipng)
+ (dvisvgm
+ (org-check-external-command
+ "dvisvgm" "needed to convert LaTeX fragments to images")
+ #'org-create-formula-image-with-dvisvgm)
(imagemagick
(org-check-external-command
"convert" "you need to install imagemagick")
@@ -19429,6 +19442,64 @@ horizontal and vertical directions."
(delete-file (concat texfilebase e))))
pngfile))))
+(defun org-create-formula-image-with-dvisvgm (string tofile options buffer)
+ "This calls dvisvgm."
+ (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"))
+ (dvifile (concat texfilebase ".dvi"))
+ (xdvfile (concat texfilebase ".xdv"))
+ (svgfile (concat texfilebase ".svg"))
+ (scale (number-to-string (or (plist-get options (if buffer :scale :html-scale)) 2.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-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 '(:name dvisvgm :need dvi))
+ (if (not (or (file-exists-p dvifile)
+ (file-exists-p xdvfile)))
+ (progn (message "Failed to create dvi or xdv file from %s" texfile) nil)
+ (ignore-errors
+ (call-process "dvisvgm" nil nil nil
+ (if (file-exists-p dvifile)
+ dvifile
+ xdvfile)
+ "-n"
+ "-b" "min"
+ "-c" scale
+ "-o" svgfile))
+ (if (not (file-exists-p svgfile))
+ (if org-format-latex-signal-error
+ (error "Failed to create svg file from %s" texfile)
+ (message "Failed to create svg file from %s" texfile)
+ nil)
+ ;; Use the requested file name and clean up
+ (copy-file svgfile tofile 'replace)
+ (dolist (e '(".dvi" ".xdv" ".tex" ".aux" ".log" ".svg" ".out"))
+ (when (file-exists-p (concat texfilebase e))
+ (delete-file (concat texfilebase e))))
+ svgfile))))
+
(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."
diff --git a/lisp/ox-html.el b/lisp/ox-html.el
index b188c38..2c1fa4a 100644
--- a/lisp/ox-html.el
+++ b/lisp/ox-html.el
@@ -818,7 +818,9 @@ 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
+`dvipng' Process the LaTeX fragments to png images. This will also
+ include processing of non-math environments.
+`dvisvgm' Process the LaTeX fragments to svg 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.
@@ -830,7 +832,8 @@ t Synonym for `mathjax'."
: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 dvipng to make png images" dvipng)
+ (const :tag "Use dvisvgm to make svg images" dvisvgm)
(const :tag "Use imagemagick to make images" imagemagick)
(const :tag "Use MathJax to display math" mathjax)
(const :tag "Leave math verbatim" verbatim)))
@@ -2760,9 +2763,9 @@ 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."
+a symbol among `mathjax', `dvipng', `dvisvgm', `imagemagick',
+`verbatim' nil and t. 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 +2780,7 @@ a plist containing export properties."
"\n")
"\n")))))
(setq cache-relpath
- (concat "ltxpng/"
+ (concat "ltximg/"
(file-name-sans-extension
(file-name-nondirectory bfn)))
cache-dir (file-name-directory bfn))
@@ -2801,7 +2804,7 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(case processing-type
((t mathjax)
(org-html-format-latex latex-frag 'mathjax info))
- ((dvipng imagemagick)
+ ((dvipng dvisvgm imagemagick)
(let ((formula-link
(org-html-format-latex latex-frag processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
@@ -2822,7 +2825,7 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(case processing-type
((t mathjax)
(org-html-format-latex latex-frag 'mathjax info))
- ((dvipng imagemagick)
+ ((dvipng dvisvgm imagemagick)
(let ((formula-link
(org-html-format-latex latex-frag processing-type info)))
(when (and formula-link (string-match "file:\\([^]]*\\)" formula-link))
diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index 7fa68c5..ccbd348 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -1143,7 +1143,32 @@ which calls the \"correct\" combinations of auxiliary programs.
Alternatively, this may be a Lisp function that does the
processing, so you could use this to apply the machinery of
AUCTeX or the Emacs LaTeX mode. This function should accept the
-file name as its single argument."
+file name as its single argument.
+
+User can set this variable to a plist, the first element of the
+plist is :fetcher and the second is a function, for example:
+
+ (setq org-latex-pdf-process
+ '(:fetcher my-org-latex-pdf-process-format))
+
+ (defun my-org-late-pdf-process-formt (&optional texfile snippet caller-info)
+ (cond
+ (snippet '(\"latex -interaction nonstopmode -output-directory %o %f\"))
+ (t '(\"%latex -interaction nonstopmode -output-directory %o %f\"
+ \"%latex -interaction nonstopmode -output-directory %o %f\"
+ \"%latex -interaction nonstopmode -output-directory %o %f\"))))
+
+`org-latex-compile' will call the second function, then use the
+returned command list.
+
+the function has three optional arguments: texfile, snippet and
+caller-info, when `org-latex-compile' compile a tex snippet for
+previewing, snippet will set to t and client-info argument will
+record the infomation of org-latex-compile's caller, for example:
+
+ (:name dvisvgm :need dvi)
+
+This information can be used to select tex command."
:group 'org-export-pdf
:type '(choice
(repeat :tag "Shell command sequence"
@@ -3515,7 +3540,7 @@ Return PDF file's name."
async subtreep visible-only body-only ext-plist
(lambda (file) (org-latex-compile file)))))
-(defun org-latex-compile (texfile &optional snippet)
+(defun org-latex-compile (texfile &optional snippet caller-info)
"Compile a TeX file.
TEXFILE is the name of the file being compiled. Processing is
@@ -3525,6 +3550,16 @@ When optional argument SNIPPET is non-nil, TEXFILE is a temporary
file used to preview a LaTeX snippet. In this case, do not
create a log buffer and do not bother removing log files.
+By default, `org-latex-compile' will compile `texfile' to a pdf
+file, but when we compile a tex snippet, the desired output may
+dvi or xdv file instead of pdf file, snippet-generate-function
+can tell `org-latex-compile' the infomation with the argument
+CALLER-INFO, then org-latex-compile can find proper commands
+with this infomation, this argument is a property list, for
+example:
+
+ (:caller dvisvgm :need dvi)
+
Return PDF file name or an error if it couldn't be produced."
(let* ((base-name (file-name-sans-extension (file-name-nondirectory texfile)))
(full-name (file-truename texfile))
@@ -3544,62 +3579,72 @@ Return PDF file name or an error if it couldn't be produced."
(time (current-time))
warnings)
(unless snippet (message "Processing LaTeX file %s..." texfile))
- (save-window-excursion
- (cond
- ;; A function is provided: Apply it.
- ((functionp org-latex-pdf-process)
- (funcall org-latex-pdf-process (shell-quote-argument texfile)))
- ;; A list is provided: Replace %b, %f and %o with appropriate
- ;; values in each command before applying it. Note that while
- ;; "%latex" and "%bibtex" is used in `org-latex-pdf-process',
- ;; they are replaced with "%L" and "%B" to adhere to
- ;; format-spec. Output is redirected to "*Org PDF LaTeX
- ;; Output*" buffer.
- ((consp org-latex-pdf-process)
- (let ((outbuf (and (not snippet)
- (get-buffer-create "*Org PDF LaTeX Output*")))
- (spec (list (cons ?B (shell-quote-argument org-latex-bib-compiler))
- (cons ?L (shell-quote-argument compiler))
- (cons ?b (shell-quote-argument base-name))
- (cons ?f (shell-quote-argument full-name))
- (cons ?o (shell-quote-argument out-dir)))))
- (dolist (command org-latex-pdf-process)
- (let ((c (replace-regexp-in-string
- "%\\(latex\\|bibtex\\)\\>"
- (lambda (str) (upcase (substring str 0 2)))
- command)))
- (shell-command (format-spec c spec) outbuf)))
- ;; Collect standard errors from output buffer.
- (setq warnings (and (not snippet)
- (org-latex--collect-warnings outbuf)))))
- (t (error "No valid command to process to PDF")))
- (let ((pdffile (concat out-dir base-name ".pdf")))
- ;; Check for process failure. Provide collected errors if
- ;; possible.
- (if (or (not (file-exists-p pdffile))
- ;; Only compare times up to whole seconds as some filesystems
- ;; (e.g. HFS+) do not retain any finer granularity.
- (time-less-p (cl-subseq (nth 5 (file-attributes pdffile)) 0 2)
- (cl-subseq time 0 2)))
- (error (format "PDF file %s wasn't produced" pdffile))
- ;; Else remove log files, when specified, and signal end of
- ;; process to user, along with any error encountered.
- (unless snippet
- (when org-latex-remove-logfiles
- (dolist (file (directory-files
- out-dir t
- (concat (regexp-quote base-name)
- "\\(?:\\.[0-9]+\\)?"
- "\\."
- (regexp-opt org-latex-logfiles-extensions))))
- (delete-file file)))
- (message (concat "PDF file produced"
- (cond
- ((eq warnings 'error) " with errors.")
- (warnings (concat " with warnings: " warnings))
- (t "."))))))
- ;; Return output file name.
- pdffile))))
+ (let* ((fetcher-function (plist-get org-latex-pdf-process :fetcher))
+ (latex-pdf-process
+ (if fetcher-function
+ (if (functionp fetcher-function)
+ (funcall fetcher-function
+ (shell-quote-argument texfile) snippet caller-info)
+ (error "`org-latex-pdf-process' set an invalid fetcher function."))
+ org-latex-pdf-process)))
+ (save-window-excursion
+ (cond
+ ;; A function is provided: Apply it.
+ ((functionp latex-pdf-process)
+ (funcall latex-pdf-process (shell-quote-argument texfile)))
+ ;; A list is provided: Replace %b, %f and %o with appropriate
+ ;; values in each command before applying it. Note that while
+ ;; "%latex" and "%bibtex" is used in `org-latex-pdf-process',
+ ;; they are replaced with "%L" and "%B" to adhere to
+ ;; format-spec. Output is redirected to "*Org PDF LaTeX
+ ;; Output*" buffer.
+ ((consp latex-pdf-process)
+ (let ((outbuf (and (not snippet)
+ (get-buffer-create "*Org PDF LaTeX Output*")))
+ (spec (list (cons ?B (shell-quote-argument org-latex-bib-compiler))
+ (cons ?L (shell-quote-argument compiler))
+ (cons ?b (shell-quote-argument base-name))
+ (cons ?f (shell-quote-argument full-name))
+ (cons ?o (shell-quote-argument out-dir)))))
+ (dolist (command latex-pdf-process)
+ (let ((c (replace-regexp-in-string
+ "%\\(latex\\|bibtex\\)\\>"
+ (lambda (str) (upcase (substring str 0 2)))
+ command)))
+ (shell-command (format-spec c spec) outbuf)))
+ ;; Collect standard errors from output buffer.
+ (setq warnings (and (not snippet)
+ (org-latex--collect-warnings outbuf)))))
+ (t (error "No valid command to process to PDF")))
+ (let ((pdffile (concat out-dir base-name ".pdf")))
+ ;; Check for process failure. Provide collected errors if
+ ;; possible.
+ (if (or (not (file-exists-p pdffile))
+ ;; Only compare times up to whole seconds as some filesystems
+ ;; (e.g. HFS+) do not retain any finer granularity.
+ (time-less-p (cl-subseq (nth 5 (file-attributes pdffile)) 0 2)
+ (cl-subseq time 0 2)))
+ ;; When compile a tex snippet, we may only need dvi file
+ (unless snippet
+ (error (format "PDF file %s wasn't produced" pdffile)))
+ ;; Else remove log files, when specified, and signal end of
+ ;; process to user, along with any error encountered.
+ (unless snippet
+ (when org-latex-remove-logfiles
+ (dolist (file (directory-files
+ out-dir t
+ (concat (regexp-quote base-name)
+ "\\(?:\\.[0-9]+\\)?"
+ "\\."
+ (regexp-opt org-latex-logfiles-extensions))))
+ (delete-file file)))
+ (message (concat "PDF file produced"
+ (cond
+ ((eq warnings 'error) " with errors.")
+ (warnings (concat " with warnings: " warnings))
+ (t "."))))))
+ ;; Return output file name.
+ pdffile)))))
(defun org-latex--collect-warnings (buffer)
"Collect some warnings from \"pdflatex\" command output.
--
2.1.4
[-- Attachment #3: Type: text/plain, Size: 6 bytes --]
--
next prev parent reply other threads:[~2016-05-14 15:10 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 [this message]
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 ` (V9) " Feng Shu
2016-05-21 9:38 ` 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=87lh3chenz.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.