From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: Re: (v6) [PATCH] New feature: Use dvisvgm to preview latex formular Date: Mon, 16 May 2016 23:17:45 +0200 Message-ID: <87k2itu2h2.fsf@saiph.selenimh> References: <87lh3dxibp.fsf@163.com> <87lh3chenz.fsf@163.com> <8737pjluy5.fsf_-_@163.com> <87posncycg.fsf@163.com> <87inyfuf4d.fsf@saiph.selenimh> <87posmnr7i.fsf_-_@163.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52113) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b2Ptn-0001KK-Tp for emacs-orgmode@gnu.org; Mon, 16 May 2016 17:18:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b2Ptk-00041l-Nx for emacs-orgmode@gnu.org; Mon, 16 May 2016 17:17:58 -0400 Received: from relay4-d.mail.gandi.net ([2001:4b98:c:538::196]:32936) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b2Ptk-000418-EG for emacs-orgmode@gnu.org; Mon, 16 May 2016 17:17:56 -0400 In-Reply-To: <87posmnr7i.fsf_-_@163.com> (Feng Shu's message of "Mon, 16 May 2016 20:05:21 +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" To: Feng Shu Cc: orgmode-devel Hello, "Feng Shu" writes: > This is my modified patch (v6), fix the problems you stated. please review > again, thank! Thank you. Comments follow. > From 29760e5c5876fb6b772f7a6004b7160bc06efba8 Mon Sep 17 00:00:00 2001 > From: Feng Shu > Date: Sat, 14 May 2016 22:42:53 +0800 > Subject: [PATCH] New feature: Use dvisvgm to preview latex formular > > * ox-latex.el (org-latex-pdf-process): org-latex-pdf-process can be a > configure generator (a plist with :generator keyword). > (org-latex-preview-process): new variable, which is used to process > latex snippet. > (org-latex-compile): Add a new optional argument: extra-info. As discussed in another message, I don't think we should mess with `org-latex-compile'. Instead, we could factor out the needed part in `org-latex-compile' and make it a generic function. Then we can introduce a new function to specifically handle previewing related compilation. Note that I'm not asking you to implement the factoring out part in your patch, but to tell me if the following would fulfill your needs for `org-create-formula-image'. I'm sending its docstring again. (defun org-compile-file (source process extension &optional spec log-buffer) "Compile a SOURCE file using PROCESS. PROCESS is either a function or a list of shell commands, as strings. If PROCESS is a function, it is called with a single argument: SOURCE file. It must create a file with the same base name and directory as SOURCE, but using extension. If it is a list of commands, each of them is called using `shell-command'. By default, in each command, %b, %f and %o are replaced, respectively, with SOURCE base name, SOURCE full name and SOURCE directory. It is possible, however, to use different place-holders by specifying them in optional argument SPEC. In this case, SPEC should be an alist (STRING REPLACEMENT-STRING). When PROCESS is a list of commands, optional argument LOG-BUFFER can be set to a buffer or a buffer name. `shell-command' then uses it as an output buffer, which may be used for collecting errors. `default-directory' is set to SOURCE directory during the whole process. Generated file is expected to use the same directory and base name as SOURCE, and end with EXTENSION. Return its filename or raise an error if it wasn't generated upon executing PROCESS." ...) > +If you have a working @LaTeX{} installation and @file{dvipng}, @file{dvisvgm} > +or @file{convert} installed@footnote{These are respectively available at > +@url{http://sourceforge.net/projects/dvipng/}, @url{http://dvisvgm.bplaced.net/} > +and from the @file{imagemagick} suite. Choose the converter by setting the variable You need to use two spaces to separate sentences. > +(defcustom org-latex-to-image-backends You could remove it `org-preview-latex-backends' since it doesn't belong to the "org-latex" namespace. > +dvisvgm Process the LaTeX fragments to dvi/xdv file, then convert > + dvi/xdv files to svg files using dvipng. You probably mean "using dvisvgm". > +Org mode can use some external commands to generate TeX snippet's image for > +previewing or inserting into HTML files, e.g. dvipng, dvisvgm or imagemagick > +this variable tells `org-create-formula-image' how to use external commands. or imagemagick. This variable tells... > + :class symbol, this setting may be useful in future. Meanwhile, I suggest to remove it, unless you have a clear plan in mind. > + :name string, the backend's name. > + :programs list of strings, required programs. > + :message string, message it when required program can't be found. required programs > + :color symbol, if set to `latex', LaTeX \"xcolor\" macro is used > + to deal with background and foreground color of image, > + if set to `divpng', dvipng style background and foregroud color > + format will be generated, you should use them in command options > + with special string: \"%fg\"% and \"%bg%\". are generated; you should used them in ... with special strings: ... > + :size-adjust cons of numbers, the car element is used to adjust latex image > + size showed in buffer and the cdr element is for html file. > + this option is only useful for backend developers, user > + should use variable `org-format-latex-options' instead. This option... users... > + :org-latex-compile boolean, when non-nil, `org-create-formula-image' uses > + `org-latex-compile' to compile tex file, otherwise, you need > + to set latex command in `:commands' option. > + :need-clean list of strings, files matched are to be cleaned up once the > + image is generated. Is it :need-clean or :post-clean? A back-end uses the former, the others the latter. > + :commands list, the commands setting, the following special strings, > + will be replaced to according value before commands called. > + > + 1. %fg% foreground > + 2. %bg% background > + 3. %dpi% dpi, which used to adjust image size by > + some backend's command. which is used > + 4. %scale% the image size scale ratio, which used to > + adjust image size by some backend's command. which is used > + For example, \"%temp-dir%/test\" may be replaced to \"/tmp/test\" > + in linux." Again, please drop "in linux". > + :group 'org-latex > + :version "25.1" > + :type '(alist :tag "LaTeX to image backends" > + :value-type (plist))) This can work, but will need to be refined for a nice Customize interface. > (org-in-regexp > "\\\\[a-zA-Z]+\\*?\\(\\(\\[[^][\n{}]*\\]\\)\\|\\({[^{}\n]*}\\)\\)*"))) > > + (when (and overlays (memq processing-type > + (mapcar #'car org-latex-to-image-backends))) (memq processing-type ...) => (assq processing-type org-latex-to-image-backends) > @@ -19148,11 +19242,14 @@ Some of the options can be changed using the variable > (if (string= (match-string 0 value) "$$") > (insert "\\[" (substring value 2 -2) "\\]") > (insert "\\(" (substring value 1 -1) "\\)")))) > - ((dvipng imagemagick) > + ((member processing-type > + (mapcar #'car org-latex-to-image-backends)) Ditto. > + (let* ((type (or type 'dvipng)) > + (backend-info > + (cdr (assq type org-latex-to-image-backends))) > + (programs (plist-get backend-info :programs)) (cons "latex" (plist-get backend-info :programs)) so you can avoid duplicating checks later. Up to you. > + (error-message (plist-get backend-info :message)) > + (color-style (plist-get backend-info :color)) > + (input-type (plist-get backend-info :input)) > + (output-type (plist-get backend-info :output)) > + (post-clean > + (delete-dups `(,@(plist-get backend-info :post-clean) Isn't it :need-clean? > + ".dvi" ".xdv" ".tex" ".aux" ".log" > + ".svg" ".png" ".jpg" ".jpeg" ".out"))) Why do you force other types since they are already provided by preview image back-ends. You could do instead (or (plist-get backend-info :need-clean) '(".dvi" ...)) > - (case processing-type > - ((t mathjax) > + (cond > + ((member processing-type '(t mathjax)) > (org-html-format-latex latex-frag 'mathjax info)) > - ((dvipng imagemagick) > + ((member processing-type > + (mapcar #'car org-latex-to-image-backends)) See above. > (let ((formula-link > (org-html-format-latex latex-frag processing-type info))) > (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) > @@ -2819,10 +2823,10 @@ CONTENTS is nil. INFO is a plist holding contextual information." > CONTENTS is nil. INFO is a plist holding contextual information." > (let ((latex-frag (org-element-property :value latex-fragment)) > (processing-type (plist-get info :with-latex))) > - (case processing-type > - ((t mathjax) > + (cond > + ((member processing-type '(t mathjax)) > (org-html-format-latex latex-frag 'mathjax info)) > - ((dvipng imagemagick) > + ((member processing-type (mapcar #'car org-latex-to-image-backends)) Ditto. > (let ((formula-link > (org-html-format-latex latex-frag processing-type info))) > (when (and formula-link (string-match "file:\\([^]]*\\)" formula-link)) > diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el > index 7fa68c5..2dddb5e 100644 > --- a/lisp/ox-latex.el > +++ b/lisp/ox-latex.el > @@ -1119,6 +1119,24 @@ A better approach is to use a compiler suit such as `latexmk'." > :version "25.1" > :package-version '(Org . "9.0")) > > +(defcustom org-latex-preview-process I suggest to rename it `org-preview-latex-process' and move it to "org.el". > + '("latex -interaction nonstopmode -output-directory %o %f") > + "Commands to process a LaTeX formula snippet to dvi, xdv or pdf file, > +which will be convert to image for previewing or inserting HTML file. The first line should be a sentence on its own. Maybe Commands to process a LaTeX snippet to dvi, xdv, or pdf. The produced file can be converted to an image and previewed in the buffer or inserted in an HTML file. > + :group 'org-export-pdf > + :type '(choice > + (repeat :tag "Shell command sequence" > + (string :tag "Shell command")) > + (const :tag "Use other latex command" > + ("%latex -interaction nonstopmode -output-directory %o %f")) > + (function))) Note that there is no requirement for this variable to mimic `org-latex-pdf-process'. In particular, the function could accept three arguments (texfile, snippet and extra info) bypassing the need for the :generator trick altogether. Regards, -- Nicolas Goaziou