如何右对齐 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 简单表中的列内容?的主要内容,如果未能解决你的问题,请参考以下文章