From 2526a06e4f77a2fdae615a95365f557c40b6d968 Mon Sep 17 00:00:00 2001 From: Emmanuel Charpentier Date: Sat, 20 Apr 2019 10:25:24 +0200 Subject: [PATCH] Support a :scale parameter in org-latex-export-to-latex and friends * lisp/ox-latex.el: introduce a :scale #+ATTR_LATEX parameter, as well as a "" default value for it. When present, it overrides :width and :height parameters (as it does for ODT export and in ox-pandoc exporters) ; therefore, setting a default value for :scale should be exceptional. Implementation: uses \scalebox for tikz/pgf images, "scale=" parameter of \includegraphics in other cases. * doc/org-manual.org: document the new :scale #+ATTR_LATEX parameter, --- doc/org-manual.org | 8 ++++++-- lisp/ox-latex.el | 49 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index a8f4a45ea..a9114184a 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -13277,14 +13277,18 @@ insert the image. But for TikZ (http://sourceforge.net/projects/pgf/) images, the back-end uses an ~\input~ macro wrapped within a ~tikzpicture~ environment. -For specifying image =:width=, =:height=, and other =:options=, use -this syntax: +For specifying image =:width=, =:height=, =:scale= and other =:options=, +use this syntax: #+begin_example ,#+ATTR_LATEX: :width 5cm :options angle=90 [[./img/sed-hr4049.pdf]] #+end_example +A =:scale= parameter overrides both =:width= and =:height= parameters ; +therefore, setting its default value should be done only in exceptional +circumstances. + For custom commands for captions, use the =:caption= attribute. It overrides the default =#+CAPTION= value: diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index cdcb07aca..60b8773b0 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -127,6 +127,7 @@ (:latex-format-headline-function nil nil org-latex-format-headline-function) (:latex-format-inlinetask-function nil nil org-latex-format-inlinetask-function) (:latex-hyperref-template nil nil org-latex-hyperref-template t) + (:latex-image-default-scale nil nil org-latex-image-default-scale) (:latex-image-default-height nil nil org-latex-image-default-height) (:latex-image-default-option nil nil org-latex-image-default-option) (:latex-image-default-width nil nil org-latex-image-default-width) @@ -708,6 +709,17 @@ This value will not be used if a height is provided." :package-version '(Org . "8.0") :type 'string) +(defcustom org-latex-image-default-scale "" + "Default scale for images. +This value will not be used if a width or a scale is provided, +or if the image is wrapped within a \"wrapfigure\",environment. +Since scale overrides width and height, setting its default +value should be done only in exceptional circumstances." + :group 'org-export-latex + :version "25.1" + :package-version '(Org . "9.2") + :type 'string) + (defcustom org-latex-image-default-height "" "Default height for images. This value will not be used if a width is provided, or if the @@ -2374,13 +2386,18 @@ used as a communication channel." (if (plist-member attr :center) (plist-get attr :center) (plist-get info :latex-images-centered))) (comment-include (if (plist-get attr :comment-include) "%" "")) - ;; It is possible to specify width and height in the - ;; ATTR_LATEX line, and also via default variables. - (width (cond ((plist-get attr :width)) + ;; It is possible to specify scale or width and height in + ;; the ATTR_LATEX line, and also via default variables. + (scale (cond ((eq float 'wrap) "") + ((plist-get attr :scale)) + (t (plist-get info :latex-image-default-scale)))) + (width (cond ((org-string-nw-p scale) "") + ((plist-get attr :width)) ((plist-get attr :height) "") ((eq float 'wrap) "0.48\\textwidth") (t (plist-get info :latex-image-default-width)))) - (height (cond ((plist-get attr :height)) + (height (cond ((org-string-nw-p scale) "") + ((plist-get attr :height)) ((or (plist-get attr :width) (memq float '(figure wrap))) "") (t (plist-get info :latex-image-default-height)))) @@ -2402,18 +2419,24 @@ used as a communication channel." (format "\\begin{tikzpicture}[%s]\n%s\n\\end{tikzpicture}" options image-code))) - (when (or (org-string-nw-p width) (org-string-nw-p height)) - (setq image-code (format "\\resizebox{%s}{%s}{%s}" - (if (org-string-nw-p width) width "!") - (if (org-string-nw-p height) height "!") - image-code)))) + (if (org-string-nw-p scale) + (setq image-code + (format "\\scalebox{%s}{%s}" scale image-code)) + (when (or (org-string-nw-p width) (org-string-nw-p height)) + (setq image-code (format "\\resizebox{%s}{%s}{%s}" + (if (org-string-nw-p width) width "!") + (if (org-string-nw-p height) height "!") + image-code))))) ;; For other images: ;; - add width and height to options. ;; - include the image with \includegraphics. - (when (org-string-nw-p width) - (setq options (concat options ",width=" width))) - (when (org-string-nw-p height) - (setq options (concat options ",height=" height))) + (if (org-string-nw-p scale) + (setq options (concat options ",scale=" scale)) + (progn + (when (org-string-nw-p width) + (setq options (concat options ",width=" width))) + (when (org-string-nw-p height) + (setq options (concat options ",height=" height))))) (let ((search-option (org-element-property :search-option link))) (when (and search-option (equal filetype "pdf") -- 2.20.1