UP | HOME

How to do X with Emacs Org-Mode

Emacs Org mode keeps me organized. Here I plan to incrementally gather tipps.


PDF (drucken)

full-page images per page for printing via latex eport

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

#+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

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:

pdfnup --nup 4x4 --no-landscape foo.pdf
# creates foo-nup.pdf

agenda-and-todo: my most important planning tool

When I open my Emacs, I hit F12.

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 kanban.el and optimized TODO states.

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

;; 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)

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

#+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)

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

;; 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)

ArneBab 2021-08-23 Mo 00:00 - Impressum - GPLv3 or later (code), cc by-sa (rest)