Org-mode & Latex export: Есть ли способ добавить короткие и длинные имена в команды секционирования?Обходные? - PullRequest
7 голосов
/ 27 февраля 2012

В стандартном латексе можно использовать что-то вроде ...

\section[short head]{A longer and more meaningful heading version for the section}

..., что дает как длинную, так и короткую версию секции (или другую команду секционирования). Таким образом, допускается как значимоеразбивка на разделы «заголовки», а также разумно выглядящие бегущие головы, оглавления, навигация по проекторам и т. д.

Есть ли способ легко добиться этого в режиме org?(То есть без жесткого кодирования команд секционирования в фрагментах LATEX и, таким образом, подавления большей части гибкости, связанной с изменением уровней секционирования и перепрофилированием контента для классов beamer, book и article, из-за чего я в первую очередь хочу попробовать orgmode?)

Я попробовал «обходной путь», который не сработал.Я попытался отредактировать возможные классы экспорта латекса, добавив еще один класс к org-export-latex-classes.Этот новый класс изменяет команды секционирования с \section{%s} на \section%s (исправлена ​​опечатка в слешах).Затем я протестировал использование [short]{longer version} в разделах orgmode файла.Это работало, за исключением того, что действовал так, как будто заголовок раздела более длинной версии был просто "{", а "более длинная версия" была основным текстом!Что с этим?

Ответы [ 3 ]

5 голосов
/ 07 февраля 2014

Начиная с версии 8.0 стратегия "org-export-latex-classes" больше не будет работать.

Вместо этого, и, осмелюсь сказать, более элегантно, вы можете установить свойство ALT_TITLE для заголовка.
См. http://orgmode.org/manual/Table-of-contents.html.

Следующий код организации:

* The Long Title of Section 1 
:PROPERTIES:
 :ALT_TITLE: Section 1
:END:
Lorem ipsum.

** The Long Title of Subsection 1-1 
:PROPERTIES:
 :ALT_TITLE: Subsection 1-1
:END:
Dolor sit amet.

экспортирует в LaTeX как:

[...]

\section[Section 1]{The Long Title of Section 1}
\label{sec-1}
Lorem ipsum.

\subsection[Subsection 1-1]{The Long Title of Subsection 1-1}
\label{sec-1-1}
Dolor sit amet.
1 голос
/ 13 марта 2012

У вас была правильная идея создать свой собственный класс 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.

0 голосов
/ 12 февраля 2013

Можно использовать следующие команды в латексе, чтобы определить текст, который должен появиться в заголовке, чтобы заменить названия разделов. Но оглавление по-прежнему будет содержать оригинальные имена.

\chaptermarks
\sectionmarks
\subsectionmarks
...

Итак, в орг-режиме вы можете написать

* Long section title 
#+LaTeX: \sectionmark{Short title}

edit: на самом деле он не работает на самой странице, где появляется название раздела. Только на этом полное имя все еще помещается в заголовок.

...