У вас была правильная идея создать свой собственный класс LaTeX.Проблема заключается в том, как шаблоны заполняются функцией по умолчанию org-fill-template
.Я не очень хорош в Лиспе, но этот хак поможет.Добавьте следующее в ваш .emacs файл:
(defun my-section (level text)
(let* ((in "") (out "")
(short-title (if (string-match "\\[.*\\]" text)
(substring text (match-beginning 0)
(match-end 0))
nil)))
(if short-title (setq text (substring text (match-end 0) -1)))
(setq in (org-fill-template
"\\section%S{%s}"
(list (cons "S" (or short-title ""))
(cons "s" (or text ""))))
out (copy-sequence "\\end{section}"))
(cons text (list in out in out))))
(add-to-list 'org-export-latex-classes
'("test"
"\\documentclass{article}"
my-section))
Это объявляет новый класс латекса, добавляя класс «test» к org-export-latex-classes
.Здесь мы объявляем вместо обычного \\section{%s}
материала функцию, которая принимает два параметра - текущий уровень и текст заголовка - и возвращает измененную cons-ячейку.Некоторые подробности этой информации можно найти в org-latex-export.el .
Над добавлением в список мы фактически определяем функцию.Это, честно говоря, хакерская версия, и я много чего извлек из функции org-beamer-sectioning
в файле org-beamer.el .Эта функция в основном ищет в заголовке все, что похоже на краткую метку LaTeX (то есть [....]
), удаляет его из заголовка и прикрепляет его перед фактической меткой раздела.Прямо сейчас этот хак будет генерировать только \section
операторов, независимо от того, насколько глубокий уровень - если вы хотите что-то более интеллектуальное, например \chapter
или \subsection
, или даже ненумерованные элементы, вам нужно будет сделать еще несколько Лиспинг;снова см. org-beamer.el для получения справки.
Этот бит org-mode
кода
#+latex_class: test
* [short 1] this is 1 star
test
** this is a 2 star
test
*** [short 3] this is a 3 star
test
**** what happens
экспортируется в LaTeX как (только соответствующие разделы показаны здесь):
\section[short 1]{ this is 1 star}
\label{sec-1}
test
\section{ this is a 2 star }
\label{sec-1-1}
test
\section[short 3]{ this is a 3 star}
\label{sec-1-1-1}
test
\section{ what happens }
\label{sec-1-1-1-1}
\end{section}
\end{section}
\end{section}
\end{section}
Хотя это не прямая org-mode
Решение, похоже, работает и может стать отправной точкой для вас.На днях я мог бы попытаться написать это правильно и поместить в дистрибутив org-mode
.