Подтвердить что ты не робот

Как я могу экспортировать Org-режим в LaTeX с определенной преамбулой?

Когда я делаю 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 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]}
}

Я знаю, что вы можете манипулировать тем, какие пакеты используются для каждого файла как описано в руководстве, но я хочу использовать эту преамбулу для всех файлов, если не указано иное). Преамбула, которую я хочу использовать, включает следующее:

  • деактивированные пакеты (например, geometry выше)
  • пакеты, загруженные RequirePackage
  • input макросы
  • \immediate\write18 макросы
  • комментарии после usepackage макросов
  • a hypersetup макрос, который распознает #+TITLE и #+AUTHOR из файлов режима Org
4b9b3361

Ответ 1

Деактивированные пакеты (например, geometry выше)

Org-mode распознает синтаксис LaTeX внутри кодовых блоков LaTeX, а также при включении файлов LaTeX в контент. (См. Цитата LaTeX code.)

Пакеты, загруженные RequirePackage

Как указано выше.

Макросы ввода

Как указано выше.

\immediate\write18 макросы

Я считаю, что это также должно быть как указано выше, однако есть альтернативный метод борьбы с этим. Если вы создадите блок исходного кода типа sh с помощью команды внутри него, Org будет оценивать его при экспорте и производить желаемое поведение. Вы должны включить sh в качестве типа языка буферизации, чтобы он мог работать.

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

A hypersetup, который распознает # + TITLE и # + AUTHOR из файлов режима Org.

Это должно быть включено в каждый документ, а не отдельно. Следующее предоставит вам то, что вы хотите для своих макросов. Он не будет находиться в преамбуле, однако он окажется в верхней части документа, и экспорт будет вести себя так, как ожидалось (однако он не будет вести себя так, как ожидалось, если он добавлен через #+INCLUDE: из org.

#+begin_latex
  \hypersetup{% Setup for hyperref
  pdftitle    = {{{{TITLE}}}}, %Org macro to take from #+TITLE
  pdfauthor   = {{{{AUTHOR}}}} %Org macro to take from #+AUTHOR
  }
#+end_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:.

Ответ 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 вставить файл в нужную преамбулу. Дальнейшее чтение.

Ответ 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}"))))

Используйте этот класс в своем org файле:

# + LaTeX_CLASS: per-file-class

# + LaTeX_CLASS_OPTIONS: [10pt, a4paper]