emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [Orgmode] allow table* specification with #+ATTR_LaTeX:


From: Thomas S. Dye
Subject: Re: [Orgmode] allow table* specification with #+ATTR_LaTeX:
Date: Fri, 17 Dec 2010 06:21:09 -1000

Hi Eric,

A syntax like this, with a width attribute, seems most like Org-mode to me:

#+ATTR_LaTeX table* tabularx width=\textwidth align=llXrl

If that isn't a reasonable possibility, then, yes, the square brackets should be changed. These represent optional arguments in LaTeX. The width argument is required by tabularx and tabulary, not optional, so it looks like an error from a LaTeX point of view. Changing the square brackets to curly brackets in this case would have the advantage of looking a lot like the underlying LaTeX.

All the best,
Tom

On Dec 16, 2010, at 2:57 PM, Eric Schulte wrote:

Hi Tom,

Thanks for the pointer, how about this revised version of the patch. It
takes the following inputs

#+begin_src org
 #+CAPTION: A wide table with tabulary
 #+LABEL: tbl:wide
 #+ATTR_LaTeX: table* tabulary[\textwidth] align=l|lp{3cm}r|l
 | 1 | 2 | 3 |
 | 4 | 5 | 6 |

 #+CAPTION: A normal table with tabularx
 #+LABEL: tbl:wide
 #+ATTR_LaTeX: table tabularx[\textwidth] align=l|lp{3cm}r|l
 | 1 | 2 | 3 |
 | 4 | 5 | 6 |
#+end_src

and yields the following output

#+begin_src latex
 \begin{table*}[htb]
 \caption{A wide table with tabulary} \label{tbl:wide}
 \begin{center}
 \begin{tabulary}{\textwidth}{l|lp{3cm}r|l}
  1  &  2  &  3  \\
  4  &  5  &  6  \\
 \end{tabulary}
 \end{center}
 \end{table*}


 \begin{table}[htb]
 \caption{A normal table with tabularx} \label{tbl:wide}
 \begin{center}
 \begin{tabularx}{\textwidth}{l|lp{3cm}r|l}
  1  &  2  &  3  \\
  4  &  5  &  6  \\
 \end{tabularx}
 \end{center}
 \end{table}
#+end_src

I'm not sure about the square bracket syntax, maybe curly would be
preferable.  Definitely open to suggestions.

Should this be applied?  Are there any obvious areas for improvement?

Thanks -- Eric

diff --git a/lisp/org-latex.el b/lisp/org-latex.el
index a261171..af0a15d 100644
--- a/lisp/org-latex.el
+++ b/lisp/org-latex.el
@@ -1741,7 +1741,7 @@ The conversion is made depending of STRING- BEFORE and STRING-AFTER."
             (org-table-last-column-widths (copy-sequence
org-table-last-column- widths))
             fnum fields line lines olines gr colgropen line-fmt align
-             caption shortn label attr floatp placement longtblp)
+ caption shortn label attr floatp placement longtblp tblenv)
        (if org-export-latex-tables-verbatim
            (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
                                "\\end{verbatim}\n")))
@@ -1758,6 +1758,16 @@ The conversion is made depending of STRING- BEFORE and STRING-AFTER."
                         'org-label raw-table)
                  longtblp (and attr (stringp attr)
                                (string-match "\\<longtable\\>" attr))
+                 tblenv (if (and attr (stringp attr)
+                                 (string-match (regexp-quote "table*") attr))
+                            "table*" "table")
+                 org-export-latex-tabular-environment
+                 (progn
+                   (message "attr:%s" attr)
+                   (if (and attr (stringp attr)
+                            (string-match "\\(tabular.*\\)\\[\\(.+\\)\\]" 
attr))
+                       (list (match-string 1 attr) (match-string 2 attr))
+                     org-export-latex-tabular-environment))
                  align (and attr (stringp attr)
(string-match "\\<align=\\([^ \t\n\r]+\ \)" attr)
                             (match-string 1 attr))
