diff --git a/home-manager/modules/tex.nix b/home-manager/modules/tex.nix new file mode 100644 index 0000000..0055b0b --- /dev/null +++ b/home-manager/modules/tex.nix @@ -0,0 +1,287 @@ +{ + pkgs, + lib, + config, + ... +}: let + enabled = config.custom.enableOrgTex; +in { + options.custom.enableOrgTex = lib.mkEnableOption "Enable Emacs Org and LaTeX configuration"; + config = lib.mkIf enabled (let + aspellPackage = pkgs.aspellWithDicts (d: [d.en d.en-science d.en-computers d.fr]); + texliveset = pkgs.texlive.combine { + inherit + (pkgs.texlive) + scheme-basic + babel + amscls + amsmath + biber + biblatex + biblatex-mla + block + cancel + caption + capt-of + csquotes + enotez + enumitem + etex + etoolbox + fancyhdr + float + fontaxes + graphics + hanging + hyperref + latex + latexindent + latexmk + logreq + metafont + mlacls + newtx + pdflscape + pdfpages + preprint + psnfss + ragged2e + titlesec + tools + translations + ulem + url + wrapfig + xstring + xkeyval + ; + }; + in { + home.packages = with pkgs; [ + texliveset + aspellPackage + gnuplot + plantuml + ]; + + programs.emacs.extraPackages = let + org-auctex = pkgs.emacsPackages.trivialBuild rec { + pname = "org-auctex"; + version = "e1271557b9f36ca94cabcbac816748e7d0dc989c"; + + buildInputs = [pkgs.emacsPackages.auctex]; + + src = pkgs.fetchFromGitHub { + owner = "karthink"; + repo = pname; + rev = version; + sha256 = "sha256-cMAhwybnq5HA1wOaUqDPML3nnh5m1iwEETTPWqPbAvw="; + }; + }; + in (with pkgs.emacsPackages; [ + org-auctex + auctex + cdlatex + citeproc + graphviz-dot-mode + ivy-bibtex + gnuplot + htmlize + org-auctex + org-contrib + org-download + pdf-tools + plantuml-mode + ]); + + home.file.".emacs.d/org-init.el".text = + /* + elisp + */ + '' + (require 'cdlatex) + (require 'citeproc) + (require 'gnuplot) + (require 'gnuplot-context) + (require 'graphviz-dot-mode) + (require 'htmlize) + (require 'ivy-bibtex) + (require 'ob-dot) + (require 'ob-emacs-lisp) + (require 'ob-gnuplot) + (require 'ob-matlab) + (require 'ob-python) + (require 'ob-shell) + (require 'oc) + (require 'oc-basic) + (require 'oc-csl) + (require 'oc-natbib) + (require 'org-auctex) + (require 'org-contrib) + (require 'org-download) + (require 'ox-latex) + (require 'ox-publish) + (require 'pdf-tools) + (require 'plantuml-mode) + (require 'tex) + + (autoload 'gnuplot-mode "gnuplot" "Gnuplot major mode" t) + (autoload 'gnuplot-make-buffer "gnuplot" "open a buffer in gnuplot-mode" t) + (setq auto-mode-alist (append '(("\\.gp$" . gnuplot-mode)) auto-mode-alist)) + + (define-key graphviz-dot-mode-map (kbd "C-c C-y") 'graphviz-dot-indent-graph) + + (defvar zotero-bibliography (expand-file-name "zotero.bib" org-directory)) + + (defvar ivy-bibtex-bibliography (list zotero-bibliography)) + (setq reftex-default-bibliography (list zotero-bibliography)) + (setq bibtex-completion-pdf-field "file") + + (add-hook 'LaTeX-mode-hook 'turn-on-cdlatex) + (add-hook 'LaTeX-mode (lambda () + (turn-on-reftex))) + (setq TeX-PDF-mode t + TeX-auto-save t + TeX-parse-self t) + + (setq org-babel-octave-shell-command "octave -q") + + (setq org-babel-python-command "python3.10") + (setq-default python-indent-guess-indent-offset-verbose nil) + (defun my/org-babel-execute:python-session (body params) + "Initiate a python session before executing org babel blocks that use sessions. + BODY is the content of the org-babel block and PARAMS are any parameters specified." + (let ((session-name (cdr (assq :session params)))) + (when (not (eq session-name "none")) + (org-babel-python-initiate-session session-name)))) + (advice-add #'org-babel-execute:python :before #'my/org-babel-execute:python-session) + + (defun my/indent-org-block-automatically () + "Indent the current org code block." + (interactive) + (when (org-in-src-block-p) + (org-edit-special) + (indent-region (point-min) (point-max)) + (org-edit-src-exit))) + (defun my/org-force-open-current-window () + "Open a link using 'org-open-at-point' in current window." + (interactive) + (let ((org-link-frame-setup + (quote + ((vm . vm-visit-folder) + (vm-imap . vm-visit-imap-folder) + (gnus . gnus) + (file . find-file) + (wl . wl))) + )) + (org-open-at-point))) + (defun my/follow-org-link (arg) + "Follow a link in orgmode If ARG is given. + Opens in new window otherwise opens in current window." + (interactive "P") + (if arg + (org-open-at-point) + (my/org-force-open-current-window))) + (defun krofna-hack () + "Toggle latex fragments after exiting closing them." + (when (looking-back (rx "$ ")) + (save-excursion + (backward-char 1) + (org-latex-preview)))) + + + (global-set-key (kbd "C-c n a") 'org-agenda) + + (setq org-agenda-start-on-weekday nil) + + (define-key org-mode-map (kbd "C-c C-o") 'my/follow-org-link) + (define-key org-mode-map (kbd "C-c C-y") 'my/indent-org-block-automatically) + (define-key org-mode-map (kbd "C-c ]") 'org-cite-insert) + + (add-hook 'org-babel-after-execute-hook 'org-redisplay-inline-images) + (add-hook 'org-mode-hook 'visual-line-mode) + (add-hook 'org-mode-hook 'org-cdlatex-mode) + (add-hook 'org-mode-hook + (lambda () + (add-hook 'post-self-insert-hook #'krofna-hack 'append 'local))) + + (add-to-list 'org-latex-classes + '("mla" + "\\documentclass{mla}" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + (add-to-list 'org-latex-classes + '("letter" + "\\documentclass{letter}" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) + + (plist-put org-format-latex-options :scale 3) + + (setq org-agenda-files (list org-directory (expand-file-name "ubc" org-directory))) + (setq org-agenda-tags-column 0) + (setq org-auto-align-tags nil) + (setq org-fold-catch-invisible-edits 'show-and-error) + (setq org-cite-export-processors '((t basic))) + (setq org-cite-global-bibliography (list zotero-bibliography)) + (setq org-confirm-babel-evaluate nil) + (setq org-ellipsis "…") + (setq org-export-with-tags nil) + (setq org-hide-emphasis-markers t) + (setq org-highlight-latex-and-related '(latex)) + (setq org-html-head-include-default-style nil) + (setq org-html-head-include-scripts nil) + (setq org-html-validation-link nil) + (setq org-image-actual-width 300) + (setq org-insert-heading-respect-content t) + (setq org-latex-pdf-process '("latexmk -pdflatex='pdflatex -interaction nonstopmode' -pdf -bibtex -f %f")) + (setq org-pretty-entities t) + (setq org-preview-latex-default-process 'dvisvgm) + (setq org-special-ctrl-a/e t) + (setq org-src-fontify-natively t) + (setq org-src-preserve-indentation t) + (setq org-src-tab-acts-natively t) + (setq org-src-window-setup 'current-window) + (setq org-tags-column 0) + + (setq org-agenda-time-grid + '((daily today require-timed) + (800 1000 1200 1400 1600 1800 2000) + " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄")) + + (setq org-exports-dir (expand-file-name "exports" org-directory)) + + (setq org-publish-project-alist + (list (cons "html" + (list :base-directory org-directory + :base-extension "org" + :htmlized-source t + :recursive t + :publishing-directory org-exports-dir + :publishing-function 'org-html-publish-to-html)) + (cons "pdf" + (list :base-directory org-directory + :base-extension "org" + :recursive t + :publishing-directory org-exports-dir + :publishing-function 'org-latex-publish-to-pdf)) + (cons "all" '(:components ("html" "pdf"))))) + + (add-hook 'org-mode-hook 'org-auctex-mode) + + (add-hook 'dired-mode-hook 'org-download-enable) + (setq-default org-download-image-dir (expand-file-name "images" org-directory)) + + (add-hook 'org-mode-hook 'org-modern-mode) + + (setq-default pdf-view-display-size 'fit-width) + (defvar pdf-annot-activate-created-annotations t) + + (setq plantuml-default-exec-mode 'executable) + ''; + }); +} diff --git a/home-manager/profiles/willem/base.nix b/home-manager/profiles/willem/base.nix index 788ede4..400248a 100644 --- a/home-manager/profiles/willem/base.nix +++ b/home-manager/profiles/willem/base.nix @@ -23,4 +23,16 @@ in rec { MAILDIR = "${config.home.homeDirectory}/Maildir"; }; }; + + custom.enableOrgTex = lib.mkDefault true; + + home.file = { + ".config/nixpkgs/config.nix".text = '' + # -*-nix-*- + { + nixpkgs.config.allowUnfreePredicate = (_: true); + allowUnfree = true; + } + ''; + }; } diff --git a/home-manager/profiles/willem/packages.nix b/home-manager/profiles/willem/packages.nix index c4df51a..cf31319 100644 --- a/home-manager/profiles/willem/packages.nix +++ b/home-manager/profiles/willem/packages.nix @@ -17,53 +17,6 @@ yarn ]; octave-wp = pkgs.octave.withPackages (p: with p; [symbolic]); - texliveset = pkgs.texlive.combine { - inherit - (pkgs.texlive) - scheme-basic - babel - amscls - amsmath - biber - biblatex - biblatex-mla - block - cancel - caption - capt-of - csquotes - enotez - enumitem - etex - etoolbox - fancyhdr - float - fontaxes - graphics - hanging - hyperref - latex - latexindent - latexmk - logreq - metafont - mlacls - newtx - pdflscape - pdfpages - preprint - psnfss - ragged2e - titlesec - tools - translations - ulem - url - wrapfig - xstring - xkeyval - ; - }; fenix-rust = pkgs.fenix.combine (with pkgs.fenix; [ latest.toolchain targets.thumbv7em-none-eabihf.latest.rust-std diff --git a/home-manager/profiles/willem/programs/emacs/default.nix b/home-manager/profiles/willem/programs/emacs/default.nix index ded84b1..3b02580 100644 --- a/home-manager/profiles/willem/programs/emacs/default.nix +++ b/home-manager/profiles/willem/programs/emacs/default.nix @@ -3,7 +3,6 @@ pkgs, ... }: let - aspellPackage = pkgs.aspellWithDicts (d: [d.en d.en-science d.en-computers d.fr]); emacsPackage = (pkgs.emacsPackagesFor pkgs.emacs29).emacsWithPackages (epkgs: @@ -19,19 +18,6 @@ sha256 = "sha256-6aX2S4cUop1rdxweIF5f1qrgNmYd1mtWgT9T1Q1s2h8="; }; }; - org-auctex = epkgs.trivialBuild rec { - pname = "org-auctex"; - version = "e1271557b9f36ca94cabcbac816748e7d0dc989c"; - - buildInputs = [epkgs.auctex]; - - src = pkgs.fetchFromGitHub { - owner = "karthink"; - repo = pname; - rev = version; - sha256 = "sha256-cMAhwybnq5HA1wOaUqDPML3nnh5m1iwEETTPWqPbAvw="; - }; - }; lean4-mode = epkgs.trivialBuild rec { pname = "lean4-mode"; version = "d1c936409ade7d93e67107243cbc0aa55cda7fd5"; @@ -52,9 +38,6 @@ in [ all-the-icons all-the-icons-dired - auctex - cdlatex - citeproc company-mode company-sourcekit counsel @@ -64,11 +47,7 @@ f flycheck format-all - gnuplot - graphviz-dot-mode - htmlize ivy - ivy-bibtex lean4-mode lsp-mode lua-mode @@ -78,12 +57,7 @@ nix-mode nix-update org - org-auctex - org-contrib - org-download org-modern - pdf-tools - plantuml-mode polymode poly-org rustic @@ -95,9 +69,6 @@ yasnippet ]) ++ (with pkgs; [ - aspellPackage - gnuplot - plantuml sqlite ])); in { diff --git a/home-manager/profiles/willem/programs/emacs/init.el b/home-manager/profiles/willem/programs/emacs/init.el index 54e46e8..84c046d 100644 --- a/home-manager/profiles/willem/programs/emacs/init.el +++ b/home-manager/profiles/willem/programs/emacs/init.el @@ -60,51 +60,31 @@ (require 'all-the-icons) (require 'all-the-icons-dired) -(require 'cdlatex) -(require 'citeproc) (require 'company) (require 'counsel) (require 'edit-indirect) (require 'editorconfig) (require 'eglot) (require 'format-all) -(require 'gnuplot) -(require 'gnuplot-context) -(require 'graphviz-dot-mode) -(require 'htmlize) (require 'ivy) -(require 'ivy-bibtex) (require 'lean4-mode) (require 'magit) (require 'meow) (require 'nix-mode) (require 'nix-update) -(require 'ob-dot) -(require 'ob-emacs-lisp) -(require 'ob-gnuplot) -(require 'ob-matlab) -(require 'ob-python) -(require 'ob-shell) -(require 'oc) -(require 'oc-basic) -(require 'oc-csl) -(require 'oc-natbib) (require 'org) -(require 'org-auctex) -(require 'org-contrib) -(require 'org-download) (require 'org-modern) -(require 'ox-latex) -(require 'ox-publish) -(require 'pdf-tools) -(require 'plantuml-mode) (require 'polymode) (require 'rustic) (require 'rust-ts-mode) (require 'swiper) -(require 'tex) (require 'yasnippet) +(let ((org-config (expand-file-name "~/.emacs.d/org-init.el"))) + (when (file-exists-p org-config) + (load-file org-config)) +) + (setq org-directory (expand-file-name "~/Documents/org")) (add-hook 'dired-mode-hook 'all-the-icons-dired-mode) @@ -140,12 +120,6 @@ (add-to-list 'format-all-default-formatters '("Nix" alejandra)) (setq-default format-all-formatters format-all-default-formatters) -(autoload 'gnuplot-mode "gnuplot" "Gnuplot major mode" t) -(autoload 'gnuplot-make-buffer "gnuplot" "open a buffer in gnuplot-mode" t) -(setq auto-mode-alist (append '(("\\.gp$" . gnuplot-mode)) auto-mode-alist)) - -(define-key graphviz-dot-mode-map (kbd "C-c C-y") 'graphviz-dot-indent-graph) - (global-set-key (kbd "C-c C-r") 'ivy-resume) (add-hook 'after-init-hook 'ivy-mode) @@ -159,21 +133,6 @@ '((ivy-bibtex . ivy--regex-ignore-order) (t . ivy--regex-plus))) -(defvar zotero-bibliography (expand-file-name "zotero.bib" org-directory)) - -(defvar ivy-bibtex-bibliography (list zotero-bibliography)) -(setq reftex-default-bibliography (list zotero-bibliography)) -(setq bibtex-completion-pdf-field "file") - -(add-hook 'LaTeX-mode-hook 'turn-on-cdlatex) -(add-hook 'LaTeX-mode (lambda () - (turn-on-reftex))) -(setq TeX-PDF-mode t - TeX-auto-save t - TeX-parse-self t) - - - (defun meow-setup () "Initialize meow-edit for colemak." (setq meow-cheatsheet-layout meow-cheatsheet-layout-colemak) @@ -279,149 +238,9 @@ (add-to-list 'auto-mode-alist '("\\.nix$" . poly-nix-mode)) - ;; Automatically update hash for nix fetch functions (define-key nix-mode-map (kbd "C-c C-u") 'nix-update-fetch) -(setq org-babel-octave-shell-command "octave -q") - -(setq org-babel-python-command "python3.10") -(setq-default python-indent-guess-indent-offset-verbose nil) -(defun my/org-babel-execute:python-session (body params) - "Initiate a python session before executing org babel blocks that use sessions. -BODY is the content of the org-babel block and PARAMS are any parameters specified." - (let ((session-name (cdr (assq :session params)))) - (when (not (eq session-name "none")) - (org-babel-python-initiate-session session-name)))) -(advice-add #'org-babel-execute:python :before #'my/org-babel-execute:python-session) - -(defun my/indent-org-block-automatically () - "Indent the current org code block." - (interactive) - (when (org-in-src-block-p) - (org-edit-special) - (indent-region (point-min) (point-max)) - (org-edit-src-exit))) -(defun my/org-force-open-current-window () - "Open a link using 'org-open-at-point' in current window." - (interactive) - (let ((org-link-frame-setup - (quote - ((vm . vm-visit-folder) - (vm-imap . vm-visit-imap-folder) - (gnus . gnus) - (file . find-file) - (wl . wl))) - )) - (org-open-at-point))) -(defun my/follow-org-link (arg) - "Follow a link in orgmode If ARG is given. -Opens in new window otherwise opens in current window." - (interactive "P") - (if arg - (org-open-at-point) - (my/org-force-open-current-window))) -(defun krofna-hack () - "Toggle latex fragments after exiting closing them." - (when (looking-back (rx "$ ")) - (save-excursion - (backward-char 1) - (org-latex-preview)))) - - -(global-set-key (kbd "C-c n a") 'org-agenda) - -(setq org-agenda-start-on-weekday nil) - -(define-key org-mode-map (kbd "C-c C-o") 'my/follow-org-link) -(define-key org-mode-map (kbd "C-c C-y") 'my/indent-org-block-automatically) -(define-key org-mode-map (kbd "C-c ]") 'org-cite-insert) - -(add-hook 'org-babel-after-execute-hook 'org-redisplay-inline-images) -(add-hook 'org-mode-hook 'visual-line-mode) -(add-hook 'org-mode-hook 'org-cdlatex-mode) -(add-hook 'org-mode-hook - (lambda () - (add-hook 'post-self-insert-hook #'krofna-hack 'append 'local))) - -(add-to-list 'org-latex-classes - '("mla" - "\\documentclass{mla}" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) -(add-to-list 'org-latex-classes - '("letter" - "\\documentclass{letter}" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))) - -(plist-put org-format-latex-options :scale 3) - -(setq org-agenda-files (list org-directory (expand-file-name "ubc" org-directory))) -(setq org-agenda-tags-column 0) -(setq org-auto-align-tags nil) -(setq org-fold-catch-invisible-edits 'show-and-error) -(setq org-cite-export-processors '((t basic))) -(setq org-cite-global-bibliography (list zotero-bibliography)) -(setq org-confirm-babel-evaluate nil) -(setq org-ellipsis "…") -(setq org-export-with-tags nil) -(setq org-hide-emphasis-markers t) -(setq org-highlight-latex-and-related '(latex)) -(setq org-html-head-include-default-style nil) -(setq org-html-head-include-scripts nil) -(setq org-html-validation-link nil) -(setq org-image-actual-width 300) -(setq org-insert-heading-respect-content t) -(setq org-latex-pdf-process '("latexmk -pdflatex='pdflatex -interaction nonstopmode' -pdf -bibtex -f %f")) -(setq org-pretty-entities t) -(setq org-preview-latex-default-process 'dvisvgm) -(setq org-special-ctrl-a/e t) -(setq org-src-fontify-natively t) -(setq org-src-preserve-indentation t) -(setq org-src-tab-acts-natively t) -(setq org-src-window-setup 'current-window) -(setq org-tags-column 0) - -(setq org-agenda-time-grid - '((daily today require-timed) - (800 1000 1200 1400 1600 1800 2000) - " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄")) - -(setq org-exports-dir (expand-file-name "exports" org-directory)) - -(setq org-publish-project-alist - (list (cons "html" - (list :base-directory org-directory - :base-extension "org" - :htmlized-source t - :recursive t - :publishing-directory org-exports-dir - :publishing-function 'org-html-publish-to-html)) - (cons "pdf" - (list :base-directory org-directory - :base-extension "org" - :recursive t - :publishing-directory org-exports-dir - :publishing-function 'org-latex-publish-to-pdf)) - (cons "all" '(:components ("html" "pdf"))))) - -(add-hook 'org-mode-hook 'org-auctex-mode) - -(add-hook 'dired-mode-hook 'org-download-enable) -(setq-default org-download-image-dir (expand-file-name "images" org-directory)) - -(add-hook 'org-mode-hook 'org-modern-mode) - -(setq-default pdf-view-display-size 'fit-width) -(defvar pdf-annot-activate-created-annotations t) - -(setq plantuml-default-exec-mode 'executable) - (define-key eglot-mode-map (kbd "C-c C-y") 'eglot-format-buffer) (define-key eglot-mode-map (kbd "C-c C-a") 'eglot-code-actions) (setq eglot-extend-to-xref t)