【问题标题】:How to right-align columns content in reStructuredText simple tables?如何右对齐 reStructuredText 简单表中的列内容?
【发布时间】:2011-11-12 23:24:29
【问题描述】:

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

我有一个 simple table(与 grid table 相对),其中最右边的列报告包含我想右对齐的数字,但我不能不知道如何实现。

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

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

【问题讨论】:

  • reStructuredText 不支持任何东西的右对齐。我认为,您只能手动设置样式。不过,好问题。 +1
  • @mac 你使用什么 Python 版本?你的文件中有哪些类型的列:第二列总是数字?,第一列总是在开头的字母?第一列和第二列之间有什么样的分隔(几个空格?空格的最小数量?制表符?给定宽度?...)
  • @eyquem - 嗯......从那种问题,我猜你误解了我......但这里有答案:2.7.1+ |取决于什么 .rst 文件和文件中的什么表 |取决于 |几个空白| 1.
  • @mac reStructuredText 不支持您想要的功能,根据 Chris Morgan 的说法,我认为您必须考虑在创建每个文件后对其进行特殊处理,借助内置字符串的方法或需要的正则表达式。但是我不理解这个问题的可能性是很现实的。您的意思是您希望将右对齐编码在 reStructuredText 文档类型的某些特殊标记或其他功能中?

标签: python alignment python-sphinx restructuredtext tabular


【解决方案1】:

遗憾的是,我不认为 rst 提供这种能力......表格样式选项相当有限。也就是说,如果您要渲染为 HTML,则可以添加带有 css 规则的自定义样式表,例如:

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

然后添加指令:

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

就在第一个文件中您的表格上方。它很笨重,但它应该可以工作。


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

【讨论】:

  • 谢谢伊莱。我最终选择了一个具有丑陋表格的主题(agogo),所以 - 虽然我会努力改进它,但我也会使用你的 sn-p。
【解决方案2】:

虽然看起来 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 文档时是否保持对齐。

【讨论】:

  • 感谢您的建议。 :) 我觉得它在概念上很有趣,但我相信维护与不可见的非空格空白相关的文档实际上非常困难......
【解决方案3】:

我的做法是在 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/

【讨论】:

  • 谢谢。我自己在 GNU/Linux 上,但是 +1 以获得清晰而有用的解释! :)
  • 这应该可以在没有 -E 修饰符的 GNU/Linux 上工作。您可以在 Sed 中使用 \n 而不是真正的换行符。
【解决方案4】:

您可以使用 centered 指令。我在下面提供了一个示例:

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

Here's what that looks like in HTML

【讨论】:

  • 刚刚意识到标题是右对齐,而不是居中...哎呀
【解决方案5】:

从 Docutils 0.13(2016 年末)开始,table directive 支持 align 选项。


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

您的样式表需要支持.align-right class

【讨论】:

  • 这会右对齐整个表格,不是吗?问题是关于右对齐最右列中的值。
  • 不。它右对齐每个单元格中的值,但表格左对齐。请参阅georgevreilly.com/blog/2019/09/15/use-for-octal.html 处呈现的表格
  • 我指的是 Sphinx 和 Docutils 的默认行为,没有任何 CSS 自定义。我尝试了“read_the_docs”、“nature”和“classic”主题。使用:align: right 选项,整个表格右对齐,而不是单元格中的值。
猜你喜欢
  • 2011-07-03
  • 2017-08-31
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多