emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [patch, ox-latex] caption and :float nil
@ 2015-06-30 23:33 Rasmus
  2015-07-01 14:21 ` Aaron Ecay
  2015-07-01 20:16 ` Nicolas Goaziou
  0 siblings, 2 replies; 8+ messages in thread
From: Rasmus @ 2015-06-30 23:33 UTC (permalink / raw)
  To: emacs-orgmode; +Cc: aaronecay

[-- Attachment #1: Type: text/plain, Size: 2065 bytes --]

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!!!

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-latex-Support-captions-for-None-floats.patch --]
[-- Type: text/x-diff, Size: 6431 bytes --]

From 590390f2e5cf34edcfbb13b18e5c9abc67b98d93 Mon Sep 17 00:00:00 2001
From: Rasmus <rasmus@gmx.us>
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


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-07-03 12:55 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-30 23:33 [patch, ox-latex] caption and :float nil Rasmus
2015-07-01 14:21 ` Aaron Ecay
2015-07-01 15:05   ` Rasmus
2015-07-02  8:50     ` Aaron Ecay
2015-07-02 12:17       ` Rasmus
2015-07-03 12:43         ` Rasmus
2015-07-03 12:57           ` Nicolas Goaziou
2015-07-01 20:16 ` Nicolas Goaziou

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).