Автоматически балансировать столбцы таблицы?

Автоматически балансировать столбцы таблицы?

Как сбалансировать столбцы такой декларации:

\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. Вам нужно вычесть правильное количество tabcolseps, которое составляет два на столбец (всего восемь для четырех столбцов). Если у вас есть вертикальные линейки, вам также нужно вычесть правильное количество arrayrulewidths.

Я 'улучшил' предыдущий пример. Если вы посмотрите на определение -column A, то теперь оно выглядит так:

\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
  1. Если вы предпочитаете выравнивание по центру или по правому краю, измените \RaggedRightна \Centeringили \RaggedLeft.
  2. Если вам нужна табличная, где общая ширина меньше полной linewidth, вы меняете (1\linewidth)на правильную дробь. Например, если вам нужна табличная 80 процентов от linewidth, вы используете (0.8\linewidth).
  3. Формула 25/100/2— это относительная ширина -столбца A, здесь 25%. Это число должно быть установлено так, чтобы сумма newcolumntypeбыла 100. Поэтому -столбец Bиспользует 75/100. Последняя цифра — это количество A-или B-столбцов.
  4. Если вы удалите левый и правый подшипники, ( @{}), количество tabcolsepвычитаемых s будет на два меньше общего количества tabcolsepts. Если у вас четыре столбца, вам придется вычесть шесть, если у вас шесть столбцов, вам придется вычесть десять,и т. д.. Формула будет -(2\tabcolsep-(\tabcolsep/<no. col.type>)). Если у вас три A-столбца, вам нужно вычесть -(2\tabcolsep-(\tabcolsep/3)).
  5. Если вы используете вертикальные правила, вам также нужно правильно распределить число 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}

введите описание изображения здесь

(красные линии обозначают границы текста)

Связанный контент