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