From 57366f385a2f1f35bbe741d7542096db81368c72 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Thu, 17 Mar 2011 11:23:07 +0100 Subject: Big changes, last one before I wipe it all. * Added muse * Added graphviz-dot-mode * Remove all trailing whitespace on save. This is the last commit I'm going to do before throwing it all away again. --- emacs.d/elisp/muse/muse-latex2png.el | 277 +++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 emacs.d/elisp/muse/muse-latex2png.el (limited to 'emacs.d/elisp/muse/muse-latex2png.el') diff --git a/emacs.d/elisp/muse/muse-latex2png.el b/emacs.d/elisp/muse/muse-latex2png.el new file mode 100644 index 0000000..2b4373d --- /dev/null +++ b/emacs.d/elisp/muse/muse-latex2png.el @@ -0,0 +1,277 @@ +;; muse-latex2png.el --- generate PNG images from inline LaTeX code + +;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 +;; Free Software Foundation, Inc. + +;; Author: Michael Olson +;; Created: 12-Oct-2005 + +;; This file is part of Emacs Muse. It is not part of GNU Emacs. + +;; Emacs Muse is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published +;; by the Free Software Foundation; either version 3, or (at your +;; option) any later version. + +;; Emacs Muse is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with Emacs Muse; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; This was taken from latex2png.el, by Ganesh Swami , which was made for emacs-wiki. It has since +;; been extensively rewritten for Muse. + +;;; To do + +;; Remove stale image files. This could be done by making a function +;; for `muse-before-publish-hook' that deletes according to +;; (muse-page-name). + +;;; Code + +(require 'muse-publish) + +(defgroup muse-latex2png nil + "Publishing LaTeX formulas as PNG files." + :group 'muse-publish) + +(defcustom muse-latex2png-img-dest "./latex" + "The folder where the generated images will be placed. +This is relative to the current publishing directory." + :type 'string + :group 'muse-latex2png) + +(defcustom muse-latex2png-scale-factor 2.5 + "The scale factor to be used for sizing the resulting LaTeX output." + :type 'number + :group 'muse-latex2png) + +(defcustom muse-latex2png-fg "Black" + "The foreground color." + :type 'string + :group 'muse-latex2png) + +(defcustom muse-latex2png-bg "Transparent" + "The background color." + :type 'string + :group 'muse-latex2png) + +(defcustom muse-latex2png-template + "\\documentclass{article} +\\usepackage{fullpage} +\\usepackage{amssymb} +\\usepackage[usenames]{color} +\\usepackage{amsmath} +\\usepackage{latexsym} +\\usepackage[mathscr]{eucal} +%preamble% +\\pagestyle{empty} +\\begin{document} +{%code%} +\\end{document}\n" + "The LaTeX template to use." + :type 'string + :group 'muse-latex2png) + +(defun muse-latex2png-move2pubdir (file prefix pubdir) + "Move FILE to the PUBDIR folder. + +This is done so that the resulting images do not clutter your +main publishing directory. + +Old files with PREFIX in the name are deleted." + (when file + (if (file-exists-p file) + (progn + (unless (file-directory-p pubdir) + (message "Creating latex directory %s" pubdir) + (make-directory pubdir)) + (copy-file file (expand-file-name (file-name-nondirectory file) + pubdir) + t) + (delete-file file) + (concat muse-latex2png-img-dest "/" (file-name-nondirectory file))) + (message "Cannot find %s!" file)))) + +(defun muse-latex2png (code prefix preamble) + "Convert the LaTeX CODE into a png file beginning with PREFIX. +PREAMBLE indicates extra packages and definitions to include." + (unless preamble + (setq preamble "")) + (unless prefix + (setq prefix "muse-latex2png")) + (let* ((tmpdir (cond ((boundp 'temporary-file-directory) + temporary-file-directory) + ((fboundp 'temp-directory) + (temp-directory)) + (t "/tmp"))) + (texfile (expand-file-name + (concat prefix "__" (format "%d" (abs (sxhash code)))) + tmpdir)) + (defalt-directory default-directory)) + (with-temp-file (concat texfile ".tex") + (insert muse-latex2png-template) + (goto-char (point-min)) + (while (search-forward "%preamble%" nil t) + (replace-match preamble nil t)) + (goto-char (point-min)) + (while (search-forward "%code%" nil t) + (replace-match code nil t))) + (setq default-directory tmpdir) + (call-process "latex" nil nil nil texfile) + (if (file-exists-p (concat texfile ".dvi")) + (progn + (call-process + "dvipng" nil nil nil + "-E" + "-fg" muse-latex2png-fg + "-bg" muse-latex2png-bg + "-T" "tight" + "-x" (format "%s" (* muse-latex2png-scale-factor 1000)) + "-y" (format "%s" (* muse-latex2png-scale-factor 1000)) + "-o" (concat texfile ".png") + (concat texfile ".dvi")) + (if (file-exists-p (concat texfile ".png")) + (progn + (delete-file (concat texfile ".dvi")) + (delete-file (concat texfile ".tex")) + (delete-file (concat texfile ".aux")) + (delete-file (concat texfile ".log")) + (concat texfile ".png")) + (message "Failed to create png file") + nil)) + (message (concat "Failed to create dvi file " texfile)) + nil))) + +(defun muse-latex2png-region (beg end attrs) + "Generate an image for the Latex code between BEG and END. +If a Muse page is currently being published, replace the given +region with the appropriate markup that displays the image. +Otherwise, just return the path of the generated image. + +Valid keys for the ATTRS alist are as follows. + +prefix: The prefix given to the image file. +preamble: Extra text to add to the Latex preamble. +inline: Display image as inline, instead of a block." + (let ((end-marker (set-marker (make-marker) (1+ end))) + (pubdir (expand-file-name + muse-latex2png-img-dest + (file-name-directory muse-publishing-current-output-path)))) + (save-restriction + (narrow-to-region beg end) + (let* ((text (buffer-substring-no-properties beg end)) + ;; the prefix given to the image file. + (prefix (cdr (assoc "prefix" attrs))) + ;; preamble (for extra options) + (preamble (cdr (assoc "preamble" attrs))) + ;; display inline or as a block + (display (car (assoc "inline" attrs)))) + (when muse-publishing-p + (delete-region beg end) + (goto-char (point-min))) + (unless (file-directory-p pubdir) + (make-directory pubdir)) + (let ((path (muse-latex2png-move2pubdir + (muse-latex2png text prefix preamble) + prefix pubdir))) + (when path + (when muse-publishing-p + (muse-insert-markup + (if (muse-style-derived-p "html") + (concat "\"latex2png" + ">") + (muse-insert-markup "")) + (let ((ext (or (file-name-extension path) "")) + (path (muse-path-sans-extension path))) + (muse-markup-text 'image path ext)))) + (goto-char (point-max))) + path)))))) + +(defun muse-publish-latex-tag (beg end attrs) + "If the current style is not Latex-based, generate an image for the +given Latex code. Otherwise, don't do anything to the region. +See `muse-latex2png-region' for valid keys for ATTRS." + (unless (assoc "prefix" attrs) + (setq attrs (cons (cons "prefix" + (concat "latex2png-" (muse-page-name))) + attrs))) + (if (or (muse-style-derived-p "latex") (muse-style-derived-p "context")) + (muse-publish-mark-read-only beg end) + (muse-latex2png-region beg end attrs))) + +(put 'muse-publish-latex-tag 'muse-dangerous-tag t) + +(defun muse-publish-math-tag (beg end) + "Surround the given region with \"$\" characters. Then, if the +current style is not Latex-based, generate an image for the given +Latex math code. + +If 6 or more spaces come before the tag, and the end of the tag +is at the end of a line, then surround the region with the +equivalent of \"$$\" instead. This causes the region to be +centered in the published output, among other things." + (let* ((centered (and (re-search-backward + (concat "^[" muse-regexp-blank "]\\{6,\\}\\=") + nil t) + (save-excursion + (save-match-data + (goto-char end) + (looking-at (concat "[" muse-regexp-blank "]*$")))) + (prog1 t + (replace-match "") + (when (and (or (muse-style-derived-p "latex") + (muse-style-derived-p "context")) + (not (bobp))) + (backward-char 1) + (if (bolp) + (delete-char 1) + (forward-char 1))) + (setq beg (point))))) + (tag-beg (if centered + (if (muse-style-derived-p "context") + "\\startformula " "\\[ ") + "$")) + (tag-end (if centered + (if (muse-style-derived-p "context") + " \\stopformula" " \\]") + "$")) + (attrs (nconc (list (cons "prefix" + (concat "latex2png-" (muse-page-name)))) + (if centered nil + '(("inline" . t)))))) + (goto-char beg) + (muse-insert-markup tag-beg) + (goto-char end) + (muse-insert-markup tag-end) + (if (or (muse-style-derived-p "latex") (muse-style-derived-p "context")) + (muse-publish-mark-read-only beg (point)) + (muse-latex2png-region beg (point) attrs)))) + +(put 'muse-publish-math-tag 'muse-dangerous-tag t) + +;;; Insinuate with muse-publish + +(add-to-list 'muse-publish-markup-tags + '("latex" t t nil muse-publish-latex-tag) + t) + +(add-to-list 'muse-publish-markup-tags + '("math" t nil nil muse-publish-math-tag) + t) + +(provide 'muse-latex2png) +;;; muse-latex2png.el ends here -- cgit v1.2.3-54-g00ecf