使用org mode导出LaTeX

使用org mode导出LaTeX

Org mode是Emacs下一个重要组件, 也是Emacs的 Killer Application . 几乎所有Emacs下的功能Vim都有对应的插件, 但是唯有org mode, Vim下始终没有一个能与之相媲美的工具. org mode的口号是”Your Life in Plain Text”. org所有内容都是以纯文本的形式保存. 这一点和Mardown类似, 但org mode的功能远远多与Markdown. 用户可以用它做GTD, 写日记, 写程序, 做笔记, 项目管理或写blog. org mode还有非常丰富的导出功能, 可以导出HTML, Textinfo, LaTex文档和幻灯片, 甚至Markdown. org mode还提供了export的API, 用户可是根据自己的需求定义自己的导出格式. 使用org写作,可以真正做到了内容与形式的分离. 本文就是在org mode下写的, 然后转换成Markdown上传到博客的, 还可将其导出LaTeX和pdf.

Org默认的LaTeX导出

org 已经提供了LaTeX的导出功能, 默认使用了 documentclass{paper} . 例如:

#+TITLE: Org to \LaTeX
* Introduction
** section 1
** section 2
** subsection 1
   hello world!
   你好!
   $$a^{2} + b^{2}$$

Ctrl c e 之后, 会弹出 export 的buffer, 提示用户选择导出类型, 按 l 表示导出LaTeX, 接着按 o 键表示导出pdf文件, 并且打开. 导出的LaTeX文件如下:

% Created 2016-11-21 Mon 21:28
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fixltx2e}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{float}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{textcomp}
\usepackage{marvosym}
\usepackage{wasysym}
\usepackage{amssymb}
\usepackage{hyperref}
\tolerance=1000
\date{\today}
\title{Org to \LaTeX}
\begin{document}

\maketitle
\tableofcontents
\section{Introduction}
\label{sec-1}
\subsection{section 1}
\label{sec-1-1}
\subsection{section 2}
\label{sec-1-2}
\subsection{subsection 1}
\label{sec-1-3}
hello world!
你好!
$$a^{2} + b^{2}$$
% Emacs 24.4.1 (Org mode 8.2.10)
\end{document}

效果如下图片:
img

从写法上看, org mode非常紧凑, LaTeX文件要麻烦的多. 这是因为导出时org已经自动为我们做了转换, 用户只需要关心写作的内容而非LaTeX烦人的细节.上面tex文件中package是org mode默认的, 用户可以根据自己的需求添加更改.你可以定制自己的LaTeX模板, 同样的org内容, 选择不同的模板就能得到不同格式的pdf文件, 实现内容与形式的分离. org mode还集成了GTD, 版本控制, 插入图片, 插入表格, 以及公式编辑和预览等功能, 写文档非常之方便.

定制LaTeX导出模板

