doomemacs/modules/lang/latex/config.el
Henrik Lissner 1e81a35461
Minimize dependence on map!
This is in preparation for general.el integration coming in 2.1.1. It is
very likely that map! will change (and even more, be split into several
macros). Not much, but change none-the-less. Specifically, the state
keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state
property that takes a list, e.g. (normal visual insert).

In any case, both map! and general are also relatively expensive
compared to define-key and evil-define-key* (and the new define-key!
macro), so use that when we can.

This also means changes to either API won't affect Doom's modules in the
long term.
2018-06-03 15:46:00 +02:00

215 lines
7.4 KiB
EmacsLisp

;;; lang/latex/config.el -*- lexical-binding: t; -*-
(defvar +latex-bibtex-file ""
"File AUCTeX (specifically RefTeX) uses to search for citations.")
(defvar +latex-bibtex-dir ""
"Where bibtex files are kept.")
(defvar +latex-indent-level-item-continuation 8
"Custom indentation level for items in enumeration-type environments")
;;
;; Plugins
;;
(after! tex
;; Set some varibles to fontify common LaTeX commands.
(load! "+fontification")
(setq TeX-parse-self t ; Enable parse on load.
TeX-save-query nil ; just save, don't ask
TeX-auto-save t ; Enable parse on save.
;; Use hidden directories for AUCTeX files.
TeX-auto-local ".auctex-auto"
TeX-style-local ".auctex-style"
;; When correlating sources to rendered PDFs, don't start the emacs
;; server
TeX-source-correlate-start-server nil
TeX-source-correlate-mode t
TeX-source-correlate-method 'synctex
;; Fonts for section, subsection, etc
font-latex-fontify-sectioning 1.15)
(setq-default TeX-master nil)
;; Display the output of the latex commands in a popup.
(set! :popup " output\\*$" '((size . 15)))
;; TeX Font Styling
;; (def-package! tex-style :defer t)
;; TeX Folding
(add-hook 'TeX-mode-hook #'TeX-fold-mode))
(after! latex
(setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks.
'(LaTeX-section-heading
LaTeX-section-title
LaTeX-section-toc
LaTeX-section-section
LaTeX-section-label)
LaTeX-fill-break-at-separators nil
LaTeX-item-indent 0) ; item indentation.
(define-key LaTeX-mode-map "C-j" nil)
;; Do not prompt for Master files, this allows auto-insert to add templates
;; to .tex files
(add-hook! '(LaTeX-mode TeX-mode)
(remove-hook 'find-file-hook (car find-file-hook) 'local))
;; Adding useful things for latex
(add-hook! 'LaTeX-mode-hook
#'(LaTeX-math-mode
TeX-source-correlate-mode
TeX-global-PDF-mode
TeX-PDF-mode
visual-line-mode))
;; Enable rainbow mode after applying styles to the buffer
(add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode)
(when (featurep! :feature spellcheck)
(add-hook 'LaTeX-mode-hook #'flyspell-mode))
;; Use chktex to search for errors in a latex file.
(setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s")
;; Set a custom item indentation
(dolist (env '("itemize" "enumerate" "description"))
(map-put LaTeX-indent-environment-list
env '(+latex/LaTeX-indent-item)))
;;
;; Use Okular if the user says so.
(when (featurep! +okular)
;; Configure Okular as viewer. Including a bug fix
;; (https://bugs.kde.org/show_bug.cgi?id=373855)
(map-put TeX-view-program-list
"Okular" '(("okular --unique file:%o" (mode-io-correlate "#src:%n%a"))))
(map-put TeX-view-program-list 'output-pdf '("Okular")))
;; Or Skim
(when (featurep! +skim)
(map-put TeX-view-program-list
"Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b"))
(map-put TeX-view-program-selection 'output-pdf '("Skim")))
;; Or PDF-tools, but only if the module is also loaded
(when (and (featurep! :tools pdf)
(featurep! +pdf-tools))
(map-put TeX-view-program-list "PDF Tools" '("TeX-pdf-tools-sync-view"))
(map-put TeX-view-program-selection 'output-pdf '("PDF Tools"))
;; Enable auto reverting the PDF document with PDF Tools
(add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)))
;; The preview package is currently broken with the latest AUCTeX version
;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX
;; master, so we just have to wait.
(def-package! preview
:hook (LaTeX-mode . LaTeX-preview-setup)
:config
(setq-default preview-scale 1.4
preview-scale-function
(lambda () (* (/ 10.0 (preview-document-pt)) preview-scale))))
(def-package! latex-preview-pane
:when (featurep! +preview-pane)
:hook ((latex-mode LaTeX-mode) . latex-preview-pane-enable)
:commands latex-preview-pane-mode
:init
(setq latex-preview-pane-multifile-mode 'auctex)
:config
(map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode))
(map-put TeX-view-program-selection 'output-pdf '("preview-pane"))
(define-key! doc-view-mode-map
(kbd "ESC") #'delete-window
"q" #'delete-window
"k" (λ! (quit-window) (delete-window))))
(def-package! reftex
:hook ((latex-mode LaTeX-mode) . turn-on-reftex)
:init
(setq reftex-plug-into-AUCTeX t
reftex-toc-split-windows-fraction 0.3)
:config
;; Get ReTeX working with biblatex
;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992
(setq reftex-cite-format
'((?t . "\\textcite[]{%l}")
(?a . "\\autocite[]{%l}")
(?c . "\\cite[]{%l}")
(?s . "\\smartcite[]{%l}")
(?f . "\\footcite[]{%l}")
(?n . "\\nocite{%l}")
(?b . "\\blockcquote[]{%l}{}")))
(unless (string-empty-p +latex-bibtex-file)
(setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file))))
(map! :map reftex-mode-map
:localleader :n ";" 'reftex-toc)
(add-hook! 'reftex-toc-mode-hook
(reftex-toc-rescan)
(map! :local
:e "j" #'next-line
:e "k" #'previous-line
:e "q" #'kill-buffer-and-window
:e "ESC" #'kill-buffer-and-window
"C-g" #'reftex-toc-quit)))
(def-package! bibtex
:defer t
:config
(setq bibtex-dialect 'biblatex
bibtex-align-at-equal-sign t
bibtex-text-indentation 20)
(unless (string-empty-p +latex-bibtex-file)
(setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))
(unless (string-empty-p +latex-bibtex-dir)
(setq bibtex-completion-library-path (list +latex-bibtex-dir)
bibtex-completion-pdf-field "file"
bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)
bibtex-completion-pdf-open-function
(lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))
(define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry))
(def-package! auctex-latexmk
:when (featurep! +latexmk)
:after-call (latex-mode-hook LaTeX-mode-hook)
:init
;; Pass the -pdf flag when TeX-PDF-mode is active
(setq auctex-latexmk-inherit-TeX-PDF-mode t)
;; Set LatexMk as the default
(setq-hook! LaTeX-mode TeX-command-default "LatexMk")
:config
;; Add latexmk as a TeX target
(auctex-latexmk-setup))
(def-package! ivy-bibtex
:when (featurep! :completion ivy)
:commands ivy-bibtex
:config (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key))
(def-package! helm-bibtex
:when (featurep! :completion helm)
:commands helm-bibtex)
(def-package! company-auctex
:when (featurep! :completion company)
:commands (company-auctex-init)
:init
;; We can't use the (set! :company-backend ...) because Auctex reports its
;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is
;; not anticipated by :company-backend (and shouldn't have to!)
(add-hook! LaTeX-mode
(make-variable-buffer-local 'company-backends)
(company-auctex-init)))
;; Nicely indent lines that have wrapped when visual line mode is activated
(def-package! adaptive-wrap
:hook (LaTeX-mode . adaptive-wrap-prefix-mode)
:init (setq-default adaptive-wrap-extra-indent 0))