[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] using a simple numerical variable in an org text ocument
From: |
Jonathan Leech-Pepin |
Subject: |
Re: [O] using a simple numerical variable in an org text ocument |
Date: |
Thu, 25 Jul 2013 21:16:26 -0400 |
User-agent: |
mu4e 0.9.9.5; emacs 24.3.1 |
Hi,
Thorsten Jolitz writes:
> Matt Price <address@hidden> writes:
>
>> Hi,
>>
>> I'm making a very simple org-document -- a packing list for a trip.
>> It has entries like
>>
>> - 4 mugs
>> - for sleeping bags
>> - 4 thermarest pads
>>
>>
>> I'd like to replace the numbers there by a variable -- so if I make a
>> list for 4 people, the number displayed will be '4'; but if the list
>> is for 2 people, the number displayed will be 2. Better would be if I
>> could also do simple arithmetic manipulations (x * 6 dinners for a
>> week...). I there a really simple way to do this? if it's not really
>> easy, it won't really seem worth it, but if it is really easy, I will
>> use it a lot...
>
> Or, if you insist on checkboxes (private conversation), you might put this
> function in your .emacs and run it to replace all numbers (that are either
> factors or totals) with num * people (when people >= 0) or with num / people
> (when people > 0).
>
If you want to use checkboxes, couldn't you use a babel code block and
then =call= it on each entry?
#+begin_src org
,#+MACRO: count call_Sample(x=$1)[:results raw]
,* Test
:PROPERTIES:
:var: people=5
:END:
- [ ] call_Sample(x=2)[:results raw] socks
- [ ] call_Sample(x=1)[:results raw] toothbrushes
- [ ] {{{count(3)}}} shoes
,#+name: Sample
,#+header: :var x=1 :results raw
,#+begin_src emacs-lisp
(* x people)
,#+end_src
,#+RESULTS: Sample
5
#+end_src
You can then wrap it in a macro to avoid having to write out quite as
much per line (as the last entry demonstrates.
Then just adjust the value of the =:var:= property to match how many
people, and your export will provide the correct values
> #+begin_src emacs-lisp
> (defun tj/calc-total-items (people)
> "Replace factor cookies with factor * people totals."
> (interactive "NPeople: ")
> (save-excursion
> (save-restriction
> (save-match-data
> (goto-char (point-min))
> (widen)
> (while (not (eobp))
> (and (org-at-item-checkbox-p)
> (looking-at
> (concat
> "\\(^[[:space:]]*-[[:space:]]"
> "\\[[-X\s]\\][[:space:]]\\)"
> "\\([[:digit:]]+\\)\\([[:space:]]+\\)"))
> (let* ((num
> (string-to-number
> (match-string-no-properties 2)))
> (total
> (if (>= people 0)
> (* num people)
> (/ num (abs people)))))
> (replace-match
> (format "%s" total) nil nil nil 2)))
> (forward-line))))))
> #+end_src
>
> #+results:
> : tj/calc-total-items
>
>
> Use either as
>
> ,----------------------------------
> | M-x tj/calc-total-items RET 7 RET
> `----------------------------------
>
> or
>
> ,----------------------------------
> | C-7 M-x tj/calc-total-items RET
> `----------------------------------
>
> in your org-buffer.
>
> When there are e.g. 7 people, this checkbox list
>
> - [ ] 1 toothbrushes
> - [ ] 4 socks
>
> turns into
>
> - [ ] 7 toothbrushes
> - [ ] 28 socks
>
> after applying the above command in this buffer, and the change is
> reversed when applying
>
> ,----------------------------------
> | M-x tj/calc-total-items RET -7 RET
> `----------------------------------
>
> or
>
> ,----------------------------------
> | C--7 M-x tj/calc-total-items RET
> `----------------------------------
>
> afterwards. Note that you must stick to the format
>
> ,--------------------------
> | - [ ] <<digit>> text ....
> `--------------------------
>
> for this to work.
Regards,
--
Jonathan