From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rasmus Subject: Re: [patch, ox-latex] captions and latex-environments Date: Fri, 17 Mar 2017 10:23:02 +0100 Message-ID: <874lystfyh.fsf@gmx.us> References: <87k27pv38z.fsf@gmx.us> <87bmt1v2xs.fsf@gmx.us> <87tw6se5a3.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:45336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1coo6Y-0000Xb-OR for emacs-orgmode@gnu.org; Fri, 17 Mar 2017 05:23:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1coo6V-0001Jc-ES for emacs-orgmode@gnu.org; Fri, 17 Mar 2017 05:23:26 -0400 Received: from [195.159.176.226] (port=41378 helo=blaine.gmane.org) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1coo6V-0001Iq-3K for emacs-orgmode@gnu.org; Fri, 17 Mar 2017 05:23:23 -0400 Received: from list by blaine.gmane.org with local (Exim 4.84_2) (envelope-from ) id 1coo6I-00085m-MU for emacs-orgmode@gnu.org; Fri, 17 Mar 2017 10:23:10 +0100 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" To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Hi, Thanks for the feedback. Nicolas Goaziou 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-ox-latex-Support-caption-for-latex-environment.patch >From a3e7dd757a4bcba7dfdd5f54e2e703c1b37ce09a Mon Sep 17 00:00:00 2001 From: Rasmus 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 --=-=-=--