Избегайте printbibliography поглощается заголовками Org-mode

при использовании Org-mode и его экспорта LaTeX BibTeX или Biblatex часто используется для обработки ссылок. В этом случае команда LaTeX printbibliography часто включается в файл org. printbibliography помещается в файл организации, где LaTeX должен записать список ссылок. Что?!--2--> does-вставить заголовок LaTeX вместе со списком ссылок. В большинстве случаев printbibliography находится в конце файла org просто потому, что в большинстве документов список литературы должен быть помещен последним. Это средство это printbibliography будет включен под последним заголовком в файл организации, например

* Heading

  printbibliography

это также означает, что когда этот заголовок сложен printbibliography будет проглатывании:

* Heading...

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

как я могу сделать так, чтобы printbibliography не проглатывается разделами в Org-mode? Бонусный вопрос: как я могу сделать так, чтобы Org-mode не создавал заголовки после printbibliography Если C-Ret нажата, когда курсор находится после него?

в поисках решения этой проблемы я нашел http://comments.gmane.org/gmane.emacs.orgmode/49545.

5 ответов


следующее слегка протестировано, но работает для меня с помощью tab и shift-tab, чтобы скрыть и отобразить вещи. Это единственные команды, которые я использую, чтобы скрыть и показать, поэтому, если вы используете другие команды, их, возможно, придется посоветовать или исправить каким-то другим способом.

вы можете, конечно, изменить org-footer-regexp все, что вы хотите. Я надеялся не использовать никаких советов, но без советов org-end-of-subtree последний заголовок никогда не циклически с вкладкой, потому что он думает, что он не скрыт, поэтому он скрывает его и тогда org-cycle-hook отобразить его. Он зовет org-end-of-subtree перед org-pre-cycle-hook так что это не вариант.

(defvar org-footer-regexp "^\\printbibliography\[.*\]$"
  "Regexp to match the whole line of the first line of the footer which should always be shown.")

(defun show-org-footer (&rest ignore)
  (save-excursion
    (goto-char (point-max))
    (when (re-search-backward org-footer-regexp nil t)
      (outline-flag-region (1- (point)) (point-max) nil))))

(add-hook 'org-cycle-hook 'show-org-footer)
(add-hook 'org-occur-hook 'show-org-footer)

(defadvice org-end-of-subtree (after always-show-org-footer
                                     ()
                                     activate)
  (when (>= (point) (1- (point-max)))
    (re-search-backward org-footer-regexp nil t)
    (setq ad-return-value (point))))

обходной путь для этой проблемы-сделать \printbibliography не возвращайте заголовок LaTeX, чтобы его можно было поместить под заголовком Org-mode.

С biblatex это можно сделать, поставляя \printbibliography с параметром heading=none и поместить его под соответствующим заголовком. Вот пример:

* Heading

* References

  \printbibliography[heading=none]

таким образом, ссылки могут храниться в собственном заголовке и \printbibliography быть поглощенным заголовком не проблема, потому что это поглотил собственный курс.


одно решение будет следующим:

#+macro: printbiblio        (add extra spaces here, but cannot add comment)

* Test 2
  This is a test

* {{{printbiblio}}}
  Test text
  \printbibliography
* 
  asdf

Как это вы в конечном итоге с пустой заголовок в нижней части документа. Макрос расширяется до пустого блока текста, поэтому вы получаете

\section{Test 2}
\label{sec-1}

This is a test
\section{}

Test text
\printbibliography
\section{}

asdf

Это также гарантирует, что вы не можете случайно добавлять заголовки после вашей библиографии, так как это собственный (пустой) заголовок. Это может быть (кажется, на самом деле) включено в оглавление, что вызывает сожаление, но я подозреваю, что решение будет в худшее запустить post-export, чтобы удалить пустой заголовок из файла (или вручную сделать это перед преобразованием в PDF).


другим решением было бы поместить библиографию под заголовком "ссылки", например:

* Heading
Some text
* References
\printbibliography

и удалить \section{References} из полученного файла latex, добавив это в файл инициализации emacs

(defun org-export-latex-remove-references-heading (contents backend info)
    (if (not (eq backend 'latex))
        contents
      (replace-regexp-in-string "\\section\*?{References}\s-*\\label{.*?}" "" contents)
      ))

(add-hook 'org-export-filter-final-output-functions 'org-export-latex-remove-references-heading)

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

\section{References}
\label{<any_string>}
\printbibliography

для других форматов необходимо поменять регулярное выражение в


* References
  :PROPERTIES:
  :UNNUMBERED: t
  :END:

   \printbibliography[heading=none]

существует более простой способ решить эту проблему. Просто добавьте" ненумерованные " свойства в заголовок, и он будет экспортирован без нумерации.