From mboxrd@z Thu Jan 1 00:00:00 1970 From: FengShu Subject: [patch] Need test: New path which is used to preview latex fragements Date: Mon, 26 Mar 2012 14:07:43 +0800 Message-ID: <87limnrj2o.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> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:51861) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SC350-0006kE-UN for emacs-orgmode@gnu.org; Mon, 26 Mar 2012 02:07:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SC34x-0007Vr-QJ for emacs-orgmode@gnu.org; Mon, 26 Mar 2012 02:06:58 -0400 Received: from mail-iy0-f169.google.com ([209.85.210.169]:40105) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SC34x-0007Vb-Fq for emacs-orgmode@gnu.org; Mon, 26 Mar 2012 02:06:55 -0400 Received: by iajr24 with SMTP id r24so9488243iaj.0 for ; Sun, 25 Mar 2012 23:06:53 -0700 (PDT) In-Reply-To: <87y5qohn7m.fsf@gmail.com> (FengShu's message of "Sun, 25 Mar 2012 20:36:13 +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 this is the patch v4, and I think that it's not an experimental toy any more (may be it's a toy :-), for its using range), if you are interested in it and have time, please test it. the most user I think is the CJK people who use xetex... >From 0be0b1d4fed65a5329bf98e6a3cfb0c3d2171e2a Mon Sep 17 00:00:00 2001 From: FengShu Date: Fri, 23 Mar 2012 16:05:37 +0800 Subject: [PATCH] This is a experimental toy ,which use '(car org-latex-to-pdf-process) and imagemagick to convert latex fragements into pngfiles,and then insert them into the editing buffer,you can use it to preview latex formula and so on. the converting path is "latex->pdf->png",which is different from the org default path: "latex->dvi->png" --- lisp/org-exp.el | 16 +++-- lisp/org-html.el | 1 + lisp/org-latex.el | 76 +++++++++++++++--------- lisp/org.el | 164 ++++++++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 208 insertions(+), 49 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-latex.el b/lisp/org-latex.el index a733f31..5f2258a 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -631,12 +631,21 @@ allowed. The default we use here encompasses both." (defcustom org-latex-to-pdf-process '("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. + "pdflatex -interaction nonstopmode -output-directory %o %f" + ("pdflatex -interaction nonstopmode -output-directory %o %f")) + "Commands to process a LaTeX file to a PDF file and +commands to process latex fragments to pdf files +This is a list of strings and a sub-list, the strings of the sub-list +is used to convert latex fragments in editing org buffer which will +be converted to png files and inserted into the editing buffer for +previewing. each of strings (list or sublist) 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 having no sublist, the default command which is used to convert +; latex fragments in editing buffer for previewing will be the first +; string of list (No code available at this time!) 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 @@ -661,30 +670,37 @@ This function should accept the file name as its single argument." (string :tag "Shell command")) (const :tag "2 runs of pdflatex" ("pdflatex -interaction nonstopmode -output-directory %o %f" - "pdflatex -interaction nonstopmode -output-directory %o %f")) + "pdflatex -interaction nonstopmode -output-directory %o %f" + ("pdflatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "3 runs of pdflatex" ("pdflatex -interaction nonstopmode -output-directory %o %f" "pdflatex -interaction nonstopmode -output-directory %o %f" - "pdflatex -interaction nonstopmode -output-directory %o %f")) + "pdflatex -interaction nonstopmode -output-directory %o %f" + ("pdflatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "pdflatex,bibtex,pdflatex,pdflatex" ("pdflatex -interaction nonstopmode -output-directory %o %f" "bibtex %b" "pdflatex -interaction nonstopmode -output-directory %o %f" - "pdflatex -interaction nonstopmode -output-directory %o %f")) + "pdflatex -interaction nonstopmode -output-directory %o %f" + ("pdflatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "2 runs of xelatex" ("xelatex -interaction nonstopmode -output-directory %o %f" - "xelatex -interaction nonstopmode -output-directory %o %f")) + "xelatex -interaction nonstopmode -output-directory %o %f" + ("xelatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "3 runs of xelatex" ("xelatex -interaction nonstopmode -output-directory %o %f" "xelatex -interaction nonstopmode -output-directory %o %f" - "xelatex -interaction nonstopmode -output-directory %o %f")) + "xelatex -interaction nonstopmode -output-directory %o %f" + ("xelatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "xelatex,bibtex,xelatex,xelatex" ("xelatex -interaction nonstopmode -output-directory %o %f" "bibtex %b" "xelatex -interaction nonstopmode -output-directory %o %f" - "xelatex -interaction nonstopmode -output-directory %o %f")) + "xelatex -interaction nonstopmode -output-directory %o %f" + ("xelatex -interaction nonstopmode -output-directory %o %f"))) (const :tag "texi2dvi" - ("texi2dvi -p -b -c -V %f")) + ("texi2dvi -p -b -c -V %f" + ("texi2dvi -p -b -c -V %f"))) (const :tag "rubber" ("rubber -d --into %o %f")) (function))) @@ -1084,22 +1100,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 159bb7f..4f60ae7 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" "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) @@ -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,105 @@ 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 cmds org-latex-to-pdf-process) + (while cmds + (setq latex-frags-cmds (pop cmds)) + (cond + ((listp latex-frags-cmds) + (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))) + (message "%s" 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 +17408,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