From mboxrd@z Thu Jan 1 00:00:00 1970 From: Aaron Ecay Subject: [PATCH] ox-latex: Support tikz images, :width, and :height Date: Tue, 5 Mar 2013 23:04:42 -0500 Message-ID: <1362542682-20542-1-git-send-email-aaronecay@gmail.com> References: <87y5e189c2.fsf@gmail.com> Return-path: Received: from eggs.gnu.org ([208.118.235.92]:55307) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UD5ay-0003Us-NE for emacs-orgmode@gnu.org; Tue, 05 Mar 2013 23:04:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UD5aw-00055H-Rd for emacs-orgmode@gnu.org; Tue, 05 Mar 2013 23:04:48 -0500 Received: from mail-qe0-f42.google.com ([209.85.128.42]:46861) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UD5aw-00055C-9v for emacs-orgmode@gnu.org; Tue, 05 Mar 2013 23:04:46 -0500 Received: by mail-qe0-f42.google.com with SMTP id f6so5160362qej.15 for ; Tue, 05 Mar 2013 20:04:46 -0800 (PST) In-Reply-To: <87y5e189c2.fsf@gmail.com> 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-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org * ox-latex.el: (org-latex-image-default-option): Change default value to "" (org-latex-image-default-width) (org-latex-image-default-height): Add variables (org-latex-inline-image-rules): Make .tikz files as exportable with latex (org-latex--inline-image): Support tikz images. Also support separate :width and :height parameters for images. * ob-R.el (org-babel-R-construct-graphics-device-call): Change file extension of tikz graphics files to .tikz Tikz graphics should be exported to LaTeX by \include, not as a link. This commit changes the file extension used for tikz graphics from .tex to .tikz, and inserts code for including such images. The :options for tikz graphics are passed as an optional argument to a tikzpicture environment. Also provide :width and :height ATTR_LATEX entries for images. For tikz graphics, these are implemented with \resizebox; for other image types they are inserted in the optional arguments to \includegraphics. --- lisp/ob-R.el | 2 +- lisp/ox-latex.el | 111 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 83 insertions(+), 30 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 8db0853..9875f81 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -237,7 +237,7 @@ current code buffer." '((:bmp . "bmp") (:jpg . "jpeg") (:jpeg . "jpeg") - (:tex . "tikz") + (:tikz . "tikz") (:tiff . "tiff") (:png . "png") (:svg . "svg") diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 8a5b6a6..47b8bb1 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -77,15 +77,19 @@ ;; (i.e. "inparaenum"). The second one allows to specify optional ;; arguments for that environment (square brackets are not mandatory). ;; -;; Images accept `:float', `:placement', `:comment-include', and -;; `:options' as attributes. `:float' accepts a symbol among `wrap', -;; `multicolumn', and `figure', which defines the float environment -;; for the table (if unspecified, an image with a caption will be set -;; in a "figure" environment). `:comment-include' is a boolean that -;; toggles whether to comment out the \includegraphics -;; call. `:placement' is a string that will be used as argument for -;; the environment chosen. `:options' is a string that will be used -;; as the optional argument for "includegraphics" macro. +;; Images accept `:float', `:placement', `:comment-include', `:width', +;; and `:height', and `:options' as attributes. `:float' accepts a +;; symbol among `wrap', `multicolumn', and `figure', which defines the +;; float environment for the image (if unspecified, an image with a +;; caption will be set in a "figure" environment). `:comment-include' +;; is a boolean that toggles whether to comment out the code which +;; actually includes the image. `:placement' is a string that will be +;; used as argument for the environment chosen. `:width' and +;; `:height' control the width and height of the image. `:options' is +;; a string that will be used as the optional argument for +;; "includegraphics" macro or (in the case of tikz images), used as +;; the optional argument for a `tikzpicture' environment which will +;; surround the "\input" picture code. ;; ;; Special blocks accept `:options' as attribute. Its value will be ;; appended as-is to the opening string of the environment created. @@ -472,18 +476,28 @@ which format headlines like for Org version prior to 8.0." ;;;; Links -(defcustom org-latex-image-default-option "width=.9\\linewidth" +(defcustom org-latex-image-default-option "" "Default option for images." :group 'org-export-latex :type 'string) +(defcustom org-latex-image-default-width ".9\\linewidth" + "Default width for images." + :group 'org-export-latex + :type 'string) + +(defcustom org-latex-image-default-height "" + "Default height for images." + :group 'org-export-latex + :type 'string) + (defcustom org-latex-default-figure-position "htb" "Default position for latex figures." :group 'org-export-latex :type 'string) (defcustom org-latex-inline-image-rules - '(("file" . "\\.\\(pdf\\|jpeg\\|jpg\\|png\\|ps\\|eps\\)\\'")) + '(("file" . "\\.\\(pdf\\|jpeg\\|jpg\\|png\\|ps\\|eps\\|tikz\\)\\'")) "Rules characterizing image files that can be inlined into LaTeX. A rule consists in an association whose key is the type of link @@ -1751,6 +1765,7 @@ used as a communication channel." (path (let ((raw-path (org-element-property :path link))) (if (not (file-name-absolute-p raw-path)) raw-path (expand-file-name raw-path)))) + (filetype (file-name-extension path)) (caption (org-latex--caption/label-string parent info)) ;; Retrieve latex attributes from the element around. (attr (org-export-read-attribute :attr_latex parent)) @@ -1768,32 +1783,70 @@ used as a communication channel." (format "[%s]" org-latex-default-figure-position)) (t "")))) (comment-include (if (plist-get attr :comment-include) "%" "")) - ;; Options for "includegraphics" macro. Make sure it is - ;; a string with square brackets when non empty. Default to - ;; `org-latex-image-default-option' when possible. - (options (let ((opt (format "%s" - (or (plist-get attr :options) - org-latex-image-default-option)))) - (cond ((string-match "\\`\\[.*\\]" opt) opt) - ((org-string-nw-p opt) (format "[%s]" opt)) - ((eq float 'float) "[width=0.7\\textwidth]") - ((eq float 'wrap) "[width=0.48\\textwidth]") - (t ""))))) + ;; It is possible to specify width and height in the + ;; ATTR_LATEX line, and also via default variables. + (width (format "%s" (or (plist-get attr :width) + (cond + ((eq float 'float) "0.7\\textwidth") + ((eq float 'wrap) "0.48\\textwidth") + (t org-latex-image-default-width))))) + (height (format "%s" (or (plist-get attr :height) + org-latex-image-default-height))) + (options (or (plist-get attr :options) + org-latex-image-default-option)) + image-code) + (if (not options) + (setq options "") + (setq options (format "%s" options))) + (when (string-match "\\`\\[\\(.*\\)\\]\\'" options) + (setq options (match-string 1 options))) + (if (equal filetype "tikz") + ;; For tikz images: + ;; - use \input to read in image file + ;; - if options are present, wrap in a tikzpicture environment + ;; - if width or height are present, use \resizebox to change + ;; the image size + (progn + (setq image-code (format "\\input{%s}" path)) + (when (and (org-string-nw-p options)) + (setq image-code (format "\\begin{tikzpicture}[%s]\n%s\n\\end{tikzpicture}" + options + image-code))) + (when (or (and (org-string-nw-p width) (org-not-nil width)) + (and (org-string-nw-p height) (org-not-nil height))) + (setq image-code (format "\\resizebox{%s}{%s}{%s}" + (if (and (org-string-nw-p width) (org-not-nil width)) + width + "!") + (if (and (org-string-nw-p height) (org-not-nil height)) + height + "!") + image-code)))) + ;; For other images: + ;; - add width and height to options + ;; - include the image with \includegraphics + (when (and (org-string-nw-p width) (org-not-nil width)) + (setq options (concat options ",width=" width))) + (when (and (org-string-nw-p height) (org-not-nil height)) + (setq options (concat options ",height=" height))) + (when (= (aref options 0) ?,) + (setq options (substring options 1))) + (setq image-code (format "\\includegraphics[%s]{%s}" options path))) ;; Return proper string, depending on FLOAT. (case float (wrap (format "\\begin{wrapfigure}%s \\centering -%s\\includegraphics%s{%s} -%s\\end{wrapfigure}" placement comment-include options path caption)) +%s%s +%s\\end{wrapfigure}" placement comment-include image-code caption)) (multicolumn (format "\\begin{figure*}%s \\centering -%s\\includegraphics%s{%s} -%s\\end{figure*}" placement comment-include options path caption)) +%s%s +%s\\end{figure*}" placement comment-include image-code caption)) (figure (format "\\begin{figure}%s \\centering -%s\\includegraphics%s{%s} -%s\\end{figure}" placement comment-include options path caption)) - (t (format "\\includegraphics%s{%s}" options path))))) +%s%s +%s\\end{figure}" placement comment-include image-code caption)) + (t image-code)))) (defun org-latex-link (link desc info) "Transcode a LINK object from Org to LaTeX. -- 1.8.1.5