How to right-align columns content in reStructuredText simple tables? How to right-align columns content in reStructuredText simple tables? python python

How to right-align columns content in reStructuredText simple tables?


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.


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.


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).

The bottom-line

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/