From: Rasmus <rasmus@gmx.us>
To: emacs-orgmode@gnu.org
Subject: Re: [patch, ox-latex] captions and latex-environments
Date: Fri, 17 Mar 2017 10:23:02 +0100 [thread overview]
Message-ID: <874lystfyh.fsf@gmx.us> (raw)
In-Reply-To: 87tw6se5a3.fsf@nicolasgoaziou.fr
[-- Attachment #1: Type: text/plain, Size: 2318 bytes --]
Hi,
Thanks for the feedback.
Nicolas Goaziou <mail@nicolasgoaziou.fr> 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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-latex-Support-caption-for-latex-environment.patch --]
[-- Type: text/x-diff, Size: 5016 bytes --]
From a3e7dd757a4bcba7dfdd5f54e2e703c1b37ce09a Mon Sep 17 00:00:00 2001
From: Rasmus <rasmus@gmx.us>
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
next prev parent reply other threads:[~2017-03-17 9:23 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-16 12:02 [patch, ox-latex] captions and latex-environments Rasmus
2017-03-16 12:09 ` Rasmus
2017-03-17 7:22 ` Nicolas Goaziou
2017-03-17 9:23 ` Rasmus [this message]
2017-03-18 9:44 ` Nicolas Goaziou
2017-03-20 14:34 ` Rasmus
2017-03-23 16:17 ` Nicolas Goaziou
2017-03-24 16:25 ` Rasmus
2017-03-27 12:02 ` Nicolas Goaziou
2017-03-27 12:30 ` Rasmus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=874lystfyh.fsf@gmx.us \
--to=rasmus@gmx.us \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).