tabularx 和 siunitx 问题

tabularx 和 siunitx 问题

以下文件中表格的最后两列对齐不正确。我似乎不知道哪里出了问题。

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs,tabularx,float}
\usepackage[add-decimal-zero = true,add-integer-zero = true,round-integer-to-decimal,round-mode = places,round-precision=1]{siunitx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr3\hsize+4\tabcolsep\relax}C}{#2}}
\newcommand{\mcone}[1]{\multicolumn{1}{C}{#1}}
\begin{document}

\begin{table}
\caption{\label{orgc39fb42}
Prevalence of Undernourishment estimated for India with different parameter estimates}
\begin{tabularx}{\textwidth}{lS[table-format=1.3,round-precision=3]S[table-format=1.3,round-precision=3]S[table-format=2,round-precision=0]S[table-format=2,round-precision=0]}
\toprule
Mean & \mcone{CV} & \mcone{Skew} & \mcx{2}{Prev of Unment and met} \\
 &  &  & \mcone{MPEX=1791} & \mcone{MPEX=2037}\\
\midrule
2455 & 0.25 & 0.55 & 15 & 23\\
2455 & 0.294 & 0.528 & 18 & 26\\
2135 & 0.294 & 0.528 & 27 & 39\\
\bottomrule
\end{tabularx}
\end{table}


\end{document}

答案1

的定义\mcx有错误。可以用不同的方法纠正,但对我来说最简单的方法如下:-)

\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize 
                                        + #1\tabcolsep + #1\tabcolsep\relax}C|}{#2}}

除此之外,我会删除siunitx在加载包时设置的选项,并将本地需求写入sisetup本地采用的选项。

一套完整的姆韦是:

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs,tabularx,float}
\usepackage{siunitx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize
                                        + #1\tabcolsep + #1\tabcolsep\relax}C|}{#2}}
\newcommand{\mcone}[1]{\multicolumn{1}{C}{#1}}

\begin{document}
    \begin{table}
\caption{\label{orgc39fb42}
    Prevalence of Undernourishment estimated for India with different parameter estimates}
\begin{tabularx}{\textwidth}{l
                 S[table-format=1.3]
                 S[table-format=1.3]
                 S[table-format=2.0]
                 S[table-format=2.0]
                            }
    \toprule
Mean    & \mcone{CV}    & \mcone{Skew}  & \mcx{2}{Prev of Unment and met}       \\
        &               &               & \mcone{MPEX=1791} & \mcone{MPEX=2037} \\
    \midrule
2455    & 0.25          & 0.55          & 15                & 23                \\
2455    & 0.294         & 0.528         & 18                & 26                \\
2135    & 0.294         & 0.528         & 27                & 39                \\
    \bottomrule
\end{tabularx}
    \end{table}

这使

在此处输入图片描述

看看下表是否也对您来说更好:

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[skip=1ex]{caption}
\usepackage{booktabs,tabularx}
\usepackage{siunitx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize
                                        + #1\tabcolsep + #1\tabcolsep\relax}C}{#2}}
\newcommand{\mcone}[1]{\multicolumn{1}{C}{#1}}

\begin{document}
    \begin{table}
\caption{\label{orgc39fb42}
    Prevalence of Undernourishment estimated for India with different parameter estimates}
\begin{tabularx}{\textwidth}{l
                 S[table-format=1.3]
                 S[table-format=1.3]
                 S[table-format=2.0]
                 S[table-format=2.0]
                            }
    \toprule
        &               &               & \mcx{2}{Prev of Unment and met}       \\
    \cmidrule(lr){4-5}
Mean    & \mcone{CV}    & \mcone{Skew}  & \mcone{MPEX=1791} & \mcone{MPEX=2037} \\
    \midrule
2455    & 0.25          & 0.55          & 15                & 23                \\
2455    & 0.294         & 0.528         & 18                & 26                \\
2135    & 0.294         & 0.528         & 27                & 39                \\
    \bottomrule
\end{tabularx}
    \end{table}
\end{document}

在此处输入图片描述

笔记: 在定义中\multicolumn考虑tabularx列类型时,Xtabularx多列单元格的宽度考虑,仅考虑单元格内容的最大宽度,而不是单元格的宽度。换句话说

\multicolumn{2}{>{\hsize=2\hsize}X}{...}

不考虑tabcolsep这两列中的所有空格,因此multicolumn单元格对于四个空格来说更窄tabcolsep。因此,上面定义了“\newcommand\mcx{...}”的广义解决方案(通过它更简单的排版表)姆韦作为:

\newcolumntype{C}{>{\centering\arraybackslash}X}% definition of `C`
\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize
                                        + #1\tabcolsep 
                                        + #1\tabcolsep\relax}
                                      C}{#2}}

或简称:

\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize
                                        + #1\tabcolsep2 \relax}
                                      C}{#2}}

答案2

您可能对如何排版跨越两个标题单元格的字符串的问题想得太多了,尤其是当需要排版的字符串相当短时。\mcx我不会摆弄宏,而是使用一个简单的\multicolumn{2}{c}{...}指令来排版相关字符串。(是的,这就是全部!)

为了给标题提供更多的视觉结构,我还提供了一个\cmidrule(l){4-5}指令。

在此处输入图片描述

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs,tabularx,float}
\usepackage[add-decimal-zero = true,
            add-integer-zero = true,
            round-integer-to-decimal,
            round-mode = places,
            round-precision=1]{siunitx}
\newcolumntype{C}{>{\centering\arraybackslash}X}

\newcommand{\mcone}[1]{\multicolumn{1}{C}{#1}}
\begin{document}

\begin{table}
\caption{Prevalence of Undernourishment estimated for India with 
different parameter estimates} \label{orgc39fb42}
\begin{tabularx}{\textwidth}{ l
   S[table-format=1.3,round-precision=3]
   S[table-format=1.3,round-precision=3]
   S[table-format=2,round-precision=0]
   S[table-format=2,round-precision=0]}
\toprule
Mean & \mcone{CV} & \mcone{Skew} & 
   \multicolumn{2}{c}{Prev of Unment and met} \\
   \cmidrule(l){4-5} % <--- new
 &  &  & \mcone{MPEX=1791} & \mcone{MPEX=2037}\\
\midrule
2455 & 0.25  & 0.55  & 15 & 23\\
2455 & 0.294 & 0.528 & 18 & 26\\
2135 & 0.294 & 0.528 & 27 & 39\\
\bottomrule
\end{tabularx}
\end{table}

\end{document}

附录:上述方法之所以有效,是因为要排版的字符串相对较短 —— 具体来说,它的宽度小于 2 个基本C列。如果您有另一个包含较长字符串的表格,或者字符串需要跨越 3 个(或更多!)列,您可能需要重新定义宏,\mcx如下所示:

\newcommand{\mcx}[2]{\multicolumn{#1}%
  {>{\hsize=\dimexpr #1\hsize +\numexpr2*#1-2\relax\tabcolsep \relax}C}%
  {#2}}

然后将字符串排版为\mcx{2}{Prev of Unment and met}。(你可以自己验证\mcx{2}{Prev of Unment and met}和生成的解决方案\multicolumn{2}{c}{Prev of Unment and met}是相同的。)

这种修改后的形式如何(为什么)起作用\mcx?假设有n列需要由字符串跨越,该字符串可能比列长(因此可能需要自动换行)。每个底层列n的可用宽度为,其总宽度(包括两侧的空白填充)为。因此,类型列的总宽度为。由于组合列的总宽度应等于此长度,因此C\hsize\hsize+2\tabcolsepnCn\hsize+2n\tabcolsep可用的合并列的宽度为n\hsize+2(n-1)\tabcolsep。用 TeX 语法表达此计算结果为

\hsize=\dimexpr #1\hsize +\numexpr2*#1-2\relax\tabcolsep \relax

C这就是定义中给出的“前缀” \mxc。(请自行验证 的计算\numexpr2*#1-2\relax\tabcolsep结果为2(n-1)。)

答案3

看看@Zarko 和@Mico 的答案是否更正确。就留在这里,直到看到其中一个答案被接受

如果您不喜欢我评论中的答案,请尝试以下操作:

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{booktabs,tabularx,float}
\usepackage[add-decimal-zero = true,add-integer-zero = true,round-integer-to-decimal,round-mode = places,round-precision=1]{siunitx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\newcommand{\mcx}[2]{\multicolumn{#1}{>{\hsize=\dimexpr#1\hsize+\numexpr#1-1\relax\tabcolsep\relax}C}{#2}}
\newcommand{\mcone}[1]{\multicolumn{1}{C}{#1}}
\begin{document}

\begin{table}
\caption{\label{orgc39fb42}
Prevalence of Undernourishment estimated for India with different parameter estimates}
\begin{tabularx}{\textwidth}{lS[table-format=1.3,round-precision=3]S[table-format=1.3,round-precision=3]S[table-format=2,round-precision=0]S[table-format=2,round-precision=0]}
\toprule
Mean & \mcone{CV} & \mcone{Skew} & \mcx{2}{Prev of Unment and met} \\
 & &  & \mcone{MPEX=1791} & \mcone{MPEX=2037}\\
\midrule
2455 & 0.25 & 0.55 & 15 & 23\\
2455 & 0.294 & 0.528 & 18 & 26\\
2135 & 0.294 & 0.528 & 27 & 39\\
\bottomrule
\end{tabularx}
\end{table}


\end{document}

我已经改变了你的 mcx 定义。

相关内容