0

All figures in my org-mode file are 3-inch wide (at 72 dpi) SVG figures. Here is an example.

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    width="236" height="92"
    viewBox="0 0 236 92"
    version="1.1">
    <g>
        <path d="M 10 10 L 226 10 L 226 82 L 10 82 z"
            fill="none" stroke="blue" stroke-width="2" />
    </g>
</svg>

When I refer—using an empty .emacs—to the SVG figure above in org-mode using

...
culpa qui officia deserunt mollit anim id est laborum.

  [[./figure.svg]]

Sed ut perspiciatis unde omnis iste natus error sit voluptatem
...

I get (thanks to a delightful new feature in EmacsForMacOSX) the SVG figure inlined in the body of the text,

SVG inline in text

I can increase the size of each figure individually by writing

#+ATTR_ORG: :width 100
[[./figure.svg]]

If all my figures are the same width and I'd like to increase them by the same factor, how do I increase through one setting the width/size of all inline SVG figures?

Sam
  • 317
  • 1
  • 11
  • See the answer [here](https://stackoverflow.com/a/38477233/6837095). Furthermore, you can use Ctrl+Mouse-Wheel on the image. – dalanicolai Mar 29 '23 at 21:02
  • @dalanicolai The solution you point to does not work on my side (with a `.emacs` containing just the line suggested). Varying the number in `#+ATTR_ORG: :width 500` and killing/reloading the buffer reloads with the same image size, for both PNG and SVG. Ctrl+Mouse-Wheel works, of course, but that just magnifies the already scan-converted (rasterized) SVG image. If there are small details, they do not become any clearer. – Sam Mar 29 '23 at 22:14
  • The `#+ATTR` line goes into the Org mode file, right above the link, with no empty lines between them. It does *not* go into your init file. – NickD Mar 30 '23 at 01:06
  • @NickD I see. The `#+ATTR` doesn't just appear once per file (at the top). It needs to precede each figure. Edited that answer to clarify. (Yes, it's clear that the `setq` line is the one that goes in the `.emacs` file.) – Sam Mar 30 '23 at 01:59
  • @NickD That made the question redundant. Since there is still a feature missing, I updated the question, both to remove the duplication and to seek a better ("DRY") solution. – Sam Mar 30 '23 at 02:06

1 Answers1

1

I am not aware of an 'out of the box' solution. However, it is very easy to create one. Images in org mode are created via the function org--create-inline-image, where it gets passed a scaling of 1. So by simply creating a (buffer local) variable, and redefining that function to use the value of that variable as follows, we can set the scaling per org buffer:

(defvar-local org-image-scaling-factor 2.0)

(with-eval-after-load 'org
  (defun org--create-inline-image (file width)
    "Create image located at FILE, or return nil.
WIDTH is the width of the image.  The image may not be created
according to the value of `org-display-remote-inline-images'."
    (let* ((remote? (file-remote-p file))
       (file-or-data
        (pcase org-display-remote-inline-images
              ((guard (not remote?)) file)
              (`download (with-temp-buffer
               (set-buffer-multibyte nil)
               (insert-file-contents-literally file)
               (buffer-string)))
              (`cache (let ((revert-without-query '(".")))
            (with-current-buffer (find-file-noselect file)
              (buffer-string))))
              (`skip nil)
              (other
               (message "Invalid value of `org-display-remote-inline-images': %S"
            other)
               nil))))
      (when file-or-data
    (create-image file-or-data
              (and (image-type-available-p 'imagemagick)
               width
               'imagemagick)
              remote?
              :width width :scale org-image-scaling-factor)))))

Add the above to your init file, evaluate, and try again. You can configure the scaling per buffer by adjusting the buffer local value.

You might also like to create a feature request at org-mode (if it does not already exist), where you could point them to this solution.

Of course, this solution scales all image types, but it is simple to add logic to limit the scaling to certain image types. Also, it scales the images with the #+ATTR_ORG: :width ... attribute, this could also be easily prevented, if you'd prefer so.

dalanicolai
  • 6,108
  • 7
  • 23