Как правильно выровнять содержимое столбцов в простых таблицах reStructuredText? - PullRequest
25 голосов
/ 08 сентября 2011

Я редактирую документацию для моего проекта с использованием Sphinx , который в свою очередь использует reStructuredText в качестве языка разметки.

У меня есть простая таблица (в отличие от таблица сетки ), в которой самые правые столбцы отчетов содержат числа, которые я хотел бы выровнять по правому краю, но я не смог найти, как этого добиться.

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

Я был бы рад перейти на таблицу сетки , если это позволило бы мне решить проблему.

Ответы [ 3 ]

16 голосов
/ 08 сентября 2011

К сожалению, я не думаю, что первая предлагает такую ​​возможность ... варианты оформления таблицы довольно ограничены.Тем не менее, если вы визуализируете в HTML, вы можете добавить пользовательскую таблицу стилей с правилом css, например:

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

, а затем добавить директиву:

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

прямо вышеВаша таблица в первом файле.Это неуклюже, но должно работать.


update 2013-2-6: С тех пор мне нужно было сделать это самостоятельно, и я нашел более постоянное решение.Расширение cloud_sptheme.ext.table_styling Sphinx добавляет директивы для выполнения выравнивания столбцов, классов CSS для каждого столбца и ряда других приемов стилевого оформления таблицы.Несмотря на то, что он упакован как часть «облачной» темы Sphinx, он должен работать с любой темой Sphinx.

5 голосов
/ 03 января 2012

Хотя кажется, что ReST на самом деле не поддерживает выравнивание содержимого ячейки, вы можете использовать строковые блоки внутри своей ячейки, чтобы обеспечить сохранение пробелов для эффективного заполнения содержимого вашей ячейки.

Вам нужно будет использовать некоторые из символов юникода-пробела символов (например, 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 голосов
/ 20 февраля 2012

Мой подход - немного sed для файла TeX, сгенерированного Docutils . Идея состоит в том, чтобы заменить объявление table на то, что соответствует вашим потребностям.

Документы производят что-то вроде этого:

\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/

...