emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Aaron Ecay <aaronecay@gmail.com>
To: Rasmus <rasmus@gmx.us>
Cc: orgmode <emacs-orgmode@gnu.org>
Subject: Re: [patch, ox-latex] caption and :float nil
Date: Wed, 01 Jul 2015 15:21:39 +0100	[thread overview]
Message-ID: <87wpykj6vg.fsf@gmail.com> (raw)
In-Reply-To: <87twtovkjh.fsf@gmx.us>

Hi Rasmus,

AFAICS you sent the original message only to me.  I’m replying also to
the org mode list.  You may want to resend the patch attachment though,
since the quoting in this reply will probably mangle it.

I have almost no time to follow org development these days (sadly).
However these are my brief thoughts.

2015ko uztailak 1an, Rasmus-ek idatzi zuen:
> 
> 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}
>

I think this should depend on the value of org-latex-listings:
nil -> use \captionof{float}
t -> use \captionof{listing}
minted -> use \captionof{listing} (see below for why)

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

Minted uses listing as its floating environment; see sec. 5 of the
minted manual.  So this seems correct in fact.

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

I’m not sure that minted provides this separately from the float
package.  So it’s probably better to use \captionof in the minted case
as well.  Certainly it will make things more consistent from org’s POV.

Thanks,
Aaron

> 
> 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 <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
> 
> 
-- 
Aaron Ecay

  reply	other threads:[~2015-07-01 14:22 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-30 23:33 [patch, ox-latex] caption and :float nil Rasmus
2015-07-01 14:21 ` Aaron Ecay [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wpykj6vg.fsf@gmail.com \
    --to=aaronecay@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=rasmus@gmx.us \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).