;;; config-latex.el --- Generated package (no.92) from my config -*- lexical-binding: t; -*- ;; ;; Copyright (C) 2024 TEC ;; ;; Author: TEC <https://code.tecosaur.net/tec> ;; Maintainer: TEC <contact@tecosaur.net> ;; Created: June 26, 2024 ;; Modified: June 26, 2024 ;; Version: 2024.06.26 ;; Homepage: https://code.tecosaur.net/tec/emacs-config ;; Package-Requires: ((emacs "29.1")) ;; ;; This file is not part of GNU Emacs. ;; ;;; Commentary: ;; ;; Generated package (no.92) from my config. ;; ;; During generation, dependency on other aspects of my configuration and ;; packages is inferred via (regexp-based) static analysis. While this seems ;; to do a good job, this method is imperfect. This code likely depends on ;; utilities provided by Doom, and if you try to run it in isolation you may ;; discover the code makes more assumptions. ;; ;; That said, I've found pretty good results so far. ;; ;;; Code: (setq TeX-save-query nil TeX-show-compilation t TeX-command-extra-options "-shell-escape") (after! latex (add-to-list 'TeX-command-list '("XeLaTeX" "%`xelatex%(mode)%' %t" TeX-run-TeX nil t))) (setq +latex-viewers '(pdf-tools evince zathura okular skim sumatrapdf)) (setq tec/yas-latex-template-preamble " \\usepackage[pdfa,unicode=true,hidelinks]{hyperref} \\usepackage[dvipsnames,svgnames,table,hyperref]{xcolor} \\renewcommand{\\UrlFont}{\\ttfamily\\small} \\usepackage[a-2b]{pdfx} % why not be archival \\usepackage[T1]{fontenc} \\usepackage[osf]{newpxtext} % Palatino \\usepackage{gillius} \\usepackage[scale=0.9]{sourcecodepro} \\usepackage{mathtools} \\usepackage{amssymb} \\let\\Bbbk\\relax \\usepackage[varbb]{newpxmath} \\usepackage[activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,factor=2000]{microtype} % microtype makes text look nicer \\usepackage{graphicx} % include graphics \\usepackage{booktabs} % nice table rules ") (defun tec/yas-latex-get-class-choice () "Prompt user for LaTeX class choice" (setq tec/yas-latex-class-choice (completing-read "Select document class: " '("article" "scrartcl" "bmc")))) (defun tec/yas-latex-preamble-if () "Based on class choice prompt for insertion of default preamble" (if (equal tec/yas-latex-class-choice "bmc") 'nil (eq (read-char-choice "Include default preamble? [Type y/n]" '(?y ?n)) ?y))) (after! tex (defvar tec/tex-last-delim-char nil "Last open delim expanded in a tex document") (defvar tec/tex-delim-dot-second t "When the `tec/tex-last-delim-char' is . a second character (this) is prompted for") (defun tec/get-open-delim-char () "Exclusivly read next char to tec/tex-last-delim-char" (setq tec/tex-delim-dot-second nil) (setq tec/tex-last-delim-char (read-char-exclusive "Opening deliminator, recognises: 9 ( [ { < | .")) (when (eql ?. tec/tex-last-delim-char) (setq tec/tex-delim-dot-second (read-char-exclusive "Other deliminator, recognises: 0 9 ( ) [ ] { } < > |")))) (defun tec/tex-open-delim-from-char (&optional open-char) "Find the associated opening delim as string" (unless open-char (setq open-char (if (eql ?. tec/tex-last-delim-char) tec/tex-delim-dot-second tec/tex-last-delim-char))) (pcase open-char (?\( "(") (?9 "(") (?\[ "[") (?\{ "\\{") (?< "<") (?| (if tec/tex-delim-dot-second "." "|")) (_ "."))) (defun tec/tex-close-delim-from-char (&optional open-char) "Find the associated closing delim as string" (if tec/tex-delim-dot-second (pcase tec/tex-delim-dot-second (?\) ")") (?0 ")") (?\] "]") (?\} "\\}") (?\> ">") (?| "|") (_ ".")) (pcase (or open-char tec/tex-last-delim-char) (?\( ")") (?9 ")") (?\[ "]") (?\{ "\\}") (?< ">") (?\) ")") (?0 ")") (?\] "]") (?\} "\\}") (?\> ">") (?| "|") (_ ".")))) (defun tec/tex-next-char-smart-close-delim (&optional open-char) (and (bound-and-true-p smartparens-mode) (eql (char-after) (pcase (or open-char tec/tex-last-delim-char) (?\( ?\)) (?\[ ?\]) (?{ ?}) (?< ?>))))) (defun tec/tex-delim-yas-expand (&optional open-char) (yas-expand-snippet (yas-lookup-snippet "_deliminators" 'latex-mode) (point) (+ (point) (if (tec/tex-next-char-smart-close-delim open-char) 2 1))))) (after! latex (setcar (assoc "⋆" LaTeX-fold-math-spec-list) "★")) ;; make \star bigger (setq TeX-fold-math-spec-list `(;; missing/better symbols ("≤" ("le")) ("≥" ("ge")) ("≠" ("ne")) ;; convenience shorts -- these don't work nicely ATM ;; ("‹" ("left")) ;; ("›" ("right")) ;; private macros ("ℝ" ("RR")) ("ℕ" ("NN")) ("ℤ" ("ZZ")) ("ℚ" ("QQ")) ("ℂ" ("CC")) ("ℙ" ("PP")) ("ℍ" ("HH")) ("𝔼" ("EE")) ("𝑑" ("dd")) ;; known commands ("" ("phantom")) (,(lambda (num den) (if (and (TeX-string-single-token-p num) (TeX-string-single-token-p den)) (concat num "/" den) (concat "❪" num "/" den "❫"))) ("frac")) (,(lambda (arg) (concat "√" (TeX-fold-parenthesize-as-necessary arg))) ("sqrt")) (,(lambda (arg) (concat "⭡" (TeX-fold-parenthesize-as-necessary arg))) ("vec")) ("‘{1}’" ("text")) ;; private commands ("|{1}|" ("abs")) ("‖{1}‖" ("norm")) ("⌊{1}⌋" ("floor")) ("⌈{1}⌉" ("ceil")) ("⌊{1}⌉" ("round")) ("𝑑{1}/𝑑{2}" ("dv")) ("∂{1}/∂{2}" ("pdv")) ;; fancification ("{1}" ("mathrm")) (,(lambda (word) (string-offset-roman-chars 119743 word)) ("mathbf")) (,(lambda (word) (string-offset-roman-chars 119951 word)) ("mathcal")) (,(lambda (word) (string-offset-roman-chars 120003 word)) ("mathfrak")) (,(lambda (word) (string-offset-roman-chars 120055 word)) ("mathbb")) (,(lambda (word) (string-offset-roman-chars 120159 word)) ("mathsf")) (,(lambda (word) (string-offset-roman-chars 120367 word)) ("mathtt")) ) TeX-fold-macro-spec-list '( ;; as the defaults ("[f]" ("footnote" "marginpar")) ("[c]" ("cite")) ("[l]" ("label")) ("[r]" ("ref" "pageref" "eqref")) ("[i]" ("index" "glossary")) ("..." ("dots")) ("{1}" ("emph" "textit" "textsl" "textmd" "textrm" "textsf" "texttt" "textbf" "textsc" "textup")) ;; tweaked defaults ("©" ("copyright")) ("®" ("textregistered")) ("™" ("texttrademark")) ("[1]:||►" ("item")) ("❡❡ {1}" ("part" "part*")) ("❡ {1}" ("chapter" "chapter*")) ("§ {1}" ("section" "section*")) ("§§ {1}" ("subsection" "subsection*")) ("§§§ {1}" ("subsubsection" "subsubsection*")) ("¶ {1}" ("paragraph" "paragraph*")) ("¶¶ {1}" ("subparagraph" "subparagraph*")) ;; extra ("⬖ {1}" ("begin")) ("⬗ {1}" ("end")) )) (defun string-offset-roman-chars (offset word) "Shift the codepoint of each character in WORD by OFFSET with an extra -6 shift if the letter is lowercase" (apply 'string (mapcar (lambda (c) (string-offset-apply-roman-char-exceptions (+ (if (>= c 97) (- c 6) c) offset))) word))) (defvar string-offset-roman-char-exceptions '(;; lowercase serif (119892 . 8462) ; ℎ ;; lowercase caligraphic (119994 . 8495) ; ℯ (119996 . 8458) ; ℊ (120004 . 8500) ; ℴ ;; caligraphic (119965 . 8492) ; ℬ (119968 . 8496) ; ℰ (119969 . 8497) ; ℱ (119971 . 8459) ; ℋ (119972 . 8464) ; ℐ (119975 . 8466) ; ℒ (119976 . 8499) ; ℳ (119981 . 8475) ; ℛ ;; fraktur (120070 . 8493) ; ℭ (120075 . 8460) ; ℌ (120076 . 8465) ; ℑ (120085 . 8476) ; ℜ (120092 . 8488) ; ℨ ;; blackboard (120122 . 8450) ; ℂ (120127 . 8461) ; ℍ (120133 . 8469) ; ℕ (120135 . 8473) ; ℙ (120136 . 8474) ; ℚ (120137 . 8477) ; ℝ (120145 . 8484) ; ℤ ) "An alist of deceptive codepoints, and then where the glyph actually resides.") (defun string-offset-apply-roman-char-exceptions (char) "Sometimes the codepoint doesn't contain the char you expect. Such special cases should be remapped to another value, as given in `string-offset-roman-char-exceptions'." (if (assoc char string-offset-roman-char-exceptions) (cdr (assoc char string-offset-roman-char-exceptions)) char)) (defun TeX-fold-parenthesize-as-necessary (tokens &optional suppress-left suppress-right) "Add ❪ ❫ parenthesis as if multiple LaTeX tokens appear to be present" (if (TeX-string-single-token-p tokens) tokens (concat (if suppress-left "" "❪") tokens (if suppress-right "" "❫")))) (defun TeX-string-single-token-p (teststring) "Return t if TESTSTRING appears to be a single token, nil otherwise" (if (string-match-p "^\\\\?\\w+$" teststring) t nil)) (after! tex (map! :map LaTeX-mode-map :ei [C-return] #'LaTeX-insert-item) (setq TeX-electric-math '("\\(" . ""))) ;; Making \( \) less visible (defface unimportant-latex-face '((t :inherit font-lock-comment-face :weight extra-light)) "Face used to make \\(\\), \\[\\] less visible." :group 'LaTeX-math) (font-lock-add-keywords 'latex-mode `(("\\\\[]()[]" 0 'unimportant-latex-face prepend)) 'end) ;; (font-lock-add-keywords ;; 'latex-mode ;; '(("\\\\[[:word:]]+" 0 'font-lock-keyword-face prepend)) ;; 'end) (setq preview-LaTeX-command '("%`%l \"\\nonstopmode\\nofiles\ \\PassOptionsToPackage{" ("," . preview-required-option-list) "}{preview}\ \\AtBeginDocument{\\ifx\\ifPreview\\undefined" preview-default-preamble "\\fi}\"%' \"\\detokenize{\" %t \"}\"")) (after! cdlatex (setq cdlatex-env-alist '(("bmatrix" "\\begin{bmatrix}\n?\n\\end{bmatrix}" nil) ("equation*" "\\begin{equation*}\n?\n\\end{equation*}" nil))) (setq ;; cdlatex-math-symbol-prefix ?\; ;; doesn't work at the moment :( cdlatex-math-symbol-alist '( ;; adding missing functions to 3rd level symbols (?_ ("\\downarrow" "" "\\inf")) (?2 ("^2" "\\sqrt{?}" "" )) (?3 ("^3" "\\sqrt[3]{?}" "" )) (?^ ("\\uparrow" "" "\\sup")) (?k ("\\kappa" "" "\\ker")) (?m ("\\mu" "" "\\lim")) (?c ("" "\\circ" "\\cos")) (?d ("\\delta" "\\partial" "\\dim")) (?D ("\\Delta" "\\nabla" "\\deg")) ;; no idea why \Phi isnt on 'F' in first place, \phi is on 'f'. (?F ("\\Phi")) ;; now just convenience (?. ("\\cdot" "\\dots")) (?: ("\\vdots" "\\ddots")) (?* ("\\times" "\\star" "\\ast"))) cdlatex-math-modify-alist '( ;; my own stuff (?B "\\mathbb" nil t nil nil) (?a "\\abs" nil t nil nil)))) (after! tex (add-to-list 'TeX-view-program-list '("Evince" "evince %o")) (add-to-list 'TeX-view-program-selection '(output-pdf "Evince"))) (when (>= emacs-major-version 28) (add-hook 'latex-mode-hook #'TeX-latex-mode)) (provide 'config-latex) ;;; config-latex.el ends here