Reputation: 43031
I'm editing the documentation for a project of mine using Sphinx, which in turn uses reStructuredText as markup language.
I have a simple table (as opposed to grid table) in which the rightmost column reports contains numbers that I would like to right-align, but I couldn't find how to achieve that.
============ =====================
Event Score variation
============ =====================
Event 1 +100
Event 2 -25
Event 3 -400
============ =====================
I would be happy to switch to a grid table if this would allow me to solve the problem.
Upvotes: 35
Views: 21469
Reputation: 16313
As of Docutils 0.13 (late 2016), the table
directive supports an align
option.
.. table::
:align: right
======== ==== ==== ==== ==== ==== ==== ==== ==== ====
4 \\ 9 0 1 2 3 4 5 6 7 8
======== ==== ==== ==== ==== ==== ==== ==== ==== ====
0 0 28 20 12 4 32 24 16 8
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----
1 9 1 29 21 13 5 33 25 17
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----
2 18 10 2 30 22 14 6 34 26
-------- ---- ---- ---- ---- ---- ---- ---- ---- ----
3 27 19 11 3 31 23 15 7 35
======== ==== ==== ==== ==== ==== ==== ==== ==== ====
Your stylesheet will need to support the .align-right
class
Upvotes: -1
Reputation: 41
You can use the centered directive. I've included an example below:
+------+-----------+------------+--------+------+------+
| Type | .. centered:: -payload- | crcL | crcH |
+------+-----------+------------+--------+------+------+
| Type | subType | obj/access | -data- | crcL | crcH |
+------+-----------+------------+--------+------+------+
Here's what that looks like in HTML
Upvotes: 4
Reputation: 8533
Sadly I don't think rst offers that ability... the table styling options are rather limited. That said, if you're rendering to HTML, you could add a custom stylesheet with a css rule such as:
table.right-align-right-col td:last-child {
text-align: right
}
and then add the directive:
.. rst-class:: right-align-right-col
right above your table in the rst file. It's clunky, but it should work.
update 2013-2-6: I've since needed to accomplish this myself, and came up with a more permanent solution. The cloud_sptheme.ext.table_styling Sphinx extension adds directives for doing column alignment, per-column css classes, and number of other table styling tricks. Despite being packaged as part of the "cloud" Sphinx theme, it should work with any Sphinx theme.
Upvotes: 21
Reputation: 8966
My approach is a bit of sed
on the TeX file generated by Docutils.
The idea is to replace the table
declaration with something that fits your needs.
Docutils produce something like that :
\begin{longtable*}[c]{p{0.086\DUtablewidth}p{0.290\DUtablewidth}}
Imagine you want to right-align the second column.You may want to replace this with :
\begin{longtable*}[c]{lr}
But you lose the ability to control the width of the cells. What we need here is to declare 2 \newcolumntype
, one for the right-align (x) and one for the left-align (y):
\newcolumntype{x}[1]{%
>{\raggedleft\hspace{0pt}}p{#1}}%
\newcolumntype{y}[1]{%
>{\raggedright\hspace{0pt}}p{#1}}%
And use them in the table declaration:
\begin{longtable*}[c]{y{7.5cm}x{2cm}}
The \\
newline must also be replaced with a \tabularnewline
.
I put everything in a script file because I am on OSX and the version of sed shipped does not support newline substitution with \n
(that sucks when you are in a Makefile
).
On OSX/BSD:
sed -E -f fix_table.sed < source.tex > destination.tex
with fix_table.sed
:
s/\\begin{longtable\*}.*/\\newcolumntype{x}[1]{% \
>{\\raggedleft\\hspace{0pt}}p{#1}}% \
\\newcolumntype{y}[1]{% \
>{\\raggedright\\hspace{0pt}}p{#1}}% \
\\begin{longtable*}[c]{y{7.5cm}x{2cm}}/
s/\\\\/\\tabularnewline/
This is a bit harsh but there is no workaround that really works at the RestructuredText level.
http://en.wikibooks.org/wiki/LaTeX/Tables
http://texblog.org/2008/05/07/fwd-equal-cell-width-right-and-centre-aligned-content/
Upvotes: 2
Reputation: 3675
While it appears that ReST doesn't actually support cell content alignment, you can actually use line-blocks within your cell to enforce preservation of whitespace to effectively pad your cell's content.
You'll have to use some of the unicode-whitespace characters (e.g. U+2001 - EM QUAD
) and have them preceded by a normal space character (U+0020
) i.e. U+0020U+2001Your String
to stop the ReST parser complaining about malformed tables and unterminated substitution references, etc.
+--------+---------+
| String | Num |
+========+=========+
| foo || 12.00| # second cell's content is actually |<U+0020><U+2001>12.00
+--------+---------+
| bar || 3.01|
+--------+---------+
| baz || 4.99|
+--------+---------+
| moo || 15.99|
+--------+---------+
| quux || 33.49|
+--------+---------+
| foo || 20.00|
+--------+---------+
| bar || 100.00|
+--------+---------+
Tables like the above start to look a bit awkward and are awkward to maintain but the approach gets the job done. It also goes without saying, you'll need to both edit and generate UTF-8 output. While rst2html.py
treats this well, I'm not sure how sphinx
deals with this and if it can, whether the alignment remains when generating non-HTML documents.
Upvotes: 6