如何绘制具有正确列宽和多列项目正确居中的表格?

如何绘制具有正确列宽和多列项目正确居中的表格?

在此处输入图片描述

我想将$\omega_1$$\omega_2$项放在两列的中间。

如果我使各列的宽度相等(如下面代码中为 2em),结果会很差:

\documentclass{article}
\usepackage{array, makecell}
\NewExpandableDocumentCommand\mcc{O{1}m}%
                             {\multicolumn{#1}{c}{#2}}

\begin{document}
\begin{center}
\setcellgapes{3pt}
\makegapedcells
\begin{tabular}{c | *{2}{>{$}w{c}{2em}<{$} |}}
\mcc{}  & \mcc{$m$}     & \mcc{$\hat{m}$}     \\
\cline{2-3}
$m$       & x+2\alpha-1   & 1-\alpha-x   \\
\cline{2-3}
$\hat{m}$       & 1-\alpha-x   & x   \\
\cline{2-3}
\mcc{}  & \mcc[2]{$\omega_1$}
\end{tabular}
\hskip 21mm
\begin{tabular}{c | *{2}{>{$}w{c}{2em}<{$} |}}
\mcc{}  & \mcc{$m$}     & \mcc{$\hat{m}$}     \\
\cline{2-3}
$m$       & y   & 1-\alpha-y   \\
\cline{2-3}
$\hat{m}$       & 1-\alpha-y   & y+2\alpha-1   \\
\cline{2-3}
\mcc{}  & \mcc[2]{$\omega_2$}
\end{tabular}
\end{center}
\end{document}

在此处输入图片描述

我试图改变“3pt”,但它控制的是高度而不是宽度。

答案1

这两种环境的主要问题tabular是您将列宽设置为2em,这实在太窄了。

下面,我将示例代码从使用环境切换tabulararray环境,通过删除大量$内联数学模式启动符和终止符来简化代码。为了获得看起来紧凑的表格,我建议您测量最宽列(称为\lenA\lenB下面)的宽度,并使用这些长度而不是2em。结果显示在以下屏幕截图中表格的中间一行。

不过,仍然存在一个令人困扰的印刷问题:\omega_1\omega_2数学上讲,但不是光学的,居中。这(视觉或美学)问题是什么?\omega视觉上主导\omega_1\omega_2术语的字形没有放置在垂直规则的正下方;因此,术语\omega_1\omega_2“看起来”不在表格中居中。为了实现所需的视觉居中,我建议您将12下标术语放在\mathrlap包装器中,以便在\omega字形上执行居中。

我在以下屏幕截图的中间行和底部行中突出显示了 omega 项,以突出显示数学与光学定心问题。

在此处输入图片描述

\documentclass{article}
% pre-existing code
\usepackage{array, makecell}
\setcellgapes{3pt}
\makegapedcells
\NewExpandableDocumentCommand\mcc{O{1}m}%
                             {\multicolumn{#1}{c}{#2}}

% new code
\usepackage{mathtools} % for '\mathrlap' macro 
% measure appropriate column widths:
\newlength\lenA
\settowidth\lenA{$x+2\alpha-1$} % for left-hand side array
\newlength\lenB
\settowidth\lenB{$y+2\alpha-1$} % for right-hand side array


\begin{document}

%% original version: incorrect column widths -- why 2em ?
\[
\begin{array}{c | *{2}{w{c}{2em} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}}\\
\cline{2-3}
m       & x+2\alpha-1 & 1-\alpha-x   \\
\cline{2-3}
\hat{m} & 1-\alpha-x  & x   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega_1}
\end{array}
\hskip 21mm
\begin{array}{c | *{2}{w{c}{2em} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}} \\
\cline{2-3}
m       & y           & 1-\alpha-y   \\
\cline{2-3}
\hat{m} & 1-\alpha-y  & y+2\alpha-1   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega_2}
\end{array}
\]

%% appropriate column widths, but naive centering of \omega_i terms
\[
\begin{array}{c | *{2}{w{c}{\lenA} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}}\\
\cline{2-3}
m       & x+2\alpha-1 & 1-\alpha-x   \\
\cline{2-3}
\hat{m} & 1-\alpha-x  & x   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega_1}
\end{array}
\hskip 21mm
\begin{array}{c | *{2}{w{c}{\lenB} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}} \\
\cline{2-3}
m       & y           & 1-\alpha-y   \\
\cline{2-3}
\hat{m} & 1-\alpha-y  & y+2\alpha-1   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega_2}
\end{array}
\]

