[Top][All Lists]

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

[O] [patch, ox-latex] captions and latex-environments

From: Rasmus
Subject: [O] [patch, ox-latex] captions and latex-environments
Date: Thu, 16 Mar 2017 13:02:20 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux)


I often generate tables directly from R.  At the moment, I have to do
something like the following because org-latex-latex-environment doesn’t
support captions.

    #+name: tbl:1
    #+caption: cap
    #+include: "tbl.tex"

This is a bit too verbose IMO.
With the attached patch this can be cut down to,

    #+name: tbl:1
    #+caption: cap
    #+include: "tbl.tex"

It should respect ‘org-latex-custom-lang-environments’ and

Would this be an appropriate change or is it too hackish?  I have not
looked at other backends, but I suspect this is mostly a latex thing.


When in doubt, do it!
>From 4304552a0c8a72c6aeb2805a8cf703eddb5da123 Mon Sep 17 00:00:00 2001
From: Rasmus <address@hidden>
Date: Thu, 16 Mar 2017 12:45:10 +0100
Subject: [PATCH] ox-latex: Support caption for latex-environment

* lisp/ox-latex.el (org-latex-environment--type): New function
  determining type of a latex-environment.
  (org-latex-latex-environment): Add support for caption.
  (org-latex--caption/label-string): Use correct type for non-floating
 lisp/ox-latex.el | 78 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 62 insertions(+), 16 deletions(-)

diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index 2727359cb..f226dc7ae 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -1312,14 +1312,19 @@ For non-floats, see `org-latex--wrap-label'."
       (format (if nonfloat "\\captionof{%s}%s{%s%s}\n"
-             (if nonfloat
-                 (cl-case type
-                   (paragraph "figure")
-                   (src-block (if (plist-get info :latex-listings)
-                                  "listing"
-                                "figure"))
-                   (t (symbol-name type)))
-               "")
+             (let ((type* (if (eq type 'latex-environment)
+                              (org-latex-environment--type element)
+                            type)))
+               (if nonfloat
+                   (cl-case type*
+                     (paragraph "figure")
+                     (image "figure")
+                     (special-block "figure")
+                     (src-block (if (plist-get info :latex-listings)
+                                    "listing"
+                                  "figure"))
+                     (t (symbol-name type*)))
+                 ""))
              (if short (format "[%s]" (org-export-data short info)) "")
              (org-export-data main info))))))
@@ -2250,24 +2255,65 @@ CONTENTS is nil.  INFO is a plist holding contextual 
 ;;;; Latex Environment
+(defun org-latex-environment--type (latex-environment)
+The TYPE is determined from the actual latex environment, and
+could be a member of `org-latex-caption-above' or `math'."
+  (let* ((value (org-remove-indentation
+                (org-element-property :value latex-environment)))
+        (latex-begin-re (cadr (assoc "begin" org-latex-regexps)))
+        (env (progn (string-match latex-begin-re value)
+                    (match-string 2 value))))
+    (cond
+     ((string-match org-latex-math-environments-re value) 'math)
+     ((string-match-p "tab\\(le\\|ular\\)" env) 'table)
+     ((string-match-p "figure" env) 'image)
+     ;; Default coding environments
+     ((or (string-match-p "\\(\\(lst\\)?listing\\|verbatim\\|minted\\)" env)
+         (string-match-p
+          (regexp-opt
+           (mapcar (lambda (str)
+                     (let ((s (cadr str)))
+                       (if (string-match latex-begin-re s)
+                           (match-string 2 s)
+                         s)))
+                   org-latex-custom-lang-environments))
+          env))
+      'src-block)
+     (t 'special-block))))
 (defun org-latex-latex-environment (latex-environment _contents info)
   "Transcode a LATEX-ENVIRONMENT element from Org to LaTeX.
 CONTENTS is nil.  INFO is a plist holding contextual information."
   (when (plist-get info :with-latex)
-    (let ((value (org-remove-indentation
-                 (org-element-property :value latex-environment))))
-      (if (not (org-element-property :name latex-environment)) value
+    (let* ((value (org-remove-indentation
+                  (org-element-property :value latex-environment)))
+          (type (org-latex-environment--type latex-environment))
+          (caption (if (eq type 'math)
+                       (org-latex--label latex-environment info nil t)
+                     (org-latex--caption/label-string latex-environment info)))
+          (caption-above-p
+           (memq type (append (plist-get info :latex-caption-above) '(math)))))
+      (if (not (or (org-element-property :name latex-environment)
+                  (org-element-property :caption latex-environment)))
+         value
        ;; Environment is labeled: label must be within the environment
        ;; (otherwise, a reference pointing to that element will count
-       ;; the section instead).
+       ;; the section instead). Also insert caption if `latex-environment'
+       ;; is not a math environment.
          (insert value)
-         (goto-char (point-min))
-         (forward-line)
-         (insert (org-latex--label latex-environment info nil t))
+         (if caption-above-p
+             (progn
+               (goto-char (point-min))
+               (forward-line)
+               (insert caption))
+           (goto-char (point-max))
+           (forward-line -1)
+           (insert caption))
 ;;;; Latex Fragment
 (defun org-latex-latex-fragment (latex-fragment _contents _info)

reply via email to

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