rev: tip draketo/software/org-mode-tipps.org -rw-r--r-- 11.0 KiB View raw Log this file
03c1c7810af4Arne Babenhauserheide cli 3 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# custom home link so the RSS export works
#+HTML_LINK_HOME: https://www.draketo.de/software
#+INCLUDE: ../org-templates/level-1.org
#+title: How to do X with Emacs Org-Mode
#+date: <2021-08-23 Mo>
#+LANGUAGE: en

[[http://gnu.org/s/emacs][Emacs]] [[http://orgmode.org][Org mode]] keeps me organized. Here I plan to incrementally gather tipps.

#+begin_export html
<div class="sourcebox" markdown="1" >
<a href="org-mode.pdf"><img title="PDF" src="../assets/pdf-thumbnail.png" /></a><br />
<a href="org-mode.pdf">PDF</a> (drucken)
</div>
#+end_export

#+toc: headlines 2

* full-page images per page for printing via latex eport
  :PROPERTIES:
  :CUSTOM_ID: full-page-image-export-latex
  :ID:       9822f663-02ba-4b9e-8d08-9f7c50a32f03
  :PUBDATE:  <2021-08-23 Mo 09:41>
  :END:

Task: create a PDF with full-width images for printing.

#+html: <small>

#+begin_src org
,#+latex_header: \usepackage[margin=0.0cm]{geometry}
,#+options: toc:nil


# ## upside image ##
,#+latex: \noindent
,#+attr_latex: :width 0.9999\textwidth :height 0.9999\textheight :options keepaspectratio=true,angle=90
[[file:portrait.jpg]]


# ## rotated image ##
,#+latex: \noindent
,#+attr_latex: :width 0.9999\textwidth :height 0.9999\textheight :options keepaspectratio=true
[[file:landscape.jpg]]


# ## two images per page ##
,#+latex: \noindent
,#+attr_latex: :width 0.9999\textwidth :height 0.495\textheight :options keepaspectratio=true
[[file:landscape.jpg]]

,#+latex: \noindent
,#+attr_latex: :width 0.9999\textwidth :height 0.495\textheight :options keepaspectratio=true
[[file:landscape.jpg]]


# ## keep some space around the images 

,#+latex: \noindent
,#+attr_latex: :width 0.98\textwidth :height 0.98\textheight :options keepaspectratio=true
[[file:portrait.jpg]]
#+end_src

#+html: </small>

Now just export with =C-c C-e l p= (export to pdf). (the 0.9999 height and width prevent LaTeX from skipping pages)

To turn these into a gallery with 4x4 images per page to cut out the
images, you can use pdfnup:

#+begin_src bash
pdfnup --nup 4x4 --no-landscape foo.pdf
# creates foo-nup.pdf
#+end_src


# specific RSS feed
#+HTML_HEAD: <link rel="alternate" type="application/rss+xml" title="Emacs Org-Mode" href="https://www.draketo.de/software/org-mode-tipps.xml" />
#+setupfile: ../org-templates/level-1-software.org
#+RSS_BASE_URL: https://www.draketo.de/software
#+RSS_FEED_URL: https://www.draketo.de/software/org-mode-tipps.xml
#+RSS_IMAGE_URL: https://www.draketo.de/assets/portrait.png
# Local Variables:
# org-confirm-babel-evaluate: nil
# org-export-default-language: de
# org-babel-noweb-wrap-start: "{{{"
# org-babel-noweb-wrap-end: "}}}"
# org-latex-images-centered: nil
# End:
# override template options:
#+options: toc:nil H:2 num:nil ^:nil

* agenda-and-todo: my most important planning tool
  :PROPERTIES:
  :CUSTOM_ID: agenda-and-todo
  :ID:       5055dbc8-a4da-48d4-9c9f-b7ee00e214a8
  :PUBDATE:  <2021-08-26 Do 11:00>
  :END:

/When I open my Emacs, I hit F12./

[[file:screenshot-20210826103308.png][file:screenshot-20210826103308-width600.png]]

This is what keeps me organized — at home as well as at work. As you
can see with the high scheduled count, it isn't perfect, but whenever
I skip it, I lose focus. A lifesaver at work, staying ahead of
important tasks at home.

It’s a custom agenda combined with [[https://www.draketo.de/light/english/free-software/el-kanban-org-table][kanban.el]] and optimized TODO states.

Put this into your =~/.emacs.d/init.el= to replicate it:

#+begin_src elisp
;; KDE: show custom agenda with kanban via f12:
(with-eval-after-load 'org
  (setq org-agenda-custom-commands
        '(("o" "Agenda and TODOs"
           ((agenda)
            (tags-todo "-notodo-TERMIN" ((org-agenda-block-separator ?-)))
	        (tags "KANBAN" ((org-agenda-block-separator ?-)
                            (org-agenda-compact-blocks nil)
                            (org-agenda-overriding-header ""))))))))

;; from https://www.emacswiki.org/emacs/TransposeWindows solution by Robert Bost
(defun rotate-windows (arg)
  "Rotate your windows; with prefix argument to rotate the other direction"
  (interactive "P")
  (if (not (> (count-windows) 1))
      (message "You can't rotate a single window!")
    (let* ((rotate-times (prefix-numeric-value arg))
           (direction (if (or (< rotate-times 0) (equal arg '(4)))
                          'reverse 'identity)))
      (dotimes (_ (abs rotate-times))
        (dotimes (i (- (count-windows) 1))
          (let* ((w1 (elt (funcall direction (window-list)) i))
                 (w2 (elt (funcall direction (window-list)) (+ i 1)))
                 (b1 (window-buffer w1))
                 (b2 (window-buffer w2))
                 (s1 (window-start w1))
                 (s2 (window-start w2))
                 (p1 (window-point w1))
                 (p2 (window-point w2)))
            (set-window-buffer-start-and-point w1 b2 s2 p2)
            (set-window-buffer-start-and-point w2 b1 s1 p1)))))))

(defun my/org-agenda-show-kanban ()
  (interactive)
  (save-excursion
    (search-forward ":KANBAN:")
    (org-agenda-goto)
    (org-narrow-to-subtree)
    (show-all)
    (fit-window-to-buffer)
    (widen)
    (recenter-top-bottom 0)))

(defun agenda-and-todo ()
  (interactive)
  (org-agenda nil "o")
  (delete-other-windows)
  (my/org-agenda-show-kanban)
  (rotate-windows 1))
;;      systemsettings shortcuts: map f12 to
;;        emacsclient -e '(progn (show-frame)(agenda-and-todo))'
(global-set-key (kbd "<f12>") 'agenda-and-todo)
#+end_src

To make it look like the screenshot, also set some options in the org-file:

#+begin_src org
,#+STARTUP: overview
# TAG TERMIN is excluded from the Kanban table
,#+TAGS: WOHNUNG(w) RAUS(r) SONST(s) LESEN(l) KANBAN(k) 1w6(1) FAMILIE(f) TERMIN(t)
,#+STARTUP: hidestars logdone
,#+SEQ_TODO: ❢ ☯ ⧖ | ✔ DEFERRED
# logdone adds a DONE timestamp when switching from a TODO (before |)
# to a DONE keyword (after |)
# State with (!) behind it means, add a timestamp when switching to that.
# See http://orgmode.org/manual/Tracking-TODO-state-changes.html

|   |   |   |
|---+---+---|
|   |   |   |
|   |   |   |
|   |   |   |
,#+TBLFM: @1='(kanban-headers $#)::@2$1..@>$>='(kanban-zero @# $# "-TERMIN" 'file)
#+end_src

If you use this, the following could also come in handy:

#+begin_src elisp
;; KDE: update all agenda kanban tables with C-S-f12 (ctrl-shift f12)
(defun kanban-update-all ()
  (interactive)
  (cl-loop for i in org-agenda-files do
	   (with-current-buffer (find-file-noselect i)
	     (save-excursion ;; avoid changing the position in the agenda files
	       (beginning-of-buffer)
	       (while (search-forward "='(kanban-" nil t)
		 (org-ctrl-c-ctrl-c))))))
;;      systemsettings shortcuts: map control shift f12 to
;;        emacsclient -e '(progn (show-frame)(kanban-update-all))'
(global-set-key (kbd "C-S-<f12>") 'kanban-update-all)
#+end_src

* create a simple gantt-chart from a table with Gnuplot
  :PROPERTIES:
  :CUSTOM_ID: gantt
  :ID:       f03dfa8a-70a2-497a-ae17-c0bb9e413228
  :PUBDATE:  <2021-09-27 Mo 19:22>
  :END:

[[https://en.wikipedia.org/wiki/Gantt_chart][Gantt-Charts]] make it easy to grasp project organization tasks at a
glance. If you only need smaller projects with limited scope and 4-6
participants, it is viable to create them directly from an org-mode
table.

#+call: KollAbAccessGantt()

#+RESULTS:
[[file:gantt-out.png]]

All data is in the following Table: 

#+tblname: gantt-table
| Task           | Effort | Start           | End              | Who |
|----------------+--------+-----------------+------------------+-----|
| Time available |      1 | <2020-11-02 Mo> | <2020-11-13 Fr>  |     |
| Task 0         |      2 | <2020-11-03 Di> | [2020-11-05 Thu] | Al  |
| Task 1         |      1 | <2020-11-05 Do> | <2020-11-06 Fr>  | Bo  |
| Task 2         |      3 | <2020-11-05 Do> | [2020-11-10 Di]  | Ca  |
| Task 3         |      2 | <2020-11-06 Fr> | <2020-11-10 Di>  | Ca  |
| Task 4         |      2 | <2020-11-06 Fr> | <2020-11-06 Fr>  | Bo  |
| Task 5         |      1 | <2020-11-10 Di> | <2020-11-10 Di>  | Bo  |
| Task 6         |      1 | <2020-11-11 Mi> | <2020-11-12 Do>  | Bo  |
| Task 7         |      2 | <2020-11-09 Mo> | <2020-11-10 Di>  | Al  |
| Task 8         |      1 | <2020-11-12 Do> | <2020-11-12 Do>  | Al  |
| Task 9         |      1 | <2020-11-06 Fr> | <2020-11-09 Mo>  | Al  |
| Task 10        |      1 | <2020-11-12 Do> | <2020-11-13 Fr>  | Bo  |
| Task  11       |      1 | <2020-11-13 Fr> | <2020-11-13 Fr>  |     |

the time available row ensures that the whole project-duration is
shown. You need to set the start and end dates manually: Hit =C-c .=
to enter the calendar and select the date.

The parsing is done by the following code:

#+name: KollAbAccessGantt
#+begin_src gnuplot :var DATA=gantt-table :session gantt-chart :file gantt-out.png :exports code
# http://gnuplot.sourceforge.net/demo_5.1/gantt.html
OneMonth = strptime("%m","2")
OneWeek = strptime("%U","2")
OneDay = strptime("%d","2")
timeformat = "%Y-%m-%d %a"
T(N) = timecolumn(N,timeformat)

set xdata time
set format x "%a\n%d\n%b\n'%y"
set xtics OneDay nomirror
set xtics scale 2, 0.5
set mxtics 7

skiptorow=2
set yrange [(skiptorow-2):] reverse
set ytics nomirror

unset key
set title "{/=15 My Project}"
set grid x y
set border 3
set style arrow 1 nohead filled size screen 0.02, 15 fixed lt 3 lw 8

plot DATA using (T(3)) : ($0) : (T(4)-T(3)) : (0.0) : yticlabel(1) with vector as 1
#+end_src


You might have to add gnuplot to your active languages:

#+begin_src elisp
(org-babel-do-load-languages
 'org-babel-load-languages
 '((gnuplot . t)))
#+end_src

** More complex Gantt with plantuml
   :PROPERTIES:
   :ID:       e9fcb6fd-a8e8-4690-b872-43cb283f949c
   :CUSTOM_ID: gantt-plantuml
   :END:

If you need something more complex, you can go to the full [[https://plantuml.com/de/gantt-diagram][plantuml DSL]]. Example: 

#+begin_src plantuml :file my-complex-project.png :exports both
@startgantt
saturday are closed
sunday are closed
' see https://plantuml.com/gantt-diagram
Project starts at 2021-04-26
[Configuration] as [C] on {DEV1:50%} lasts 1 day
note bottom
  description
end note
[Implementation] as [I] on {DEV2} lasts 3 days
note bottom
  in multiple
  lines
end note
[I] starts at [C]'s end with green bold link
{DEV2} is off on 2021-04-30
@endgantt
#+end_src

#+RESULTS:
[[file:my-complex-project.png]]

The full source of these examples with the org-mode sourceblocks is available [[https://hg.sr.ht/~arnebab/draketo/browse/software/org-mode-tipps.org][in my website's source-code]].

** Projects to export gantt from the org-mode tree
   :PROPERTIES:
   :CUSTOM_ID: gantt-more
   :ID:       6cb0ea54-96de-4291-879c-0b8d45aab322
   :END:

- [[https://orgmode.org/worg/org-tutorials/org-taskjuggler.html][exported to taskjuggler]]
- [[https://github.com/legalnonsense/elgantt/][as interactive, emacs-hosted website]]
- [[https://github.com/swillner/org-gantt/blob/master/org-gantt-manual.pdf][via LaTeX]]

[2021-09-27 Mo]

* export to markdown and latex
  :PROPERTIES:
  :CUSTOM_ID: export-markdown-latex
  :END:

#+begin_src org
(require 'ox-md)
,#+begin_export markdown
# foo
__bar__
,#+end_export
,#+begin_export latex
\section{foo}
\textbf{bar}
,#+end_export
,*bar*
#+end_src

[2021-10-18 Mo]