%% appropriate column widths and *optical* centering of \omega_i terms
\[
\begin{array}{c | *{2}{w{c}{\lenA} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}}\\
\cline{2-3}
m       & x+2\alpha-1 & 1-\alpha-x   \\
\cline{2-3}
\hat{m} & 1-\alpha-x  & x   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega\mathrlap{{}_1}}
\end{array}
\hskip 21mm
\begin{array}{c | *{2}{w{c}{\lenB} |}}
\mcc{}  & \mcc{m}     & \mcc{\hat{m}} \\
\cline{2-3}
m       & y           & 1-\alpha-y   \\
\cline{2-3}
\hat{m} & 1-\alpha-y  & y+2\alpha-1   \\
\cline{2-3}
\mcc{}  & \mcc[2]{\omega\mathrlap{{}_2}}
\end{array}
\]
\end{document}

答案2

你把事情弄得太复杂了,我不太清楚为什么。

您只需使用跨越第 2 列和第 3 列的多列即可将 ω 居中。

由于这一切都处于数学模式,因此使用数组比表格环境更有意义。

我的建议:

\documentclass{article}
\usepackage{array, makecell}
\NewExpandableDocumentCommand\mcc{O{1}m}%
                             {\multicolumn{#1}{c}{#2}}

\begin{document}
\renewcommand*{\arraystretch}{1.2}% controls vertical spacing
%\setlength{\arraycolsep}{5pt} % if you want to control cell padding
\[
\begin{array}{r|c|c|}
\mcc[1]{} & \mcc[1]{m} & \mcc[1]{\hat{m}} \\
\cline{2-3}
m & x+2\alpha-1 & 1-\alpha-x \\
\cline{2-3}
\hat{m} & 1-\alpha-x  & x \\
\cline{2-3}
\mcc[1]{} & \mcc[2]{\omega_1}
\end{array}
\qquad
\begin{array}{r|c|c|}
\mcc[1]{} & \mcc[1]{m} & \mcc[1]{\hat{m}} \\
\cline{2-3}
m & y & 1-\alpha-y \\
\cline{2-3}
\hat{m} & 1-\alpha-y  & y+2\alpha-1 \\
\cline{2-3}
\mcc[1]{} & \mcc[2]{\omega_2}
\end{array}
\]
\end{document}

数组

答案3

这是{NiceArray}使用 的解决方案nicematrix,它类似于经典的{array}(包 的解决方案array)。

在该环境中,有一个键可以hvlines绘制所有规则,除非存在“外部”行和列,它们由键first-collast-col和指定。first-rowlast-row

为了使两个环境的列具有相同的宽度,我使用了{NiceMatrixBlock}具有专用键的环境auto-columns-width(根据设计,此键计算的宽度不适用于外部列,而这正是我们想要的)。

\documentclass{article}
\usepackage{nicematrix}

\begin{document}

\begin{NiceMatrixBlock}[auto-columns-width]%
\NiceMatrixOptions{first-row,first-col,last-row=3,hvlines,cell-space-limits=4pt}%
$\begin{NiceArray}{cc}
        & m           & \hat{m} \\
m       & x+2\alpha-1 & 1-\alpha-x \\
\hat{m} & 1-\alpha-x  & x \\
        & \Block{1-2}{\omega_1}
\end{NiceArray}
\hspace{21mm}
\begin{NiceArray}{cc}
        & m           & \hat{m} \\
m       & y           & 1-\alpha-y \\
\hat{m} & 1-\alpha-y  & y+2\alpha-1  \\
        & \Block{1-2}{\omega_2}
\end{NiceArray}$
\end{NiceMatrixBlock}

\end{document}

您需要多次编译。

上述代码的输出

相关内容