snowmacs/lisp/init-org.el

169 lines
6.3 KiB
EmacsLisp

;;; init-org.el -- Org mode 配置
;;; Commentary:
;;; 配置 Org mode 以适应 LaTeX 导出、Org Babel 语言支持以及其他功能。
;;; Code:
;; 启用 Org mode 钩子并设置必要的参数
(add-hook 'org-mode-hook
(lambda ()
(setq truncate-lines nil) ;; 不截断长行
(when (member "REFTEX" org-todo-keywords-1)
(reftex-mode t) ;; 启用 RefTeX 模式
(and (buffer-file-name)
(file-exists-p (buffer-file-name))
(reftex-parse-all)))))
;; 使用 ox-latex 包进行 LaTeX 导出
(require 'ox-latex)
;; 配置 LaTeX 导出使用 xelatex 和 minted 代码高亮
(setq org-latex-listings 'minted
org-latex-packages-alist '(("" "minted"))
org-latex-pdf-process
'("xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f"
"xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f"
"xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f"))
;; 配置 LaTeX 导出的超链接颜色和其他属性
(setq org-latex-hyperref-template nil) ;; 禁用默认的 hyperref 设置
(setq org-latex-with-hyperref t) ;; 启用 hyperref
(setq org-latex-packages-alist '(("colorlinks=true,linkcolor=blue,urlcolor=cyan" "hyperref" nil)))
;; 设置 AUCTeX 自动保存与解析
(setq TeX-auto-save t
TeX-parse-self t
TeX-master nil)
;; 禁用 Babel 代码执行确认提示
(setq org-confirm-babel-evaluate nil)
;; 自定义 LaTeX 类
(setq org-latex-classes nil) ;; 初始化变量以防止冲突
(add-to-list 'org-latex-classes
'("cn-article"
"\\documentclass[10pt,a4paper]{article}
\\usepackage{fontspec} % 引入 fontspec 包
\\usepackage{xeCJK} % 引入 xeCJK 包处理中文
\\usepackage{xcolor} % 引入xcolor
\\definecolor{hltextcolor}{RGB}{255, 69, 0} % 配置文本单词高亮颜色
\\definecolor{bgcolor}{RGB}{245,245,245} % 定义代码块背景颜色为浅灰色
% 设置英文字体
\\setmainfont{Noto Sans SC}
\\setsansfont{Arial}
\\setmonofont{Noto Sans SC} % 设置等宽字体,用于代码
% 设置中文字体
\\setCJKmainfont{Microsoft YaHei} % 设置中文主字体为微软雅黑
\\setCJKsansfont{Microsoft YaHei UI} % 设置中文无衬线字体为微软雅黑UI
\\setCJKmonofont{Microsoft YaHei Mono} % 设置中文等宽字体为微软雅黑Mono
% 设置段落和行距
\\setlength{\parindent}{2em} % 首行缩进
\\setlength{\parskip}{0.5em} % 段落间距
\\linespread{1.5} % 行间距
\\usepackage[cache=false]{minted}
\\setminted{fontsize=\\footnotesize, breaklines, breakanywhere, bgcolor=bgcolor, frame=lines, framesep=2mm}
[NO-DEFAULT-PACKAGES]
[NO-PACKAGES]"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
;; 配置 LaTeX 导出的 minted 代码框选项
(setq org-export-latex-minted-options
'(("frame" "single") ;; 代码框:阴影盒
("frameround" "tttt") ;; 代码框:圆角
("fontsize" "\\scriptsize") ;; 代码框字体大小
("linenos" "true") ;; 显示行号
("breaklines" "true") ;; 自动换行
("numbersep" "5pt") ;; 行号与代码距离
("xleftmargin" "1em") ;; 左边距
("xrightmargin" "1em") ;; 右边距
("bgcolor" "lightgray") ;; 背景颜色
("escapeinside" "||") ;; 特殊字符
))
;; 导出前移除 hypersetup 设置,以免显示在文档中
(defun my/org-latex-remove-hypersetup (backend)
"Remove hypersetup settings in the exported LaTeX file."
(goto-char (point-min))
(while (re-search-forward "hypersetup.*" nil t)
(replace-match "")))
;; 高亮字体
(defun org-latex-highlight-texttt (text backend info)
"Highlight =text= with \\textcolor{hltextcolor}{\\texttt{}} in LaTeX export."
(when (org-export-derived-backend-p backend 'latex)
(replace-regexp-in-string "\\\\texttt{\\([^}]+\\)}" "\\\\textcolor{hltextcolor}{\\\\texttt{\\1}}" text)))
(add-to-list 'org-export-filter-final-output-functions 'org-latex-highlight-texttt)
(add-hook 'org-export-before-processing-hook 'my/org-latex-remove-hypersetup)
;; 配置 Org Babel 支持多种编程语言
(org-babel-do-load-languages
'org-babel-load-languages
'((R . t) ;; 支持 R 语言
(emacs-lisp . t) ;; 支持 Emacs Lisp
(java . t) ;; 支持 Java
(matlab . t) ;; 支持 Matlab
(C . t) ;; 支持 C 语言
(perl . t) ;; 支持 Perl
(shell . t) ;; 支持 Shell 脚本
(ditaa . t) ;; 支持 ditaa 图形
(python . t) ;; 支持 Python
(haskell . t) ;; 支持 Haskell
(dot . t) ;; 支持 Graphviz dot 语言
(latex . t) ;; 支持 LaTeX
(js . t) ;; 支持 JavaScript
))
;;; Org-roam 配置,用于 Org mode 笔记管理
(use-package org-roam
:ensure t
:custom
(org-roam-directory "C:/workspace/documents")
(org-roam-db-location "C:/workspace/documents/org-roam.db")
:config
(setq org-roam-capture-templates
'(("d" "default" plain
"%?"
:if-new (file+head "${slug}.org"
"#+title: ${title}\n")
:unnarrowed t)))
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
(org-roam-db-autosync-mode)
(require 'org-roam-protocol))
;; 在创建 org-mode buffer, 自动添加 latex class 解决生成中文pdf 问题
(eval-after-load 'autoinsert
'(define-auto-insert '(org-mode . "Chinese Org skeleton")
'("Description: "
"#+LATEX_CLASS: cn-article\n"
"#+LATEX_CLASS_OPTIONS: [oneside,A4paper,12pt]\n")))
(auto-insert-mode)
(setq auto-insert-query nil)
;; 设置打印选项
(setq ps-paper-type 'a4
ps-font-size 16.0
ps-print-header nil
ps-landscape-mode nil)
;; 解除 org-mode 中 C-, 快捷键的绑定
(add-hook 'org-mode-hook (lambda ()
(local-unset-key (kbd "C-,"))))
;; Org mode 操作的 Hydras 配置
(defhydra hydra-org-operations (:color blue :hint nil)
"
^节点^
^^^^^^^^^-----------
_f_: 查找节点
"
("f" org-roam-node-find "查找节点"))
;; 提供 init-org 模块
(provide 'init-org)
;;; init-org.el ends here