From mboxrd@z Thu Jan 1 00:00:00 1970 From: FengShu Subject: Re: Need Help: [patch] A experimental toy which is used to preview latex fragements Date: Sat, 24 Mar 2012 21:34:19 +0800 Message-ID: <87zkb6xgv8.fsf@gmail.com> References: <874ntfyber.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:38036) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SBR69-0002QM-FX for emacs-orgmode@gnu.org; Sat, 24 Mar 2012 09:33:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SBR66-0007fL-Mv for emacs-orgmode@gnu.org; Sat, 24 Mar 2012 09:33:37 -0400 Received: from mail-iy0-f169.google.com ([209.85.210.169]:50778) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SBR66-0007f6-Dp for emacs-orgmode@gnu.org; Sat, 24 Mar 2012 09:33:34 -0400 Received: by iajr24 with SMTP id r24so7411917iaj.0 for ; Sat, 24 Mar 2012 06:33:30 -0700 (PDT) In-Reply-To: <874ntfyber.fsf@gmail.com> (FengShu's message of "Fri, 23 Mar 2012 16:22:20 +0800") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain The default path by which we can preview latex fragments is like this: latex -> dvi -> png , and this path works very well to the people who mainly use pdflatex. But,if you mainly use *xelatex* and use some features which is only available in *xelatex* ,for example using system fonts: #+latex_header: \setsansfont{WenQuanYi Zen Hei} you will find that previewing latex fragments doesn't work I find that xelatex can't produce dvi output which can be converted to png by dvipng. so I want to use this path: "latex -> pdf ->png" and hack to get this patch, this is version 2, and it doesn't affect the default behaver if you don't set some variables. At this time ,it can't covert all the latex fragments in the buffer and only convert one, I can't find the problem due my pool computer language ability. so I need help! --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Ihis-is-a-experimental-toy-which-use-car-org-latex-t.patch >From 3708a4b1cf4e94e5ce0d87ca8bec6e6367c40bce Mon Sep 17 00:00:00 2001 From: FengShu Date: Fri, 23 Mar 2012 16:05:37 +0800 Subject: [PATCH] Ihis is a experimental toy, which use '(car org-latex-to-pdf-process) to convert latex formula,the converting path is "latex->pdf->png" using imagemagick. --- lisp/org-exp.el | 16 ++++-- lisp/org-html.el | 1 + lisp/org.el | 157 +++++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 154 insertions(+), 20 deletions(-) diff --git a/lisp/org-exp.el b/lisp/org-exp.el index eeee1ce..0317539 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -537,12 +537,15 @@ This option can also be set with the +OPTIONS line, e.g. \"LaTeX:mathjax\". Allowed values are: -nil Don't do anything. -verbatim Keep everything in verbatim -dvipng Process the LaTeX fragments to images. - This will also include processing of non-math environments. -t Do MathJax preprocessing if there is at least on math snippet, - and arrange for MathJax.js to be loaded. +nil Don't do anything. +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 with program: + '(car org-latex-to-pdf-process), And then use + imagemagick convert pdf to png +t Do MathJax preprocessing if there is at least on math snippet, + and arrange for MathJax.js to be loaded. The default is nil, because this option needs the `dvipng' program which is not available on all systems." @@ -552,6 +555,7 @@ is not available on all systems." (const :tag "Do not process math in any way" nil) (const :tag "Obsolete, use dvipng setting" t) (const :tag "Use dvipng to make images" dvipng) + (const :tag "Use imagemagick to make images" imagemagick) (const :tag "Use MathJax to display math" mathjax) (const :tag "Leave math verbatim" verbatim))) diff --git a/lisp/org-html.el b/lisp/org-html.el index 2de2ea9..15a6c3e 100644 --- a/lisp/org-html.el +++ b/lisp/org-html.el @@ -685,6 +685,7 @@ The default is an extended format of the ISO 8601 specification." ((eq (plist-get parameters :LaTeX-fragments) 'verbatim) 'verbatim) ((eq (plist-get parameters :LaTeX-fragments) 'mathjax ) 'mathjax) ((eq (plist-get parameters :LaTeX-fragments) t ) 'mathjax) + ((eq (plist-get parameters :LaTeX-fragments) 'imagemagick ) 'imagemagick) ((eq (plist-get parameters :LaTeX-fragments) 'dvipng ) 'dvipng) (t nil)))) (goto-char (point-min)) diff --git a/lisp/org.el b/lisp/org.el index 159bb7f..c8bb3ef 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -3389,6 +3389,23 @@ When using MathToWeb as the converter, set this to :type '(choice (const :tag "None" nil) (string :tag "\nShell command"))) +(defcustom org-create-formula-image-program 'dvipng + "When a org file you are editing include some latex fragments, +you want to preview them,you can convert them into png files and +then insert into the org buffers + +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 with program: + '(car org-latex-to-pdf-process), And then use + imagemagick convert pdf to png" + + :group 'org-latex + :version "24.1" + :type '(choice + (const :tag "dvipng" dvipng) + (const :tag "imagemagick" imagemagick))) (defun org-format-latex-mathml-available-p () "Return t if `org-latex-to-mathml-convert-command' is usable." @@ -16916,7 +16933,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (concat "ltxpng/" (file-name-sans-extension (file-name-nondirectory buffer-file-name))) - default-directory 'overlays msg at 'forbuffer 'dvipng) + default-directory 'overlays msg at 'forbuffer org-create-formula-image-program) (message msg "done. Use `C-c C-c' to remove images."))))) (defvar org-latex-regexps @@ -16980,7 +16997,8 @@ Some of the options can be changed using the variable '(org-protected t)))) (add-text-properties (match-beginning n) (match-end n) '(org-protected t)))) - ((eq processing-type 'dvipng) + ((or (eq processing-type 'dvipng) + (eq processing-type 'imagemagick)) ;; Process to an image (setq txt (match-string n) beg (match-beginning n) end (match-end n) @@ -17001,17 +17019,25 @@ Some of the options can be changed using the variable (unless checkdir ; make sure the directory exists (setq checkdir t) (or (file-directory-p todir) (make-directory todir t))) - - (unless executables-checked - (org-check-external-command - "latex" "needed to convert LaTeX fragments to images") - (org-check-external-command - "dvipng" "needed to convert LaTeX fragments to images") - (setq executables-checked t)) - - (unless (file-exists-p movefile) - (org-create-formula-image - txt movefile opt forbuffer)) + (cond + ((eq processing-type 'dvipng) + (unless executables-checked + (org-check-external-command + "latex" "needed to convert LaTeX fragments to images") + (org-check-external-command + "dvipng" "needed to convert LaTeX fragments to images") + (setq executables-checked t) + (unless (file-exists-p movefile) + (org-create-formula-image-with-dvipng + txt movefile opt forbuffer)))) + ((eq processing-type 'imagemagick) + (unless executables-checked + (org-check-external-command + "convert" "needed to convert LaTeX fragments to images") + (setq executables-checked t) + (unless (file-exists-p movefile) + (org-create-formula-image-with-imagemagick + txt movefile opt forbuffer))))) (if overlays (progn (mapc (lambda (o) @@ -17147,7 +17173,7 @@ inspection." latex-frag))) ;; This function borrows from Ganesh Swami's latex2png.el -(defun org-create-formula-image (string tofile options buffer) +(defun org-create-formula-image-with-dvipng (string tofile options buffer) "This calls dvipng." (require 'org-latex) (let* ((tmpdir (if (featurep 'xemacs) @@ -17212,6 +17238,98 @@ inspection." (loop for e in '(".dvi" ".tex" ".aux" ".log" ".png") do (delete-file (concat texfilebase e))) pngfile)))) +(defun org-create-formula-image-with-imagemagick (string tofile options buffer) + "This calls convert, which is included into imagemagick." + (require 'org-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")) + (fnh (if (featurep 'xemacs) + (font-height (face-font 'default)) + (face-attribute 'default :height nil))) + (scale (or (plist-get options (if buffer :scale :html-scale)) 1.0)) + (dpi (number-to-string (* scale (floor (* 0.9 (if buffer fnh 140.)))))) + (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))) + (if (eq bg 'default) (setq bg (org-latex-color :background))) + (with-temp-file texfile + (insert (org-splice-latex-header + org-format-latex-header + org-export-latex-default-packages-alist + org-export-latex-packages-alist t + org-format-latex-header-extra)) + (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" ) + (require 'org-latex) + (org-export-latex-fix-inputenc)) + (let ((dir default-directory)) + (condition-case nil + (progn + (cd tmpdir) + (setq cmd (car org-latex-to-pdf-process)) + (while (string-match "%b" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument texfile)) + t t cmd))) + (while (string-match "%f" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument (file-name-nondirectory texfile))) + t t cmd))) + (while (string-match "%o" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument (file-name-directory texfile))) + t t cmd))) + (shell-command cmd)) + (error nil)) + (cd dir)) + (if (not (file-exists-p pdffile)) + (progn (message "Failed to create pdf file from %s" texfile) nil) + (condition-case nil + (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)) + (error nil)) + (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) + (loop for e in '(".pdf" ".tex" ".aux" ".log" ".png") do + (delete-file (concat texfilebase e))) + pngfile)))) (defun org-splice-latex-header (tpl def-pkg pkg snippets-p &optional extra) "Fill a LaTeX header template TPL. @@ -17283,6 +17401,17 @@ SNIPPETS-P indicates if this is run to create snippet images for HTML." ((eq attr :background) 'background)))) (color-values (face-attribute 'default attr nil)))))) +(defun org-latex-color (attr) + "Return an rgb color specification for latex color package." + (apply 'format "%s,%s,%s" + (mapcar 'org-normalize-color + (if (featurep 'xemacs) + (color-rgb-components + (face-property 'default + (cond ((eq attr :foreground) 'foreground) + ((eq attr :background) 'background)))) + (color-values (face-attribute 'default attr nil)))))) + (defun org-normalize-color (value) "Return string to be used as color value for an RGB component." (format "%g" (/ value 65535.0))) -- 1.7.9.1 --=-=-=--