;;; org-settings.el --- Org settings -*- lexical-binding: t -*- ;;; Commentary: ;; direct LaTeX (not org) ;; hyphen via AUCTeX (not installed) ;; https://tex.stackexchange.com/questions/282448/why-does-emacs-or-auctex-turns-into ;; Requirements: ;; org-mode https://orgmode.org/ ;; org-bullets ;; org-cliplink https://melpa.org/#/org-cliplink ;;; Code: (defgroup my-org nil "My org-mode concept mapping" :prefix "my-org-" :group 'my) (defcustom my-org-default-notes-file (convert-standard-filename "~/.notes") "Documention see `org-default-notes-file' in `org.el'." :group 'my-org :type '(choice file (const "~/.notes") (const "~/Sync/notes.org"))) (defcustom my-org-agenda-files nil "Documention see `org-agenda-files' in `org.el'." :group 'my-org :type '(choice (repeat :tag "List of files and directories" file) (file :tag "Store list in a file\n" :value "~/.agenda_files") (const "~/Sync/tasks.org"))) (defcustom my-org-refile-targets nil "Documention see `org-refile-targets' in `org.el'. Example: Current buffer (nil) :maxlevel 3 All agenda files (variable org-agenda-files) Max Level number 3 Variable org-default-notes-file Max Level number 3" :group 'my-org :type '(repeat (cons (choice :value org-agenda-files (const :tag "All agenda files" org-agenda-files) (const :tag "Current buffer" nil) (function) (variable) (file)) (choice :tag "Identify target headline by" (cons :tag "Specific tag" (const :value :tag) (string)) (cons :tag "TODO keyword" (const :value :todo) (string)) (cons :tag "Regular expression" (const :value :regexp) (regexp)) (cons :tag "Level number" (const :value :level) (integer)) (cons :tag "Max Level number" (const :value :maxlevel) (integer)))))) (defcustom my-org-publish-project-base-directory "~/org/project/" "Documention see :base-directory of `org-publish-project-alist'. Used for the example in `my-org-publish-project-alist'." :group 'my-org :type '(choice directory (const "~/org/project/") (const "~/Sync/workspace/emacs/org/"))) (defcustom my-org-publish-project-publish-directory "~/public_html/" "Documention see :publish-directory of `org-publish-project-alist'. Used for the example in `my-org-publish-project-alist'." :group 'my-org :type '(choice directory (const "~/public_html/"))) (defcustom my-org-publish-project-alist nil "Documention see `org-publish-project-alist' in `ox-publish.el'. Example defines org-notes and org-static with base-directory to `my-org-publish-project-base-directory' publishing-directory `my-org-publish-project-publish-directory'." :group 'my-org :type '(choice alist (const :tag "Example" :value (list ;; The notes component (list "org-notes" :base-directory my-org-publish-project-base-directory :base-extension "org" :publishing-directory my-org-publish-project-publish-directory :recursive t :publishing-function org-html-publish-to-html ;;:publishing-function org-html-publish-to-tufte-html :headline-levels 4 ; Just the default for this project. :auto-preamble t :auto-sitemap t ; Generate sitemap.org automatically... :sitemap-filename "sitemap.org" ; ... call it sitemap.org (it's the default)... :sitemap-title "Sitemap" ; ... with title 'Sitemap'. ) ;; The static component (list "org-static" :base-directory my-org-publish-project-base-directory :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" :publishing-directory my-org-publish-project-publish-directory :recursive t :publishing-function org-publish-attachment ) ;; The publish component (list "org" :components (list "org-notes" "org-static")))))) (defcustom my-org-brain-path (expand-file-name "brain" "~/org") "Documention see `org-brain-path' in `ox-brain.el'." :group 'my-org :type '(choice directory (const (expand-file-name "brain" "~/org")) (const "~/Sync/workspace/emacs/org-brain"))) ;; uses the org version from the org ELPA repository instead of the ;; one shipped with emacs. Therefore, any org related code should not ;; be loaded before, otherwise both versions will be loaded and will ;; conflict. (use-package org :load-path (lambda() (list (concat user-emacs-directory "lisp/org/lisp") (concat user-emacs-directory "lisp/org/contrib/lisp"))) :delight (org-mode "🅞") ;; "Org " :defer t :init (setq org-export-backends '(ascii html icalendar latex odt tufte md)) :config (setq org-startup-with-inline-images t) ;; #+STARTUP: inlineimages|noinlineimages, show inline images when loading a new Org file (setq org-image-actual-width '(600)) ;; image width displayed in org ;; todo see also org-todo-keyword-faces and org-superstar-todo-bullet-alist (setq org-todo-keywords ;; (x!) record a time stamp, (x@) add a note (with time), (y/z) entering the state / leaving the state '((sequence "TODO(t)" "WAIT(w)" "|" "DONE(d)" "CANC(c)"))) (setq org-hierarchical-todo-statistics nil) ;; TODO statistics covers all entries in the subtree. (setq org-refile-use-outline-path t) ;; show levels (setq org-outline-path-complete-in-steps nil) ;; not in steps bc of using ivy completion (setq org-default-notes-file my-org-default-notes-file) (setq org-agenda-files my-org-agenda-files) (setq org-refile-targets my-org-refile-targets) (defun my-org-refile-target-verify-function () "exclude done keywords of todos." (not (member (nth 2 (org-heading-components)) ;; get todo keyword from current heading org-done-keywords))) ;; is filled buffer-wise (setq org-refile-target-verify-function 'my-org-refile-target-verify-function) ;; C-c C-c for code blocks (otherwise e.g.: No org-babel-execute function for shell) (org-babel-do-load-languages 'org-babel-load-languages '(;; t enabled, nil disabled (awk . t) (C . t) (calc . t) (csharp . t) (ditaa . t) (dot . t) (emacs-lisp . t) (gnuplot . t) (haskell . t) (js . t) (latex . t) (octave . t) (plantuml . t) (python . t) (R . t) ;; Error message regarding R: ;; (invalid-function org-babel-header-args-safe-fn) ;; Invalid function: org-babel-header-args-safe-fn ;; M-x byte-compile-file /ob-R.el ;; restart emacs. The compilation of ob-R.el must be done twice if necessary (shell . t) (sql . t))) (add-to-list 'image-file-name-extensions "eps" t)) ;; TODO: eps not needed? (use-package org-id ;; used by org-brain :defer t :config ;; (setq org-id-track-globally t) ;; default is t (setq org-id-locations-file (concat user-cache-directory ".org-id-locations"))) (use-package org-faces :defer t :config (setq org-todo-keyword-faces ;; TODO keywords '(("TODO" . "LightSkyBlue4") ;; org-warning (bold red), DeepSkyBlue3 ("WAIT" . "LightSkyBlue4") ;; ("DONE" . "#5e5079") ;; DarkSlateGray4 PaleTurquoise4, CadetBlue4, LightSkyBlue4 ("CANC" . "#5e5079") ;; ("STARTED" . "yellow") ("CANCELED" . (:foreground "blue" :weight bold))))) (use-package org-table :defer t :config (setq org-table-convert-region-max-lines 9999)) (use-package org-capture :defer t :config ;; https://www.gnu.org/software/emacs/manual/html_node/org/Capture-templates.html (add-to-list 'org-capture-templates '(;; put entries under the heading 'Tasks' in default notes file ("t" "Todo" entry (file+headline "" "Tasks") ;; empty string is the file, e.g. "~/org/gtd.org" "* TODO %?\n %i\n %a"))) (add-to-list 'org-capture-templates '(;; put entries under a date tree (year - month - day - entry) in the default file ("j" "Journal" entry (file+olp+datetree "") ;; empty string is the file, e.g. "~/org/journal.org" "* %?\nEntered on %U\n %i\n %a"))) ;; see also org-cliplink K, org-brain b ) (use-package org-mouse ;; to load mouse features, like clicking on the bullet of a heading :after (org)) (use-package org-tempo ;; expand = min && x <= max) ? x : 1/0 ; \ set datafile separator '\\t' # treat empty fields in a org-table as 'missing' rather than 'bad' (ignoring, shifting column) ") (defvar gnuplot-init-dark "reset ; \ theme_type = 'dark' ; \ set border lc rgb '#cccccc' ; \ set title textcolor '#cccccc' ; \ set xtics textcolor rgb '#cccccc' ; \ set ytics textcolor rgb '#cccccc' ; \ set xlabel textcolor rgb '#cccccc' ; \ set ylabel textcolor rgb '#cccccc' ; \ set zlabel textcolor rgb '#cccccc' ; \ set key textcolor rgb '#cccccc' ; \ set linetype 1 lc rgb '#0060ad' lw 2 pt 5 ; \ set linetype 2 lc rgb '#dd181f' lw 2 pt 5 ; \ set linetype 3 lc rgb '#9356a6' lw 2 pt 5 ; \ set linetype 4 lc rgb '#4d92cc' lw 2 pt 5 ; \ set linetype 5 lc rgb '#cc5279' lw 2 pt 5 ; \ set linetype 6 lc rgb '#76ab2f' lw 2 pt 5 ; \ set linetype 7 lc rgb '#ecb01f' lw 2 pt 5 ; \ filter(x,min,max) = (x >= min && x <= max) ? x : 1/0 ; \ set datafile separator '\\t' # treat empty fields in a org-table as 'missing' rather than 'bad' (ignoring, shifting column) ") (defun gpl-file (filename) "\ FILENAME: the file name returns: file name with extension for the org src header :file - for LaTeX export it is set to: FILENAME.tikz - for other export it is set to: FILENAME.svg usage: #+HEADER: :file (gpl-file \"ledger-income\") See also: http://www.gnuplot.info/docs_5.2/Gnuplot_5.2.pdf#section*.519 " ;;(concat filename (by-backend (latex ".tex") (t ".svg")) ) (concat filename (by-backend (latex ".tikz") (t ".svg")) ) ;;(by-backend (latex "") (t (concat filename ".svg"))) ) (defun gpl-term (lsize osize) "\ LSIZE: latex export size OSIZE: other export size returns: term settings for the org src gnuplot header :term - for LaTeX export it is set to: lua tikz size LSIZE color colortext - for other export it is set to: svg size OSIZE mouse standalone background '#11000000' usage: #+HEADER: :term (gpl-term \"15cm,12cm\" \"380,300\") " (concat ;;(by-backend (latex "epslatex size ") (t "svg size ")) (by-backend (latex "lua tikz size ") (t "svg size ")) (by-backend (latex lsize) (t osize)) (by-backend (latex " color") (t " mouse standalone background '#11000000'")))) ) (use-package ob-python :defer t :config (defun mpl-var (filename) "\ FILENAME: the file name returns: file name varible with extension for the org src header :var - for LaTeX export it is set to: FILENAME.pgf - for other export it is set to: FILENAME.svg usage: #+HEADER: :var fname=(mpl-var \"ledger-income\") " (concat filename (by-backend (latex ".pgf") (t ".svg")))) (defun mpl-prologue () "\ Matplotlib returns: style settings for a org src python matplotlib code block - for LaTeX export it is not set. - for other export it is set to: import matplotlib.pyplot as plt;plt.style.use('dark_background'); usage: #+HEADER: :prologue (mpl-prologue) " (by-backend (latex "") (t "import matplotlib.pyplot as plt;plt.style.use('dark_background');")))) (use-package ob-ditaa :defer t :config ;; no more needed org-ditaa-jar-path default looks in ~/.config/emacs/lisp/org-9.2.6/contrib/scripts/ditaa.jar ;; org-ditaa-jar-path (car (directory-files "/usr/share/java/ditaa" 'full "[.]*.jar" #'file-newer-than-file-p)) ;; config to change from a ditaa.jar file to a ditaa executable file ;; org-babel-ditaa-java-cmd "" ; default is "java". set to "" because system ditaa executable includes java ;; org-babel-default-header-args:ditaa ; default is ((:results . "file") (:exports . "results") (:java . "-Dfile.encoding=UTF-8")) ;; '((:results . "file") ;; (:exports . "results")) ;; org-ditaa-jar-option "" ; default is "-jar". set to "" because system ditaa executable includes -jar ;; org-ditaa-jar-path (concat "" (executable-find "ditaa")) ; default is "~/.config/emacs/lisp/org/contrib/scripts/ditaa.jar" ;; TODO: find file e.g. (shell-command "cat `which ditaa`") or (shell-command "ls /usr/share/java/ditaa") (setq org-ditaa-jar-path "/usr/share/java/ditaa/ditaa-0.11.jar")) (use-package ob-csharp :after (org)) (use-package ob-async ;; https://melpa.org/#/ob-async execute src blocks async, insert in block header (without argument) :async :after (org)) (use-package ol-notmuch :after (org)) (use-package ox :defer t :config ;; https://orgmode.org/manual/Advanced-Export-Configuration.html ;; https://en.wikibooks.org/wiki/LaTeX/Internationalization ;; (defun my-org-export-filter-hyphen-shy (text backend info) ;; "Convert \"- to ­ in HTML export." ;; (when (org-export-derived-backend-p backend 'html) ;; (replace-regexp-in-string "\"-" "­" text)) ;; ) ;; (defun my-org-export-filter-hyphen-hard (text backend info) ;; "Convert \"= to - in HTML export." ;; (when (org-export-derived-backend-p backend 'html) ;; (replace-regexp-in-string "\"=" "-" text)) ;; ) ;; (add-to-list 'org-export-filter-body-functions ;; 'my-org-export-filter-hyphen-shy) ;; (add-to-list 'org-export-filter-body-functions ;; 'my-org-export-filter-hyphen-hard) ;;(add-to-list 'org-export-filter-latex-fragment-functions ;; 'my-org-export-filter-hyphen-shy) (setq org-export-with-smart-quotes t) ;; OPTIONS keyword, e.g., "’:t". ;; http://permalink.gmane.org/gmane.emacs.orgmode/93971 ;; https://emacs.stackexchange.com/questions/30575/adding-latex-newpage-before-a-heading/30892 (defun my-org-headline-string-element (headline backend info) "Return the org element representation of an element. Won't work on ~verb~/=code=-only headers" (let ((prop-point (next-property-change 0 headline))) (if prop-point (plist-get (text-properties-at prop-point headline) :parent)))) (defun my-org-latex-ensure-clearpage (headline backend info) "Insert a clearpage before the heading if property clearpage is non-nil." (when (org-export-derived-backend-p backend 'latex) (let ((elmnt (my-org-headline-string-element headline backend info))) (when (and elmnt (org-element-property :CLEARPAGE elmnt)) (concat "\\clearpage\n" headline))))) (add-to-list 'org-export-filter-headline-functions 'my-org-latex-ensure-clearpage)) (use-package ox-extra :after (org) ;; defer t is not enough bc/ ox-extra is not loaded by default :config ;; https://emacs.stackexchange.com/questions/9492/is-it-possible-to-export-content-of-subtrees-without-their-headings ;; https://emacs.stackexchange.com/questions/44018/use-package-ensure-not-working-package-downloaded-but-gives-warning-and-skips-c (ox-extras-activate '(ignore-headlines))) ;; see in variable `ox-extras' (use-package ox-html :defer t ;; will be loaded via `org-export-backends' see above inside `org' :config (setq org-html-doctype "html5") (setq org-html-html5-fancy t) (setq org-html-validation-link nil) ;; remove the "Validate" link at the bottom of the page (setq org-html-mathjax-options '((path "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML") ;;(path "/js/MathJax-master/MathJax.js?config=TeX-AMS_HTML") (scale "100") (align "center") (font "TeX") (linebreaks "false") (autonumber "AMS") (indent "0em") (multlinewidth "85%") (tagindent ".8em") (tagside "right"))) ;; #+HTML_MATHJAX: align: left indent: 5em tagside: left font: Neo-Euler ;; http://docs.mathjax.org/en/latest/input/tex/macros/ (setq org-html-mathjax-template " ") ) (use-package ox-tufte ;; https://melpa.org/#/ox-tufte :defer t ;; will be loaded via `org-export-backends' see above inside `org' :config (defun my-org-tufte-export-to-file (&optional async subtreep visible-only) "Like `org-tufte-export-to-file' but with additional notification." (interactive) (let ((outfile (org-export-output-file-name ".html" subtreep)) ;; need to bind this because tufte treats footnotes specially, so we ;; don't want to display them at the bottom (org-html-footnotes-section (if org-tufte-include-footnotes-at-bottom org-html-footnotes-section ""))) (org-export-to-file 'tufte-html outfile async subtreep visible-only nil nil (lambda (file) ;; is called with FILE and has to return a file name. (progn (when my-dbusp (use-package notifications) (notifications-notify :title "Emacs Org Tufte (HTML) Export to File" :body "Export done." :timeout 60000 :urgency 'normal :category "transfer")) file))))) ;; is needed for the asynchronous task (defun my-org-export-html (&optional async) (interactive) (save-buffer) (when (get-buffer "*gnuplot*") (kill-buffer "*gnuplot*")) ;; to get a new session (my-org-tufte-export-to-file async)) (defun my-org-export-html-async () (interactive) (my-org-export-html t)) (org-defkey org-mode-map [f5] 'my-org-export-html) (org-defkey org-mode-map [C-f5] 'my-org-export-html-async) (defun org-tufte-src-block (src-block _contents info) "Transcode a SRC-BLOCK element from Org to HTML. CONTENTS holds the contents of the item. INFO is a plist holding contextual information." (if (org-export-read-attribute :attr_html src-block :textarea) (org-html--textarea-block src-block) (let* ((lang (org-element-property :language src-block)) (code (org-html-format-code src-block info)) (label (let ((lbl (and (org-element-property :name src-block) (org-export-get-reference src-block info)))) (if lbl (format " id=\"%s\"" lbl) ""))) (klipsify (and (plist-get info :html-klipsify-src) (member lang '("javascript" "js" "ruby" "scheme" "clojure" "php" "html"))))) (if (not lang) (format "
\n%s
" label code) (format "
\n%s%s\n
" ;; Build caption. (let ((caption (org-export-get-caption src-block))) (if (not caption) "" (let ((listing-number (format "%s " (format (org-html--translate "Listing %d:" info) (org-export-get-ordinal src-block info nil #'org-html--has-caption-p))))) (format "" listing-number (org-trim (org-export-data caption info)))))) ;; Contents. (if klipsify (format "
%s
" lang label (if (string= lang "html") " data-editor-type=\"html\"" "") code) (format "
%s
" lang label code)))))))) (use-package ox-latex :defer t ;; will be loaded via `org-export-backends' see above inside `org' :config (setq org-latex-compiler "lualatex") ;; %latex in org-latex-pdf-process (setq org-latex-bib-compiler "biber") ;; %bib in org-latex-pdf-process (setq org-latex-pdf-process '("%latex -shell-escape -interaction nonstopmode -output-directory %o %f" "%bib %b" "%latex -shell-escape -interaction nonstopmode -output-directory %o %f" "%latex -shell-escape -interaction nonstopmode -output-directory %o %f")) (setq org-latex-listings t) (setq org-latex-listings-options '(("numbers" "left") ;; ("captionpos" "t") ;; not working, see org-latex-caption-above )) (setq org-latex-caption-above '(table src-block)) (setq org-latex-hyperref-template " %% DON't let hyperref overload the format of index and glossary. %% I want to do that on my own in the stylefiles for makeindex... \\makeatletter \\let\\@old@wrindex=\\@wrindex \\makeatother \\hypersetup{%% pdfauthor={%a}, pdftitle={%t}, pdfkeywords={%k}, pdfsubject={%d}, pdfcreator={%c}, pdflang={%L}, pdfproducer={LaTeX}, %%pdfpagelabels, %% Dokument an Fensterbreite anpassen, {XYZ null null 1} pdfstartview=FitH, %% Miniaturansicht nicht anzeigen pdfpagemode=UseNone, bookmarksopen=true, bookmarksnumbered=true, %% use true to enable colors below: colorlinks=true, linkcolor=black, filecolor=darkblue, menucolor=darkblue, urlcolor=darkblue, citecolor=black, %% PDF link-darstellung, falls colorlinks=false. 0 0 0: nix. 0 0 1: default. pdfborder=0 0 0, %%frenchlinks=false, %% small caps instead of colors %% false bei römisch und arabischen Zahlen plainpages=false, %% true bei römisch und arabischen Zahlen; Without hypertexnames it's just counting upwards; bei 4 -> iv hypertexnames=true, } \\makeatletter \\let\\@wrindex=\\@old@wrindex \\makeatother ") (add-to-list 'org-latex-classes '("koma-article" "\\documentclass{scrartcl}" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) (defun my-org-latex-export-to-pdf (&optional async subtreep visible-only body-only ext-plist) "Like `org-latex-export-to-pdf' but with additional notification." (interactive) (let ((outfile (org-export-output-file-name ".tex" subtreep))) (org-export-to-file 'latex outfile async subtreep visible-only body-only ext-plist (lambda (file) ;; is called with FILE and has to return a file name. (let ((output (org-latex-compile file))) (when my-dbusp (use-package notifications) (notifications-notify :title "Emacs Org Latex Export to PDF" :body "Export done." :timeout 60000 :urgency 'normal :category "transfer")) output))))) ;; is needed for the asynchronous task (defun my-org-export-pdf (&optional async) (interactive) (save-buffer) (when (get-buffer "*gnuplot*") (kill-buffer "*gnuplot*")) ;; to get a new session (my-org-latex-export-to-pdf async)) (defun my-org-export-pdf-async () (interactive) (my-org-export-pdf t)) (org-defkey org-mode-map [f6] 'my-org-export-pdf) (org-defkey org-mode-map [C-f6] 'my-org-export-pdf-async) ;; overwrite org ox-latex (defun org-latex--inline-image (link info) "Return LaTeX code for an inline image. LINK is the link pointing to the inline image. INFO is a plist used as a communication channel." (let* ((parent (org-export-get-parent-element link)) (path (let ((raw-path (org-element-property :path link))) (if (not (file-name-absolute-p raw-path)) raw-path (expand-file-name raw-path)))) (filetype (file-name-extension path)) (caption (org-latex--caption/label-string parent info)) (caption-above-p (org-latex--caption-above-p link info)) ;; Retrieve latex attributes from the element around. (attr (org-export-read-attribute :attr_latex parent)) (float (let ((float (plist-get attr :float))) (cond ((string= float "wrap") 'wrap) ((string= float "sideways") 'sideways) ((string= float "multicolumn") 'multicolumn) ((and (plist-member attr :float) (not float)) 'nonfloat) ((or float (org-element-property :caption parent) (org-string-nw-p (plist-get attr :caption))) 'figure) (t 'nonfloat)))) (placement (let ((place (plist-get attr :placement))) (cond (place (format "%s" place)) ((eq float 'wrap) "{l}{0.5\\textwidth}") ((eq float 'figure) (format "[%s]" (plist-get info :latex-default-figure-position))) (t "")))) (center (if (plist-member attr :center) (plist-get attr :center) (plist-get info :latex-images-centered))) (comment-include (if (plist-get attr :comment-include) "%" "")) ;; It is possible to specify width and height in the ;; ATTR_LATEX line, and also via default variables. (width (cond ((plist-get attr :width)) ((plist-get attr :height) "") ((eq float 'wrap) "0.48\\textwidth") (t (plist-get info :latex-image-default-width)))) (height (cond ((plist-get attr :height)) ((or (plist-get attr :width) (memq float '(figure wrap))) "") (t (plist-get info :latex-image-default-height)))) (options (let ((opt (or (plist-get attr :options) (plist-get info :latex-image-default-option)))) (if (not (string-match "\\`\\[\\(.*\\)\\]\\'" opt)) opt (match-string 1 opt)))) image-code) (if (member filetype '("tikz" "pgf")) ;; For tikz images: ;; - use \input to read in image file. ;; - if options are present, wrap in a tikzpicture environment. ;; - if width or height are present, use \resizebox to change ;; the image size. (progn (setq image-code (format "\\input{%s}" path)) (when (org-string-nw-p options) (setq image-code (format "\\begin{tikzpicture}[%s]\n%s\n\\end{tikzpicture}" options image-code))) (when (or (org-string-nw-p width) (org-string-nw-p height)) (setq image-code (format "\\resizebox{%s}{%s}{%s}" (if (org-string-nw-p width) width "!") (if (org-string-nw-p height) height "!") image-code)))) ;; For other images: ;; - add width and height to options. ;; - include the image with \includegraphics. (when (org-string-nw-p width) (setq options (concat options ",width=" width))) (when (org-string-nw-p height) (setq options (concat options ",height=" height))) (let ((search-option (org-element-property :search-option link))) (when (and search-option (equal filetype "pdf") (string-match-p "\\`[0-9]+\\'" search-option) (not (string-match-p "page=" options))) (setq options (concat options ",page=" search-option)))) (setq image-code (format "\\includegraphics%s{%s}" (cond ((not (org-string-nw-p options)) "") ((string-prefix-p "," options) (format "[%s]" (substring options 1))) (t (format "[%s]" options))) path)) (when (equal filetype "eps") (setq image-code (replace-regexp-in-string "^\\\\includegraphics\\[.+\\]" "\\input" image-code nil t)) (setq image-code (replace-regexp-in-string "\\.eps}" ".tex}" image-code nil t))) (when (equal filetype "svg") (setq image-code (replace-regexp-in-string "^\\\\includegraphics" "\\includesvg" image-code nil t)) (setq image-code (replace-regexp-in-string "\\.svg}" "}" image-code nil t))) ) ;; Return proper string, depending on FLOAT. (pcase float (`wrap (format "\\begin{wrapfigure}%s %s%s %s%s %s\\end{wrapfigure}" placement (if caption-above-p caption "") (if center "\\centering" "") comment-include image-code (if caption-above-p "" caption))) (`sideways (format "\\begin{sidewaysfigure} %s%s %s%s %s\\end{sidewaysfigure}" (if caption-above-p caption "") (if center "\\centering" "") comment-include image-code (if caption-above-p "" caption))) (`multicolumn (format "\\begin{figure*}%s %s%s %s%s %s\\end{figure*}" placement (if caption-above-p caption "") (if center "\\centering" "") comment-include image-code (if caption-above-p "" caption))) (`figure (format "\\begin{figure}%s %s%s %s%s %s\\end{figure}" placement (if caption-above-p caption "") (if center "\\centering" "") comment-include image-code (if caption-above-p "" caption))) ((guard center) (format "\\begin{center} %s%s %s\\end{center}" (if caption-above-p caption "") image-code (if caption-above-p "" caption))) (_ (concat (if caption-above-p caption "") image-code (if caption-above-p caption ""))))))) (use-package ox-md :defer t) ;; will be loaded via `org-export-backends' see above inside `org' (use-package ox-publish :defer t :config (setq org-publish-timestamp-directory (concat user-cache-directory "org-timestamps/")) (setq org-publish-project-alist my-org-publish-project-alist)) (use-package org-drill ;; requires persist https://elpa.gnu.org/packages/persist.html :commands org-drill) (use-package org-brain ;; uses org-id If you find that org-brain is missing entries, or list entries which doesn’t exist, try using M-x org-brain-update-id-locations, which syncs the org-brain entries with the org-id caching system. :commands (org-brain-visualize) :init (setq org-brain-path my-org-brain-path) :config (require 'org-capture) ;; make org-brain commands more accessable if you edit entries from org-mode (bind-key "C-c B" 'org-brain-prefix-map org-mode-map) ;; org-brain use org-id in order to speed things up. Because of ;; this, the variable org-id-track-globally should be t (which it ;; already is by default). You may want to modify ;; org-id-locations-file too. If you add entries to org-brain ;; directly from org-mode you must assign headliens an ID. A ;; comfortable way to do this is with the command ;; org-brain-ensure-ids-in-buffer. Even more comfortable is to add ;; that to before-save-hook, so that it runs when saving. (add-hook 'before-save-hook #'org-brain-ensure-ids-in-buffer) ;; to add information at the end of an entry, without visiting the file. (push '("b" "Brain" plain (function org-brain-goto-end) "* %i%?" :empty-lines 1) org-capture-templates) ;; (setq org-brain-visualize-default-choices 'all) ;; (setq org-brain-show-resources t) ;; (setq org-brain-show-text t) ;; (setq org-brain-title-max-length 12) ;; Some users find it confusing having both headline entries and ;; file entries (see below). It may be preferable to only use ;; headline entries, by setting org-brain-include-file-entries to ;; nil. If doing this, you should probably also set ;; org-brain-file-entries-use-title to nil. Another possibility is ;; if you’re only using file entries, in which case you can set ;; org-brain-scan-for-header-entries to nil. ;; (setq org-brain-include-file-entries nil) ;; (setq org-brain-file-entries-use-title nil) (require 'deft) (defun org-brain-deft () "Use `deft' for files in `org-brain-path'." (interactive) (let ((deft-directory org-brain-path) (deft-recursive t) (deft-extensions '("org"))) (deft))) (require 'org-cliplink) (defun org-brain-cliplink-resource () "Add a URL from the clipboard as an org-brain resource. Suggest the URL title as a description for resource." (interactive) (let ((url (org-cliplink-clipboard-content))) (org-brain-add-resource url (org-cliplink-retrieve-title-synchronously url) t))) (define-key org-brain-visualize-mode-map (kbd "L") #'org-brain-cliplink-resource)) ;; Allows you to edit entries directly from org-brain-visualize (use-package polymode :defer t :config (add-hook 'org-brain-visualize-mode-hook #'org-brain-polymode)) (provide 'org-settings) ;;; org-settings.el ends here