如何使用特定的前导码将Org-mode导出到LaTeX?

时间:2012-01-13 15:54:45

标签: emacs latex org-mode

当我执行 C-c C-e l 将Org文件导出到LaTeX时,它会生成一个带有特定前导码的文档。我希望它使用我选择的序言而不是这个特定的序言。假设我希望它使用以下序言:

% Don't forget to qpdf --linearize the final copy
\RequirePackage[l2tabu,orthodox]{nag}% Old habits die hard. All the same, there are commands, classes and packages which are outdated and superseded. nag provides routines to warn the user about the use of those.
\immediate\write18{sh ./vc}
\input{vc}% Version control macros (for \VCDateISO in \date) http://www.ctan.org/pkg/vc
\documentclass[a4paper,12pt]{article}% pt? doublepage?
%\usepackage{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}% Latin Modern (derivate of Knuth's CM)
\usepackage{fixltx2e}% \textsubscript and bugfixes for LaTeX
\usepackage{microtype}
\usepackage[strict=true]{csquotes}% Context-sensistive quotes. \enquote "" \enquote* ''. Use the integrated commands \textcquote and \blockcquote rather than biblatex internal commands to get contex sensistive quotes for them too. s/babel/autostyle in new version.
\usepackage[bookmarks,pdfborder={0 0 0}]{hyperref}% links and pdfinfo. MUST BE LOADED LAST!

\hypersetup{% Setup for hyperref
pdftitle    = {[Title from #+TITLE]},
pdfauthor   = {[Author from #+AUTHOR]}
}

我知道你可以操作基于每个文件使用哪些包as described in the manual但我希望这个序言用于所有文件,除非另有说明。我想要使​​用的序言包括以下内容:

  • 已停用的软件包(例如上面的geometry
  • RequirePackage
  • 加载的软件包
  • input
  • \immediate\write18
  • usepackage
  • 之后的评论
  • 一个hypersetup宏,用于识别组织模式文件中的#+TITLE#+AUTHOR

4 个答案:

答案 0 :(得分:14)

已停用的软件包(例如上面的geometry

Org-mode识别LaTeX代码块中的LaTeX语法,以及在内容中包含LaTeX文件时。 (见Quoting LaTeX code。)

RequirePackage

加载的包

如上所述。

输入宏

如上所述。

\immediate\write18

我相信这也应该如上所述,但是有另一种处理方法。如果使用其中的命令创建类型为sh的源代码块,Org将在导出时对其进行评估并生成所需的行为。您必须启用sh作为babel语言类型才能正常工作。

(require 'ob-shell)

您还可以将sh作为babel加载的语言之一加入org-babel-load-languages

(acons 'sh 't org-babel-load-languages)

然后使用类似于以下代码块来运行./vc

#+name: Test
#+begin_src sh :results output silent :exports results
  ./vc
#+end_src

只要它出现在\input{vc}行之前,它应该运行代码然后包含它。只需按照代码块

进行操作即可
#+LATEX: \input{vc}

并且应该包含您的内容。

usepackage宏之后的注释

如果代码在LaTeX块中,它应该将其识别为LaTeX。

一个hypersetup宏,用于识别组织模式文件中的#+ TITLE和#+ AUTHOR。

这必须包含在每个文档中而不是分开。以下内容将提供您对宏的期望。它不在序言中,但它最终会出现在文档的顶部,并且导出的行为与预期相符(但如果通过#+INCLUDE:从组织中添加,它将不会按预期运行。

#+begin_latex
  \hypersetup{% Setup for hyperref
  pdftitle    = {{{{TITLE}}}}, %Org macro to take from #+TITLE
  pdfauthor   = {{{{AUTHOR}}}} %Org macro to take from #+AUTHOR
  }
#+end_latex

创建自己的Latex导出类

如果您按照worg教程中的说明操作(请参阅Org Latex Export),您可以创建自己的导出类。如果您想完全控制前言中的包,您只需要:

(add-to-list 'org-export-latex-classes
             '("<CLASS NAME>"
               "\\documentclass{article}
               [NO-DEFAULT-PACKAGES]
               [NO-PACKAGES]"
               <insert desired sectioning configuration>))

您还可以在\\documentclass[NO-DEFAULT-PACKAGES]行之间添加所需的套餐。另一种方法是使用以下方法将它们添加到文件本身:

#+LATEX_CLASS: <CLASS NAME>
#+LATEX_HEADER: \usepackage{package}
...

作为第三种选择,您只需使用所需的软件包等创建自定义.sty文件,并将其作为单个#+LATEX_HEADER:包含。

答案 1 :(得分:4)

这不能回答你的问题,但确实可以让你做你想做的事。

(defun headless-latex ()
  "exports to a .tex file without any preamble"
  (interactive)
  (org-export-as-latex 3 nil nil nil t nil)
)

此函数导出ORG模式文件的内容,不带任何前导。然后,您可以\input将其添加到包含所需前导码的文件中。 Further reading.

答案 2 :(得分:1)

我使用不同的方法来完成任务:

定义一个类(我称之为 per-file-class ,因为某些奇怪的原因。你可以称之为其他类)。将此代码放在 .emacs

;; per-file-class with minimal packages
(unless (find "per-file-class" org-export-latex-classes :key 'car
              :test 'equal)
  (add-to-list 'org-export-latex-classes
               '("per-file-class"
                 "\\documentclass{article}
                [NO-DEFAULT-PACKAGES]
                [EXTRA]"
                 ("\\section{%s}" . "\\section*{%s}")
                 ("\\subsection{%s}" . "\\subsection*{%s}")
                 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
                 ("\\paragraph{%s}" . "\\paragraph*{%s}")
                 ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))

在您的组织文件中使用此类:

  

#+ LaTeX_CLASS:per-file-class

     

#+ LaTeX_CLASS_OPTIONS:[10pt,a4paper]

答案 3 :(得分:0)

我不允许发表评论(声誉欠佳或其他问题;-)),所以我将发布答案。先前的答案有一段非常不错的无头导出功能代码段。该代码需要为更高版本的org更新:

(defun headless-latex ()
  "exports to a .tex file without any preamble"
  (interactive)
  (org-latex-export-as-latex nil nil nil t nil)
  )