summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2012-11-25 16:16:29 +0100
committerNicolas Goaziou <n.goaziou@gmail.com>2012-11-25 16:16:29 +0100
commit755af2357729b15996d44d5d177a3b0caff072ff (patch)
tree7a9d7ea632b8bf3842f0c3d36180f65331328c7f
parentfe3f1a0026e993410d67b13ae1932afcd361a6df (diff)
downloadorg-mode-755af2357729b15996d44d5d177a3b0caff072ff.tar.gz
org-e-latex: Implement math table clusters
* contrib/lisp/org-e-latex.el (org-e-latex--math-table): Contiguous tables sharing the same math mode are wrapped within the same environment. This patch will allow to write: #+label: I_2 #+attr_latex: :mode math :environment bmatrix | a | b | |---+---| | c | d | #+attr_latex: :mode math :environment bmatrix :math-prefix "\\times" | 1 | 0 | |---+---| | 0 | 1 | #+attr_latex: :mode math :environment bmatrix :math-prefix "=" | 1 | 0 | |---+---| | 0 | 1 | #+attr_latex: :mode math :environment bmatrix :math-prefix "\\times" | a | b | |---+---| | c | d | #+attr_latex: :mode math :environment bmatrix :math-prefix "=" | a | b | |---+---| | c | d | and get: \begin{equation} \label{I_2} \begin{bmatrix} a & b \\ c & d \\ \end{bmatrix} \times\begin{bmatrix} 1 & 0 \\ 0 & 1 \\ \end{bmatrix} =\begin{bmatrix} 1 & 0 \\ 0 & 1 \\ \end{bmatrix} \times\begin{bmatrix} a & b \\ c & d \\ \end{bmatrix} =\begin{bmatrix} a & b \\ c & d \\ \end{bmatrix} \end{equation}
-rw-r--r--contrib/lisp/org-e-latex.el58
1 files changed, 45 insertions, 13 deletions
diff --git a/contrib/lisp/org-e-latex.el b/contrib/lisp/org-e-latex.el
index b6a3653..bc83269 100644
--- a/contrib/lisp/org-e-latex.el
+++ b/contrib/lisp/org-e-latex.el
@@ -30,7 +30,8 @@
;; `org-e-latex-publish-to-pdf'.
;;
;; The library introduces three new buffer keywords: "LATEX_CLASS",
-;; "LATEX_CLASS_OPTIONS" and "LATEX_HEADER".
+;; "LATEX_CLASS_OPTIONS" and "LATEX_HEADER". Their value can be
+;; either a string or a symbol.
;;
;; Table export can be controlled with a number of attributes (through
;; ATTR_LATEX keyword).
@@ -38,10 +39,10 @@
;; - The main one is the `:mode' attribute, which can be set to
;; `table', `math', `inline-math' and `verbatim'. In particular,
;; when in `math' or `inline-math' mode, every cell is exported
-;; as-is and the table will be wrapped in a math environment. Also,
-;; horizontal rules are ignored. These modes are particularly
-;; useful to write matrices. Default mode is stored in
-;; `org-e-latex-default-table-mode'.
+;; as-is, horizontal rules are ignored and the table will be wrapped
+;; in a math environment. Also, contiguous tables sharing the same
+;; math mode will be wrapped within the same environment. Default
+;; mode is stored in `org-e-latex-default-table-mode'.
;;
;; - The second most important attribute is `:environment'. It is the
;; environment used for the table and defaults to
@@ -54,8 +55,7 @@
;;
;; - `:align', `:font' and `:width' attributes set, respectively, the
;; alignment string of the table, its font size and its width. They
-;; only apply on regular tables. Their value can be a string or
-;; a symbol.
+;; only apply on regular tables.
;;
;; - `:booktabs', `:center' and `:rmlines' values are booleans. They
;; toggle, respectively "booktabs" usage (assuming the package is
@@ -2444,10 +2444,22 @@ This function assumes TABLE has `org' as its `:type' property and
(org-element-map row 'table-cell 'identity info) "&")
(or (cdr (assoc env org-e-latex-table-matrix-macros)) "\\\\")
"\n")))
- (org-element-map table 'table-row 'identity info) "")))
+ (org-element-map table 'table-row 'identity info) ""))
+ ;; Variables related to math clusters (contiguous math tables
+ ;; of the same type).
+ (mode (org-export-read-attribute :attr_latex table :mode))
+ (prev (org-export-get-previous-element table info))
+ (next (org-export-get-next-element table info)))
(concat
- ;; Opening string.
- (cond (inlinep "\\(")
+ ;; Opening string. If TABLE is in the middle of a table cluster,
+ ;; do not insert any.
+ (cond ((and prev
+ (eq (org-element-type prev) 'table)
+ (memq (org-element-property :post-blank prev) '(0 nil))
+ (string= (org-export-read-attribute :attr_latex prev :mode)
+ mode))
+ nil)
+ (inlinep "\\(")
((org-string-nw-p caption) (concat "\\begin{equation}\n" caption))
(t "\\["))
;; Prefix (make sure it is a string).
@@ -2463,9 +2475,29 @@ This function assumes TABLE has `org' as its `:type' property and
(t (format "\\begin{%s}\n%s\\end{%s}" env contents env)))
;; Suffix (make sure it is a string).
(format "%s" (or (plist-get attr :math-suffix) ""))
- ;; Closing string.
- (cond (inlinep "\\)")
- ((org-string-nw-p caption) "\\end{equation}")
+ ;; Closing string. If TABLE is in the middle of a table cluster,
+ ;; do not insert any. If it closes such a cluster, be sure to
+ ;; close the cluster with a string matching the opening string.
+ (cond ((and next
+ (eq (org-element-type next) 'table)
+ (memq (org-element-property :post-blank table) '(0 nil))
+ (string= (org-export-read-attribute :attr_latex next :mode)
+ mode))
+ nil)
+ (inlinep "\\)")
+ ;; Find cluster beginning to know which environment to use.
+ ((let ((cluster-beg table) prev)
+ (while (and (setq prev (org-export-get-previous-element
+ cluster-beg info))
+ (memq (org-element-property :post-blank prev)
+ '(0 nil))
+ (string=
+ (org-export-read-attribute :attr_latex prev :mode)
+ mode))
+ (setq cluster-beg prev))
+ (and (or (org-element-property :caption cluster-beg)
+ (org-element-property :name cluster-beg))
+ "\n\\end{equation}")))
(t "\\]")))))