mirror of
https://github.com/SqrtMinusOne/dotfiles.git
synced 2025-12-10 19:23:03 +03:00
feat(emacs): Org LaTeX & more jupyter
This commit is contained in:
parent
022afcfb98
commit
c0c9bdb65e
5 changed files with 153 additions and 76 deletions
|
|
@ -1019,15 +1019,21 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer."
|
|||
|
||||
(setq my/jupyter-runtime-folder (expand-file-name "~/.local/share/jupyter/runtime"))
|
||||
|
||||
(defun my/get-open-ports ()
|
||||
(mapcar
|
||||
#'string-to-number
|
||||
(split-string (shell-command-to-string "ss -tulpnH | awk '{print $5}' | sed -e 's/.*://'") "\n")))
|
||||
|
||||
(defun my/list-jupyter-kernel-files ()
|
||||
(mapcar
|
||||
(lambda (file) (cons (car file) (cdr (assq 'shell_port (json-read-file (car file))))))
|
||||
(sort
|
||||
(directory-files-and-attributes my/jupyter-runtime-folder t ".*kernel.*json$")
|
||||
(lambda (x y) (not (time-less-p (nth 6 x) (nth 6 y)))))))
|
||||
|
||||
(defun my/select-jupyter-kernel ()
|
||||
(let ((ports (mapcar
|
||||
#'string-to-number
|
||||
(split-string (shell-command-to-string "ss -tulpnH | awk '{print $5}' | sed -e 's/.*://'") "\n")))
|
||||
(files (mapcar
|
||||
(lambda (file) (cons (car file) (cdr (assq 'shell_port (json-read-file (car file))))))
|
||||
(sort
|
||||
(directory-files-and-attributes my/jupyter-runtime-folder t ".*kernel.*json$")
|
||||
(lambda (x y) (not (time-less-p (nth 6 x) (nth 6 y))))))))
|
||||
(let ((ports (my/get-open-ports))
|
||||
(files (my/list-jupyter-kernel-files)))
|
||||
(completing-read
|
||||
"Jupyter kernels: "
|
||||
(seq-filter
|
||||
|
|
@ -1043,6 +1049,11 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer."
|
|||
(interactive)
|
||||
(jupyter-connect-repl (my/select-jupyter-kernel) nil nil nil t))
|
||||
|
||||
(defun my/jupyter-qtconsole ()
|
||||
(interactive)
|
||||
(start-process "jupyter-qtconsole" nil "setsid" "jupyter" "qtconsole" "--existing"
|
||||
(file-name-nondirectory (my/select-jupyter-kernel))))
|
||||
|
||||
(use-package org-latex-impatient
|
||||
:straight (:repo "yangsheng6810/org-latex-impatient"
|
||||
:branch "master"
|
||||
|
|
@ -1497,34 +1508,45 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer."
|
|||
|
||||
(add-hook 'bibtex-mode 'smartparens-mode)
|
||||
|
||||
(defun my/list-sty ()
|
||||
(reverse
|
||||
(sort
|
||||
(seq-filter
|
||||
(lambda (file) (if (string-match ".*\.sty$" file) 1 nil))
|
||||
(directory-files
|
||||
(seq-some
|
||||
(lambda (dir)
|
||||
(if (and
|
||||
(f-directory-p dir)
|
||||
(seq-some
|
||||
(lambda (file) (string-match ".*\.sty$" file))
|
||||
(directory-files dir))
|
||||
) dir nil))
|
||||
(list "./styles" "../styles/" "." "..")) :full))
|
||||
(lambda (f1 f2)
|
||||
(let ((f1b (file-name-base f1))
|
||||
(f1b (file-name-base f2)))
|
||||
(cond
|
||||
((string-match-p ".*BibTex" f1) t)
|
||||
((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
|
||||
((string-match-p ".*Preamble" f2) t)
|
||||
(t (string-lessp f1 f2))))))))
|
||||
|
||||
(defun my/import-sty ()
|
||||
(interactive)
|
||||
(insert
|
||||
(apply #'concat
|
||||
(cl-mapcar
|
||||
(lambda (file) (concat "\\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
|
||||
(reverse
|
||||
(sort
|
||||
(seq-filter
|
||||
(lambda (file) (if (string-match ".*\.sty$" file) 1 nil))
|
||||
(directory-files
|
||||
(seq-some
|
||||
(lambda (dir)
|
||||
(if (and
|
||||
(f-directory-p dir)
|
||||
(seq-some
|
||||
(lambda (file) (string-match ".*\.sty$" file))
|
||||
(directory-files dir))
|
||||
) dir nil))
|
||||
(list "./styles" "../styles/" "." "..")) :full))
|
||||
(lambda (f1 f2)
|
||||
(let ((f1b (file-name-base f1))
|
||||
(f1b (file-name-base f2)))
|
||||
(cond
|
||||
((string-match-p ".*BibTex" f1) t)
|
||||
((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
|
||||
((string-match-p ".*Preamble" f2) t)
|
||||
(t (string-lessp f1 f2)))))))))))
|
||||
(my/list-sty)))))
|
||||
|
||||
(defun my/import-sty-org ()
|
||||
(interactive)
|
||||
(insert
|
||||
(apply #'concat
|
||||
(cl-mapcar
|
||||
(lambda (file) (concat "#+LATEX_HEADER: \\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
|
||||
(my/list-sty)))))
|
||||
|
||||
(setq my/greek-alphabet
|
||||
'(("a" . "\\alpha")
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
# name: org-html-css
|
||||
# key: org-html-css
|
||||
# --
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://gongzhitaao.org/orgcss/org.css"/>
|
||||
|
||||
#+begin_export html
|
||||
<style type="text/css">
|
||||
.org-rainbow-delimiters-depth-1, .org-rainbow-delimiters-depth-2, .org-rainbow-delimiters-depth-3, .org-rainbow-delimiters-depth-4 {
|
||||
|
|
|
|||
7
.emacs.d/snippets/org-mode/org-latex
Normal file
7
.emacs.d/snippets/org-mode/org-latex
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# -*- mode: snippet -*-
|
||||
# name: org-latex
|
||||
# key: org-latex
|
||||
# --
|
||||
#+LATEX_CLASS: org-plain-extarticle
|
||||
#+LATEX_CLASS_OPTIONS: [a4paper, 14pt]
|
||||
$0
|
||||
|
|
@ -2,11 +2,11 @@
|
|||
# name: org-python-template
|
||||
# key: orgpy
|
||||
# --
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://gongzhitaao.org/orgcss/org.css"/>
|
||||
#+PROPERTY: header-args:python :session $1
|
||||
#+PROPERTY: header-args:python+ :exports both
|
||||
#+PROPERTY: header-args:python+ :tangle yes
|
||||
#+PROPERTY: header-args:python+ :async yes
|
||||
#+PROPERTY: header-args:python+ :eval never-export
|
||||
|
||||
#+begin_src elisp :exports none
|
||||
(setq-local org-image-actual-width '(1024))
|
||||
|
|
|
|||
136
Emacs.org
136
Emacs.org
|
|
@ -104,7 +104,7 @@ As with other files in the repo, parts prefixed with (OFF) are not used but kept
|
|||
- [[#python][Python]]
|
||||
- [[#view-html-in-browser][View HTML in browser]]
|
||||
- [[#setup][Setup]]
|
||||
- [[#select-active-jupyter-kernel][Select active Jupyter kernel]]
|
||||
- [[#managing-jupyter-kernels][Managing Jupyter kernels]]
|
||||
- [[#ui][UI]]
|
||||
- [[#instant-equations-preview][Instant equations preview]]
|
||||
- [[#latex-fragments][LaTeX fragments]]
|
||||
|
|
@ -114,7 +114,7 @@ As with other files in the repo, parts prefixed with (OFF) are not used but kept
|
|||
- [[#hugo][Hugo]]
|
||||
- [[#jupyter-notebook][Jupyter Notebook]]
|
||||
- [[#html-export][Html export]]
|
||||
- [[#off-latex][(OFF) LaTeX]]
|
||||
- [[#latex][LaTeX]]
|
||||
- [[#keybindings--stuff][Keybindings & stuff]]
|
||||
- [[#copy-a-link][Copy a link]]
|
||||
- [[#presentations][Presentations]]
|
||||
|
|
@ -1652,7 +1652,7 @@ Async code blocks evaluations. Jupyter blocks have a built-in async, so they are
|
|||
:config
|
||||
(setq ob-async-no-async-languages-alist '("python" "jupyter-python" "jupyter-octave")))
|
||||
#+end_src
|
||||
*** Select active Jupyter kernel
|
||||
*** Managing Jupyter kernels
|
||||
Functions for managing local Jupyter kernels.
|
||||
|
||||
~my/insert-jupyter-kernel~ inserts a path to an active Jupyter kernel to the buffer. Useful to quickly write a header like:
|
||||
|
|
@ -1660,22 +1660,28 @@ Functions for managing local Jupyter kernels.
|
|||
#+PROPERTY: header-args:python :session <path-to-kernel>
|
||||
#+end_example
|
||||
|
||||
~my/jupyter-connect-repl~ opens a REPL, connected to an active kernel.
|
||||
~my/jupyter-connect-repl~ opens a =emacs-jupyter= REPL, connected to an active kernel. ~my/jupyter-qtconsole~ runs a standalone Jupyter QtConsole.
|
||||
|
||||
Requirements: =ss=
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(setq my/jupyter-runtime-folder (expand-file-name "~/.local/share/jupyter/runtime"))
|
||||
|
||||
(defun my/get-open-ports ()
|
||||
(mapcar
|
||||
#'string-to-number
|
||||
(split-string (shell-command-to-string "ss -tulpnH | awk '{print $5}' | sed -e 's/.*://'") "\n")))
|
||||
|
||||
(defun my/list-jupyter-kernel-files ()
|
||||
(mapcar
|
||||
(lambda (file) (cons (car file) (cdr (assq 'shell_port (json-read-file (car file))))))
|
||||
(sort
|
||||
(directory-files-and-attributes my/jupyter-runtime-folder t ".*kernel.*json$")
|
||||
(lambda (x y) (not (time-less-p (nth 6 x) (nth 6 y)))))))
|
||||
|
||||
(defun my/select-jupyter-kernel ()
|
||||
(let ((ports (mapcar
|
||||
#'string-to-number
|
||||
(split-string (shell-command-to-string "ss -tulpnH | awk '{print $5}' | sed -e 's/.*://'") "\n")))
|
||||
(files (mapcar
|
||||
(lambda (file) (cons (car file) (cdr (assq 'shell_port (json-read-file (car file))))))
|
||||
(sort
|
||||
(directory-files-and-attributes my/jupyter-runtime-folder t ".*kernel.*json$")
|
||||
(lambda (x y) (not (time-less-p (nth 6 x) (nth 6 y))))))))
|
||||
(let ((ports (my/get-open-ports))
|
||||
(files (my/list-jupyter-kernel-files)))
|
||||
(completing-read
|
||||
"Jupyter kernels: "
|
||||
(seq-filter
|
||||
|
|
@ -1690,6 +1696,28 @@ Requirements: =ss=
|
|||
(defun my/jupyter-connect-repl ()
|
||||
(interactive)
|
||||
(jupyter-connect-repl (my/select-jupyter-kernel) nil nil nil t))
|
||||
|
||||
(defun my/jupyter-qtconsole ()
|
||||
(interactive)
|
||||
(start-process "jupyter-qtconsole" nil "setsid" "jupyter" "qtconsole" "--existing"
|
||||
(file-name-nondirectory (my/select-jupyter-kernel))))
|
||||
#+end_src
|
||||
|
||||
I've also noticed that there are JSON files left in the runtime folder whenever kernel isn't stopped correctly. So here is a cleanup function.
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(defun my/jupyter-cleanup-kernels ()
|
||||
(interactive)
|
||||
(let* ((ports (my/get-open-ports))
|
||||
(files (my/list-jupyter-kernel-files))
|
||||
(to-delete (seq-filter
|
||||
(lambda (file)
|
||||
(not (member (cdr file) ports)))
|
||||
files)))
|
||||
(when (and (length> to-delete 0)
|
||||
(y-or-n-p (format "Delete %d files?" (length to-delete))))
|
||||
(dolist (file to-delete)
|
||||
(delete-file (car file))))))
|
||||
#+end_src
|
||||
** UI
|
||||
*** Instant equations preview
|
||||
|
|
@ -1767,29 +1795,36 @@ Scale latex fragments preview.
|
|||
:config
|
||||
(setq org-html-htmlize-output-type 'css))
|
||||
#+end_src
|
||||
*** OFF (OFF) LaTeX
|
||||
| Type | Note |
|
||||
|------+------------------------|
|
||||
| TODO | Make LaTeX export work |
|
||||
|
||||
*** LaTeX
|
||||
Add a custom LaTeX template without default packages. Packages are indented to be imported with function from [[Import *.sty]].
|
||||
#+begin_src emacs-lisp :tangle no
|
||||
(defun my/setup-org-latex ()
|
||||
(setq org-latex-compiler "xelatex")
|
||||
(setq org-latex-listings 'minted)
|
||||
(setq org-latex-minted-options
|
||||
'(("breaklines" "true")
|
||||
("tabsize" "4")
|
||||
("autogobble")
|
||||
("linenos")
|
||||
("numbersep" "0.5cm")
|
||||
("xleftmargin" "1cm")
|
||||
("frame" "single")))
|
||||
(setq org-latex-pdf-process '("latexmk -outdir=%o %f"))
|
||||
(add-to-list 'org-latex-classes
|
||||
'("extarticle"
|
||||
"\\documentclass[a4paper, 14pt]{extarticle}"
|
||||
'("org-plain-extarticle"
|
||||
"\\documentclass{extarticle}
|
||||
[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}"))
|
||||
)
|
||||
)
|
||||
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
|
||||
|
||||
(with-eval-after-load 'ox-latex
|
||||
(my/setup-org-latex))
|
||||
#+end_src
|
||||
|
||||
** Keybindings & stuff
|
||||
#+begin_src emacs-lisp :tangle no :noweb-ref org-keys-setup
|
||||
(general-define-key
|
||||
|
|
@ -2343,34 +2378,45 @@ References:
|
|||
A function to import =.sty= files to the LaTeX document.
|
||||
|
||||
#+begin_src emacs-lisp
|
||||
(defun my/list-sty ()
|
||||
(reverse
|
||||
(sort
|
||||
(seq-filter
|
||||
(lambda (file) (if (string-match ".*\.sty$" file) 1 nil))
|
||||
(directory-files
|
||||
(seq-some
|
||||
(lambda (dir)
|
||||
(if (and
|
||||
(f-directory-p dir)
|
||||
(seq-some
|
||||
(lambda (file) (string-match ".*\.sty$" file))
|
||||
(directory-files dir))
|
||||
) dir nil))
|
||||
(list "./styles" "../styles/" "." "..")) :full))
|
||||
(lambda (f1 f2)
|
||||
(let ((f1b (file-name-base f1))
|
||||
(f1b (file-name-base f2)))
|
||||
(cond
|
||||
((string-match-p ".*BibTex" f1) t)
|
||||
((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
|
||||
((string-match-p ".*Preamble" f2) t)
|
||||
(t (string-lessp f1 f2))))))))
|
||||
|
||||
(defun my/import-sty ()
|
||||
(interactive)
|
||||
(insert
|
||||
(apply #'concat
|
||||
(cl-mapcar
|
||||
(lambda (file) (concat "\\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
|
||||
(reverse
|
||||
(sort
|
||||
(seq-filter
|
||||
(lambda (file) (if (string-match ".*\.sty$" file) 1 nil))
|
||||
(directory-files
|
||||
(seq-some
|
||||
(lambda (dir)
|
||||
(if (and
|
||||
(f-directory-p dir)
|
||||
(seq-some
|
||||
(lambda (file) (string-match ".*\.sty$" file))
|
||||
(directory-files dir))
|
||||
) dir nil))
|
||||
(list "./styles" "../styles/" "." "..")) :full))
|
||||
(lambda (f1 f2)
|
||||
(let ((f1b (file-name-base f1))
|
||||
(f1b (file-name-base f2)))
|
||||
(cond
|
||||
((string-match-p ".*BibTex" f1) t)
|
||||
((and (string-match-p ".*Locale" f1) (not (string-match-p ".*BibTex" f2))) t)
|
||||
((string-match-p ".*Preamble" f2) t)
|
||||
(t (string-lessp f1 f2)))))))))))
|
||||
(my/list-sty)))))
|
||||
|
||||
(defun my/import-sty-org ()
|
||||
(interactive)
|
||||
(insert
|
||||
(apply #'concat
|
||||
(cl-mapcar
|
||||
(lambda (file) (concat "#+LATEX_HEADER: \\usepackage{" (file-name-sans-extension (file-relative-name file default-directory)) "}\n"))
|
||||
(my/list-sty)))))
|
||||
#+end_src
|
||||
*** Snippets
|
||||
| Note | Type |
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue