emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] [patch] Need test: New path which is used to preview latex fragement


From: FengShu
Subject: [O] [patch] Need test: New path which is used to preview latex fragements
Date: Mon, 26 Mar 2012 14:07:43 +0800
User-agent: Gnus/5.130004 (Ma Gnus v0.4) Emacs/24.0.94 (gnu/linux)

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 <address@hidden>
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

  
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]