From mboxrd@z Thu Jan 1 00:00:00 1970 From: Feng Shu Subject: Re: [patch] Need test: New method which is used to preview latex fragements Date: Wed, 28 Mar 2012 07:48:25 +0800 Message-ID: <87iphpobau.fsf@gmail.com> References: <874ntfyber.fsf@gmail.com> <87zkb6xgv8.fsf@gmail.com> <30714.1332610374@alphaville> <30896.1332611119@alphaville> <32078.1332615285@alphaville> <87y5qohn7m.fsf@gmail.com> <87limnrj2o.fsf_-_@gmail.com> <87iphqlljr.fsf_-_@gmail.com> <87haxawjb2.fsf@gnu.org> <87haxapcof.fsf@gmail.com> <87limmqoyu.fsf@gnu.org> <87k426xk5t.fsf@gmail.com> <87vclq401w.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:47496) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SCg74-0007B2-DX for emacs-orgmode@gnu.org; Tue, 27 Mar 2012 19:47:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SCg71-0007zm-NL for emacs-orgmode@gnu.org; Tue, 27 Mar 2012 19:47:41 -0400 In-Reply-To: <87vclq401w.fsf@gnu.org> (Bastien's message of "Tue, 27 Mar 2012 15:59:23 +0200") 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: Bastien Cc: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain Sorry, I change my name in commit from FengShu to Feng Shu. Thanks for your help! --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Adding-a-new-method-for-previewing-latex-fragements.patch >From ef9c4ad164161c5dfde01dd5d8c3221163adb231 Mon Sep 17 00:00:00 2001 From: Feng Shu Date: Wed, 28 Mar 2012 07:40:04 +0800 Subject: [PATCH] Adding a new method for previewing latex fragements. * org-latex.el (org-latex-to-pdf-process): Get the latex fragements converting command(s) from this variable, now you can save your own latex fragments converting command(s) into this variable. * org-latex.el (org-export-as-pdf): Deal with the changes of 'org-latex-to-pdf-process. * org.el (org-create-formula-image-program): New defcustom, which will be used to set the command converting pdf or dvi files to png files. * org.el (org-create-formula-image): Change its name to 'org-create-formula-image-with-dvipng. * org.el (org-create-formula-image-with-imagemagick): New function by which a latex fragment can be convert to a pdf file and then convert to a png file. * org.el (org-latex-color): New function, which will get an rgb color specification from default background or foreground, and using this specification, we can define a latex color. * org.el (org-latex-color-format): New fuction, which can translate a color-name to specification, and using this specification, we can define a latex color. * org.el (org-format-latex): Add 'imagemagick support. * org-exp.el (org-export-with-LaTeX-fragments): Add 'imagemagick support. * org-html.el (org-export-html-preprocess): Add 'imagemagick support. --- lisp/org-exp.el | 15 +++-- lisp/org-html.el | 1 + lisp/org-latex.el | 57 +++++++++++------- lisp/org.el | 174 ++++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 205 insertions(+), 42 deletions(-) diff --git a/lisp/org-exp.el b/lisp/org-exp.el index eeee1ce..ccf2247 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -537,12 +537,14 @@ 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 files and then use imagemagick + convert pdf files to png files +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 +554,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-latex.el b/lisp/org-latex.el index 4418dee..47be65d 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -632,11 +632,24 @@ allowed. The default we use here encompasses both." '("pdflatex -interaction nonstopmode -output-directory %o %f" "pdflatex -interaction nonstopmode -output-directory %o %f" "pdflatex -interaction nonstopmode -output-directory %o %f") - "Commands to process a LaTeX file to a PDF file. -This is a list of strings, each of them will be given to the shell -as a command. %f in the command will be replaced by the full file name, %b -by the file base name (i.e. without extension) and %o by the base directory -of the file. + "Commands to process a LaTeX file to a PDF file and process latex +fragments to pdf files.By default,this is a list of strings,and each of +strings will be given to the shell as a command. %f in the command will +be replaced by the full file name, %b by the file base name (i.e. without +extension) and %o by the base directory of the file. + +If you set 'org-create-formula-image-program to 'imagemagick or +set 'org-export-with-LaTeX-fragments to 'imagemagick,You can add a +sub-list which contains your own command(s) for latex fragments +previewing,like this: + + '(\"xelatex -interaction nonstopmode -output-directory %o %f\" + \"xelatex -interaction nonstopmode -output-directory %o %f\" + ;; use below command(s) to convert latex fragments + (\"xelatex %f\")) + +If not having any sublist ,the default command which is used to convert +latex fragments will be the first string of the list. The reason why this is a list is that it usually takes several runs of `pdflatex', maybe mixed with a call to `bibtex'. Org does not have a clever @@ -1084,22 +1097,24 @@ when PUB-DIR is set, use this as the publishing directory." (funcall cmds (shell-quote-argument file)) (while cmds (setq cmd (pop cmds)) - (while (string-match "%b" cmd) - (setq cmd (replace-match - (save-match-data - (shell-quote-argument base)) - t t cmd))) - (while (string-match "%f" cmd) - (setq cmd (replace-match - (save-match-data - (shell-quote-argument file)) - t t cmd))) - (while (string-match "%o" cmd) - (setq cmd (replace-match - (save-match-data - (shell-quote-argument output-dir)) - t t cmd))) - (shell-command cmd outbuf))))) + (cond + ((not (listp cmd)) + (while (string-match "%b" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument base)) + t t cmd))) + (while (string-match "%f" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument file)) + t t cmd))) + (while (string-match "%o" cmd) + (setq cmd (replace-match + (save-match-data + (shell-quote-argument output-dir)) + t t cmd))) + (shell-command cmd outbuf))))))) (message (concat "Processing LaTeX file " file "...done")) (setq errors (org-export-latex-get-error outbuf)) (if (not (file-exists-p pdffile)) diff --git a/lisp/org.el b/lisp/org.el index d3b1ddc..d4b5c8a 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -3389,6 +3389,22 @@ 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 files and then use + imagemagick convert pdf files to png files" + + :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." @@ -16896,7 +16912,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 @@ -16960,7 +16976,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) @@ -16981,17 +16998,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" "is needed,please install imagemagick package") + (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) @@ -17127,7 +17152,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) @@ -17189,7 +17214,109 @@ inspection." nil) ;; Use the requested file name and clean up (copy-file pngfile tofile 'replace) - (loop for e in '(".dvi" ".tex" ".aux" ".log" ".png") do + (loop for e in '(".dvi" ".tex" ".aux" ".log" ".png" ".out") 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)) + "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")(setq bg "white"))))) + (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 cmds org-latex-to-pdf-process) + (while cmds + (setq latex-frags-cmds (pop cmds)) + (if (listp latex-frags-cmds) + (setq cmds nil) + (setq latex-frags-cmds (list (car org-latex-to-pdf-process))))) + (while latex-frags-cmds + (setq cmd (pop latex-frags-cmds)) + (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" ".out") do (delete-file (concat texfilebase e))) pngfile)))) @@ -17263,6 +17390,23 @@ 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-latex-color-format (color-name) + "Convert color name to RGB value with format num1,num2,num3" + (apply 'format "%s,%s,%s" + (mapcar 'org-normalize-color + (color-values color-name)))) + (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 --=-=-=--