aboutsummaryrefslogtreecommitdiff
path: root/modules/latex-config.el
blob: 0db21f2f2517f199810dfe195a532ed15a0bf7d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
;;; latex-config --- Setup for LaTeX and Related Software -*- lexical-binding: t; coding: utf-8; -*-
;; author Craig Jennings <c@cjennings.net>

;;; Commentary:
;;
;; Layer: 3 (Domain Workflow).
;; Category: D/P.
;; Load shape: eager.
;; Eager reason: none; LaTeX/AUCTeX editing, a hook/mode-loaded deferral candidate.
;; Top-level side effects: package configuration via use-package.
;; Runtime requires: none.
;; Direct test load: yes.
;;
;; WORKFLOW:
;;
;; Opening any tex file will put you into LaTeX mode.
;;
;; C-c C-m to enter macros
;; C-c C-e to enter environment
;;
;; C-c C-c to compile a tex document using latexmk
;; C-c C-v to view the resulting pdf
;;
;;; Code:

;; ----------------------------- PDF Viewer Selection --------------------------
;;
;; Pick whichever PDF viewer is available rather than hard-coding Zathura.
;; The selected viewer is pushed onto `TeX-view-program-selection' for
;; output-pdf so `C-c C-v' opens the compiled PDF.

(defconst cj/--latex-pdf-viewer-candidates
  ;; (PROGRAM . TeX-VIEWER-NAME) in preference order.  TeX-view-program-list
  ;; has built-in entries for "Zathura", "Evince", "Okular", "Skim",
  ;; "PDF Tools", and platform openers; we match against those names.
  '(("zathura"     . "Zathura")
    ("evince"      . "Evince")
    ("okular"      . "Okular")
    ("SumatraPDF"  . "Sumatra PDF")
    ("xdg-open"    . "xdg-open"))
  "Ordered (EXECUTABLE . TEX-VIEWER-NAME) pairs for PDF preview selection.")

(defvar TeX-view-program-selection)
(declare-function pdf-view-mode "pdf-view")

(defun cj/--latex-select-pdf-viewer ()
  "Select the first available external PDF viewer for `output-pdf'.
Falls back to PDF Tools when no external viewer is on PATH.  Any existing
`output-pdf' entry is dropped first, then the chosen viewer is consed onto
the head so it wins over any default.  Idempotent: re-running leaves a
single entry."
  (let* ((found (cl-find-if (lambda (entry)
                              (executable-find (car entry)))
                            cj/--latex-pdf-viewer-candidates))
         (viewer-name (if found (cdr found) "PDF Tools")))
    (setq TeX-view-program-selection
          (cons (list 'output-pdf viewer-name)
                (assq-delete-all 'output-pdf TeX-view-program-selection)))))

;; ----------------------------- Auctex And Related ----------------------------

(use-package tex
  :ensure auctex
  :defer t
  :hook
  (TeX-mode-hook . (lambda () (setq TeX-command-default "latexmk"))) ; use latexmk by default
  (LaTeX-mode    . (lambda () (TeX-fold-mode 1)))                    ; automatically activate TeX-fold-mode.
  (LaTeX-mode    . flyspell-mode)                               ; turn on flyspell-mode by default
  (LaTeX-mode    . TeX-PDF-mode)
  (LaTeX-mode . cj/--latex-select-pdf-viewer)
  :mode
  ("\\.tex\\'" . latex-mode)
  :config
  (setq TeX-auto-save t)       ; auto save style info when saving buffer
  (setq TeX-parse-self t)      ; parse file after loading if it has no style hook
  (setq TeX-save-query nil)    ; don't ask to save files before starting TeX
  (setq TeX-PDF-mode t)        ; compile to PDF mode, rather than DVI
  (setq-default TeX-master t)) ; Assume the file is the master file itself

(use-package auctex-latexmk
  :defer t
  :config
  (auctex-latexmk-setup)
  (setq auctex-latexmk-inherit-TeX-PDF-mode t))

(use-package company-auctex
  :after tex
  :init (company-auctex-init))

;; ----------------------------- Graphviz Dot Mode -----------------------------

(use-package graphviz-dot-mode
  :defer t
  :config
  (setq graphviz-dot-indent-width 4))

(provide 'latex-config)
;;; latex-config.el ends here