org-mode转latex时,设置的latex选项没有效果


#1

org-mode转latex时,我需要设置一个block的一些latex选项。看文档使用 :options这个选项来加感觉没有效果。大家有遇到过吗?

比如这个org块:

#+ATTR_LATEX: :options commentstyle=\bfseries
#+BEGIN_SRC emacs-lisp
       (defun Fib (n)
         (if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2)))))
#+END_SRC

导出:

\begin{verbatim}
       (defun Fib (n)
         (if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2)))))
\end{verbatim}

对应的commentstyle=\bfseries这个选项就是加不上。

我希望的结果是:

\begin{verbatim}[commentstyle=\bfseries]
       (defun Fib (n)
         (if (< n 2) n (+ (Fib (- n 1)) (Fib (- n 2)))))
\end{verbatim}

我example这些block也试了,都不生效。

求指教。


#2

我直接在《The Org Manual》的第164页“12.10.8 Source blocks in LATEX export”找到了你这个block,同时附带这个说明:

the :options are set for Minted. Minted is a source code highlighting LATEXpackage with many configurable options.

To apply similar configuration options for all source blocks in a file, use the org-latex-listings-options and org-latex-minted-options variables.

所以,建议检查一下对应package的设置吧。


#3

这个我看过。我感觉好像是对src block导出成\begin{listings}或者\begin{minted}这种格式才生效。

但我现在的情况是,我所有的src block导出都是导出成 \begin{verbatim}。而我对我的src block使用类似于

#+ATTR_LATEX: :environment listtings
#+BEGIN_SRC C
#include <stdio.h>
#+END_SRC

这样显示地指定也不行。

我用的emacs和org版本如下:

GNU Emacs 26.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.18.9) of 2018-06-15
Org mode version 9.1.9 (release_9.1.9-65-g5e4542 @ /usr/local/share/emacs/26.1/lisp/org/)

#4

今天有时间仔细实践了。《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效果: mintedpdf

总结,这两个方法貌似不能共存。我看到org各种报错,累死了……

真是好麻烦啊,导出的Latex长得这么丑,越过Latex直接生成pdf还莫名出错。在org里折腾Latex真是事倍功半。


#5

哈哈。非常感谢。

我之前也这样搞出来了。记录在 这里。现在我用的listings来的设置。

用org主要是导出确实很方便。我觉得就是,搞出一个模版出来。然后只管用org写就行了。其实导出还是因为要呈现给别人看。

在org里折腾确实累。但是搞好了写起来确实很爽啊。


#6

今天又看了一下,发现了三楼提到的改变:enviornment的问题。

按照 org manual 的例子,:environment的设置是对放在#+BEGIN_EXAMPLE#+END_EXAMPLE之间的代码起作用的。如果,代码是放在#+BEGIN_SRC#+END_SRC之间,那么,就算是有:environment的设置也不会生效,导出的Latex效果依旧还是默认的verbatim,又或者是已经有的listingsminted的效果。

虽然:environment可以任意指定一个Latex的环境,不过要搭配用#+BEGIN_EXAMPLE#+END_EXAMPLE就有点鸡肋了,除非那代码就是摆出来看看而已。


#7

是的,我也觉得这样设计不太好。

凑合用着。纯文本才是王道。其它都是异教徒。哈哈 :slight_smile: