Emacs org-mode: define variable in buffer and access variable

4.3k views Asked by At

I would like to define a buffer wide variable in an org-file and use the value from this variable later for, e.g., define the width of images for latex export.

Is there a way how this can be done?

Can this be done using #+CONSTANTS:?

Ideally, it should work like this:

I define a variable image_width in a buffer, e.g.

image_width=10

and use this variable in for #+ATTR_LATEX: settings, e.g., #+ATTR_LATEX: :width $image_width.

3

There are 3 answers

2
fniessen On

Two ways (untested), if you want your constant to be buffer-specific:

  • "Local Variable(s)" in the last 8 lines (or so) of your Org file;

  • Use Org "#+MACRO:" feature

1
jimmu On

Define a variable in your .emacs. Just like how you'd define a function, you can bind a variable to certain value. You can do setq or defvar, defconst, depending on what you want. For an instance:

(setq image-width 10)

Make sure to eval-buffer after you set your variable.

0
nuaavee On

You can declare a variable using the #+NAME: tag. Then use it by passing it to :var in the src block you need it.

This will look something like this:

#+NAME: instance-id
| abcd |

#+BEGIN_SRC sh :var id=instance-id
echo $id
#+END_SRC

#+RESULTS:
: abcd

#+BEGIN_SRC python :var myvar=instance-id[0, 0]
print myvar
#+END_SRC

#+RESULTS:
: abcd

Note the instance-id[0, 0] in python src block. I've declared the variable as an array because of which I need to de-reference the value like this.