From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nicolas Goaziou Subject: Re: Exporting source code blocks as LaTeX figures Date: Mon, 20 May 2013 10:54:33 +0200 Message-ID: <8738tic9py.fsf@gmail.com> References: <87r4h4ohx6.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([208.118.235.92]:59112) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UeLrW-0005sq-Rw for Emacs-orgmode@gnu.org; Mon, 20 May 2013 04:54:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UeLrV-0003Gv-1u for Emacs-orgmode@gnu.org; Mon, 20 May 2013 04:54:34 -0400 Received: from mail-we0-x231.google.com ([2a00:1450:400c:c03::231]:46846) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UeLrU-0003Gn-OI for Emacs-orgmode@gnu.org; Mon, 20 May 2013 04:54:32 -0400 Received: by mail-we0-f177.google.com with SMTP id n57so722148wev.8 for ; Mon, 20 May 2013 01:54:31 -0700 (PDT) In-Reply-To: (James Harkins's message of "Mon, 20 May 2013 15:00:53 +0800") 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: jamshark70@dewdrop-world.net Cc: "Emacs-orgmode@gnu.org" , "Thomas S. Dye" --=-=-= Content-Type: text/plain Hello, James Harkins writes: > The other reference to multicolumn is for table export, and this isn't > a table either. So I think, as currently designed, :multicolumn simply > doesn't apply. Correct. The first attached patch implements :float multicolumn and :float figure handling for source blocks. Would you mind to test it? > I'm aware that BEGIN_figure delimits a "special block" which > translates into LaTeX as an arbitrary environment, and not all > environments can be floated safely... but perhaps one approach for the > future would be to consider BEGIN_figure to be an extra-special > "special block" where we know that the properties of LaTeX floating > bodies are valid. The second patch introduces :starred attribute for special blocks in latex back-end, e.g., #+attr_latex: :starred t :options [b] #+begin_figure something #+end_figure I think it could be useful. Do you? Regards, -- Nicolas Goaziou --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-ox-latex-Implement-float-attribute-for-source-blocks.patch >From cbc4a3a0b98cab9455bd7d3bd8b0ea8bfe8ea34e 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: Implement :float attribute for source blocks * lisp/ox-latex.el (org-latex-src-block): Handle :float attribute. Its value can be set to "figure", "multicolumn" or "nil". This needs to be documented in Org manual. --- lisp/ox-latex.el | 142 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 62 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 41cf1d0..669c84b 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -2073,21 +2073,27 @@ 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)) + (long-listing (if (plist-member attributes :long-listing) + (plist-get attributes :long-listing) + org-latex-long-listings)) + (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 (long-listing "%s") + ((string= "multicolumn" float) + (format "\\begin{figure*}[%s]\n%s%%s\n\\end{figure*}" + org-latex-default-figure-position + caption-str)) + ((or label caption (string= "figure" float)) + (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 +2103,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 (long-listing "%s") + ((string= "multicolumn" float) + (format "\\begin{listing*}\n%%s\n%s\\end{listing*}" + caption-str)) + ((or label caption (string= "figure" float)) + (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 +2164,25 @@ 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 + ((string= "multicolumn" float) '(("float" "*"))) + ((and (string= "figure" float) + (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}" -- 1.8.2.3 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0002-ox-latex-Implement-starred-attribute-for-special-blo.patch >From 814edb94ffc45c0d1734e42805d8ede33ad81f67 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Mon, 20 May 2013 10:44:44 +0200 Subject: [PATCH 2/2] ox-latex: Implement :starred attribute for special blocks * lisp/ox-latex.el (org-latex-special-block): Implement :starred attribute for special blocks. --- lisp/ox-latex.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 669c84b..ab5c062 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -2045,15 +2045,17 @@ holding contextual information." "Transcode a SPECIAL-BLOCK element from Org to LaTeX. CONTENTS holds the contents of the block. INFO is a plist holding contextual information." - (let ((type (downcase (org-element-property :type special-block))) - (opt (org-export-read-attribute :attr_latex special-block :options))) - (concat (format "\\begin{%s}%s\n" type (or opt "")) + (let* ((type (downcase (org-element-property :type special-block))) + (attributes (org-export-read-attribute :attr_latex special-block)) + (opt (plist-get attributes :options)) + (starredp (plist-get attributes :starred))) + (concat (format "\\begin{%s%s}%s\n" type (if starredp "*" "") (or opt "")) ;; Insert any label or caption within the block ;; (otherwise, a reference pointing to that element will ;; count the section instead). (org-latex--caption/label-string special-block info) contents - (format "\\end{%s}" type)))) + (format "\\end{%s%s}" type (if starredp "*" ""))))) ;;;; Src Block -- 1.8.2.3 --=-=-=--