emacs-orgmode
[Top][All Lists]
Advanced

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

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


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

Hi,

Thanks for the feedback.

Nicolas Goaziou <address@hidden> writes:

>> +(defun org-latex-environment--type (latex-environment)
>
> It should be `org-latex--environment-type'.

Yes.

> I'd rather avoid using `org-latex-regexps', which predates the parser.
> A hard-coded regexp is better.

OK.


>> +     (env (progn (string-match latex-begin-re value)
>> +                 (match-string 2 value))))
>
> Since environments do not necessary start with \begin{...}, I think the
> following is better
>
>   (and (string-match ...)
>        (match-string ...))

Don't the element `latex-environment' always start \begin{.}?
Cf. org-element--latex-begin-environment.

Another danger is that someone writes something like,

    \begin{center}
    \begin{table}
    ...

I wouldn’t worry too much about this, though.

>> +    (cond
>> +     ((string-match org-latex-math-environments-re value) 'math)
>> +     ((string-match-p "tab\\(le\\|ular\\)" env) 'table)
>
> This is a bit sloppy. In particular, it doesn't match all table
> environments supported out of the box, e.g., "longtabu". Also, a list of
> strings, compiler into a regexp with `regexp-opt' may be better.

Longtable in an omission, but would have been matched.  For some reason I
thought tabu was no longer supported.  Browsing the tabu CTAN page there’s
links to all sorts of exotic table packages, like "stabular",
"bigtabular", and "supertabular".  I wonder if it’s enough to match the
ones supported by Org by default, or whether it would be better to have it
as a defvar that could be hacked if necessary?

>> +    ;; is not a math environment.
>>      (with-temp-buffer
>>        (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))
>
> Nitpick: you can move (insert caption) outside the (if ...) and
> de-duplicate it.

Good point.  Thanks.

I have attached the patch with the changes again and added a changelog
entry.  I am not sure this needs to be documented, but I’m happy to
include a couple lines somewhere.

Thanks,
Rasmus

-- 
It was you, Jezebel, it was you
>From a3e7dd757a4bcba7dfdd5f54e2e703c1b37ce09a 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
  latex-environments.
* etc/ORG-NEWS: Add entry.
---
 etc/ORG-NEWS     |  2 +-
 lisp/ox-latex.el | 77 ++++++++++++++++++++++++++++++++++++++++++++------------
 2 files changed, 62 insertions(+), 17 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index f9c1196e5..c3bc60efa 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -183,7 +183,7 @@ user to specify the name of the output file upon exporting 
the
 document.  This also has an effect on publishing.
 **** Horizontal rules are no longer ignored in LaTeX table math mode
 **** Use ~compilation-mode~ for compilation output
-
+**** ~latex-environment~ elements support ~caption~ keywords for LaTeX export
 *** ~org-edit-special~ can edit LaTeX environments
 
 Using ~C-c '~ on a LaTeX environment opens a sub-editing buffer.  By
diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index 2727359cb..0d492e421 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -1312,14 +1312,19 @@ For non-floats, see `org-latex--wrap-label'."
      (t
       (format (if nonfloat "\\captionof{%s}%s{%s%s}\n"
                "\\caption%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)) "")
              label
              (org-export-data main info))))))
@@ -2250,24 +2255,64 @@ CONTENTS is nil.  INFO is a plist holding contextual 
information."
 
 ;;;; Latex Environment
 
+(defun org-latex--environment-type (latex-environment)
+  "Return the TYPE of 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)))
+        (env (or (and (string-match "\\\\begin{\\([A-Za-z0-9*]+\\)}" value)
+                      (match-string 1 value)) "")))
+    (cond
+     ((string-match-p org-latex-math-environments-re value) 'math)
+     ((string-match-p
+       (regexp-opt '("table" "longtable" "tabular" "tabu" "longtabu")) env)
+      'table)
+     ((string-match-p "figure" env) 'image)
+     ((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.
        (with-temp-buffer
          (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))
+           (goto-char (point-max))
+           (forward-line -1))
+         (insert caption)
          (buffer-string))))))
 
-
 ;;;; Latex Fragment
 
 (defun org-latex-latex-fragment (latex-fragment _contents _info)
-- 
2.12.0


reply via email to

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