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

Posted

技术标签:

【中文标题】如何右对齐 reStructuredText 简单表中的列内容?【英文标题】:How to right-align columns content in reStructuredText simple tables? 【发布时间】: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 文档类型的某些特殊标记或其他功能中? 【参考方案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 会产生类似的东西:

\beginlongtable*[c]p0.086\DUtablewidthp0.290\DUtablewidth

假设您想右对齐第二列。您可能希望将其替换为:

\beginlongtable*[c]lr

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

\newcolumntypex[1]% 
>\raggedleft\hspace0ptp#1% 
\newcolumntypey[1]% 
>\raggedright\hspace0ptp#1% 

并在表声明中使用它们:

\beginlongtable*[c]y7.5cmx2cm

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

我将所有内容都放在一个脚本文件中,因为我在 OSX 上,并且发布的 sed 版本不支持用 \n 替换换行符(当你在在Makefile)。

底线

在 OSX/BSD 上:

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

fix_table.sed:

s/\\beginlongtable\*.*/\\newcolumntypex[1]% \
>\\raggedleft\\hspace0ptp#1% \
\\newcolumntypey[1]% \
>\\raggedright\\hspace0ptp#1% \
\\beginlongtable*[c]y7.5cmx2cm/
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 选项,整个表格右对齐,而不是单元格中的值。

以上是关于如何右对齐 reStructuredText 简单表中的列内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 Twitter Bootstrap 按钮右对齐?

Node-Webkit(nwjs)如何将窗口向右对齐?

4-6如何对字符串进行左, 右, 居中对齐

C语言输出如何右对齐?

Java中如何控制右对齐输出?

一个简单的相对布局,与父右对齐不起作用