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: Carsten Dominik
Subject: Re: [Orgmode] allow table* specification with #+ATTR_LaTeX:
Date: Fri, 17 Dec 2010 22:04:37 +0100


On Dec 17, 2010, at 10:01 PM, Eric Schulte wrote:

Ah! you caught me :)

I've just pushed up documentation. -- Eric

Thank you, Eric.

- Carsten


Carsten Dominik <address@hidden> writes:

This is great, I like it.  Maybe a change to the manual
would be appropriate?

Best wishes

- Carsten

On Dec 17, 2010, at 9:39 PM, Eric Schulte wrote:

Hi Tom,

Thanks for all you help on this front. I've just pushed up the patch
with your suggested syntax (which is much better than my original).
It
allows the following behavior.

The following org
#+begin_src org
#+CAPTION: A wide table with tabulary
#+LABEL: tbl:wide
#+ATTR_LaTeX: table* tabulary width=\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 width=\textwidth align=l|lp{3cm}r|l
| 1 | 2 | 3 |
| 4 | 5 | 6 |

and now a simple table

| 1 | 2 | 3 |
| 4 | 5 | 6 |
#+end_src

exports to the following tex
#+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}


and now a simple table


\begin{center}
\begin{tabular}{rrr}
 1  &  2  &  3  \\
 4  &  5  &  6  \\
\end{tabular}
\end{center}
#+end_src


Thanks -- Eric

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

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

_______________________________________________
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]