Режим Org: исключить определенные заголовки из оглавления при экспорте

13

В: Как я могу сказать, org-modeчтобы исключить определенные заголовки из оглавления при экспорте?

Например, экспорт

* Headline 1: Put me in TOC
* Headline 2: Put me in TOC
* Headline 3: DO NOT put me in TOC

в HTML выдает

...
<div id="text-table-of-contents">
  <ul>
    <li><a href="#sec-1">1. Headline 1: Put me in TOC</a></li>
    <li><a href="#sec-2">2. Headline 2: Put me in TOC</a></li>
    <li><a href="#sec-3">3. Headline 3: DO NOT put me in TOC</a></li>
  </ul>
</div>
...

но я хочу это произвести

...
<div id="text-table-of-contents">
  <ul>
    <li><a href="#sec-1">1. Headline 1: Put me in TOC</a></li>
    <li><a href="#sec-2">2. Headline 2: Put me in TOC</a></li>
  </ul>
</div>
...

Содержание раздела org-modeруководства не имеет никакой информации об этом.

Кроме того, я знаю, что могу не org-modeэкспортировать заголовки, задав COMMENTключевое слово с помощью C-c ;( org-toggle-comment) или пометив их тегами :noexport:. Хотя это не позволяет отображаться в оглавлении затронутых заголовков, это также приводит к тому, что их содержимое будет исключено из итогового документа, а это не то, что мне нужно.

itsjeyd
источник
1
Это не тот ответ, который вы ищете, но просто как примечание другого тупика: EXPORT_OPTIONS: toc:nil почти делает то, что вы хотите, но только когда вы экспортируете только только поддерево. Чтобы уточнить, хотите ли вы, чтобы раздел все еще был пронумерован, или вы хотите что-то похожее на LaTeX \section*?
Шон Оллред
@SeanAllred Я бы хотел, чтобы раздел все еще был пронумерован. В целом, я не хочу ничего менять в способе экспорта отдельных разделов. Я просто не хочу, чтобы некоторые из них появлялись в оглавлении.
itsjeyd

Ответы:

12

Орг использует org-export-collect-headlinesдля сбора заголовков, которые должны быть в оглавлении. Эта функция уже включает два критерия для исключения заголовков: глубина заголовка и является ли это «разделом сноски» (*), поэтому легко добавить еще один.

Смотрите модифицированную версию org-export-collect-headlinesниже. Эта версия позволяет предотвратить появление заголовка в оглавлении путем установки NOTOCсвойства.

* Section 1: shows up in the TOC

* Section 2: modified Org code (not in the TOC)
  :PROPERTIES:
  :NOTOC:    t
  :END:

  This is the modified =org-export-collect-headlines=:

  #+BEGIN_SRC elisp
  (defun org-export-collect-headlines (info &optional n)
    "Collect headlines in order to build a table of contents. [...]

  Return a list of all exportable headlines as parsed elements.
  Footnote sections, if any, will be ignored."
    (let ((limit (plist-get info :headline-levels)))
      (setq n (if (wholenump n) (min n limit) limit))
      (org-element-map (plist-get info :parse-tree) 'headline
        #'(lambda (headline)
            (unless (or (org-element-property :NOTOC headline)               ; new condition
                        (org-element-property :footnote-section-p headline)) ; old condition
              (let ((level (org-export-get-relative-level headline info)))
                (and (<= level n) headline))))
        info)))
  #+END_SRC

** Sub-section
   This shows up in the TOC: property inheritance is off by default.

(*) Хотя я не знаю, что такое «сноски».

Это работает для экспортных бэкэндов, которые создают оглавление вручную. Бэкэнды LaTeX, Beamer и Texinfo этого не делают.

Добавив этот совет, org-export-numbered-headline-pможно создавать заголовки с UNNUMBEREDэкспортом свойств как \section*{...}, исключая их из оглавления при экспорте в LaTeX и Beamer:

(advice-add 'org-export-numbered-headline-p :around
            (lambda (orig headline info)
              (and (funcall orig headline info)
                   (not (org-element-property :UNNUMBERED headline)))))

Обратите внимание, что по состоянию на 2014-10-03 20:06:34 (GMT) проверка UNNUMBERED уже встроена

Константин
источник
1
Спасибо, это отлично работает для экспорта HTML. Мне на самом деле также нужно, чтобы это работало для LaTeX / Beamer; Сначала я не упомянул об этом, потому что предполагал, что должно быть общее решение, которое будет работать для всех (или, по крайней мере, для большинства) экспортных серверных частей ... У вас есть идеи, как решить эту проблему для экспорта LaTeX? Сравнение файлов .htmlи .texфайлов, которые org-modeсоздаются при экспорте, похоже, основная проблема заключается в том, org-modeчто TOC вручную строит оглавление для HTML, а просто выдает дженерик \tableofcontentsв .texфайл.
itjeyd
@itsjeyd: я не думаю, что универсальное решение возможно: как вы сказали, экспортные бэкэнды LaTeX (и beamer, и Texinfo) используют собственные команды для создания TOC, в то время как другие бэкэнды создают TOC вручную. Это является возможным исключить раздел из оглавления в латексе , но я не нашел решение , которое принимается сообществом как правая . Использование идеи, с которой я связан в org-modeкоде экспорта, потребует серьезных изменений org-latex-headline. Что касается реализации этого в поддержке Texinfo, я даже не знаю, с чего начать.
Константин
Хорошо, большое спасибо за продолжение. Для Бимера, я думаю, что я просто прибегну к тому, чтобы разделы, которые я не хочу показывать в оглавлении, не были пронумерованы . Дело закрыто. :)
itjeyd
@itsjeyd: Вы можете изменить , org-export-numbered-headline-pчтобы получить такое поведение почти автоматически - если превратить его в непронумерованный раздел является вариантом, то есть. Я могу уточнить, если вам интересно.
Константин
Пожалуйста, делайте - всегда заинтересованы в упрощении решений!
Ижеид