>From a0b7c47e37c3c5c62492236562a5f19a38efc06f Mon Sep 17 00:00:00 2001 From: Rasmus Date: Wed, 1 Jul 2015 01:12:42 +0200 Subject: [PATCH 1/3] ox-latex: Support captions for None-floats * ox-latex.el (org-latex--caption/label-string): Format nonfloating captions using the capt-of package. (org-latex--inline-image, org-latex-src-block) (org-latex--org-table): Allow none-float and caption. --- etc/ORG-NEWS | 1 + lisp/ox-latex.el | 88 ++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index ea7a2de..9592f88 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -398,6 +398,7 @@ set using the hh:mm:ss format. ~org-clone-subtree-with-time-shift~ now accepts 0 as an argument for the number of clones, which removes the repeater from the original subtree and creates one shifted, repeating clone. +*** None-floating tables, graphics and blocks can have captions ** Miscellaneous *** Strip all meta data from ITEM special property ITEM special property does not contain TODO, priority or tags anymore. diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 11fa00d..31d804b 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -1109,21 +1109,37 @@ caption nor label, return the empty string. For non-floats, see `org-latex--wrap-label'." (let* ((label (org-latex--label element info nil t)) (main (org-export-get-caption element)) + (attr (org-export-read-attribute :attr_latex element)) + (type (org-element-type element)) + (nonfloat (or (and (plist-member attr :float) + (not (plist-get attr :float)) + main) + (and (eq type 'src-block) + (not (plist-get attr :float)) + (memq (plist-get info :latex-listings) + '(nil minted))))) (short (org-export-get-caption element t)) - (caption-from-attr-latex - (org-export-read-attribute :attr_latex element :caption))) + (caption-from-attr-latex (plist-get attr :caption))) (cond ((org-string-nw-p caption-from-attr-latex) (concat caption-from-attr-latex "\n")) ((and (not main) (equal label "")) "") ((not main) (concat label "\n")) ;; Option caption format with short name. - (short (format "\\caption[%s]{%s%s}\n" - (org-export-data short info) - label - (org-export-data main info))) - ;; Standard caption format. - (t (format "\\caption{%s%s}\n" label (org-export-data main info)))))) + (t + (format (if nonfloat "\\captionof{%s}%s{%s%s}\n" + "\\caption%s%s{%s%s}\n") + (if nonfloat + (case type + (paragraph "figure") + (src-block (if (plist-get info :latex-listings) + "listing" + "figure")) + (t (symbol-name type))) + "") + (if short (format "[%s]" (org-export-data short info)) "") + label + (org-export-data main info)))))) (defun org-latex-guess-inputenc (header) "Set the coding system in inputenc to what the buffer is. @@ -1975,14 +1991,15 @@ used as a communication channel." ;; Retrieve latex attributes from the element around. (attr (org-export-read-attribute :attr_latex parent)) (float (let ((float (plist-get attr :float))) - (cond ((and (not float) (plist-member attr :float)) nil) - ((string= float "wrap") 'wrap) + (cond ((string= float "wrap") 'wrap) ((string= float "sideways") 'sideways) ((string= float "multicolumn") 'multicolumn) ((or float (org-element-property :caption parent) (org-string-nw-p (plist-get attr :caption))) - 'figure)))) + (if (and (plist-member attr :float) (not float)) 'nonfloat + 'figure)) + ((and (not float) (plist-member attr :float)) nil)))) (placement (let ((place (plist-get attr :placement))) (cond @@ -2087,6 +2104,13 @@ used as a communication channel." (if caption-above-p caption "") comment-include image-code (if caption-above-p "" caption))) + (nonfloat + (format "\\begin{center}%s +%s +%s\\end{center}" + (if caption-above-p caption "") + image-code + (if caption-above-p "" caption))) (otherwise image-code)))) (defun org-latex-link (link desc info) @@ -2501,15 +2525,15 @@ contextual information." ((not listings) (let* ((caption-str (org-latex--caption/label-string src-block info)) (float-env - (cond ((and (not float) (plist-member attributes :float)) "%s") - ((string= "multicolumn" float) + (cond ((string= "multicolumn" float) (format "\\begin{figure*}[%s]\n%s%%s\n%s\\end{figure*}" (plist-get info :latex-default-figure-position) (if caption-above-p caption-str "") (if caption-above-p "" caption-str))) - ((or caption float) - (format "\\begin{figure}[H]\n%%s\n%s\\end{figure}" - caption-str)) + (caption (concat + (if caption-above-p caption-str "") + "%s" + (if caption-above-p "" (concat "\n" caption-str)))) (t "%s")))) (format float-env @@ -2529,23 +2553,14 @@ contextual information." (let* ((caption-str (org-latex--caption/label-string src-block info)) (float-env (cond - ((and (not float) (plist-member attributes :float) caption) - (let ((caption - (replace-regexp-in-string - "\\\\caption" "\\captionof{listing}" caption-str - t t))) - (concat (and caption-above-p caption) - "%%s" - (and (not caption-above-p) (concat "\n" caption))))) - ((and (not float) (plist-member attributes :float)) "%s") ((string= "multicolumn" float) (format "\\begin{listing*}\n%s%%s\n%s\\end{listing*}" (if caption-above-p caption-str "") (if caption-above-p "" caption-str))) - ((or caption float) - (format "\\begin{listing}[H]\n%s%%s\n%s\\end{listing}" - (if caption-above-p caption-str "") - (if caption-above-p "" caption-str))) + (caption + (concat (if caption-above-p caption-str "") + "%s" + (if caption-above-p "" (concat "\n" caption-str)))) (t "%s"))) (options (plist-get info :latex-minted-options)) (body @@ -2867,6 +2882,12 @@ This function assumes TABLE has `org' as its `:type' property and (if caption-above-p caption "") (when centerp "\\centering\n") fontsize)) + ((and (not float-env) caption) + (concat + (and centerp "\\begin{center}\n" ) + (if caption-above-p caption "") + (cond ((and fontsize centerp) fontsize) + (fontsize (concat "{" fontsize))))) (centerp (concat "\\begin{center}\n" fontsize)) (fontsize (concat "{" fontsize))) (cond ((equal "tabu" table-env) @@ -2884,8 +2905,13 @@ This function assumes TABLE has `org' as its `:type' property and table-env))) (cond (float-env - (concat (if caption-above-p "" caption) - (format "\n\\end{%s}" float-env))) + (concat (if caption-above-p "" (concat "\n" caption)) + (format "\\end{%s}" float-env))) + ((and (not float-env) caption) + (concat + (if caption-above-p "" (concat "\n" caption)) + (and centerp "\\end{center}") + (and fontsize (not centerp) "}"))) (centerp "\n\\end{center}") (fontsize "}"))))))) -- 2.4.4