emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] [patch, ox-latex] caption and :float nil


From: Rasmus
Subject: [O] [patch, ox-latex] caption and :float nil
Date: Wed, 01 Jul 2015 01:33:22 +0200
User-agent: Gnus/5.130014 (Ma Gnus v0.14) Emacs/25.0.50 (gnu/linux)

Hi,

Attached is a patch that works reasonably well to allow :float nil
"floats" to have captions in ox-latex.

The hard part is src-blocks.

At the moment we sometimes allow captions to register as figures (at least
when when using verbatim).  Instead we could go with "listing".  Of course
listing is not a known environment to LaTeX.  We can add register it with
newfloat in default-packages, or we can mention in the manual the lines
that needs to be added to org-latex-packages if desired:

     \usepackage{newfloat}
     \DeclareFloatingEnvironment{listing}

We could also unconditionally use captionof in case of verbatim output for
src blocks, even if float is required, which would allow us to kill
float.sty from default package alist.

BTW: In the current code we uses \captionof{listing}{caption} with minted.
This seems incompatible.  But I have not really used minted so I don't
know if I did the test correctly.  minted has a [H] placement through it's
listings environment, it seems, so I don't think we need captionof there.

Aaron: I think you had something to do with this at some point, hence the Cc.

WDYT? 

Rasmus

Examples:

#+caption: cap
#+attr_latex: :float nil
|a|

⇒

\begin{center}
\captionof{table}{cap}
\begin{tabular}{l}
\toprule
a\\
\bottomrule
\end{tabular}
\end{center}

(Of course, this is from my normal Emacs session)


#+caption: cap
#+attr_latex: :float nil
[[file:org.png]]

⇒

\begin{center}
\includegraphics{org.png}
\captionof{figure}{cap}
\end{center}


#+caption: test
#+attr_latex: :float nil
#+BEGIN_SRC emacs-lisp
  (setq org-latex-listings 'minted)
#+END_SRC

⇒ [Note, latex is happy with this...]

% \usepackage{minted}
\begin{minted}[]{common-lisp}
(setq org-latex-listings 'minted)
\end{minted}
\captionof{listing}{test}


#+caption: test
#+attr_latex: :float nil
#+BEGIN_SRC emacs-lisp
  (setq org-latex-listings nil)
#+END_SRC

⇒ [Note, here I think we should use listing instead of figure]

\begin{verbatim}
(setq org-latex-listings nil)
\end{verbatim}
\captionof{figure}{test}


-- 
Don't panic!!!
>From 590390f2e5cf34edcfbb13b18e5c9abc67b98d93 Mon Sep 17 00:00:00 2001
From: Rasmus <address@hidden>
Date: Wed, 1 Jul 2015 01:12:42 +0200
Subject: [PATCH] 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 | 68 +++++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 49 insertions(+), 20 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..918949b 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -1109,21 +1109,31 @@ 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))
+        (nonfloat (and (member :float attr)
+                       (not (plist-get attr :float))
+                       main))
         (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
+                 (let ((type (org-element-type element)))
+                   (case type
+                     (paragraph "figure")
+                     (src-block "listing")
+                     (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 +1985,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 (member :float attr) (not float)) 'nonfloat
+                          'figure))
+                       ((and (not float) (plist-member attr :float)) nil))))
         (placement
          (let ((place (plist-get attr :placement)))
            (cond
@@ -2087,6 +2098,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,12 +2519,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)))
+                     ((and caption (not float)
+                           (plist-member attributes :float))
+                      (concat "%s\n"
+                              (replace-regexp-in-string "listing" "figure" 
caption-str)))
                      ((or caption float)
                       (format "\\begin{figure}[H]\n%%s\n%s\\end{figure}"
                               caption-str))
@@ -2530,13 +2551,9 @@ contextual information."
               (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)))))
+                 (concat (and caption-above-p caption-str)
+                         "%s"
+                         (and (not caption-above-p) (concat "\n" 
caption-str))))
                 ((and (not float) (plist-member attributes :float)) "%s")
                 ((string= "multicolumn" float)
                  (format "\\begin{listing*}\n%s%%s\n%s\\end{listing*}"
@@ -2867,6 +2884,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)
@@ -2886,6 +2909,11 @@ This function assumes TABLE has `org' as its `:type' 
property and
                 (float-env
                  (concat (if caption-above-p "" caption)
                          (format "\n\\end{%s}" float-env)))
+                ((and (not float-env) caption)
+                 (concat
+                  (if caption-above-p "" caption)
+                  (and centerp "\n\\end{center}")
+                  (and fontsize (not centerp) "}")))
                 (centerp "\n\\end{center}")
                 (fontsize "}")))))))
 
-- 
2.4.4


reply via email to

[Prev in Thread] Current Thread [Next in Thread]