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}
This commit is contained in:
Nicolas Goaziou 2012-11-25 16:16:29 +01:00
parent fe3f1a0026
commit 755af23577
1 changed files with 45 additions and 13 deletions

View File

@ -30,7 +30,8 @@
;; `org-e-latex-publish-to-pdf'. ;; `org-e-latex-publish-to-pdf'.
;; ;;
;; The library introduces three new buffer keywords: "LATEX_CLASS", ;; 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 ;; Table export can be controlled with a number of attributes (through
;; ATTR_LATEX keyword). ;; ATTR_LATEX keyword).
@ -38,10 +39,10 @@
;; - The main one is the `:mode' attribute, which can be set to ;; - The main one is the `:mode' attribute, which can be set to
;; `table', `math', `inline-math' and `verbatim'. In particular, ;; `table', `math', `inline-math' and `verbatim'. In particular,
;; when in `math' or `inline-math' mode, every cell is exported ;; when in `math' or `inline-math' mode, every cell is exported
;; as-is and the table will be wrapped in a math environment. Also, ;; as-is, horizontal rules are ignored and the table will be wrapped
;; horizontal rules are ignored. These modes are particularly ;; in a math environment. Also, contiguous tables sharing the same
;; useful to write matrices. Default mode is stored in ;; math mode will be wrapped within the same environment. Default
;; `org-e-latex-default-table-mode'. ;; mode is stored in `org-e-latex-default-table-mode'.
;; ;;
;; - The second most important attribute is `:environment'. It is the ;; - The second most important attribute is `:environment'. It is the
;; environment used for the table and defaults to ;; environment used for the table and defaults to
@ -54,8 +55,7 @@
;; ;;
;; - `:align', `:font' and `:width' attributes set, respectively, the ;; - `:align', `:font' and `:width' attributes set, respectively, the
;; alignment string of the table, its font size and its width. They ;; alignment string of the table, its font size and its width. They
;; only apply on regular tables. Their value can be a string or ;; only apply on regular tables.
;; a symbol.
;; ;;
;; - `:booktabs', `:center' and `:rmlines' values are booleans. They ;; - `:booktabs', `:center' and `:rmlines' values are booleans. They
;; toggle, respectively "booktabs" usage (assuming the package is ;; 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) "&") (org-element-map row 'table-cell 'identity info) "&")
(or (cdr (assoc env org-e-latex-table-matrix-macros)) "\\\\") (or (cdr (assoc env org-e-latex-table-matrix-macros)) "\\\\")
"\n"))) "\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 (concat
;; Opening string. ;; Opening string. If TABLE is in the middle of a table cluster,
(cond (inlinep "\\(") ;; 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)) ((org-string-nw-p caption) (concat "\\begin{equation}\n" caption))
(t "\\[")) (t "\\["))
;; Prefix (make sure it is a string). ;; 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))) (t (format "\\begin{%s}\n%s\\end{%s}" env contents env)))
;; Suffix (make sure it is a string). ;; Suffix (make sure it is a string).
(format "%s" (or (plist-get attr :math-suffix) "")) (format "%s" (or (plist-get attr :math-suffix) ""))
;; Closing string. ;; Closing string. If TABLE is in the middle of a table cluster,
(cond (inlinep "\\)") ;; do not insert any. If it closes such a cluster, be sure to
((org-string-nw-p caption) "\\end{equation}") ;; 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 "\\]"))))) (t "\\]")))))