有时我们需要定制自己的导出模板, org mode 也可以非常方便的做到.下面是几个常用的功能.

  1. 更改pdf引擎

    org默认的pdf引擎是pdftex,我们将其更改为xeLaTeX. 后者处理中文的效果更好一些. 在 ./emac.d/init.el 文件中加入如下的 lisp 语句:

    ;;xelatex                                                                                                             (setq org-latex-pdf-process '("xelatex -interaction nonstopmode %f"
                                  "xelatex -interaction nonstopmode %f"))
    

    该命令是将org mode的默认pdf引擎改为xelatex.

  2. 自定义模板

    下面将建立一个自己的模板, 取名 org-article 需要在 ./emac.d/init.el 中添加如下的语句:

    ;;org-export latex
    (require 'ox-latex)
    (add-to-list 'org-latex-classes
                 '("org-article"
                   "\\documentclass{article}
                     \\usepackage{graphicx}
                     \\usepackage{xcolor}
                     \\usepackage{xeCJK}
                     \\usepackage{fixltx2e}
                     \\usepackage{longtable}
                     \\usepackage{float}        
                     \\usepackage{tikz}         
                     \\usepackage{wrapfig}      
                     \\usepackage{latexsym,amssymb,amsmath}
                     \\usepackage{textcomp}
                     \\usepackage{listings}     
                    \\usepackage{marvosym}     
                    \\usepackage{textcomp}     
                    \\usepackage{latexsym}     
                    \\usepackage{natbib}       
                    \\usepackage{geometry}     
                    [NO-DEFAULT-PACKAGES]      
                    [PACKAGES]                 
                    [EXTRA]"
                    ("\\section{%s}" . "\\section*{%s}")
                    ("\\subsection{%s}" . "\\subsection*{%s}")
                    ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
                    ("\\paragraph{%s}" . "\\paragraph*{%s}")
                    ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
    

    这里使用了16个个宏包, 也几乎是latex中最常用的宏包, 例如, xeCJK 是对中文的支持, tikz 是LaTeX下的绘图包, listings 是对代码的支持.
    注意到上述代码中的 [NO-DEFAULT-PACKAGES] . 其含义的是不加载org默认的宏包, 只有上面代码给的这些宏包. 以上的这些宏包是基本够用,需要添加其他包在org文件中直接操作, 这个将会在后面讲解.
    有了上述的配置, 下面重新用上面的例子测试:

    #+LATEX_CLASS: org-article
    #+TITLE: Org to \LaTeX
    * Introduction
    ** section 1
    ** section 2
    ** subsection 1
       hello world!
       你好!
       $$a^{2} + b^{2}$$
    

    相比之前的例子, 增加了 #+LATEX_CLASS_OPTIONS: org-article 这一句, 意思是使用 org-article 这个配置. 现在重新 按 Ctrl c e 之后, 会弹出 export 的buffer, 提示用户选择导出类型, 按 l 表示导出LaTeX, 接着按 o 键表示导出pdf文件, 并且打开. 导出的LaTeX文件如下:
    img

更多功能

上面已经实现了基本功能. 下面是如何在org文件里操作实现导出的控制.

  1. 如何添加宏包

    当需要添加新的宏包时, 只需要在org文件上边添加 #+LATEX_HEADER:\uspackage{packagename} . 例如:

    #+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}
    #+LATEX_CLASS: org-article
    #+TITLE: Org to \LaTeX
    * Introduction
    ** section 1
    ** section 2
    ** subsection 1
       hello world!
       你好!
       $$a^{2} + b^{2}$$
    

    上面的 #+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref} 的含义是给目录添加索引并且使用红色. 效果如下图:
    img

  2. 添加LaTeX环境

    在LaTeX中, 需要各种各样的环境. 比如摘要, 公式, 表格和图片等. org可以直接在org文档里嵌入LaTeX代码实现. 所有以 #+begin_latex 开头, 以 #+end_latex 结尾的都会被默认成LaTeX代码. 例如, 希望在上面的里面加入摘要. 如下:

    #+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}
    #+LATEX_CLASS: org-article
    
    #+TITLE: Org to \LaTeX
    #+BEGIN_LaTeX
    \begin{abstract}
            This is an abstract with ordinary Org-mode markup. 
            \end{abstract}
    #+END_LaTeX
    * Introduction
    ** section 1
    ** section 2
    ** subsection 1
       hello world!
       你好!
       $$a^{2} + b^{2}$$
    

    则导出的文档如下:
    img

    同理, 表格, 数学公式和和图片也同样嵌入.

  3. org导出选项

    org可以根据需要控制导出格式的设置,比如有时不希望导出作者和邮件, 有时候不希望某部分导出. 这些都通过添加导出开关实现. 例如,

    #+LATEX_CLASS: org-article
    #+OPTIONS: H:3 author:nil c:nil date:nil email:nil |:t <:nil
    #+OPTIONS: p:nil pri:nil tags:nil todo:nil timestamp:nil tasks:t
    #+LATEX_HEADER: \usepackage[colorlinks=true,linkcolor=red]{hyperref}
    #+TITLE: Org to \LaTeX
    #+BEGIN_LaTeX
    \begin{abstract}
            This is an abstract with ordinary Org-mode markup. 
            \end{abstract}
    #+END_LaTeX
    * Introduction
    ** section 1                                                                    :noexport:
    ** section 2
    ** subsection 1
       hello world!
       你好!
       $$a^{2} + b^{2}$$
    

    上面设定使用a4纸张, options 有如下含义

    H:3只导出3级目录
    author:nil不导出作者
    date:nil不显示时间
    email:nil不导出email

    其他也是类似的选项. 注意到 section1 添加了 :export: 标签, 这样 section1 将不会导出. 所以最终pdf输出如下:
    img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值