@@ -1821,7 +1831,8 @@ The conversion is made depending of STRING- BEFORE and STRING-AFTER."
                       (concat
                        (if longtblp
                            (concat "\\begin{longtable}{" align "}\n")
- (if floatp (format "\\begin{table}%s\n" placement)))
+                          (if floatp
+                             (format "\\begin{%s}%s\n" tblenv placement)))
                        (if floatp
                            (format
                             "\\caption%s{%s} %s"
@@ -1832,8 +1843,15 @@ The conversion is made depending of STRING- BEFORE and STRING-AFTER." (if (and org-export-latex-tables-centered (not longtblp))
                            "\\begin{center}\n")
                        (if (not longtblp)
-                           (format "\\begin{%s}{%s}\n"
-                                   org-export-latex-tabular-environment align))
+                           (if (listp org-export-latex-tabular-environment)
+                               (apply
+                                #'format
+                                (append
+                                 (list "\\begin{%s}{%s}{%s}\n")
+                                 org-export-latex-tabular-environment
+                                 (list align)))
+                             (format "\\begin{%s}{%s}\n"
+                                     org-export-latex-tabular-environment 
align)))
                        (orgtbl-to-latex
                         lines
                         `(:tstart nil :tend nil
@@ -1847,12 +1865,14 @@ The conversion is made depending of STRING- BEFORE and STRING-AFTER."
                                             nil)))
                        (if (not longtblp)
                            (format "\n\\end{%s}"
-                                   org-export-latex-tabular-environment))
+                                   (if (listp 
org-export-latex-tabular-environment)
+                                       (car 
org-export-latex-tabular-environment)
+                                     org-export-latex-tabular-environment)))
(if longtblp "\n" (if org-export-latex- tables-centered "\n\\end{center}\n" "\n"))
                        (if longtblp
                            "\\end{longtable}"
-                          (if floatp "\\end{table}"))))
+                          (if floatp (format "\\end{%s}" tblenv)))))
                      "\n\n"))))))))

(defun org-export-latex-convert-table.el-table ()

"Thomas S. Dye" <address@hidden> writes:

Hi Eric,

The syntax for tabularx and tabulary includes a width specification
that is a required argument:

\begin{tabulary}{<width>}{<align>} ... \end{tabulary}
\begin{tabularx}{<width>}{<align>} ... \end{tabularx}

This is typically set to something like \linewidth, \colwidth, or
\textwidth, but might also take an absolute length like 250pt, 5in,
etc.

All the best,
Tom

On Dec 16, 2010, at 4:43 AM, Eric Schulte wrote:

The attached patch implements the behavior described previously, so
for
example the following org

#+begin_src org
#+CAPTION: A wide table with tabulary
#+LABEL: tbl:wide
#+ATTR_LaTeX: table* tabulary align=l|lp{3cm}r|l
| 1 | 2 | 3 |
| 4 | 5 | 6 |

#+CAPTION: A normal table with tabularx
#+LABEL: tbl:wide
#+ATTR_LaTeX: table tabularx align=l|lp{3cm}r|l
| 1 | 2 | 3 |
| 4 | 5 | 6 |
#+end_src

exports to the following latex

#+begin_src latex
\begin{table*}[htb]
\caption{A wide table with tabulary} \label{tbl:wide}
\begin{center}
\begin{tabulary}{l|lp{3cm}r|l}
 1  &  2  &  3  \\
 4  &  5  &  6  \\
\end{tabulary}
\end{center}
\end{table*}


\begin{table}[htb]
\caption{A normal table with tabularx} \label{tbl:wide}
\begin{center}
\begin{tabularx}{l|lp{3cm}r|l}
 1  &  2  &  3  \\
 4  &  5  &  6  \\
\end{tabularx}
\end{center}
\end{table}
#+end_src

Does this behavior and patch look reasonable? If I don't hear by the
end of the day I will apply this patch, I just wanted to check first
on
list as the export mechanisms aren't my personal area of expertise.

Thanks -- Eric

diff --git a/lisp/org-latex.el b/lisp/org-latex.el
index a261171..66541de 100644
--- a/lisp/org-latex.el
+++ b/lisp/org-latex.el
@@ -1741,7 +1741,7 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
            (org-table-last-column-widths (copy-sequence
                                           org-table-last-column-
widths))
fnum fields line lines olines gr colgropen line-fmt align
-             caption shortn label attr floatp placement longtblp)
+             caption shortn label attr floatp placement longtblp
tblenv tblrenv)
       (if org-export-latex-tables-verbatim
           (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
                               "\\end{verbatim}\n")))
@@ -1758,6 +1758,15 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                        'org-label raw-table)
                 longtblp (and attr (stringp attr)
(string-match "\\<longtable\\>" attr))
+                 tblenv (if (and attr (stringp attr)
+                                 (string-match (regexp-quote "table*") attr))
+                            "table*" "table")
+                 org-export-latex-tabular-environment
+                 (if (and attr (stringp attr)
+                          (string-match (regexp-quote "tabularx") attr))
+                     "tabularx"
+                   (if (string-match (regexp-quote "tabulary") attr)
+                       "tabulary" org-export-latex-tabular-environment))
                 align (and attr (stringp attr)
                            (string-match "\\<align=\\([^ \t\n\r]+\
\)" attr)
                            (match-string 1 attr))
@@ -1821,7 +1830,8 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                      (concat
                       (if longtblp
(concat "\\begin{longtable}{" align "} \n")
-                          (if floatp (format "\\begin{table}%s\n"
placement)))
+                          (if floatp
+                             (format "\\begin{%s}%s\n" tblenv placement)))
                       (if floatp
                           (format
                            "\\caption%s{%s} %s"
@@ -1852,7 +1862,7 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                                             "\n\\end{center}\n"
"\n"))
                       (if longtblp
                           "\\end{longtable}"
-                          (if floatp "\\end{table}"))))
+ (if floatp (format "\\end{%s}" tblenv)))))
                     "\n\n"))))))))

(defun org-export-latex-convert-table.el-table ()

"Eric Schulte" <address@hidden> writes:

Hi Tom,

Thanks for the informative list.  I had no idea LaTeX supported so
many
table options. How about I update the patch so that is supports the
following sets of mutually exclusive options...
- longtable :: wraps the table in a longtable with no table or
tabular
             wrappers -- already implemented
- table* :: replaces =table= wrapper with =table*= wrapper,
contains an
          inner tabular wrapper
- tabular[xy] :: specifies the inner tabular wrapping environment,
only
               one can be specified

so for example, the following

#+begin_src org
#+CAPTION: A wide table
#+LABEL: tbl:wide
#+ATTR_LaTeX: table* tabulary align=l|lp{3cm}r|l
| ... | ... |
| ... | ... |
#+end_src

results in the following

#+begin_src latex
\begin{table*}[htb]
\caption{A wide table} \label{tbl:wide}
\begin{center}
\begin{tabulary}{l|lp{3cm}r|l}
 1  &  2  &  3  \\
 4  &  5  &  6  \\
\end{tabulary}
\end{center}
\end{table*}
#+end_src

Then the next question would be how to insert a =figure*= instead
of a
simple =figure= environment.

Thanks -- Eric

Thomas S. Dye <address@hidden> writes:

Hi Eric,

It would be great to have a more general solution.  Tables are
hard to
typeset, so it might take a while to come up with a good
specification. Here is what I know about the LaTeX side of things.

** LaTeX destinations for an Org-mode table
*** Environments for typesetting a table
  - table placed in the output where it occurs in the input
  - all of these environments can be used on their own
**** tabular
   standard LaTeX environment, doesn't break across pages, no
caption
**** tabularx
   extended environment that can automatically calculate column
   widths and wrap text within table cells, doesn't break across
   pages, no caption
**** tabulary
   like tabularx, but tries harder to come up with optimal column
widths
**** supertabular
   extended tabular environment that breaks across pages, includes
   caption
**** supertabular*
   like supertabular, but for wide tables in a multicolumn page
   layout
**** mpsupertabular
   like supertabular, but also handles footnotes within the table
**** mpsupertabular*
   like mpsupertabular, but for multicolumn page layouts
**** longtable
   extended tabular environment that breaks across pages and
   includes a caption, but can't be used in a multicolumn page
   layout
*** Environment for floating a table and adding a caption
  floats a table typeset by some other environment to a place in
the
  output that LaTeX determines appropriate, probably not where it
  occurs in the input
**** =table=, single column document
   typically wraps a =tabular=, =tabularx=, or =tabulary=
environment
**** =table*=, multi-column document
   typically wraps a =tabular=, =tabularx=, or =tabulary=
environment
*** "Typical" uses
  In our report production work we regularly use seven setups:
  - table or table* wrapped around tabularx or tabular
  - longtable
  - tabular or tabularx on their own

hth,
Tom
On Dec 15, 2010, at 11:33 AM, Eric Schulte wrote:

Hi,

The attached patch allows the use of table* latex tables from
within
Org
mode documents using the attr_latex lines, for example

#+CAPTION: A wide table
#+LABEL: tbl:wide
#+ATTR_LaTeX: table* align=l|lp{3cm}r|l
| ... | ... |
| ... | ... |

Should this be added, or should we put together a more general
solution
for different types of table environments?  Currently only
longtable
is
supported.  Also, is there already a way to do this that I have
missed?

Thanks -- Eric

diff --git a/lisp/org-latex.el b/lisp/org-latex.el
index a261171..b7f48d3 100644
--- a/lisp/org-latex.el
+++ b/lisp/org-latex.el
@@ -1741,7 +1741,7 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
           (org-table-last-column-widths (copy-sequence
                                          org-table-last-column-
widths))
           fnum fields line lines olines gr colgropen line-fmt
align
- caption shortn label attr floatp placement longtblp)
+             caption shortn label attr floatp placement longtblp
tblenv)
      (if org-export-latex-tables-verbatim
          (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
                              "\\end{verbatim}\n")))
@@ -1758,6 +1758,9 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                       'org-label raw-table)
                longtblp (and attr (stringp attr)
                              (string-match "\\<longtable\\>"
attr))
+                 tblenv (if (and attr (stringp attr)
+                                 (string-match (regexp-quote "table*") attr))
+                            "table*" "table")
                align (and attr (stringp attr)
(string-match "\\<align=\\([^ \t\n\r] +\
\)" attr)
                           (match-string 1 attr))
@@ -1821,7 +1824,8 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                     (concat
                      (if longtblp
                          (concat "\\begin{longtable}{" align "}
\n")
- (if floatp (format "\\begin{table}%s \n"
placement)))
+                          (if floatp
+                             (format "\\begin{%s}%s\n" tblenv placement)))
                      (if floatp
                          (format
                           "\\caption%s{%s} %s"
@@ -1852,7 +1856,7 @@ The conversion is made depending of STRING-
BEFORE and STRING-AFTER."
                                            "\n\\end{center}\n"
"\n"))
                      (if longtblp
                          "\\end{longtable}"
-                          (if floatp "\\end{table}"))))
+                          (if floatp (format "\\end{%s}"
tblenv)))))
                    "\n\n"))))))))

(defun org-export-latex-convert-table.el-table ()
_______________________________________________
Emacs-orgmode mailing list
Please use `Reply All' to send replies to the list.
address@hidden
http://lists.gnu.org/mailman/listinfo/emacs-orgmode




reply via email to

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