
Я столкнулся с простой проблемой, но не могу найти ее решение. Я хочу создать матрицу, где все элементы в строке имеют одинаковую ширину. Вот так:
Мой подход был 12 столбцов (+1 начальный столбец) и затем работа с несколькими столбцами. Проблема, которую я получаю, заключается в том, что строки не масштабируются до той же ширины, что на этой картинке.
Я попробовал tabularx, как в этом вопросе, но это не сработало так, как хотелось бы. (Использование 12 раз X в качестве заголовка)Расстояние между таблицами, несколько столбцов
Может ли кто-нибудь объяснить мне, в чем ошибка, из-за которой tabularx тоже не работает?
Код для простой табличной среды
\documentclass{article}
\begin{document}
\begin{table}[h]
\begin{tabular}{|c|cllcclclccll|}
\hline
N & \multicolumn{12}{c|}{Chance} \\ \hline
1 & \multicolumn{12}{c|}{100} \\ \hline
2 & \multicolumn{6}{c|}{50} & \multicolumn{6}{c|}{50} \\ \hline
3 & \multicolumn{4}{c|}{22} & \multicolumn{4}{c|}{56} & \multicolumn{4}{c|}{22} \\ \hline
4 & \multicolumn{3}{c|}{12.5} & \multicolumn{3}{c|}{37.5} & \multicolumn{3}{c|}{37.5} & \multicolumn{3}{c|}{12.5} \\ \hline
\end{tabular}
\end{table}
\end{document}
решение1
Со столбцами фиксированной ширины:
\documentclass{article}
\usepackage{array}
\newlength{\blockwidth}
\begin{document}
\begin{table}[htp]
\centering
% local settings
\setlength{\blockwidth}{0.5cm}
\newcommand{\block}[2]{% #1 = number of blocks to span, #2 = text
\multicolumn{#1}{w{c}{\dimeval{#1\blockwidth+10\arrayrulewidth*\f{#1}/#1}}|}{#2}%
}
\newcommand{\f}[1]{\inteval{4*(#1-3)}}
%%%
\begin{tabular}{|>{$\vphantom{\bigg|}}c<{$}|*{12}{c}}
\hline
N & \block{12}{Chance} \\ \hline
1 & \block{12}{100} \\ \hline
2 & \block{6}{50} & \block{6}{50} \\ \hline
3 & \block{4}{22} & \block{4}{56} & \block{4}{22} \\ \hline
4 & \block{3}{12.5} & \block{3}{37.5} & \block{3}{37.5} & \block{3}{12.5} \\ \hline
\end{tabular}
\caption{A caption}
\end{table}
\end{document}
Вероятно, ТикВ этом случае лучше использовать подход на основе Z. Или, может быть, даже дерево вместо таблицы.
решение2
Просто ради развлечения:
\multicolumn
помещает все «лишнее» пространство в последний используемый столбец, и многие из этих столбцов никогда не используются по отдельности.
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\begin{table}[h]
\begin{tabularx}{\textwidth}{|c|XXXXXXXXXXXX|}
\hline
&&&&&&&&&&&& \\[-\normalbaselineskip]% hidden
N & \multicolumn{12}{c|}{Chance} \\ \hline
1 & \multicolumn{12}{c|}{100} \\ \hline
2 & \multicolumn{6}{c|}{50} & \multicolumn{6}{c|}{50} \\ \hline
3 & \multicolumn{4}{c|}{22} & \multicolumn{4}{c|}{56} & \multicolumn{4}{c|}{22} \\ \hline
4 & \multicolumn{3}{c|}{12.5} & \multicolumn{3}{c|}{37.5} & \multicolumn{3}{c|}{37.5} & \multicolumn{3}{c|}{12.5} \\ \hline
\end{tabularx}
\end{table}
\end{document}
решение3
Я не уверен, что вы это имеете в виду, но если вы хотите, чтобы размеры ячеек были пропорциональны числам, вы можете использовать TiкZ chains
. По сути, первый столбец — это цепочка, называемая n
идущей вниз, а каждая пронумерованная строка — это цепочка, идущая вправо. Проверка ошибок отсутствует, поэтому ваши строки могут быть короче или длиннее 100.
Вы можете изменить значение, \widthfactor
чтобы отрегулировать ширину таблицы.
Также есть необязательный аргумент, который может установить TiкПараметры Z для всей таблицы, например:
\chancetable[thick, orange, text=blue]{{100},{50,50},{22,56,22},{12.5,37.5,37.5,12.5}}
должно сработать.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\newcommand{\widthfactor}{1}
\tikzset{rect/.style={draw, minimum width=#1, minimum height=5mm, inner sep=0pt}}
\newcommand{\chancetable}[2][]{\tikz[node distance=-\pgflinewidth, #1]{
\node[rect=\widthfactor*5mm, start chain=n going below](N0){N}; \node[rect=\widthfactor*100mm, right=of N0]{Chance};
\foreach \r[count=\n, evaluate=\n as \k using {int(\n-1)}] in {#2} {
\node[rect=\widthfactor*5mm, below=of N\k, start chain=\n, on chain=\n](N\n){\n};
\foreach \p in \r {\node[on chain=\n, rect=\widthfactor*\p mm]{\p};}
}
}}
\begin{document}
\chancetable{{100},{50,50},{22,56,22},{12.5,37.5,37.5,12.5}}
\end{document}