Why use Jupyter notebooks when you can connect to a kernel directly from within Org mode in Emacs?
Configure texlive
I’m on Arch BTW, and i don’t like the texlive-basic
,
texlive-full
and texlive-bin
packages that are present in the Arch
repos. So I’ll be setting up a local Texlive installation in this
section. I’ve symlinked (to /usr/local/bin
) some binaries
that Emacs requires. I didn’t add the entire installation folder to
PATH
because it adds a lot of executables to my fish
autosuggestions.
mkdir - p ~/.Texlive
wget https://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
unzip install-tl-unx.tar.gz # note that unzip can be installed using `pacman -S unzip
./install-tl --texdir ~/.Texlive
sudo ln -sf ~/.Texlive/bin/x86_64-linux/dvipng /usr/local/bin
sudo ln -sf ~/.Texlive/bin/x86_64-linux/latex /usr/local/bin
sudo ln -sf ~/.Texlive/bin/x86_64-linux/pdflatex /usr/local/bin
Org mode settings
Org-mode does need could do with some configuration to accomodate
LaTeX previews. Note that the steps below will be applicable only to the
graphical version of Emacs.
(setq org-src-preserve-indentation nil
org-export-wth-toc nil
org-src-tab-acts-natively t
org-confirm-babel-evaluate nil
org-startup-indented t
org-return-follows-link t
org-hide-emphasis-markers t)
(add-to-list 'org-babel-after-execute-hook (function org-latex-preview))
Better defaults
(defvar org-babel-default-header-args '((:results . "output") (:noweb . "yes")))
(defvar org-babel-default-header-args:jupyter '((:results . "output") (:kernel . "python3") (:session . "hello") (:async . "yes")))
(defun org-enter-maybe-execute ()
(interactive)
(if (org-in-src-block-p)
(org-babel-execute-src-block)
(newline)))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
;; (C . t)
;; (python . t)
;; (css . t)
;; (jupyter . t)
(shell . t)))
This makes it convenient to use Jupyter
src blocks within Emacs. Note
that emacs-jupyter
needs to be set up for this. I’ve also
set a custom size for the LaTeX (and image, e.g plot) previews here.
(use-package jupyter
:config
;; (org-babel-jupyter-override-src-block "python") ;; always use jupyter mode (even in python source blocks)
(setq ob-async-no-async-languages-alist '("python" "jupyter-python"))
(setq-local org-image-actual-width '(1024)))
Org mode LaTeX configuration
Org-fragtog
is a package that brings [on-hover]{.underline}
LaTeX preview functionality to Emacs. This requires a local LaTeX
environment such as the one I’m using. The configuration below loads
LaTeX previews when a file is opened.
(use-package latex-preview-pane)
(use-package org-fragtog
:after org
:config (setq org-preview-latex-image-directory (concat (getenv "HOME") "/.cache"))
;; :custom (org-startup-with-latex-preview t)
:hook (org-mode . org-fragtog-mode)
:hook (org-babel-after-execute . org-redisplay-inline-images) ;; render plots automatically
:custom
(org-format-latex-options
(plist-put org-format-latex-options :scale 2)
(plist-put org-format-latex-options :foreground 'auto)
(plist-put org-format-latex-options :background 'auto)))
This automatically configures LaTeX previews for us because the Jupyter
kernel supports %matplotlib inline
.
Conda
I’m using Anaconda
for ML work, and so I’ve configured
Emacs to auto-load my ML
environment (in which I’ve installed the
Jupyter
packages). I’ve installed miniconda to
~/.miniconda
and so i’ve set these variables accordingly,
you’d have to modify these values based on your prefix.
(use-package conda
:config
(setq conda-anaconda-home (expand-file-name (concat (getenv "HOME") "/.miniconda/"))
conda-env-home-directory (expand-file-name (concat (getenv "HOME") "/.miniconda/"))
conda-env-subdirectory "envs"))
(unless (getenv "CONDA_DEFAULT_ENV")
(conda-env-activate "ML"))
PDF Org-export previews
pdf-tools is a replacement of
DocView for viewing PDF files inside Emacs. It uses the
poppler
library, which also means that ‘pdf-tools’ can
be used to modify PDFs. This requires the poppler
library, and so it
must be installed (in my case, using pacman
). This also brings PDF
editing abilities to Emacs - which I guess isn’t available in DocView
mode. This uses epdfinfo
under the hood and renders PDFs quite well.
I’m pleased enough to make this my system-wide PDF editor.
(use-package pdf-tools
:init (pdf-loader-install)
:config (add-to-list 'revert-without-query ".pdf")
:hook (pdf-view-mode-hook . (lambda () (interactive) (display-line-numbers-mode -1))))
Conclusion
Whoops, did i forget images? Here ya go:
Ok then, I’ll be back with some Emacs content in the near future. Stay tuned!