Function: org-latex-headline
org-latex-headline is a byte-compiled function defined in
ox-latex.el.gz.
Signature
(org-latex-headline HEADLINE CONTENTS INFO)
Documentation
Transcode a HEADLINE element from Org to LaTeX.
CONTENTS holds the contents of the headline. INFO is a plist holding contextual information.
Source Code
;; Defined in /usr/src/emacs/lisp/org/ox-latex.el.gz
;;;; Headline
(defun org-latex-headline (headline contents info)
"Transcode a HEADLINE element from Org to LaTeX.
CONTENTS holds the contents of the headline. INFO is a plist
holding contextual information."
(unless (org-element-property :footnote-section-p headline)
(let* ((class (plist-get info :latex-class))
(level (org-export-get-relative-level headline info))
(numberedp (org-export-numbered-headline-p headline info))
(class-sectioning (assoc class (plist-get info :latex-classes)))
;; Section formatting will set two placeholders: one for
;; the title and the other for the contents.
(section-fmt
(let ((sec (if (functionp (nth 2 class-sectioning))
(funcall (nth 2 class-sectioning) level numberedp)
(nth (1+ level) class-sectioning))))
(cond
;; No section available for that LEVEL.
((not sec) nil)
;; Section format directly returned by a function. Add
;; placeholder for contents.
((stringp sec) (concat sec "\n%s"))
;; (numbered-section . unnumbered-section)
((not (consp (cdr sec)))
(concat (funcall (if numberedp #'car #'cdr) sec) "\n%s"))
;; (numbered-open numbered-close)
((= (length sec) 2)
(when numberedp (concat (car sec) "\n%s" (nth 1 sec))))
;; (num-in num-out no-num-in no-num-out)
((= (length sec) 4)
(if numberedp (concat (car sec) "\n%s" (nth 1 sec))
(concat (nth 2 sec) "\n%s" (nth 3 sec)))))))
;; Create a temporary export backend that hard-codes
;; "\underline" within "\section" and alike.
(section-backend
(org-export-create-backend
:parent 'latex
:transcoders
'((underline . (lambda (o c i) (format "\\underline{%s}" c)))
;; LaTeX isn't happy when you try to use \verb inside the argument of other
;; commands (like \section, etc.), and this causes compilation to fail.
;; So, within headings it's a good idea to replace any instances of \verb
;; with \texttt.
(code . (lambda (o _ _) (org-latex--protect-texttt (org-element-property :value o))))
(verbatim . (lambda (o _ _) (org-latex--protect-texttt (org-element-property :value o)))))))
;; Create a temporary export backend that strips footnotes from title.
;; Footnotes are not allowed in \section and similar
;; commands that contribute to TOC and footers.
;; See https://orgmode.org/list/691643eb-49d0-45c3-ab7f-a1edbd093bef@gmail.com
;; https://texfaq.org/FAQ-ftnsect
(section-no-footnote-backend
(org-export-create-backend
:parent section-backend
:transcoders
`((footnote-reference . ignore))))
(text
(org-export-data-with-backend
(org-element-property :title headline) section-backend info))
(text-no-footnote
(org-export-data-with-backend
(org-element-property :title headline) section-no-footnote-backend info))
(todo
(and (plist-get info :with-todo-keywords)
(let ((todo (org-element-property :todo-keyword headline)))
(and todo (org-export-data todo info)))))
(todo-type (and todo (org-element-property :todo-type headline)))
(tags (and (plist-get info :with-tags)
(org-export-get-tags headline info)))
(priority (and (plist-get info :with-priority)
(org-element-property :priority headline)))
;; Create the headline text along with a no-tag version.
;; The latter is required to remove tags from toc.
(full-text (funcall (plist-get info :latex-format-headline-function)
todo todo-type priority text tags info))
(full-text-no-footnote
(funcall (plist-get info :latex-format-headline-function)
todo todo-type priority text-no-footnote tags info))
;; Associate \label to the headline for internal links.
(headline-label (org-latex--label headline info t t))
(pre-blanks
(make-string (org-element-property :pre-blank headline) ?\n)))
(if (or (not section-fmt) (org-export-low-level-p headline info))
;; This is a deep sub-tree: export it as a list item. Also
;; export as items headlines for which no section format has
;; been found.
(let ((low-level-body
(concat
;; If headline is the first sibling, start a list.
(when (org-export-first-sibling-p headline info)
(format "\\begin{%s}\n" (if numberedp 'enumerate 'itemize)))
;; Itemize headline
"\\item"
(and full-text
(string-match-p "\\`[ \t]*\\[" full-text)
"\\relax")
" " full-text "\n"
headline-label
pre-blanks
contents)))
;; If headline is not the last sibling simply return
;; LOW-LEVEL-BODY. Otherwise, also close the list, before
;; any blank line.
(if (not (org-export-last-sibling-p headline info)) low-level-body
(replace-regexp-in-string
"[ \t\n]*\\'"
(format "\n\\\\end{%s}" (if numberedp 'enumerate 'itemize))
low-level-body)))
;; This is a standard headline. Export it as a section. Add
;; an alternative heading when possible, and when this is not
;; identical to the usual heading.
(let ((opt-title
(funcall (plist-get info :latex-format-headline-function)
todo todo-type priority
(org-export-data-with-backend
(org-export-get-alt-title headline info)
section-backend info)
(and (eq (plist-get info :with-tags) t) tags)
info))
;; Maybe end local TOC (see `org-latex-keyword').
(contents
(concat
contents
(let ((case-fold-search t)
(section
(let ((first (car (org-element-contents headline))))
(and (org-element-type-p first 'section) first))))
(org-element-map section 'keyword
(lambda (k)
(and (equal (org-element-property :key k) "TOC")
(let ((v (org-element-property :value k)))
(and (string-match-p "\\<headlines\\>" v)
(string-match-p "\\<local\\>" v)
(format "\\stopcontents[level-%d]" level)))))
info t)))))
(if (and (or (and opt-title (not (equal opt-title full-text)))
;; Heading contains footnotes. Add optional title
;; version without footnotes to avoid footnotes in
;; TOC/footers.
(and (not (equal full-text-no-footnote full-text))
(setq opt-title full-text-no-footnote)))
(string-match "\\`\\\\\\(.+?\\){" section-fmt))
(format (replace-match "\\1[%s]" nil nil section-fmt 1)
;; Replace square brackets with parenthesis
;; since square brackets are not supported in
;; optional arguments.
(replace-regexp-in-string
"\\[" "(" (replace-regexp-in-string "\\]" ")" opt-title))
full-text
(concat headline-label pre-blanks contents))
;; Impossible to add an alternative heading. Fallback to
;; regular sectioning format string.
(format section-fmt full-text
(concat headline-label pre-blanks contents))))))))