如何在reStructuredText简单表中右对齐列内容?

时间:2011-09-08 12:43:40

标签: python alignment python-sphinx restructuredtext tabular

我正在使用Sphinx编辑我的项目的文档,而reStructuredText又使用{{3}}作为标记语言。

我有一个简单表(而不是网格表),其中最右边的列报告包含我想要正确对齐的数字,但我不能找到如何实现这一点。

============  =====================
Event               Score variation
============  =====================
Event 1                        +100
Event 2                         -25
Event 3                        -400
============  =====================

如果能让我解决问题,我很乐意切换到网格表

4 个答案:

答案 0 :(得分:16)

可悲的是,我认为rst不提供这种能力......桌面造型选项相当有限。也就是说,如果你要渲染HTML,你可以添加一个带有css规则的自定义样式表,例如:

table.right-align-right-col td:last-child {
    text-align: right
}

然后添加指令:

.. rst-class:: right-align-right-col

在rst文件的正上方。它很笨重但它应该有效。


更新2013-2-6:我自己需要完成这项工作,并想出了一个更持久的解决方案。 cloud_sptheme.ext.table_styling Sphinx扩展添加了用于进行列对齐,每列css类和其他表样式技巧的指令。尽管被打包为“云”Sphinx主题的一部分,但它应该适用于任何Sphinx主题。

答案 1 :(得分:5)

虽然看起来ReST实际上并不支持单元格内容对齐,但您实际上可以在单元格中使用line-blocks来强制保留空白以有效填充单元格的内容。

你必须使用一些unicode-whitespace个字符(例如U+2001 - EM QUAD)并让它们前面有一个普通的空格字符(U+0020),即U+0020U+2001Your String来停止ReST解析器抱怨格式错误的表和未终止的替换引用等。

+--------+---------+
| 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|
+--------+---------+

像上面这样的表开始看起来有点尴尬并且难以维护但是方法完成了工作。不言而喻,您还需要编辑和生成UTF-8输出。虽然rst2html.py很好地对待了这一点,但我不确定sphinx如何处理这个问题,如果可以的话,是否在生成非HTML文档时保持对齐。

答案 2 :(得分:2)

我的方法在 Docutils 生成的TeX文件上有点sed。 我们的想法是将table声明替换为符合您需求的声明。

Docutils产生类似的东西:

\begin{longtable*}[c]{p{0.086\DUtablewidth}p{0.290\DUtablewidth}}

想象一下,您想要右对齐第二列。您可能希望将其替换为:

\begin{longtable*}[c]{lr}

但是你失去了控制细胞宽度的能力。我们这里需要的是声明2 \newcolumntype,一个用于右对齐( x ),一个用于左对齐( y ):

\newcolumntype{x}[1]{% 
>{\raggedleft\hspace{0pt}}p{#1}}% 
\newcolumntype{y}[1]{% 
>{\raggedright\hspace{0pt}}p{#1}}% 

并在表声明中使用它们:

\begin{longtable*}[c]{y{7.5cm}x{2cm}}

\\换行符也必须替换为\tabularnewline

我将所有内容都放在脚本文件中,因为我在 OSX 上,并且 sed 的版本不支持使用\n替换换行符(这很糟糕你在Makefile)。

底线

在OSX / BSD上:

sed -E -f fix_table.sed < source.tex > destination.tex

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/

这有点苛刻,但没有解决方法在RestructuredText级别真正起作用。

http://en.wikibooks.org/wiki/LaTeX/Tables

http://texblog.org/2008/05/07/fwd-equal-cell-width-right-and-centre-aligned-content/

答案 3 :(得分:1)

您可以使用居中指令。我在下面包含了一个示例:

+------+-----------+------------+--------+------+------+
| Type |  .. centered:: -payload-        | crcL | crcH |
+------+-----------+------------+--------+------+------+
| Type | subType   | obj/access | -data- | crcL | crcH |
+------+-----------+------------+--------+------+------+

Here's what that looks like in HTML