![Автоматически балансировать столбцы таблицы?](https://rvso.com/image/399824/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D0%B1%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%81%D1%82%D0%BE%D0%BB%D0%B1%D1%86%D1%8B%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B%3F.png)
Как сбалансировать столбцы такой декларации:
\begin{tabularx}{\linewidth}{
>{\hsize=0.4\hsize}X% 10% of 4\hsize
>{\hsize=1.6\hsize}X% 30% of 4\hsize
>{\hsize=0.4\hsize}X% 10% of 4\hsize
>{\hsize=1.6\hsize}X% 30% of 4\hsize
}
\end{tabularx}
Очевидно, что значения 0.4
и 1.6
должны быть скорректированы автоматически во время сборки...
Пример:
.--------- Same width ---------------.
| |
<----+---> <---+---->
┌────────┬────────────────────────────┬────────┬───────────────────────────┐
│ A │ B │ A │ B │
├────────┼────────────────────────────┼────────┼───────────────────────────┤
│ 132132 │ Sed rutrum elit quis neque │ 42 │ Cras porta │
└────────┴────────────────────────────┴────────┴───────────────────────────┘
<------------+---------------> <-------------+------------->
| |
'------------- Same width -------------'
Где нечетные столбцы имеют размер A
, а четные — размер B
? При этом я гарантирую, что столбцы 1 и 3 всегда имеют одинаковый размер, а столбцы 2 и 4 равномерно распределены в пространстве.
Другими словами, минимальная ширина столбцов определяется следующим образом:
min_widths[0] = min_widths[2] = max(map(width, columns[0] + columns[2]))
min_widths[1] = min_widths[3] = max(map(width, columns[1] + columns[3]))
Затем все растягивается, чтобы поместиться в \linewidth
:
if sum(min_widths) > \linewidth:
% Attempts to wrap some text and reduce the column sizes
else:
widths = map(lambda x: x * (\linewidth / sum(min_widths), min_widths)
Хорошими параметрами для такой функции были бы:
- Column alignment: left, center, right, raggedleft, raggedright
- Maximum width: e.g. 10em
- Minimum width: e.g. 0em
- Desired width ratio: 1
- Automatic wrapping: yes, no
решение1
Вот решение с {NiceTabular}
( nicematrix
≥ 6.25a). В этой среде у вас есть ключ columns-width=auto
, который требует, чтобы все столбцы имели одинаковую ширину, за исключением X
столбцов (которые похожи на X
столбцы tabularx
).
\documentclass{article}
\usepackage{nicematrix}
\usepackage{lipsum} % for dummy text
\begin{document}
\lipsum[1]
\begin{center}
\begin{NiceTabular}{lXlX}[columns-width=auto,hvlines]
A & B & A & B \\
132132 & Sed rutrum elit quis neque & 42 & Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
fringilla ultrices.
\end{NiceTabular}
\end{center}
\lipsum[2]
\end{document}
решение2
ИЗМЕНИТЬ 20190807В конце ответа я включил код, который я рекомендую, представляющий собой объединение моего ответа и ответа Зарко.
Вы можете использовать tabular
целое linewidth
, вычислив ширину p{}
-столбцов как дроби linewidth
. Просто убедитесь, что общее количество ширин столбцов накапливается до linewidth
. Вам нужно вычесть правильное количество tabcolsep
s, которое составляет два на столбец (всего восемь для четырех столбцов). Если у вас есть вертикальные линейки, вам также нужно вычесть правильное количество arrayrulewidth
s.
Я 'улучшил' предыдущий пример. Если вы посмотрите на определение -column A
, то теперь оно выглядит так:
\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
- Если вы предпочитаете выравнивание по центру или по правому краю, измените
\RaggedRight
на\Centering
или\RaggedLeft
. - Если вам нужна табличная, где общая ширина меньше полной
linewidth
, вы меняете(1\linewidth)
на правильную дробь. Например, если вам нужна табличная 80 процентов отlinewidth
, вы используете(0.8\linewidth)
. - Формула
25/100/2
— это относительная ширина -столбцаA
, здесь 25%. Это число должно быть установлено так, чтобы суммаnewcolumntype
была 100. Поэтому -столбецB
использует75/100
. Последняя цифра — это количествоA
-илиB
-столбцов. - Если вы удалите левый и правый подшипники, (
@{}
), количествоtabcolsep
вычитаемых s будет на два меньше общего количестваtabcolsept
s. Если у вас четыре столбца, вам придется вычесть шесть, если у вас шесть столбцов, вам придется вычесть десять,и т. д.. Формула будет-(2\tabcolsep-(\tabcolsep/<no. col.type>))
. Если у вас триA
-столбца, вам нужно вычесть-(2\tabcolsep-(\tabcolsep/3))
. - Если вы используете вертикальные правила, вам также нужно правильно распределить число
arrayruleswidth
. Я оставляю вам это в качестве упражнения.
Выше я предполагал, что вы будете использовать равное количество столбцов каждого типа (ABAB, ABBA, ABBBAA).и т. д..). При автоматизированном расчете необходимо учитывать, что количество типов столбцов не обязательно будет одинаковым (у вас может быть ABBAA, ABABA,и т. д..). Так что вы легко получите очень сложный пакет. Вероятно, лучше использовать калькулятор или ручку и бумагу, чтобы зафиксировать ширину столбца. Очевидно, это намного быстрее, чем программировать в LaTeX.
Внимание! Я подчеркиваю это tabularx
и tabulary
уже сделал все расчеты за вас. Однако, взгляните на раздел 4.3 в -руководстве tabularx
.
Ниже я привожу код для таблицы с шестью столбцами:
\documentclass{article}
\usepackage{array, booktabs, ragged2e}
\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\newcolumntype{B}{>{\Centering\arraybackslash}p{\dimexpr(1\textwidth)*75/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\usepackage{showframe}
\renewcommand*\ShowFrameColor{\color{red}}
\renewcommand*\ShowFrameLinethickness{.4pt}
\setlength{\tabcolsep}{2pt}
\begin{document}
{\centering
\begin{tabular}{@{}ABABBA@{}}
\toprule
A & B & A & B & A & B\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text & Wide centered column, which has lots of text & Short left alig\-ned column \\
\bottomrule
\end{tabular}%
}
\end{document}
Рекомендуемый пример кода
\documentclass{article}
\usepackage{booktabs, ragged2e}
\usepackage{tabularx}
\newcolumntype{D}{>{\small\RaggedRight\arraybackslash\hsize=0.4\hsize}X}
\newcolumntype{E}{>{\small\Centering\arraybackslash\hsize=1.6\hsize}X}
\setlength{\tabcolsep}{1.5pt}
\begin{document}
\noindent\begin{tabularx}{\linewidth}{@{}DEDEED@{}}
\toprule
D & E & D & E & E & D\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text & Wide centered column, which has lots of text & Short left alig\-ned column \\
\bottomrule
\end{tabularx}
\end{document}
решение3
Насколько я понял вопрос, таблицы должны иметь ширину, равную ширине текста. Так что я не вижу никаких преимуществ (может из-за отпуска?) почемунетиспользовать tabularx
, как я предложил в своем комментарии ниже вопрос:
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{2}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
\hline
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
\hline
\end{tabularx}
\caption{Four column}
\end{table}
\begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{3}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
\hline
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx
& xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
\hline
\end{tabularx}
\caption{Sixt column}
\end{table}
\end{document}
(красные линии обозначают границы текста)