Search code examples
emacsorg-modebibtexbiblatex

Avoid \printbibliography being swallowed by Org-mode headings


When using Org-mode and its LaTeX export BibTeX or Biblatex is often used to handle references. In that case the LaTeX command \printbibliography is often included in the org file. \printbibliography is placed in the org file where LaTeX is supposed to write out the reference list. What \printbibliography does is to insert a LaTeX header along with the reference list. In most cases \printbibliography is placed at the end of the org file simply because in most documents the reference list is to be placed last. This means that \printbibliography will be included under the last heading in the org file, e.g.

* Heading

  \printbibliography

It also means that when that heading is folded the \printbibliography will be swallowed:

* Heading...

But this goes against the meaning of \printbibliography because it includes its own heading in the output. Also, it will be confusing when \printbibliography is swallowed and a new heading is placed after it because then the reference list will no longer appear last in the document.

How can I make it so that \printbibliography is not swallowed by sections in Org-mode? A bonus question: how can I make it so that Org-mode does not create headings after \printbibliography unless C-Ret is pressed when the cursor is after it?

In searching for a solution to this problem I found http://comments.gmane.org/gmane.emacs.orgmode/49545.


Solution

  • The following is lightly tested but works for me using tab and shift-tab to hide and display things. Those are the only hiding and showing commands that I use, so if you use other commands they may have to be advised or fixed in some other way.

    You can of course change org-footer-regexp to anything you want. I was hoping to not have to use any advice, but without advising org-end-of-subtree the last heading never cycles with tab because it thinks it's not hidden, so it hides it and then org-cycle-hook unhides it. It calls org-end-of-subtree before running org-pre-cycle-hook so that's not an option either.

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