From 107587e01fda5fc6372a7db4b50548f47345eca7 Mon Sep 17 00:00:00 2001 From: Gerard Vermeulen Date: Thu, 23 Dec 2021 15:29:03 +0100 Subject: [PATCH] Freeze many changes * Implement headers and footers for export to LaTeX. * Implement a title page for export to LaTeX. * Improve the text in many places. * Configure export to LaTeX using buffer local variables. --- .gitignore | 3 + Emacs-logo.png | Bin 0 -> 29881 bytes Org-mode-unicorn.png | Bin 0 -> 20545 bytes README.org | 1151 +++++++++++++++++++++++++++-------------- org-babel-tangle-file | 1 + 5 files changed, 755 insertions(+), 400 deletions(-) create mode 100644 Emacs-logo.png create mode 100644 Org-mode-unicorn.png diff --git a/.gitignore b/.gitignore index 33d1649..6f02458 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,10 @@ *.fdb_latexmk *.fls *.html +*.lof *.log +*.lol +*.lot *.out *.pdf *.py diff --git a/Emacs-logo.png b/Emacs-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..08051c8d038f4335491679e875edac1daae0d466 GIT binary patch literal 29881 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 A$p8QV literal 0 HcmV?d00001 diff --git a/README.org b/README.org index 5b3145b..b1b50a1 100644 --- a/README.org +++ b/README.org @@ -3,9 +3,19 @@ #+author: Gerard Vermeulen #+babel: :cache no #+property: header-args :tangle init.el :comments link -#+property: header-args:emacs-lisp :results silent +#+property: header-args:emacs-lisp :exports code :results silent +# #+latex_class: article #+latex_class_options: [11pt,a4paper,svgnames] +#+latex_header: \usepackage[AUTO]{babel} +#+latex_header: \usepackage{fvextra} +#+latex_header: \usepackage{csquotes} +# +#+latex_header: \usepackage{caption} +#+latex_header: \usepackage[newfloat]{minted} +#+latex_header: \captionsetup[listing]{position=below,skip=0em} +#+latex_header: \usemintedstyle{xcode} +# #+latex_header: \hypersetup{ #+latex_header: citecolor=blue, #+latex_header: colorlinks=true, @@ -15,35 +25,59 @@ #+latex_header: unicode=true, #+latex_header: urlcolor=blue #+latex_header: } -#+latex_header: \usepackage{minted} -#+latex_header: \usemintedstyle{xcode} +# +#+latex_header: \usepackage{fancyhdr} +#+latex_header: \usepackage{lastpage} +# #+latex_header: \usepackage[ #+latex_header: headheight=20mm, #+latex_header: top=40mm, #+latex_header: bottom=20mm, -#+latex_header: left=0.1\paperwidth, -#+latex_header: right=0.1\paperwidth, +#+latex_header: left=60pt, +#+latex_header: right=60pt, #+latex_header: heightrounded, #+latex_header: verbose, #+latex_header: ]{geometry} +# +#+latex_header: % Make section an implicit float barrier: +#+latex_header: \usepackage[section]{placeins} +#+latex_header: % Make subsection an implicit float barrier: +#+latex_header: \makeatletter +#+latex_header: \AtBeginDocument{% +#+latex_header: \expandafter\renewcommand\expandafter\subsection\expandafter{% +#+latex_header: \expandafter\@fb@secFB\subsection +#+latex_header: }% +#+latex_header: } +#+latex_header: \makeatother +#+latex_header: % Make subsubsection an implicit float barrier: +#+latex_header: \makeatletter +#+latex_header: \AtBeginDocument{% +#+latex_header: \expandafter\renewcommand\expandafter\subsubsection\expandafter{% +#+latex_header: \expandafter\@fb@secFB\subsubsection +#+latex_header: }% +#+latex_header: } +#+latex_header: \makeatother * Quick start :PROPERTIES: :CUSTOM_ID: sec:quick-start :END: -Backup your =~/.emacs.d= directory to execute the following commands: +Backup your =user-emacs-directory= (defaults often to =~/.emacs.d= on =Linux=, +=Unix=, or =Darwin=) directory and execute the commands in listing +[[lst:prepare-user-emacs-directory]]. After normal (interactive mode, no batch +mode, neither server mode), Emacs will ask you to install a selected set of +packages. Quit Emacs and invoke Emacs again. +#+caption[Prepare the user-emacs-directory]: +#+caption: Clone and initialize the user-emacs-directory. +#+label: lst:prepare-user-emacs-directory #+begin_src shell :noeval :tangle no cd ~ - git clone ccdr@mercury.grenoble.cnrs.fr:SERVER/.emacs.d + git clone ccdr@mercury.grenoble.cnrs.fr:SERVER/emacs.d.git .emacs.d make --directory=.emacs.d init + emacs & #+end_src -After its invokation, Emacs will install a minimal set of packages. Now, you -have the option to install all optional packages using the command -=my-install-optional-packages=, but you can do this any time, or you can install -any package using the command =package-install= whenever you like. Quit Emacs -and invoke Emacs again. * Introduction :PROPERTIES: @@ -56,9 +90,9 @@ the reports is [[https://orgmode.org/][Org Mode]] plain text with [[https://www. format of the presentations is [[https://www.latex-project.org/][LaTeX]]. This [[info:org#Top][org]] file (more precisely the original [[info:org#Top][org]] source file of this file) -illustrates my work-flow by showing: +illustrates three methods in my work-flow: 1. How to tangle (or export) source blocks from [[info:org#Top][org]] files. This file contains - source blocks to produce the files =early-init.el=, =init.el=, =latexmkrc=, + source blocks to produce the files =early-init.el=, =init.el=, =latexmkrc=, =org-store-link=, and =example.py= by tangling. 2. How to export [[info:org#Top][org]] files to other formats such as [[https://en.wikipedia.org/wiki/HTML][HTML]], [[https://www.latex-project.org/][LaTeX]], and [[https://en.wikipedia.org/wiki/PDF][PDF]]. 3. How [[info:org#Hyperlinks][org hyperlinks (info)]] allow to link inside and outside [[info:org#Top][Org Mode]]: hover @@ -115,6 +149,9 @@ Here follows a list of interesting Emacs configurations: Try to load [[https://github.com/emacscollective/no-littering][no-littering]] as early as possible, since it helps to keep =~/.emacs.d= clean. +#+caption[Tangle the early-init-file]: +#+caption: Tangle the early-init-file. +#+label: lst:tangle-early-init-file #+begin_src emacs-lisp :tangle early-init.el ;;; early-init.el --- user early-init file -*- lexical-binding: t -*- ;;; Commentary: @@ -135,9 +172,9 @@ Try to load [[https://github.com/emacscollective/no-littering][no-littering]] as In order to get help in understanding the code block above in a buffer showing the original [[info:org#Top][Org]] source file, move point (or cursor) to one of the items of the list the and type =C-c C-c=: -1. src_emacs-lisp[:exports code]{(describe-variable #'load-prefer-newer t)} -2. src_emacs-lisp[:exports code]{(apropos-library "no-littering")} -3. src_emacs-lisp[:exports code]{(find-function #'hack-local-variables)} +1. src_emacs-lisp{(describe-variable #'load-prefer-newer t)} +2. src_emacs-lisp{(apropos-library "no-littering")} +3. src_emacs-lisp{(find-function #'hack-local-variables)} to execute the code between the curly braces for access to help. This shows why *Emacs is a self-documenting editor.* @@ -147,14 +184,22 @@ This shows why *Emacs is a self-documenting editor.* :CUSTOM_ID: sec:init-file-header :END: -The [[info:elisp#Quoting][quoting (info)]] and the [[info:elisp#Backquote][backquote (info)]] pages explain how to understand the -reader macros ~'~ (quote), ~`~ (backquote), ~,~ (substitute) and ~@,~ (splice) -in the ~custom-set-variable~ function call below. A tutorial of how to use those -reader macros is the [[https://mullikine.github.io/posts/macro-tutorial/][didactic emacs-lisp macro example]]. - -Because of the ~custom-set-variables~ function call, the [[info:emacs#Init File][init file (info)]] does -not load the ~custom-file~ as [[info:emacs#Saving Customizations][saving customizations (info)]] recommends. +The =user-init-file= header requires =cl-lib= and customizes Emacs variables. +It consists of three parts in listing [[lst:1st-custom-set-variables-call]], +[[lst:2nd-custom-set-variables-call]], and [[lst:3rd-custom-set-variables-call]] in +order to limit the length of the listings for exporting to LaTeX. The [[info:elisp#Quoting][quoting +(info)]] and the [[info:elisp#Backquote][backquote (info)]] pages explain how to understand the reader +macros ~'~ (quote), ~`~ (backquote), ~,~ (substitute) and ~@,~ (splice) in the +~custom-set-variables~ function calls in listing +[[lst:1st-custom-set-variables-call]], [[lst:2nd-custom-set-variables-call]], and +[[lst:3rd-custom-set-variables-call]]. A tutorial of how to use those reader macros +is the [[https://mullikine.github.io/posts/macro-tutorial/][didactic emacs-lisp macro example]]. The [[info:emacs#Init File][init file (info)]] does not load +the ~custom-file~ as [[info:emacs#Saving Customizations][saving customizations (info)]] recommends because of the +~custom-set-variables~ function calls. +#+caption[Customize the first set of Emacs variables]: +#+caption: Customize the first set of Emacs variables. +#+label: lst:1st-custom-set-variables-call #+begin_src emacs-lisp ;;; init.el --- user init file -*- lexical-binding: t -*- ;;; Commentary: @@ -165,13 +210,10 @@ not load the ~custom-file~ as [[info:emacs#Saving Customizations][saving customi '(after-save-hook #'executable-make-buffer-file-executable-if-script-p) '(column-number-mode t) '(cursor-type 'box) - ;; `(custom-file ,(make-temp-file "emacs-custom-")) `(custom-file ,(locate-user-emacs-file "custom.el")) '(epg-pinentry-mode 'loopback) '(global-hl-line-mode t) '(global-hl-line-sticky-flag t) - '(history-delete-duplicates t) - '(history-length 500) '(indent-tabs-mode nil) '(inhibit-startup-buffer-menu t) '(inhibit-startup-screen t) @@ -182,14 +224,17 @@ not load the ~custom-file~ as [[info:emacs#Saving Customizations][saving customi '(kill-ring-max 300) '(package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("nongnu" . "https://elpa.nongnu.org/nongnu/") - ("melpa" . "https://melpa.org/packages/"))) + ("melpa" . "https://melpa.org/packages/")))) +#+end_src + +#+caption[Customize the second set of Emacs variables]: +#+caption: Customize the second set of Emacs variables. +#+label: lst:2nd-custom-set-variables-call +#+begin_src emacs-lisp + (custom-set-variables `(package-selected-packages - `( - ,@(when (version< emacs-version "28.0") - '( - org ; plain text thought organizer - modus-themes ; high foreground/background contrast themes - )) + `(,@(when (version< emacs-version "28.0") + '(org)) ; plain text thought organizer anaconda-mode ; strangles python-mode async ; asynchroneous processing auctex ; Aalborg University Center TeX @@ -228,17 +273,16 @@ not load the ~custom-file~ as [[info:emacs#Saving Customizations][saving customi writegood-mode ; bullshit and weasel-word detector ws-butler ; remove trailing whitespace xr ; undo rx to grok regular expressions - yasnippet ; code or text template expansion - )) - '(python-indent-guess-indent-offset nil) + yasnippet))) ; code or text template expansion +#+end_src + +#+caption[Customize the third set of Emacs variables]: +#+caption: Customize the third set of Emacs variables. +#+label: lst:3rd-custom-set-variables-call +#+begin_src emacs-lisp + (custom-set-variables '(recentf-mode t) '(save-place-mode t) - '(savehist-additional-variables - '(eww-history - kill-ring - regexp-search-string - search-ring - search-string)) '(scroll-bar-mode nil) '(tab-always-indent 'complete) '(tab-width 8) @@ -260,9 +304,9 @@ not load the ~custom-file~ as [[info:emacs#Saving Customizations][saving customi (add-to-list 'initial-frame-alist '(width . 180))) #+end_src -* Package bootstrapping +* Install the selected packages :PROPERTIES: -:CUSTOM_ID: sec:package-bootstrapping +:CUSTOM_ID: sec:install-selected-packages :END: [[info:emacs#Package Installation][Emacs installs packages]] from archives on the internet. This setup uses three @@ -273,21 +317,21 @@ archives: Finally, the [[https://github.com/quelpa/quelpa][quelpa]] tool allows to fetch code from any source and build a package on your computer before installation. -The code assumes that the package system is in a *virgin* state in case the -package [[https://github.com/emacscollective/no-littering][no-littering]] is not present. Refreshing the contents of available -packages at least once is a requirement in order to be able to install and load -any packages, hence also [[https://github.com/emacscollective/no-littering][no-littering]]. +The code in listing [[lst:install-selected-packages]] assumes that the package +system is in a *virgin* state in case the package [[https://github.com/emacscollective/no-littering][no-littering]] is not present. +Refreshing the contents of available packages at least once is a requirement in +order to be able to install and load any packages, hence also [[https://github.com/emacscollective/no-littering][no-littering]]. -The call src_emacs-lisp[:exports code]{(package-install-selected-packages)} -checks the installation status of all packages in -src_emacs-lisp[:exports code]{package-selected-packages} and installs the -missing packages after the user has agreed to its prompt. - -After package bootstrapping, you have to refresh the list of available packages -yourself before updating the installed packages. +The call src_emacs-lisp{(package-install-selected-packages)} checks the +installation status of all packages in src_emacs-lisp{package-selected-packages} +and installs the missing packages after the user has agreed to its prompt. In +case of normal Emacs usage, src_emacs-lisp{(package-list-packages)} refreshes +the contents of packages and allows to update packages to the latest version. +#+caption[Install the selected packages]: +#+caption: Install the selected packages. +#+label: lst:install-selected-packages #+begin_src emacs-lisp - ;; The is the 1st package bootstrapping block. (unless (require 'no-littering nil 'noerror) (package-refresh-contents) (package-install 'no-littering) @@ -304,22 +348,25 @@ yourself before updating the installed packages. Emacs can act as a server that listens to a socket to share its state (for instance buffers and command history) with other programs by means of a shell -command =emacsclient=. +command =emacsclient=. Section [[#sec:latexmk-save-compile-display-loop]] and +[[#sec:qutebrowser-userscript]] show how to use ~emacsclient~ to: +1. Install an asynchronous (or background) loop of saving a LaTeX file, + compiling it, and redisplaying the output in Emacs. +2. Make [[https://qutebrowser.org][qutebrowser]] send html links with document titles to Emacs. +The code in listing [[lst:start-emacs-server]] starts the Emacs server. +#+caption[Start the Emacs server]: +#+caption: Start the Emacs server. +#+label: lst:start-emacs-server #+begin_src emacs-lisp (when window-system (unless (or noninteractive (daemonp)) (add-hook 'after-init-hook #'server-start))) #+end_src -The next two configuration blocks show how to use ~emacsclient~ to: -1. Install an asynchronous (or background) loop of saving a LaTeX file, - compiling it, and redisplaying the output in Emacs. -2. Make [[https://qutebrowser.org][qutebrowser]] send html links with document titles to Emacs. - -** LaTeX save-compile-display loop +** Latexmk save-compile-display loop :PROPERTIES: -:CUSTOM_ID: sec:latex-save-compile-display-loop +:CUSTOM_ID: sec:latexmk-save-compile-display-loop :END: The =latexmk= resource file in the next source code block shows how to use @@ -327,8 +374,11 @@ The =latexmk= resource file in the next source code block shows how to use (re)compilation on condition that the settings of the ~compile-command~ local variable in section are compatible. The local variable ~compile-command~ in the [[#sec:local-variables][local variables]] section (only visible in =org= files, but not in =html= and -=pdf= files) shows how to use the =latexmkrc= file.. +=pdf= files) shows how to use the =latexmkrc= file. +#+caption[Tangle the Latexmk resource file]: +#+caption: Tangle the Latexmk resource file. +#+label: lst:latexmkrc #+begin_src perl :tangle latexmkrc :comments none # pdf previewer and update pdf previewer $pdf_previewer = "emacsclient -e '(find-file-other-window %S)'"; @@ -337,7 +387,7 @@ variable in section are compatible. The local variable ~compile-command~ in the # see for instance glossary.latexmkrc add_cus_dep( 'acn', 'acr', 0, 'makeglossaries' ); add_cus_dep( 'glo', 'gls', 0, 'makeglossaries' ); - $clean_ext .= " acr acn alg bbl glo gls glg ist run.xml"; + $clean_ext .= " acr acn alg bbl glo gls glg ist lol run.xml"; sub makeglossaries { my ($name, $path) = fileparse( $$Psource ); return system "makeglossaries -d '$path' '$name'"; @@ -366,8 +416,11 @@ On a [[https://en.wikipedia.org/wiki/POSIX][POSIX]] system, you can run the user terminal to see whether it works. In case you try to run it from Emacs, Emacs may hang or die. +#+caption[Tangle a qutebrowser userscript]: +#+caption: Tangle a qutebrowser userscript. #+header: :comments none #+header: :tangle-mode (identity #o755) +#+label: lst:qutebrowser-userscript #+begin_src python :noeval :tangle org-store-link #!/usr/bin/env python from urllib.parse import urlencode @@ -402,19 +455,37 @@ packages to enrich the completion UI: where the order is that of [[https://github.com/bdarcus/citar#installation][enhancing citar's experience]] and the configuration steps below. -Finally, [[https://company-mode.github.io/][company: a modular complete-anything framework for Emacs]] fills another -niche than the five packages above. +Finally, [[https://company-mode.github.io/][company: a modular complete-anything framework for Emacs]] provides +completion in any buffer and [[#sec:minibuffer-history-completion][minibuffer-history-completion]] provides completion +on previous input in the minibuffer. ** [[info:vertico#Top][Vertico (info)]] :PROPERTIES: :CUSTOM_ID: sec:vertico-configuration :END: +Listing [[lst:enable-vertico-mode]] configures and enables =savehist-mode= and +enables =vertico-mode=. The documentation src_emacs-lisp{(describe-function +'savehist-mode)} why it is best to turn on =savehist-mode= in the Emacs init +file. + +#+caption[Enable =savehist-mode= and =vertico-mode=]: +#+caption: Enable =savehist-mode= and =vertico-mode=. +#+label: lst:enable-vertico-mode #+begin_src emacs-lisp (unless noninteractive + (custom-set-variables + '(history-delete-duplicates t) + '(history-length 500) + '(savehist-additional-variables + '(eww-history + kill-ring + regexp-search-string + search-ring + search-string))) + (savehist-mode +1) (when (fboundp 'vertico-mode) - (vertico-mode +1)) - (savehist-mode +1)) + (vertico-mode +1))) #+end_src ** [[info:orderless#Top][Orderless (info)]] @@ -422,7 +493,11 @@ niche than the five packages above. :CUSTOM_ID: sec:orderless-configuration :END: -#+attr_latex: :options bgcolor=LightGoldenrodYellow +Listing [[lst:configure-orderless]] enables =orderless=. + +#+caption[Configure =orderless=]: +#+caption: Configure =orderless=. +#+label: lst:configure-orderless #+begin_src emacs-lisp (unless noninteractive (when (fboundp 'orderless-filter) @@ -442,6 +517,11 @@ niche than the five packages above. :CUSTOM_ID: sec:embark-configuration :END: +Listing [[lst:configure-embark]] configures =embark=. + +#+caption[Configure =embark=]: +#+caption: Configure =embark=. +#+label: lst:configure-embark #+begin_src emacs-lisp (unless noninteractive (when (cl-every #'fboundp '(embark-act embark-bindings embark-dwim)) @@ -455,6 +535,11 @@ niche than the five packages above. :CUSTOM_ID: sec:marginalia-configuration :END: +Listing [[lst:enable-marginalia-mode]] enables =marginalia-mode=. + +#+caption[Enable =marginalia-mode=]: +#+caption: Enable =marginalia-mode=. +#+label: lst:enable-marginalia-mode #+begin_src emacs-lisp (unless noninteractive (when (fboundp 'marginalia-mode) @@ -466,6 +551,11 @@ niche than the five packages above. :CUSTOM_ID: sec:consult-configuration :END: +Listing [[lst:configure-consult]] configures =consult=. + +#+caption[Configure =consult=]: +#+caption: Configure =consult=. +#+label: lst:configure-consult #+begin_src emacs-lisp (unless noninteractive (when (fboundp 'consult-apropos) @@ -510,6 +600,11 @@ niche than the five packages above. :CUSTOM_ID: sec:company-configuration :END: +Listing [[lst:configure-company]] configures =company=. + +#+caption[Configure =company=]: +#+caption: Configure =company=. +#+label: lst:configure-company #+begin_src emacs-lisp (unless noninteractive (when (fboundp 'company-mode) @@ -526,10 +621,17 @@ niche than the five packages above. #+end_src ** Minibuffer history completion +:PROPERTIES: +:CUSTOM_ID: sec:minibuffer-history-completion +:END: See [[https://lists.gnu.org/archive/html/emacs-devel/2021-12/msg00802.html][Juri Linkov (Emacs Developer mailing list)]] for how to allow completion on -previous input in the minibuffer. +previous input in the minibuffer. Listing +[[lst:enable-minibuffer-history-completion]] enables minibuffer history completion. +#+caption[Enable =minibuffer-history-completion=]: +#+caption: Enable =minibuffer-history-completion=. +#+label: lst:enable-minibuffer-history-completion #+begin_src emacs-lisp (defun minibuffer-setup-history-completions () (unless (or minibuffer-completion-table minibuffer-completion-predicate) @@ -558,10 +660,17 @@ previous input in the minibuffer. #+end_src ** Prefix key-binding help +:PROPERTIES: +:CUSTOM_ID: sec:prefix-key-binding-help +:END: Configure ~which-key-mode~ so that typing =C-h= after a prefix key displays all -keys available after the prefix key. +keys available after the prefix key. Listing [[lst:enable-which-key-mode]] enables +=which-key-mode=. +#+caption[Enable =which-key-mode=]: +#+caption: Enable =which-key-mode=. +#+label: lst:enable-which-key-mode #+begin_src emacs-lisp (when (fboundp 'which-key-mode) (custom-set-variables @@ -572,15 +681,29 @@ keys available after the prefix key. #+end_src * Reading +:PROPERTIES: +:CUSTOM_ID: sec:reading +:END: -** EPUB files +** Reading EPUB files +:PROPERTIES: +:CUSTOM_ID: sec:reading-epub-files +:END: +Listing [[lst:enable-nov-mode]] enables =nov-mode=. + +#+caption[Enable =nov-mode=]: +#+caption: Enable =nov-mode=. +#+label: lst:enable-nov-mode #+begin_src emacs-lisp (when (fboundp 'nov-mode) (add-to-list 'auto-mode-alist `(,(rx ".epub" eos) . nov-mode))) #+end_src -** PDF files +** Reading PDF files +:PROPERTIES: +:CUSTOM_ID: sec:reading-pdf-files +:END: The [[https://github.com/vedang/pdf-tools][pdf-tools]] package exploits the [[https://github.com/freedesktop/poppler][poppler]] library to render and to let you annotate [[https://en.wikipedia.org/wiki/PDF][PDF]] files. It also exploits the [[https://wiki.contextgarden.net/SyncTeX][SyncTeX]] library to link anchors in [[https://en.wikipedia.org/wiki/PDF][PDF]] @@ -590,6 +713,9 @@ In order to use [[https://github.com/vedang/pdf-tools][pdf-tools]], you have to installation of [[https://github.com/vedang/pdf-tools][pdf-tools]] from [[https://melpa.org/][MELPA]] or after each update of [[https://github.com/freedesktop/poppler][poppler]] to build or rebuild the =epdfinfo= executable that serves the [[https://en.wikipedia.org/wiki/PDF][PDF]] files to Emacs. +#+caption[Enable =pdf-tools=]: +#+caption: Enable =pdf-tools=. +#+label: lst:enable-pdf-tools #+begin_src emacs-lisp ;; 'pdf-loader-install' is the lazy equivalent of 'pdf-tools-install': ;; see the README file. @@ -602,8 +728,14 @@ rebuild the =epdfinfo= executable that serves the [[https://en.wikipedia.org/wik #+end_src * Writing +:PROPERTIES: +:CUSTOM_ID: sec:writing +:END: -** LaTeX +** Writing LaTeX files +:PROPERTIES: +:CUSTOM_ID: sec:writing-latex-files +:END: Loading =tex.el= immediately instead of lazily ensures proper initialization of the [[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]]. For instance, the ~TeX-master~ safe local variable in the =tex.el= @@ -611,23 +743,59 @@ elisp library file has no autoload cookie. Without prior loading of =tex.el=, Emacs will complain that ~TeX-master~ is no safe local variable in case it reads a LaTeX file that sets ~TeX-master~. -Out of the box, [[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]] does not indent text between square brackets. The code -below corrects this by advising to override ~TeX-brace-count-line~ with -~my-TeX-brace-count-line~. - +#+caption[Require =AUCTeX=]: +#+caption: Require =AUCTeX=. +#+label: lst:require-auctex #+begin_src emacs-lisp ;; Try to get the `safe-local-variable' predicate for `TeX-master' (when (require 'tex nil 'noerror) + (custom-set-variables + '(TeX-auto-save t) + '(TeX-parse-self t))) +#+end_src + +#+caption[Configure =bibtex=]: +#+caption: Configure =bibtex=. +#+label: lst:configure-bibtex +#+begin_src emacs-lisp + (with-eval-after-load 'bibtex + (custom-set-variables + '(bibtex-dialect 'BibTeX))) +#+end_src + +#+caption[Configure =font-latex=]: +#+caption: Configure =font-latex=. +#+label: lst:configure-font-latex +#+begin_src emacs-lisp + (with-eval-after-load 'font-latex + (custom-set-variables + '(font-latex-fontify-sectioning 1.0))) +#+end_src + +#+caption[Configure =latex=]: +#+caption: Configure =latex=. +#+label: lst:configure-latex +#+begin_src emacs-lisp + (with-eval-after-load 'latex (custom-set-variables '(LaTeX-section-hook '(LaTeX-section-heading LaTeX-section-title LaTeX-section-toc LaTeX-section-section - LaTeX-section-label)) - '(TeX-auto-save t) - '(TeX-parse-self t) - '(font-latex-fontify-sectioning 1.0)) - ;; https://emacs.stackexchange.com/questions/17396/indentation-in-square-brackets + LaTeX-section-label)))) +#+end_src + +Out of the box, [[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]] does not indent text between square brackets. The code +in listing [[lst:configure-tex]] corrects this by advising to override +~TeX-brace-count-line~ with ~my-TeX-brace-count-line~. + +#+caption[Configure =TeX=]: +#+caption: Configure =TeX=. +#+label: lst:configure-tex +#+begin_src emacs-lisp + (with-eval-after-load 'tex + ;; https://emacs.stackexchange.com/questions/17396/ + ;; indentation-in-square-brackets (defun my-TeX-brace-count-line () "Count number of open/closed braces." (save-excursion @@ -650,19 +818,24 @@ below corrects this by advising to override ~TeX-brace-count-line~ with (forward-char) t)))))) count))) (advice-add 'TeX-brace-count-line :override #'my-TeX-brace-count-line)) - - (with-eval-after-load 'bibtex - (custom-set-variables - '(bibtex-dialect 'BibTeX))) #+end_src *** TODO Improve the AUCTeX configuration slowly [[https://github.com/thisirs/dotemacs/blob/master/lisp/init-auctex.el][AUCTeX setup of an experienced user]] -** Org-mode +** Writing Org files +:PROPERTIES: +:CUSTOM_ID: sec:writing-org-files +:END: -*** [[info:org#Activation][Activation (info)]] +*** [[info:org#Activation][Org activation (info)]] +:PROPERTIES: +:CUSTOM_ID: sec:activate-org +:END: +#+caption[Activate =Org=]: +#+caption: Activate =Org=. +#+label: lst:activate-org #+begin_src emacs-lisp ;; Inspect: ;; function with "C-h f" @@ -675,127 +848,230 @@ below corrects this by advising to override ~TeX-brace-count-line~ with (global-set-key (kbd "C-c C-l") #'org-insert-link-global) #+end_src -*** Customization - -#+begin_src emacs-lisp - (custom-set-variables - '(org-babel-python-command "python -E") - '(org-babel-load-languages '((C . t) - (calc . t) - (dot . t) - (emacs-lisp . t) - (eshell . t) - (fortran . t) - (gnuplot . t) - (latex . t) - (lisp . t) - (maxima . t) - (org . t) - (perl . t) - (python . t) - (scheme . t) - (shell . t))) - '(org-cite-export-processors '((latex biblatex) - (t csl))) - '(org-file-apps '((auto-mode . emacs) - (directory . emacs) - ("\\.mm\\'" . default) - ("\\.x?html?\\'" . default) - ("\\.pdf\\'" . emacs))) - '(org-confirm-babel-evaluate nil) - '(org-latex-compiler "lualatex") - '(org-latex-hyperref-template nil) - '(org-latex-listings 'minted) - '(org-latex-minted-options '(("bgcolor" "LightGoldenrodYellow"))) - '(org-latex-logfiles-extensions '("blg" "lof" "log" "lot" "out" "toc")) - '(org-latex-prefer-user-labels t) - '(org-modules '(ol-bibtex - ol-doi - ol-eww - ol-info - org-id - org-protocol - org-tempo)) - '(org-src-fontify-natively t) - '(org-structure-template-alist - '(("a" . "export ascii") - ("c" . "center") - ("C" . "comment") - ("e" . "example") - ("E" . "export") - ("h" . "export html") - ("l" . "export latex") - ("q" . "quote") - ("s" . "src") - ("p" . "src python :session :async") - ("v" . "verse")))) -#+end_src - -*** [[info:org#External Links][Export external links (info)]] +*** Org customization :PROPERTIES: -:CUSTOM_ID: sec:export-external-links +:CUSTOM_ID: sec:customize-org :END: +The code in listing [[lst:customize-org-babel]], [[lst:customize-org]], and +[[lst:customize-org-export]] does basic customization of [[https://orgmode.org/][Org Mode]] variables. + +#+caption[Customize =org-babel=]: +#+caption: Customize =org-babel=. +#+label: lst:customize-org-babel +#+begin_src emacs-lisp + (with-eval-after-load 'ob-core + (custom-set-variables + '(org-confirm-babel-evaluate nil))) + + (with-eval-after-load 'ob-python + (custom-set-variables + '(org-babel-python-command "python -E"))) +#+end_src + +#+caption[Customize =Org=]: +#+caption: Customize =Org=. +#+label: lst:customize-org +#+begin_src emacs-lisp + (with-eval-after-load 'org + (custom-set-variables + '(org-babel-load-languages '((C . t) + (calc . t) + (dot . t) + (emacs-lisp . t) + (eshell . t) + (fortran . t) + (gnuplot . t) + (latex . t) + (lisp . t) + (maxima . t) + (org . t) + (perl . t) + (python . t) + (scheme . t) + (shell . t))) + '(org-file-apps '((auto-mode . emacs) + (directory . emacs) + ("\\.mm\\'" . default) + ("\\.x?html?\\'" . default) + ("\\.pdf\\'" . emacs))) + '(org-modules '(ol-bibtex + ol-doi + ol-eww + ol-info + org-id + org-protocol + org-tempo)) + '(org-structure-template-alist '(("a" . "export ascii") + ("c" . "center") + ("C" . "comment") + ("e" . "example") + ("E" . "export") + ("h" . "export html") + ("l" . "export latex") + ("q" . "quote") + ("s" . "src") + ("p" . "src python :session :async") + ("v" . "verse"))))) +#+end_src + +#+caption[Customize =org-export=]: +#+caption: Customize =org-export=. +#+label: lst:customize-org-export +#+begin_src emacs-lisp + (with-eval-after-load 'ox-latex + (custom-set-variables + '(org-latex-compiler "lualatex") + '(org-latex-hyperref-template nil) + '(org-latex-listings 'minted) + '(org-latex-minted-options '(("bgcolor" "LightGoldenrodYellow"))) + '(org-latex-logfiles-extensions '("blg" "lof" "log" "lot" "out" "toc")) + '(org-latex-prefer-user-labels t))) +#+end_src + +*** [[https://github.com/bdarcus/citar][Citar: citing bibliography]] with [[https://orgmode.org/][Org Mode]] +:PROPERTIES: +:CUSTOM_ID: sec:citing-bibliography +:END: + +[[https://github.com/bdarcus/citar][Citar]] is a completing-read front-end to browse and act on BibTeX, BibLaTeX, as +well as CSL JSON bibliographic data with LaTeX, markdown, and org-cite editing +support. In combination with vertico, orderless, embark, marginalia, and +consult, [[https://github.com/bdarcus/citar][Citar]] provides quick filtering and selecting of bibliographic entries +from the minibuffer, as well as the option to run different commands on those +selections. Listing [[lst:configure-oc-cite+citar]] configures =org-cite=, =citar=, +and =org=. + +#+caption[Configure =org-cite= with =citar=]: +#+caption: Configure =oc-cite= with =citar=. +#+label: lst:configure-oc-cite+citar +#+begin_src emacs-lisp + (with-eval-after-load 'oc + (require 'oc-biblatex) + (require 'oc-csl) + + (custom-set-variables + '(org-cite-export-processors '((latex biblatex) + (t csl))) + '(org-cite-global-bibliography '("~/VCS/research/refs.bib"))) + + (when (require 'citar nil 'noerror) + (custom-set-variables + '(org-cite-activate-processor 'citar) + '(org-cite-follow-processor 'citar) + '(org-cite-insert-processor 'citar)))) + + (with-eval-after-load 'org + (when (require 'citar nil 'noerror) + (custom-set-variables + '(citar-bibliography '("~/VCS/research/refs.bib")) + '(citar-file-extensions '("djvu" "pdf")) + '(citar-library-paths '("~/VCS/research/papers/")))) + + (define-key org-mode-map (kbd "C-c b") 'org-cite-insert)) +#+end_src + +*** TODO Compare bibtex and biblatex +1. [[https://www.economics.utoronto.ca/osborne/latex/BIBTEX.HTM][Using bibtex: a short guide]] +2. [[https://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/latex/biblatex/biblatex.pdf][The biblatex package]] +3. [[https://github.com/yuchenlin/rebiber][Rebiber: A tool for normalizing bibtex with official info]] +4. [[https://github.com/josephwright/biblatex-phys][A biblatex implementation of the AIP and APS bibliography style]] + +*** [[info:org#Adding Hyperlink Types][Making Org hyperlink types (info)]] +:PROPERTIES: +:CUSTOM_ID: sec:making-org-hyperlink-types +:END: + +The code in listing [[lst:define-org-link-types]] defines =org-link= types for +backwards compatibility with [[https://github.com/jkitchin/org-ref][org-ref]]. + +#+caption[Define =org-link= types]: +#+caption: Define =org-link= types. +#+label: lst:define-org-link-types #+begin_src emacs-lisp (with-eval-after-load 'ol (org-link-set-parameters "ac*" :export (lambda (path _desc backend _info) (pcase backend - (`latex - (format "\\gls*{%s}" path)) + (`latex (format "\\gls*{%s}" path)) (_ path)))) (org-link-set-parameters "cite" :export (lambda (path _desc backend _info) (pcase backend - (`latex - (format "\\cite{%s}" path)) + (`latex (format "\\cite{%s}" path)) (_ path)))) (org-link-set-parameters "eqref" :export (lambda (path _desc backend _info) (pcase backend - (`latex - (format "\\eqref{%s}" path)) + (`latex (format "\\eqref{%s}" path)) (_ path)))) (org-link-set-parameters "hyperlink" :export (lambda (path desc backend _info) - (pcase backend - (`latex - (format "\\hyperlink{%s}{%s}" path desc)) - (_ path)))) + (pcase backend + (`latex (format "\\hyperlink{%s}{%s}" path desc)) + (_ path)))) (org-link-set-parameters "label" :export (lambda (path _desc backend _info) (pcase backend - (`latex - (format "\\label{%s}" path)) + (`latex (format "\\label{%s}" path)) (_ path)))) (org-link-set-parameters "ref" :export (lambda (path _desc backend _info) (pcase backend - (`latex - (format "\\ref{%s}" path)) + (`latex (format "\\ref{%s}" path)) (_ path))))) #+end_src -In order to export the [[info:org#External Links][info links (info)]] in this document to =html= correctly, -modify the constant ~org-info-other-documents~ defined in =ol-info.el=. - -Note: how to make it work without tangling? +Listing [[lst:emacs-lisp-setup-patch-ol-info]] patches the function =org-info-export= +and the constant ~org-info-other-documents~, to export the [[info:org#External Links][info: links (info)]] in +this document to =html= and LaTeX correctly. +#+caption[Patch =ol-info=]: +#+caption: Patch =ol-info=. +#+name: lst:emacs-lisp-setup-patch-ol-info #+begin_src emacs-lisp - (add-hook - 'org-mode-hook - (lambda () - (when (boundp 'org-info-other-documents) - (dolist (recipe '(("consult" . "https://github.com/minad/consult") - ("embark" . "https://github.com/oantolin/embark") - ("marginalia" . "https://github.com/minad/marginalia") - ("orderless" . "https://github.com/oantolin/orderless") - ("vertico" . "https://github.com/minad/vertico"))) - (cl-pushnew recipe org-info-other-documents :test #'equal))))) + (with-eval-after-load 'ol-info + (defun org-info-export (path desc format) + "Export an info link. + See `org-link-parameters' for details about PATH, DESC and FORMAT." + (let* ((parts (split-string path "#\\|::")) + (manual (car parts)) + (node (or (nth 1 parts) "Top"))) + (pcase format + (`html + (format "%s" + (org-info-map-html-url manual) + (org-info--expand-node-name node) + (or desc path))) + (`latex + (format "\\href{%s\\#%s}{%s}" + (org-info-map-html-url manual) + (org-info--expand-node-name node) + (or desc path))) + (`texinfo + (let ((title (or desc ""))) + (format "@ref{%s,%s,,%s,}" node title manual))) + (_ nil)))) + + (make-variable-buffer-local 'org-info-other-documents) + (setq org-info-other-documents + (cl-union '(("consult" . "https://github.com/minad/consult") + ("embark" . "https://github.com/oantolin/embark") + ("marginalia" . "https://github.com/minad/marginalia") + ("orderless" . "https://github.com/oantolin/orderless") + ("vertico" . "https://github.com/minad/vertico")) + org-info-other-documents + :test #'equal))) #+end_src *** [[https://tecosaur.github.io/emacs-config/#translate-capital-keywords][Translate capital keywords (old) to lower case (new)]] +:PROPERTIES: +:CUSTOM_ID: sec:convert-upper-to-lower-case-keywords +:END: +#+caption[Convert upper to lower case keywords]: +#+caption: Convert upper to lower case keywords. +#+label: lst:convert-upper-to-lower-case-keywords #+begin_src emacs-lisp (with-eval-after-load 'org (defun org-syntax-convert-keyword-case-to-lower () @@ -812,60 +1088,46 @@ Note: how to make it work without tangling? (message "Replaced %d keywords" count))))) #+end_src +*** Evaluate specific source blocks at load-time +:PROPERTIES: +:CUSTOM_ID: sec:load-time-specific-source-block-evaluation +:END: + +#+caption[Evaluate specific source blocks at load-time]: +#+caption: Evaluate specific source blocks at load-time. +#+label: lst:load-time-specific-source-block-evaluation +#+begin_src emacs-lisp + (defun my-org-eval-blocks-named (infix) + "Evaluate all source blocks having INFIX in their name." + (when (eq major-mode 'org-mode) + (let ((blocks + (org-element-map + (org-element-parse-buffer 'greater-element nil) 'src-block + (lambda (block) + (message "%s" (org-element-property :name block)) + (when (string-match-p infix (org-element-property :name block)) + block))))) + (dolist (block blocks) + (goto-char (org-element-property :begin block)) + (org-babel-execute-src-block))))) + + ;; Emacs looks for "Local variables:" after the last "?\n?\f". + (add-to-list 'safe-local-eval-forms + '(apply 'my-org-eval-blocks-named '("emacs-lisp-setup"))) + (add-to-list 'safe-local-eval-forms + '(apply 'my-org-eval-blocks-named '("python-setup"))) +#+end_src + *** [[info:org#Advanced Export Configuration][Advanced Export Configuration (info)]] +:PROPERTIES: +:CUSTOM_ID: sec:org-document-export-hacks +:END: Stolen from [[https://git.sr.ht/~bzg/org-contrib/tree/master/item/lisp/ox-extra.el][ox-extra.el]] -#+begin_src emacs-lisp - (with-eval-after-load 'ox - (defun org-export-ignore-headlines (data backend info) - "Remove headlines tagged \"ignore\" retaining contents and promoting children. - Each headline tagged \"ignore\" will be removed retaining its - contents and promoting any children headlines to the level of the - parent." - (org-element-map data 'headline - (lambda (object) - (when (member "ignore" (org-element-property :tags object)) - (let ((level-top (org-element-property :level object)) - level-diff) - (mapc (lambda (el) - ;; recursively promote all nested headlines - (org-element-map el 'headline - (lambda (el) - (when (equal 'headline (org-element-type el)) - (unless level-diff - (setq level-diff (- (org-element-property :level el) - level-top))) - (org-element-put-property - el :level (- (org-element-property :level el) - level-diff))))) - ;; insert back into parse tree - (org-element-insert-before el object)) - (org-element-contents object))) - (org-element-extract-element object))) - info nil) - (org-extra--merge-sections data backend info) - data) - - (defun org-extra--merge-sections (data _backend info) - (org-element-map data 'headline - (lambda (hl) - (let ((sections - (cl-loop - for el in (org-element-map (org-element-contents hl) - '(headline section) #'identity info) - until (eq (org-element-type el) 'headline) - collect el))) - (when (and sections - (> (length sections) 1)) - (apply #'org-element-adopt-elements - (car sections) - (cl-mapcan (lambda (s) (org-element-contents s)) - (cdr sections))) - (mapc #'org-element-extract-element (cdr sections))))) - info))) -#+end_src - +#+caption[Convert marked LaTeX export blocks to LaTeX header lines]: +#+caption: Convert marked LaTeX export blocks to LaTeX header lines. +#+label: lst:org-latex-header-blocks-filter #+begin_src emacs-lisp (with-eval-after-load 'ox (defun org-latex-header-blocks-filter (backend) @@ -909,146 +1171,160 @@ Stolen from [[https://git.sr.ht/~bzg/org-contrib/tree/master/item/lisp/ox-extra. (reverse blocks)))))) #+end_src -#+begin_src emacs-lisp +[[https://emacs.stackexchange.com/questions/47347/customizing-org-latex-title-command-to-edit-title-page][How to customize =org-latex-title-command= only in this buffer]] + +#+caption[Hack LaTeX export buffer local variables]: +#+caption: Hack LaTeX export buffer local variables. +#+header: :var title-page=title-page +#+name: lst:emacs-lisp-setup-hack +#+begin_src emacs-lisp :exports code :results silent :tangle no (with-eval-after-load 'ox - (defun my-activate-buffer-local-org-export-filters () - "Activate my export filters locally in the current buffer." - (interactive) - (set (make-local-variable 'org-export-filter-parse-tree-functions) - (cl-pushnew #'org-export-ignore-headlines - org-export-filter-parse-tree-functions)) - (set (make-local-variable 'org-export-before-parsing-hook) - (cl-pushnew #'org-latex-header-blocks-filter - org-export-before-parsing-hook)))) -#+end_src - -#+name: emacs-lisp-setup -#+begin_src emacs-lisp :tangle no - (with-eval-after-load 'ox - (my-activate-buffer-local-org-export-filters)) -#+end_src - -#+begin_src emacs-lisp - (with-eval-after-load 'ox-latex - (mapc (lambda (item) - (add-to-list 'org-latex-classes item)) - '(;; The postfixes +1, +2, +3, -1, -2, and -3 denote: - ;; +1 => [DEFAULT-PACKAGES] - ;; +2 => [PACKAGES] - ;; +3 => [EXTRA] - ;; -1 => [NO-DEFAULT-PACKAGES] - ;; -2 => [NO-PACKAGES] - ;; -3 => [NO-EXTRA] - ("elsarticle-1+2+3" ; Elsevier journals - "\\documentclass{elsarticle} + (make-variable-buffer-local 'org-export-before-parsing-hook) + (cl-pushnew #'org-latex-header-blocks-filter + org-export-before-parsing-hook)) + (when (require 'ox-latex nil 'noerror) + (make-variable-buffer-local 'org-latex-classes) + (cl-pushnew '("article-local" + "\\documentclass[11pt]{article} [NO-DEFAULT-PACKAGES] [PACKAGES] [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - ("article-1+2+3" - "\\documentclass{article} + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) + org-latex-classes :key #'car :test #'equal) + + (make-variable-buffer-local 'org-latex-title-command) + (setq org-latex-title-command (concat title-page)) + + (make-variable-buffer-local 'org-latex-toc-command) + (setq org-latex-toc-command + (mapconcat 'identity '("" + "\\tableofcontents\\label{toc}" + "\\listoffigures" + "\\listoflistings" + "\\listoftables" + "\\newpage" + "") "\n")) + + (make-variable-buffer-local 'org-latex-subtitle-format) + (setq org-latex-subtitle-format "")) +#+end_src + +#+caption[Define =my-ox-latex-export-buffer-local-variables=]: +#+caption: Define =my-ox-latex-export-buffer-local-variables=. +#+name: lst:emacs-lisp-setup-defun +#+begin_src emacs-lisp + (defun my-ox-latex-export-buffer-local-variables (title-page) + (with-eval-after-load 'ox + (make-variable-buffer-local 'org-export-before-parsing-hook) + (cl-pushnew #'org-latex-header-blocks-filter + org-export-before-parsing-hook)) + (when (require 'ox-latex nil 'noerror) + (make-variable-buffer-local 'org-latex-classes) + (cl-pushnew '("article-local" + "\\documentclass[11pt]{article} [NO-DEFAULT-PACKAGES] [PACKAGES] [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - ("report-1+2+3" - "\\documentclass[11pt]{report} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\part{%s}" . "\\part*{%s}") - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}")) - ("book-1+2+3" - "\\documentclass[11pt]{book} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\part{%s}" . "\\part*{%s}") - ("\\chapter{%s}" . "\\chapter*{%s}") - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))))) + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) + org-latex-classes :key #'car :test #'equal) + + (make-variable-buffer-local 'org-latex-title-command) + (setq org-latex-title-command (concat title-page)) + + (make-variable-buffer-local 'org-latex-toc-command) + (setq org-latex-toc-command + (mapconcat 'identity '("" + "\\tableofcontents\\label{toc}" + "\\listoffigures" + "\\listoflistings" + "\\listoftables" + "\\newpage" + "") "\n")) + + (make-variable-buffer-local 'org-latex-subtitle-format) + (setq org-latex-subtitle-format "") + org-latex-title-command)) #+end_src -*** Evaluate source blocks on loading +#+header: :header yes +#+begin_export latex +% Add fancy headers and footers to normal pages +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\footrulewidth}{0.4pt} +\fancyfoot[C]{\emph{ + Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} +\renewcommand{\headrulewidth}{0.4pt} +\fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} +\fancyhead[C]{ + Page: \thepage/\pageref{LastPage} \\ + \text{ } \\ + \text{ } \\ + DRAFT +} +\fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} -#+begin_src emacs-lisp - (defun my-org-eval-blocks-named (name) - "Evaluate all source blocks named NAME." - (when (eq major-mode 'org-mode) - (let ((blocks - (org-element-map - (org-element-parse-buffer 'greater-element nil) 'src-block - (lambda (block) - (when (string= name (org-element-property :name block)) - block))))) - (dolist (block blocks) - (goto-char (org-element-property :begin block)) - (org-babel-execute-src-block))))) +% https://tex.stackexchange.com/questions/506102/ +% adding-header-and-footer-to-custom-titlepage +\fancypagestyle{titlepage}{% + \fancyhf{} + \renewcommand{\footrulewidth}{0.4pt} + \fancyfoot[C]{\emph{ + Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} + \renewcommand{\headrulewidth}{0.4pt} + \fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} + \fancyhead[C]{ + \pageref{LastPage} pages \\ + \text{ } \\ + \text{ } \\ + DRAFT + } + \fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} +} +#+end_export - ;; Emacs looks for "Local variables:" after the last "?\n?\f". - (add-to-list 'safe-local-eval-forms - '(apply 'my-org-eval-blocks-named '("emacs-lisp-setup"))) - (add-to-list 'safe-local-eval-forms - '(apply 'my-org-eval-blocks-named '("python-setup"))) +[[lst:emacs-lisp-setup-call]] + +#+caption[Call =my-ox-latex-export-local-variables=]: +#+caption: Use the setup macro for =ox-latex=. +#+name: lst:emacs-lisp-setup-call +#+header: :var title-page=title-page +#+begin_src emacs-lisp :exports code :results silent :tangle no + (my-ox-latex-export-buffer-local-variables title-page) #+end_src -*** [[info:org#Citation export processors][Citation export processors (info)]] -:PROPERTIES: -:CUSTOM_ID: sec:citation-export-processors -:END: - -#+begin_src emacs-lisp - (with-eval-after-load 'oc - (require 'oc-biblatex) - (require 'oc-csl) - (custom-set-variables - '(org-cite-activate-processor 'citar) - '(org-cite-follow-processor 'citar) - '(org-cite-global-bibliography '("~/VCS/research/refs.bib")) - '(org-cite-insert-processor 'citar))) +#+caption[Show a title-page example for =org-latex-title-command=]: +#+caption: Show a title-page example for =org-latex-title-command=. +#+label: lst:title-page +#+name: title-page +#+begin_src latex :exports code :results silent :tangle no + \begin{titlepage} + %% https://tex.stackexchange.com/questions/506102/ + %% adding-header-and-footer-to-custom-titlepage + \thispagestyle{titlepage} + \begin{center} + %% Title + \begin{Huge} + {\bf %t} \\ + \vspace{1em} + \end{Huge} + %% Author + \begin{Large} + {\bf %a} \\ + \vspace{1em} + \end{Large} + \end{center} + \end{titlepage} #+end_src -*** [[https://github.com/bdarcus/citar][Citar: citing bibliography]] -:PROPERTIES: -:CUSTOM_ID: sec:citing-bibliography -:END: - -[[https://github.com/bdarcus/citar][Citar]] provides a completing-read front-end to browse and act on BibTeX, -BibLaTeX, as well as CSL JSON bibliographic data with LaTeX, markdown, and -org-cite editing support. - -[[https://github.com/bdarcus/citar][Citar]] (in combination with vertico, orderless, embark, marginalia, and consult) -provides quick filtering and selecting of bibliographic entries from the -minibuffer, as well as the option to run different commands on those selections. - -#+begin_src emacs-lisp - (with-eval-after-load 'org - (when (require 'citar nil 'noerror) - (custom-set-variables - '(citar-bibliography '("~/VCS/research/refs.bib")) - '(citar-file-extensions '("djvu" "pdf")) - '(citar-library-paths '("~/VCS/research/papers/")))) - (define-key org-mode-map (kbd "C-c b") 'org-cite-insert)) -#+end_src - -*** TODO Compare bibtex and biblatex -1. [[https://www.economics.utoronto.ca/osborne/latex/BIBTEX.HTM][Using bibtex: a short guide]] -2. [[https://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/latex/biblatex/biblatex.pdf][The biblatex package]] -3. [[https://github.com/yuchenlin/rebiber][Rebiber: A tool for normalizing bibtex with official info]] -4. [[https://github.com/josephwright/biblatex-phys][A biblatex implementation of the AIP and APS bibliography style]] - * Editing ** [[https://www.emacswiki.org/emacs/DisabledCommands][Enable disabled commands and inform]] @@ -1056,9 +1332,12 @@ minibuffer, as well as the option to run different commands on those selections. :CUSTOM_ID: sec:enable-disabled-commands :END: -Execute src_emacs-lisp[:exports code]{(find-library "novice")} to see how -Emacs prevents new users from shooting themselves in the feet. +Execute src_emacs-lisp{(find-library "novice")} to see how Emacs prevents new +users from shooting themselves in the feet. +#+caption[Configure the =disabled-command-function=]: +#+caption: Configure the =disabled-command-function=. +#+label: lst:configure-disabled-command-function #+begin_src emacs-lisp (setq disabled-command-function (defun my-enable-this-command (&rest _args) @@ -1082,6 +1361,9 @@ for instance a particular function or paragraph by removing clutter. The "Do What I Mean" [[https://endlessparentheses.com/emacs-narrow-or-widen-dwim.html][narrow-or-widen-dwim]] function allows to toggle between narrowed and widened buffer states. +#+caption[Configure =narrow-or-widen-dwim=]: +#+caption: Configure =narrow-or-widen-dwim=. +#+label: lst:configure-narrow-or-widen-dwim #+begin_src emacs-lisp (defun narrow-or-widen-dwim (p) "Widen if buffer is narrowed, narrow-dwim otherwise. @@ -1112,6 +1394,9 @@ widened buffer states. ** Synchronal multiple-region editing +#+caption[Enable =iedit=]: +#+caption: Enable =iedit=. +#+label: lst:enable-iedit #+begin_src emacs-lisp (unless noninteractive (require 'iedit nil 'noerror)) @@ -1119,6 +1404,9 @@ widened buffer states. ** Extraneous whitespace trimming +#+caption[Configure =ws-butler=]: +#+caption: Configure =ws-butler=. +#+label: lst:configure-ws-butler #+begin_src emacs-lisp (unless noninteractive (when (require 'ws-butler nil 'noerror) @@ -1159,8 +1447,12 @@ following links show how to put the documentation to practical use: how the machinery after the first and after later usages of =eval-expression= differ and discusses options how to handle those differences. -The next block aims to configure [[https://github.com/Fuco1/smartparens][smartparens]] for Elisp, LaTeX, Org, and Python. +Listing [[lst:configure-smartparens]] aims to configure [[https://github.com/Fuco1/smartparens][smartparens]] for Elisp, +LaTeX, Org, and Python. +#+caption[Configure =smartparens=]: +#+caption: Configure =smartparens=. +#+label: lst:configure-smartparens #+begin_src emacs-lisp (unless noninteractive ;; To disables pairing of the quote character for lisp modes, @@ -1209,6 +1501,9 @@ The next block aims to configure [[https://github.com/Fuco1/smartparens][smartpa :CUSTOM_ID: sec:electric-operators :END: +#+caption[Configure =electric-operator-mode=]: +#+caption: Configure =electric-operator-mode=. +#+label: lst:configure-electric-operator-mode #+begin_src emacs-lisp (when (fboundp 'electric-operator-mode) (add-hook 'c-mode-common #'electric-operator-mode) @@ -1216,7 +1511,13 @@ The next block aims to configure [[https://github.com/Fuco1/smartparens][smartpa #+end_src ** Smart snippets +:PROPERTIES: +:CUSTOM_ID: sec:smart-snippets +:END: +#+caption[Enable =yas-global-mode=]: +#+caption: Enable =yas-global-mode=. +#+label: lst:enable-yas-global-mode #+begin_src emacs-lisp (when (require 'yasnippet nil 'noerror) (custom-set-variables @@ -1225,7 +1526,33 @@ The next block aims to configure [[https://github.com/Fuco1/smartparens][smartpa #+end_src * Coding +:PROPERTIES: +:CUSTOM_ID: sec:coding +:END: +** Emacs-lisp coding +:PROPERTIES: +:CUSTOM_ID: sec:emacs-lisp-coding +:END: + +** Python coding +:PROPERTIES: +:CUSTOM_ID: sec:python-coding +:END: + +The [[https://www.emacswiki.org/emacs/PythonProgrammingInEmacs][Python Programming in Emacs]] wiki page lists options to enhance Emacs's +built-in ~python-mode~. Here, the focus is on two packages: +1. [[https://github.com/joaotavora/eglot][Eglot - Emacs polyGLOT: an Emacs LSP client that stays out of your way]]. The + maintainer also contributes to Emacs itself and has a deep understanding of + [[https://sheer.tj/the_way_of_emacs.html][the Way of Emacs]]. He refuses to add new features without seeing how they fit + into [[https://sheer.tj/the_way_of_emacs.html][the Way of Emacs]] as this discussion on [[https://github.com/joaotavora/eglot/issues/523][org-mode source code blocks]] + shows. +2. [[https://github.com/pythonic-emacs/anaconda-mode][Anaconda - code navigation, documentation lookup, and completion for Python]]. + + +#+caption[Configure =eglot= for Python]: +#+caption: Configure =eglot= for Python. +#+label: lst:configure-eglot-for-python #+begin_src emacs-lisp (with-eval-after-load 'eglot (add-to-list 'eglot-server-programs '(python-mode "pylsp")) @@ -1237,43 +1564,35 @@ The next block aims to configure [[https://github.com/Fuco1/smartparens][smartpa "scipy"))))))))) #+end_src -** Python coding - -The [[https://www.emacswiki.org/emacs/PythonProgrammingInEmacs][Python Programming in Emacs]] wiki page lists options to enhance Emacs's -built-in ~python-mode~. Here, the focus is on two packages: -1. [[https://github.com/pythonic-emacs/anaconda-mode][Anaconda - code navigation, documentation lookup, and completion for Python]]. -2. [[https://github.com/joaotavora/eglot][Eglot - Emacs polyGLOT: an Emacs LSP client that stays out of your way]]. The - maintainer also contributes to Emacs itself and has a deep understanding of - [[https://sheer.tj/the_way_of_emacs.html][the Way of Emacs]]. He refuses to add new features without seeing how they fit - into [[https://sheer.tj/the_way_of_emacs.html][the Way of Emacs]] as this discussion on [[https://github.com/joaotavora/eglot/issues/523][org-mode source code blocks]] - shows. - The snippet below initializes [[https://github.com/pythonic-emacs/anaconda-mode][anaconda]]. See [[https://github.com/jorgenschaefer/elpy/blob/8d0de310d41ebf06b22321a8534546447456870c/elpy.el#L2775][elpy-module-company]] for how to handle ~company-backends~ as a local variable and the call to [[info:elisp#Advising Functions][advice-add]] opens Python org-mode edit-buffers in ~anaconda-mode~. +#+caption[Configure =anaconda= for Python]: +#+caption: Configure =anaconda= for Python. +#+label: lst:configure-anaconda-for-python #+begin_src emacs-lisp (with-eval-after-load 'python - (with-eval-after-load 'company (when (and (fboundp 'anaconda-mode) (fboundp 'company-anaconda)) (defun my-disable-anaconda-mode () (when (derived-mode-p 'python-mode) (anaconda-mode -1) - (set (make-local-variable 'company-backends) - (delq 'company-anaconda - (mapcar #'identity company-backends))) + (make-variable-buffer-local 'company-backends) + (setq company-backends + (delq 'company-anaconda + (mapcar #'identity company-backends))) (anaconda-eldoc-mode -1))) - (defun my-enable-anaconda-mode () (when (derived-mode-p 'python-mode) (anaconda-mode +1) - (set (make-local-variable 'company-backends) - (cons 'company-anaconda - (delq 'company-semantic - (delq 'company-capf - (mapcar #'identity company-backends))))) + (make-variable-buffer-local 'company-backends) + (setq company-backends + (cons 'company-anaconda + (delq 'company-semantic + (delq 'company-capf + (mapcar #'identity company-backends))))) (anaconda-eldoc-mode (if (file-remote-p default-directory) -1 1)))))) @@ -1284,7 +1603,6 @@ Python org-mode edit-buffers in ~anaconda-mode~. (when (derived-mode-p 'python-mode) (anaconda-mode -1) (anaconda-eldoc-mode -1))) - (defun my-enable-anaconda-mode () (when (derived-mode-p 'python-mode) (anaconda-mode +1) @@ -1293,7 +1611,6 @@ Python org-mode edit-buffers in ~anaconda-mode~. (when (fboundp 'my-enable-anaconda-mode) (advice-add 'org-edit-src-code :after #'my-enable-anaconda-mode)) - (when (and (fboundp 'my-disable-anaconda-mode) (fboundp 'my-enable-anaconda-mode)) (defun my-toggle-anaconda-mode () @@ -1304,6 +1621,9 @@ Python org-mode edit-buffers in ~anaconda-mode~. (my-enable-anaconda-mode))))) #+end_src +#+caption[Tangle the =example.py= file]: +#+caption: Tangle the =example.py= file. +#+label: lst:example-py #+begin_src python :tangle example.py :comments link import numpy import astropy.units as apu @@ -1314,15 +1634,29 @@ Python org-mode edit-buffers in ~anaconda-mode~. print(q) #+end_src -#+begin_src emacs-lisp - (custom-set-variables - '(python-shell-interpreter-args "-i -E")) - (when (and (executable-find "pyenv") - (require 'pyenv-mode nil 'noerror)) - (pyenv-mode +1) - (pyenv-mode-set "3.9.9/envs/python-3.9.9")) +#+caption[Configure =python=]: +#+caption: Configure =python=. +#+label: lst:configure-python +#+begin_src elisp + (with-eval-after-load 'python + (custom-set-variables + '(python-indent-guess-indent-offset nil) + '(python-shell-interpreter-args "-i -E"))) #+end_src +#+caption[Enable =pyenv-mode=]: +#+caption: Enable =pyenv-mode=. +#+label: lst:enable-pyenv-mode +#+begin_src emacs-lisp + (when (and (executable-find "pyenv") + (require 'pyenv-mode nil 'noerror)) + (pyenv-mode +1) + (pyenv-mode-set "3.9.9/envs/python-3.9.9")) +#+end_src + +#+caption[Configure =info=]: +#+caption: Configure =info=. +#+label: lst:configure-info #+begin_src emacs-lisp (with-eval-after-load 'info (add-to-list 'Info-directory-list @@ -1342,8 +1676,11 @@ boils down to two rules: with respect to the height of the face (those heights default to 1.0 for no scaling). -The next source code blocks implement those rules. +The code in listing [[lst:configure-face-attributes]] source implements those rules. +#+caption[Configure =face-attributse=]: +#+caption: Configure =face-attributes=. +#+label: lst:configure-face-attributes #+begin_src emacs-lisp (unless noninteractive ;; Set face attributes. @@ -1363,8 +1700,11 @@ The next source code blocks implement those rules. #+end_src In case of proper initialization of all face heigths, font scaling is easy as -the next source code block shows. +the the code in [[lst:my-set-default-face-height]] shows. +#+caption[Implement =my-set-default-face-height=]: +#+caption: Implement =my-set-default-face-height=. +#+label: lst:my-set-default-face-height #+begin_src emacs-lisp (defun my-set-default-face-height () "Set the default face height in all current and future frames. @@ -1384,6 +1724,9 @@ the next source code block shows. Allow swapping fhe foreground and background colors of the default face on all frames. +#+caption[Implement =my-invert-default-face=]: +#+caption: Implement =my-invert-default-face=. +#+label: lst:my-invert-default-face #+begin_src emacs-lisp (defun my-invert-default-face () "Invert the default face." @@ -1393,6 +1736,9 @@ frames. Enable =rainbow-mode= to colorize color names in buffers for debugging. +#+caption[Enable =rainbow-mode=]: +#+caption: Enable =rainbow-mode=. +#+label: lst:enable-rainbow-mode #+begin_src emacs-lisp (when (fboundp 'rainbow-mode) (custom-set-variables @@ -1414,6 +1760,9 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. [[https://emacs.stackexchange.com/questions/17431/how-do-i-change-portions-of-a-custom-theme][How to change custom theme faces]] +#+caption[Hack =leuven-theme=]: +#+caption: Hack =leuven-theme=. +#+label: lst:hack-leuven-theme #+begin_src emacs-lisp (unless noninteractive ;; Try to detect `leuven-theme` from MELPA. @@ -1454,16 +1803,9 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. (add-hook hook #'my-leuven-hook-function))) #+end_src -#+begin_src emacs-lisp :tangle no - (unless noninteractive - (custom-set-variables - '(modus-themes-hl-line 'underline) - '(modus-themes-intense-markup 't)) - (when (and (version< emacs-version "28.0") - (require 'modus-themes nil 'noerror)) - (modus-themes-load-themes))) -#+end_src - +#+caption[Implement =my-pulse-one-line=]: +#+caption: Implement =my-pulse-one-line=. +#+label: lst:my-pulse-one-line #+begin_src emacs-lisp (unless noninteractive ;; https://karthinks.com/software/batteries-included-with-emacs/ @@ -1484,6 +1826,9 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. ** Feed reader +#+caption[Enable =elfeed=]: +#+caption: Enable =elfeed=. +#+label: lst:enable-elfeed #+begin_src emacs-lisp (autoload 'elfeed "elfeed" nil t) (global-set-key (kbd "C-x w") #'elfeed) @@ -1512,6 +1857,9 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. ** Multi-media system +#+caption[Enable =emms=]: +#+caption: Enable =emms=. +#+label: lst:enable-emms #+begin_src emacs-lisp (custom-set-variables '(emms-mode-line-format "") @@ -1551,9 +1899,12 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. * [[info:emacs#Init File][Init File (info)]] footer :PROPERTIES: -:CUSTOM_ID: sec:init-file-footer +:CUSTOM_ID: sec:user-init-file-footer :END: +#+caption[Tangle the =user-init-file= footer]: +#+caption: Tangle the =user-init-file= footer. +#+label: lst:tangle-user-init-file-footer #+begin_src emacs-lisp (provide 'init) @@ -1565,7 +1916,7 @@ themes fail to display ~hl-line-mode~ properly with Emacs-27.2 on Darwin. ;;; init.el ends here #+end_src -* Local variables linking back to [[#sec:latex-save-compile-display-loop][LaTeX save-compile-display-loop]] +* Local variables linking to [[#sec:latexmk-save-compile-display-loop][Latexmk save-compile-display-loop]] :PROPERTIES: :CUSTOM_ID: sec:local-variables :END: diff --git a/org-babel-tangle-file b/org-babel-tangle-file index 2b2e5ba..794177e 100755 --- a/org-babel-tangle-file +++ b/org-babel-tangle-file @@ -3,6 +3,7 @@ emacs -Q --batch --eval " (progn (require 'org) + (require 'ob-latex) (defun my-org-eval-blocks-named (name) (when (eq major-mode 'org-mode) (let ((blocks