【问题标题】:How can I make Org-mode export to LaTeX with a specific preamble?如何使用特定的序言将 Org 模式导出到 LaTeX?
【发布时间】:2012-02-09 19:38:19
【问题描述】:

当我执行 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 宏之后的 cmets
  • 一个hypersetup 宏,可从组织模式文件中识别#+TITLE#+AUTHOR

【问题讨论】:

    标签: emacs latex org-mode


    【解决方案1】:

    停用的包(如上面的geometry

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

    RequirePackage 加载的包

    如上。

    输入宏

    如上。

    \immediate\write18

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

    (require 'ob-shell)
    

    您还可以通过将org-babel-load-languages 添加到org-babel-load-languages 来将sh 作为babel 加载的语言之一

    (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}
    

    你的内容应该包括在内。

    使用包宏后的注释

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

    一个hypersetup 宏,可识别来自 Org 模式文件的 #+TITLE 和 #+AUTHOR。

    这必须包含在每个文档中,而不是单独的。以下将提供您对宏的期望。它不会出现在序言中,但它最终会出现在文档的顶部,并且导出的行为确实符合预期(但是,如果通过来自 org 的 #+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:

    【讨论】:

    • 我能够使用(add-to-list 'org-export-latex-classes 方法将大部分内容包含在序言中。我什至可以将\hypersetup 与诸如{{{TITLE}}} 之类的组织模式宏包括在内。对我来说主要的问题是我需要在序言中转义` and "`。
    • 澄清(add-to-list 'org-export-latex-classes如何满足问题的目标:org-export-latex-classes的第二位可以包含任何LaTeX代码,包括cmets。
    • 您是否尝试使用 \ 转义这两个字符?由于(add-to-list 'org-export-latex-classes 中的序言在 elisp 中,您应该能够使用反斜杠转义任何所需的字符。
    【解决方案2】:

    这并不能回答你的问题,但它确实允许你做你想做的事。

    (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.

    【讨论】:

    • 啊,我注意到一个问题:这不会让你的 hypersetup 恶作剧表现得很好。
    • 这确实是另一种方式。这是否可以添加到headless-latexC-e 显示的替代品?然而,理想情况下,我想要一个更接近我要求的解决方案。
    • 我不知道。我只是通过M-x headless-latex 调用它
    • 使用此解决方案的另一种方法是在您的序言中制作一个 yasn-p,并在适当的位置使用制表位。然后你可以展开 sn-p 然后放入无头 LaTeX 代码。
    【解决方案3】:

    我使用不同的方法来完成工作:

    定义一个类(出于某种奇怪的原因,我将其称为 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:每个文件类

    #+LaTeX_CLASS_OPTIONS: [10pt, a4paper]

    【讨论】:

    【解决方案4】:

    我不允许发表评论(坏名声或其他东西 ;-))所以我会发布答案。先前的答案为无头导出功能提供了非常好的 sn-p 代码。该代码需要为更高版本的 org 更新:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多