From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: [RFC] Extend :float attribute to src blocks and normalize syntax Date: Sat, 1 Jun 2013 08:31:25 +0200 Message-ID: <44A8CD88-0582-4475-802C-D20BEAA74F88@gmail.com> References: <878v2v17pj.fsf@gmail.com> Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:40783) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UifLf-0001Uq-OC for emacs-orgmode@gnu.org; Sat, 01 Jun 2013 02:31:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UifLd-0001Z8-G9 for emacs-orgmode@gnu.org; Sat, 01 Jun 2013 02:31:31 -0400 Received: from mail-wg0-x22c.google.com ([2a00:1450:400c:c00::22c]:56079) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UifLc-0001Ya-UM for emacs-orgmode@gnu.org; Sat, 01 Jun 2013 02:31:29 -0400 Received: by mail-wg0-f44.google.com with SMTP id a12so1803659wgh.35 for ; Fri, 31 May 2013 23:31:28 -0700 (PDT) In-Reply-To: <878v2v17pj.fsf@gmail.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Nicolas Goaziou Cc: Org Mode List On 31.5.2013, at 17:37, Nicolas Goaziou wrote: > Hello, >=20 > 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: >=20 > | | Old | New | > |--------+---------------+----------| > | Tables | :float table | :float t | > | Images | :float figure | :float t |=20 >=20 > 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: >=20 > | | Old | New | > |------------+-----------------+------------| > | Src blocks | :long-listing t | :float nil | >=20 > 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 >=20 > WDYT? >=20 >=20 > Regards, >=20 > --=20 > Nicolas Goaziou > =46rom 0bf638246d91e5d855836ceeb24b405b3688729f Mon Sep 17 00:00:00 = 2001 > From: Nicolas Goaziou > 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 >=20 > * 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(-) >=20 > 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 >=20 > -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 >=20 > @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")))) >=20 > -(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. >=20 > @@ -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=3D float "wrap") 'wrap) > + (cond ((and (not float) (plist-member attr :float)) = nil) > + ((string=3D float "wrap") 'wrap) > ((string=3D float "multicolumn") 'multicolumn) > - ((or (string=3D float "figure") > + ((or (string=3D 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=3D "multicolumn" float) > + (format = "\\begin{figure*}[%s]\n%s%%s\n\\end{figure*}" > + org-latex-default-figure-position > + caption-str)) > + ((or caption (string=3D 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=3D "multicolumn" float) > + (format = "\\begin{listing*}\n%%s\n%s\\end{listing*}" > + caption-str)) > + ((or caption (string=3D 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=3D "multicolumn" float) '(("float" "*"))) > + ((and (string=3D 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=3D float "sidewaystable") = "sidewaystable") > ((string=3D float "multicolumn") "table*") > - ((or (string=3D float "table") > + ((or (string=3D float t) > (org-element-property :caption table)) > "table"))))) > ;; Extract others display options. > --=20 > 1.8.3 >=20