From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matt Huszagh Subject: Re: patch: add custom latex->html conversion command Date: Sun, 16 Feb 2020 17:06:49 -0800 Message-ID: <87sgjat42e.fsf@gmail.com> References: <87blpz1c29.fsf@gmail.com> <87k14mdptu.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:34971) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j3Us9-0003dt-Tz for emacs-orgmode@gnu.org; Sun, 16 Feb 2020 20:06:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j3Us8-0005F8-JT for emacs-orgmode@gnu.org; Sun, 16 Feb 2020 20:06:53 -0500 In-Reply-To: <87k14mdptu.fsf@gnu.org> 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-mx.org@gnu.org Sender: "Emacs-orgmode" To: Bastien Cc: "emacs-orgmode@gnu.org" --=-=-= Content-Type: text/plain Thanks for the feedback. I've filled out the form you sent and sent it to the email listed. Adjusted patch below. I didn't add a value to the customization. I'm honestly not very familiar with the customize interface since I never use it. Is that a default value if the user selects string from the customize interface? If it is I think it's probably best to leave it blank since this is really meant to be open-ended. For instance, I doubt the example I give would work on windows, so that might be more confusing than helpful in that case. What do you think? Happy to set it to whatever. Matt --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-add-custom-command-option-when-converting-latex-frag.patch >From 6b2495c8aef0b67fd00ad27a0056e79f42c23c06 Mon Sep 17 00:00:00 2001 From: Matt Huszagh Date: Sun, 16 Feb 2020 16:52:02 -0800 Subject: [PATCH] add custom command option when converting latex fragments to html * lisp/org.el (org-latex-to-html-convert-command): Add custom command option to convert a latex fragment directly into HTML. (org-format-latex): Add condition for this command to org-format-latex. (org-format-latex-as-html): Command that ultimately does the conversion work. It uses the user-specified command and applies to the latex fragment. It then returns the resulting HTML. * lisp/ox-html.el (org-html-with-latex): Document 'html symbol. (org-html-format-latex): This custom HTML conversion, like mathjax, doesn't require preprocessing. (org-html-latex-fragment): Add condition to org-html-latex-fragment for html symbol. This allows you to set a custom command `org-latex-to-html-convert-command' that will take as input a latex fragment and use it to generate html for export. This is very open-ended in the sense that you can use any shell-command you want. I've added the ability in order to use latexml, but you could use any other tool that generates HTML output text. --- lisp/org.el | 29 +++++++++++++++++++++++++++++ lisp/ox-html.el | 9 +++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 97ce7ec43..7cc9e8687 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -3203,6 +3203,22 @@ When using LaTeXML set this option to (const :tag "None" nil) (string :tag "\nShell command"))) +(defcustom org-latex-to-html-convert-command nil + "Command to convert LaTeX fragments to HTML. +This command is very open-ended: the output of the command will +directly replace the latex fragment in the resulting HTML. +Replace format-specifiers in the command as noted below and use +`shell-command' to convert LaTeX to HTML. +%i: The latex fragment to be converted. + +For example, this could be used with LaTeXML as +\"latexmlc 'literal:%i' --profile=math --preload=siunitx.sty 2>/dev/null\"." + :group 'org-latex + :package-version '(Org . "9.5") + :type '(choice + (const :tag "None" nil) + (string :tag "\nShell command"))) + (defcustom org-preview-latex-default-process 'dvipng "The default process to convert LaTeX fragments to image files. All available processes and theirs documents can be found in @@ -15613,6 +15629,10 @@ 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) "\\)")))) + ((eq processing-type 'html) + (goto-char beg) + (delete-region beg end) + (insert (org-format-latex-as-html value))) ((assq processing-type org-preview-latex-process-alist) ;; Process to an image. (cl-incf cnt) @@ -15778,6 +15798,15 @@ inspection." ;; Failed conversion. Return the LaTeX fragment verbatim latex-frag))) +(defun org-format-latex-as-html (latex-frag) + "Convert latex to html with a custom conversion command. +`LATEX-FRAG' is the latex fragment +Set the custom command with `org-latex-to-html-convert-command'." + (let ((cmd (format-spec org-latex-to-html-convert-command + `((?i . ,latex-frag))))) + (message "Running %s" cmd) + (setq shell-command-output (shell-command-to-string cmd)))) + (defun org--get-display-dpi () "Get the DPI of the display. The function assumes that the display has the same pixel width in diff --git a/lisp/ox-html.el b/lisp/ox-html.el index ea6aa63c3..b5cbf4cfc 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -776,6 +776,8 @@ e.g. \"tex:mathjax\". Allowed values are: `verbatim' Keep everything in verbatim `mathjax', t Do MathJax preprocessing and arrange for MathJax.js to be loaded. + `html' Use `org-latex-to-html-convert-command' to convert + LaTeX fragments to HTML. SYMBOL Any symbol defined in `org-preview-latex-process-alist', e.g., `dvipng'." :group 'org-export-html @@ -2776,12 +2778,13 @@ CONTENTS is nil. INFO is a plist holding contextual information." (defun org-html-format-latex (latex-frag processing-type info) "Format a LaTeX fragment LATEX-FRAG into HTML. PROCESSING-TYPE designates the tool used for conversion. It can -be `mathjax', `verbatim', nil, t or symbols in +be `mathjax', `verbatim', `html', nil, t or symbols in `org-preview-latex-process-alist', e.g., `dvipng', `dvisvgm' or `imagemagick'. See `org-html-with-latex' for more information. INFO is a plist containing export properties." (let ((cache-relpath "") (cache-dir "")) - (unless (eq processing-type 'mathjax) + (unless (or (eq processing-type 'mathjax) + (eq processing-type 'html)) (let ((bfn (or (buffer-file-name) (make-temp-name (expand-file-name "latex" temporary-file-directory)))) @@ -2895,6 +2898,8 @@ CONTENTS is nil. INFO is a plist holding contextual information." (cond ((memq processing-type '(t mathjax)) (org-html-format-latex latex-frag 'mathjax info)) + ((memq processing-type '(t html)) + (org-html-format-latex latex-frag 'html info)) ((assq processing-type org-preview-latex-process-alist) (let ((formula-link (org-html-format-latex latex-frag processing-type info))) -- 2.25.0 --=-=-=--