emacs-orgmode
[Top][All Lists]
Advanced

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

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


From: Aaron Ecay
Subject: Re: [O] [patch, ox-latex] caption and :float nil
Date: Wed, 01 Jul 2015 15:21:39 +0100
User-agent: Notmuch/0.19+52~g1722ea2 (http://notmuchmail.org) Emacs/25.0.50.2 (x86_64-unknown-linux-gnu)

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



reply via email to

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