From: Carsten Dominik <carsten.dominik@gmail.com>
To: Nicolas Goaziou <n.goaziou@gmail.com>
Cc: Org Mode List <emacs-orgmode@gnu.org>
Subject: Re: [RFC] Extend :float attribute to src blocks and normalize syntax
Date: Sat, 1 Jun 2013 08:31:25 +0200 [thread overview]
Message-ID: <44A8CD88-0582-4475-802C-D20BEAA74F88@gmail.com> (raw)
In-Reply-To: <878v2v17pj.fsf@gmail.com>
On 31.5.2013, at 17:37, Nicolas Goaziou <n.goaziou@gmail.com> wrote:
> Hello,
>
> The following patch extends :float attribute to src blocks (so they are
> on par with tables and images). It also slightly changes syntax for this
> attribute:
>
> | | Old | New |
> |--------+---------------+----------|
> | Tables | :float table | :float t |
> | Images | :float figure | :float t |
>
> With this patch :float attribute also accepts a nil value in all cases,
> preventing any floating mechanism, even if a caption is provided. In
> particular, it replaces :long-listing attribute for src blocks:
>
> | | Old | New |
> |------------+-----------------+------------|
> | Src blocks | :long-listing t | :float nil |
>
> Overall, it makes :float syntax a bit more regular, but it implies some
> gotchas.
Hi Nicolas,
I like the possibilities this opens, in particular to set a nil value.
We could be nice to users and interpret `table' and `figure' as t.
This is not clean, but nice... :)
- Carsten
>
> WDYT?
>
>
> Regards,
>
> --
> Nicolas Goaziou
> From 0bf638246d91e5d855836ceeb24b405b3688729f Mon Sep 17 00:00:00 2001
> From: Nicolas Goaziou <n.goaziou@gmail.com>
> Date: Mon, 20 May 2013 10:43:18 +0200
> Subject: [PATCH 1/2] ox-latex: Extend :float attribute to source blocks and
> normalize its values
>
> * lisp/ox-latex.el (org-latex-src-block): Handle :float attribute. Its
> value can be set to "t", "multicolumn" or "nil". Also
> remove :long-listing attribute, which is now replaced with :float
> nil.
> (org-latex--org-table): Replace :float table with :float t.
> (org-latex--inline-image): Replace :float figure with :float t.
> (org-latex-long-listings): Remove variable.
> * doc/org.texi (@LaTeX{} specific attributes): Document new :float values.
> ---
> doc/org.texi | 37 +++++++++----
> lisp/ox-latex.el | 162 ++++++++++++++++++++++++++++---------------------------
> 2 files changed, 110 insertions(+), 89 deletions(-)
>
> diff --git a/doc/org.texi b/doc/org.texi
> index 290c671..408d00d 100644
> --- a/doc/org.texi
> +++ b/doc/org.texi
> @@ -11597,10 +11597,11 @@ environment, like @code{tabularx}, @code{longtable}, @code{array},
> @code{tabu}, @code{bmatrix}@enddots{} It defaults to
> @code{org-latex-default-table-environment} value.
> @item :float
> +@itemx :placement
> Float environment for the table. Possible values are @code{sidewaystable},
> -@code{multicolumn} and @code{table}. If unspecified, a table with a caption
> -will have a @code{table} environment. Moreover, @code{:placement} attribute
> -can specify the positioning of the float.
> +@code{multicolumn}, @code{t} and @code{nil}. When unspecified, a table with
> +a caption will have a @code{table} environment. Moreover, @code{:placement}
> +attribute can specify the positioning of the float.
> @item :align
> @itemx :font
> @itemx :width
> @@ -11675,12 +11676,18 @@ without specifying caption by setting the @code{:float} attribute. You may
> also set it to:
> @itemize @minus
> @item
> -@code{wrap}: if you would like to let text flow around the image. It will
> -make the figure occupy the left half of the page.
> +@code{t}: if you want to use the standard @samp{figure} environment. It is
> +used by default if you provide a caption to the image.
> @item
> @code{multicolumn}: if you wish to include an image which spans multiple
> columns in a page. This will export the image wrapped in a @code{figure*}
> environment.
> +@item
> +@code{wrap}: if you would like to let text flow around the image. It will
> +make the figure occupy the left half of the page.
> +@item
> +@code{nil}: if you need to avoid any floating environment, even when
> +a caption is provided.
> @end itemize
> @noindent
> To modify the placement option of any floating environment, set the
> @@ -11711,13 +11718,23 @@ omitted).
> @subsubheading Source blocks in @LaTeX{} export
> @cindex source blocks, in @LaTeX{} export
>
> -In addition to syntax defined in @ref{Literal examples}, names and
> -captions (@pxref{Images and tables}), source blocks also accept a
> -@code{:long-listing} attribute, which prevents the block from floating
> -when non-@code{nil}.
> +In addition to syntax defined in @ref{Literal examples}, names and captions
> +(@pxref{Images and tables}), source blocks also accept a @code{:float}
> +attribute. You may set it to:
> +@itemize @minus
> +@item
> +@code{t}: if you want to make the source block a float. It is the default
> +value when a caption is provided.
> +@item
> +@code{mulicolumn}: if you wish to include a source block which spans multiple
> +colums in a page.
> +@item
> +@code{nil}: if you need to avoid any floating evironment, even when a caption
> +is provided. It is useful for source code that may not fit in a single page.
> +@end itemize
>
> @example
> -#+ATTR_LATEX: :long-listing t
> +#+ATTR_LATEX: :float nil
> #+BEGIN_SRC emacs-lisp
> Code that may not fit in a single page.
> #+END_SRC
> diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
> index 3a01693..237378d 100644
> --- a/lisp/ox-latex.el
> +++ b/lisp/ox-latex.el
> @@ -738,20 +738,6 @@ options will be applied to blocks of all languages."
> (string :tag "Minted option name ")
> (string :tag "Minted option value"))))
>
> -(defcustom org-latex-long-listings nil
> - "When non-nil no listing will be wrapped within a float.
> -
> -Removing floats may break some functionalities. For example, it
> -will be impossible to use cross-references to listings when using
> -`minted' set-up when this variable is non-nil.
> -
> -This value can be locally ignored with \":long-listing t\" and
> -\":long-listing nil\" LaTeX attributes."
> - :group 'org-export-latex
> - :version "24.4"
> - :package-version '(Org . "8.0")
> - :type 'boolean)
> -
> (defvar org-latex-custom-lang-environments nil
> "Alist mapping languages to language-specific LaTeX environments.
>
> @@ -1711,9 +1697,10 @@ 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 ((string= float "wrap") 'wrap)
> + (cond ((and (not float) (plist-member attr :float)) nil)
> + ((string= float "wrap") 'wrap)
> ((string= float "multicolumn") 'multicolumn)
> - ((or (string= float "figure")
> + ((or (string= float t)
> (org-element-property :caption parent))
> 'figure))))
> (placement
> @@ -2073,21 +2060,24 @@ contextual information."
> (continued (org-export-get-loc src-block info))
> (new 0)))
> (retain-labels (org-element-property :retain-labels src-block))
> - (long-listing
> - (let ((attr (org-export-read-attribute :attr_latex src-block)))
> - (if (plist-member attr :long-listing)
> - (plist-get attr :long-listing)
> - org-latex-long-listings))))
> + (attributes (org-export-read-attribute :attr_latex src-block))
> + (float (plist-get attributes :float)))
> (cond
> ;; Case 1. No source fontification.
> ((not org-latex-listings)
> (let* ((caption-str (org-latex--caption/label-string src-block info))
> - (float-env (and (not long-listing)
> - (or label caption)
> - (format "\\begin{figure}[H]\n%s%%s\n\\end{figure}"
> - caption-str))))
> + (float-env
> + (cond ((and (not float) (plist-member attributes :float)) "%s")
> + ((string= "multicolumn" float)
> + (format "\\begin{figure*}[%s]\n%s%%s\n\\end{figure*}"
> + org-latex-default-figure-position
> + caption-str))
> + ((or caption (string= float t))
> + (format "\\begin{figure}[H]\n%s%%s\n\\end{figure}"
> + caption-str))
> + (t "%s"))))
> (format
> - (or float-env "%s")
> + float-env
> (concat (format "\\begin{verbatim}\n%s\\end{verbatim}"
> (org-export-format-code-default src-block info))))))
> ;; Case 2. Custom environment.
> @@ -2097,46 +2087,52 @@ contextual information."
> custom-env))
> ;; Case 3. Use minted package.
> ((eq org-latex-listings 'minted)
> - (let ((float-env
> - (and (not long-listing)
> - (or label caption)
> - (format "\\begin{listing}[H]\n%%s\n%s\\end{listing}"
> - (org-latex--caption/label-string src-block info))))
> - (body
> - (format
> - "\\begin{minted}[%s]{%s}\n%s\\end{minted}"
> - ;; Options.
> - (org-latex--make-option-string
> - (if (or (not num-start)
> - (assoc "linenos" org-latex-minted-options))
> - org-latex-minted-options
> - (append `(("linenos")
> - ("firstnumber" ,(number-to-string (1+ num-start))))
> - org-latex-minted-options)))
> - ;; Language.
> - (or (cadr (assq (intern lang) org-latex-minted-langs)) lang)
> - ;; Source code.
> - (let* ((code-info (org-export-unravel-code src-block))
> - (max-width
> - (apply 'max
> - (mapcar 'length
> - (org-split-string (car code-info)
> - "\n")))))
> - (org-export-format-code
> - (car code-info)
> - (lambda (loc num ref)
> - (concat
> - loc
> - (when ref
> - ;; Ensure references are flushed to the right,
> - ;; separated with 6 spaces from the widest line
> - ;; of code.
> - (concat (make-string (+ (- max-width (length loc)) 6)
> - ?\s)
> - (format "(%s)" ref)))))
> - nil (and retain-labels (cdr code-info)))))))
> + (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)
> + (format "\\begin{listing*}\n%%s\n%s\\end{listing*}"
> + caption-str))
> + ((or caption (string= float t))
> + (format "\\begin{listing}[H]\n%%s\n%s\\end{listing}"
> + caption-str))
> + (t "%s")))
> + (body
> + (format
> + "\\begin{minted}[%s]{%s}\n%s\\end{minted}"
> + ;; Options.
> + (org-latex--make-option-string
> + (if (or (not num-start)
> + (assoc "linenos" org-latex-minted-options))
> + org-latex-minted-options
> + (append
> + `(("linenos")
> + ("firstnumber" ,(number-to-string (1+ num-start))))
> + org-latex-minted-options)))
> + ;; Language.
> + (or (cadr (assq (intern lang) org-latex-minted-langs)) lang)
> + ;; Source code.
> + (let* ((code-info (org-export-unravel-code src-block))
> + (max-width
> + (apply 'max
> + (mapcar 'length
> + (org-split-string (car code-info)
> + "\n")))))
> + (org-export-format-code
> + (car code-info)
> + (lambda (loc num ref)
> + (concat
> + loc
> + (when ref
> + ;; Ensure references are flushed to the right,
> + ;; separated with 6 spaces from the widest line
> + ;; of code.
> + (concat (make-string (+ (- max-width (length loc)) 6)
> + ?\s)
> + (format "(%s)" ref)))))
> + nil (and retain-labels (cdr code-info)))))))
> ;; Return value.
> - (if float-env (format float-env body) body)))
> + (format float-env body)))
> ;; Case 4. Use listings package.
> (t
> (let ((lst-lang
> @@ -2152,19 +2148,26 @@ contextual information."
> (org-export-data main info)))))))
> (concat
> ;; Options.
> - (format "\\lstset{%s}\n"
> - (org-latex--make-option-string
> - (append
> - org-latex-listings-options
> - `(("language" ,lst-lang))
> - (when label `(("label" ,label)))
> - (when caption-str `(("caption" ,caption-str)))
> - (cond ((assoc "numbers" org-latex-listings-options) nil)
> - ((not num-start) '(("numbers" "none")))
> - ((zerop num-start) '(("numbers" "left")))
> - (t `(("numbers" "left")
> - ("firstnumber"
> - ,(number-to-string (1+ num-start)))))))))
> + (format
> + "\\lstset{%s}\n"
> + (org-latex--make-option-string
> + (append
> + org-latex-listings-options
> + (cond
> + ((and (not float) (plist-member attributes :float)) nil)
> + ((string= "multicolumn" float) '(("float" "*")))
> + ((and (string= float t)
> + (not (assoc "float" org-latex-listings-options)))
> + `(("float" ,org-latex-default-figure-position))))
> + `(("language" ,lst-lang))
> + (when label `(("label" ,label)))
> + (when caption-str `(("caption" ,caption-str)))
> + (cond ((assoc "numbers" org-latex-listings-options) nil)
> + ((not num-start) '(("numbers" "none")))
> + ((zerop num-start) '(("numbers" "left")))
> + (t `(("numbers" "left")
> + ("firstnumber"
> + ,(number-to-string (1+ num-start)))))))))
> ;; Source code.
> (format
> "\\begin{lstlisting}\n%s\\end{lstlisting}"
> @@ -2374,9 +2377,10 @@ This function assumes TABLE has `org' as its `:type' property and
> (float-env (unless (member table-env '("longtable" "longtabu"))
> (let ((float (plist-get attr :float)))
> (cond
> + ((and (not float) (plist-member attr :float)) nil)
> ((string= float "sidewaystable") "sidewaystable")
> ((string= float "multicolumn") "table*")
> - ((or (string= float "table")
> + ((or (string= float t)
> (org-element-property :caption table))
> "table")))))
> ;; Extract others display options.
> --
> 1.8.3
>
next prev parent reply other threads:[~2013-06-01 6:31 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-31 15:37 [RFC] Extend :float attribute to src blocks and normalize syntax Nicolas Goaziou
2013-05-31 19:09 ` Sebastien Vauban
2013-05-31 19:51 ` Nicolas Goaziou
2013-05-31 20:47 ` Nick Dokos
2013-06-01 6:25 ` Nicolas Goaziou
2013-06-01 14:25 ` Nick Dokos
2013-06-01 6:31 ` Carsten Dominik [this message]
2013-06-01 6:44 ` Nicolas Goaziou
2013-06-01 8:37 ` Carsten Dominik
2013-06-01 13:29 ` Nicolas Goaziou
2013-06-01 16:00 ` Carsten Dominik
2013-06-02 7:36 ` 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=44A8CD88-0582-4475-802C-D20BEAA74F88@gmail.com \
--to=carsten.dominik@gmail.com \
--cc=emacs-orgmode@gnu.org \
--cc=n.goaziou@gmail.com \
/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).