emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [O] [patch] Need test: New method which is used to preview latex fra


From: FengShu
Subject: Re: [O] [patch] Need test: New method which is used to preview latex fragements
Date: Tue, 27 Mar 2012 12:23:04 +0800
User-agent: Gnus/5.130004 (Ma Gnus v0.4) Emacs/24.0.94 (gnu/linux)

this is v5 patch, if you want to use it,you can apply the patch and
set like this:

#+begin_src emacs-lisp
  (setq org-create-formula-image-program 'imagemagick)
  (setq org-export-with-LaTeX-fragments 'imagemagick)
#+end_src 


from cdf2a649e4a4583c855b538cac51b6257ca95817 Mon Sep 17 00:00:00 2001
From: FengShu <address@hidden>
Date: Fri, 23 Mar 2012 16:05:37 +0800
Subject: [PATCH] Adding new method for previewing latex fragments,which
 convert latex fragments into pdf files,then use imagemagick
 convert the pdf files into png files,and then insert them
 into the editing buffer for the latex fomula previewing.

the converting path is "latex->pdf->png",which is different from the
default path: "latex->dvi->png"
---
 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 a733f31..51347b8 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 159bb7f..67ad5c6 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."
@@ -16916,7 +16932,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 +16996,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 +17018,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 +17172,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)
@@ -17209,7 +17234,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))))
 
@@ -17283,6 +17410,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




reply via email to

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