今天有时间仔细实践了。《The Org Manual》里有一些地方的举例不是十分详细,可以看看worg里具体设置的说明。
https://orgmode.org/worg/org-dependencies.html
简单归纳,从org导出带格式的代码,需要用对应Latex包,listings
或者minted
是最常用的。不过,用不同的包要有各自不同的org设置。我下面做的,都是对一楼那个的elisp块加上不同的显示格式。
方法一:
先说用listings
的情况,按worg的方法设置org:
(require 'ox-latex)
(setq org-latex-listings t)
(add-to-list 'org-latex-packages-alist '("" "listings")) ;; 如果不希望每次都载入这些Latex包,省略这两行,
(add-to-list 'org-latex-packages-alist '("" "xcolor")) ;; 可以只在org文件里用LATEX_HEADER调用
在org里试一下,要求在左侧加行号,并且把注解用紫色显示:
#+LATEX_COMPILER: xelatex
#+LATEX_HEADER: \usepackage{listings}
#+LATEX_HEADER: \usepackage{xcolor}
#+ATTR_LATEX: :options numbers=left, commentstyle=\color{violet}
#+BEGIN_SRC emacs-lisp
(defun Fib (n) ;; some comments
(if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2))))) ;; some comments
#+END_SRC
导出Latex:
... % 省略部分导言
\usepackage{listings}
\usepackage{xcolor}
...
\begin{document}
\lstset{language=Lisp,label= ,caption= ,captionpos=b,numbers=none,numbers=left, commentstyle=\color{violet}}
\begin{lstlisting}
(defun Fib (n) ;; some comments
(if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2))))) ;; some comments
\end{lstlisting}
\end{document}
pdf效果如图:
方法二:
如果要用minted
,则要先改一下org的设置:
(setq org-latex-listings 'minted)
然后是org里的例子。这里要求插入一个换行的箭头,所以有:options breaklines
,而minted
实现这个功能还要调用keyval
包。
#+LATEX_COMPILER: xelatex
#+LATEX_HEADER: \usepackage{minted}
#+LATEX_HEADER: \usemintedstyle{borland}
#+LATEX_HEADER: \usepackage{keyval}
#+ATTR_LATEX: :options breaklines
#+BEGIN_SRC emacs-lisp
(defun Fib (n) ;; some looooooooooooooooooooooooooooooooooong comments
(if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2))))) ;; some comments
#+END_SRC
生成的latex文件是:
... % 省略部分导言
\usepackage{minted}
\usemintedstyle{borland}
\usepackage{keyval}
...
\begin{document}
\begin{minted}[,breaklines]{common-lisp} % 是的,你没看错
(defun Fib (n) ;; some looooooooooooooooooooooooooooooooooong comments
(if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2))))) ;; some comments
\end{minted}
\end{document}
pdf效果:
总结,这两个方法貌似不能共存。我看到org各种报错,累死了……
真是好麻烦啊,导出的Latex长得这么丑,越过Latex直接生成pdf还莫名出错。在org里折腾Latex真是事倍功半。