使用 longtable 和 multicolumn 进行顶部对齐

使用 longtable 和 multicolumn 进行顶部对齐

在大型表中,我想要获得以下内容:

  • 所有单元格垂直对齐到顶部
  • 左列水平居中,右列左对齐,
    如下图所示:
  • Alpha 应与 One 对齐
  • 奥地利应该与 1 对齐我认为使用 p 代替 m 应该可以解决问题但显然不行,虽然关于对齐有很多问题,但我没有找到这个特定问题的答案。

显然,这里使用长表、多列和小表格只是为了有一个接近我的实际文档的工作示例。

获得的表格垂直对齐错误

\documentclass[a4paper]{article}
\usepackage{longtable}
\usepackage{array}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{L}[1]{>{\flushleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}
\begin{document}
\begin{longtable}{| C{1cm} | C{1cm}  | L{3cm} | L{3cm} |}
\hline
\multicolumn{2}{|C{2cm}|}{
\begin{tabular}[t]{c}
    Alpha\\
    Beta\\
    Gamma\\
    Delta
\end{tabular}
}&
 \multicolumn{2}{L{6cm}|}{
 \begin{tabular}[t]{c}
    One\\
    Two
\end{tabular}
}
 \\\hline
\multicolumn{2}{|C{2cm}|}{
\begin{tabular}[t]{c}
    Austria\\
    Belgium
\end{tabular}
}&
 \multicolumn{2}{L{6cm}|}{
 \begin{tabular}[t]{c}
    1\\
    2\\
    3
\end{tabular}
}
\\\hline
\end{longtable}
\end{document}

答案1

问题在于您使用的\flushleft而不是\raggedright。是使用宏的\flushleft环境的开始(在 LaTeX 的很多地方内部使用),这恰好引入了一些垂直偏移。flushleft\trivlist

因此,要解决您的主要问题,只需使用\raggedright。下面的方法确实修复了更多问题并实现了一个\mulcol宏,该宏\multicolumn添加了代码来计算\tabcolsep跳过的列中的 s 和垂直规则(将其添加到宽度)。它假设每个包含的列旁边都有2\tabcolsep空间(这是默认值)加上垂直规则。它还假设第二个参数中的特定模式是任何标记,然后是指定宽度的组,后面是任何其他标记。

我修复的其他问题包括:

  • tabular使用@{}c@{}或类似方法抑制子列表中列周围的空白。

  • 对和都使用p类型列(这实际上是使垂直对齐正确所必需的)LC

  • 使用放在一起的列中可用的全部空间\multicolumn(这是在这里完成的\mulcol,通常您应该记住,您还会获得列之间内容的空间)。这对左对齐的列没有太大影响(只有当您使用全宽来显示内容时才能看到它),但如果您忘记了这一点,居中的列与其他列相比并不居中。

完整代码:

\documentclass[a4paper]{article}
\usepackage{longtable}
\usepackage{array}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash}p{#1}}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash}p{#1}}

\newcommand\mulcol[2]
  {%
    \mulcolA{#1}#2\endmulcolsecarg
  }
\newcommand\mulcolA{}
\long\def\mulcolA#1#2#{\mulcolB{#1}{#2}}
\newcommand\mulcolB{}
\long\def\mulcolB#1#2#3#4\endmulcolsecarg
  {%
    \multicolumn
      {#1}
      {%
        #2%
        {%
          \dimexpr
            #3%
            +#1\tabcolsep+#1\tabcolsep-2\tabcolsep
            +#1\arrayrulewidth-\arrayrulewidth
          \relax
        }%
        #4%
      }%
  }
\begin{document}
\begin{longtable}{| C{1cm} | C{1cm}  | L{3cm} | L{3cm} |}
\hline
\mulcol{2}{|C{2cm}|}{
\begin{tabular}[t]{@{}c@{}}
    Alpha\\
    Beta\\
    Gamma\\
    Delta
\end{tabular}
}&
 \mulcol{2}{L{6cm}|}{
   \begin{tabular}[t]{@{}c@{}}
    One\\
    Two
\end{tabular}
}
 \\\hline
\mulcol{2}{|C{2cm}|}{
  \begin{tabular}[t]{@{}c@{}}
    Austria\\
    Belgium
\end{tabular}
}&
 \mulcol{2}{L{6cm}|}{
 \begin{tabular}[t]{@{}c@{}}
    1\\
    2\\
    3
\end{tabular}
}
\\\hline
\end{longtable}
\end{document}

在此处输入图片描述

答案2

  • 我宁愿使用来自同名包的宏而不是在单元格内嵌套tabular环境(它基于环境,但使用时代码更短)。multicolumn\makecelltabular
  • 由于您longtable已经定义了四列,我怀疑它们都在某个地方被使用(但未在您的 mwe 中显示):

考虑到上述情况,您的表格可以写如下:

\documentclass[a4paper]{article}
\usepackage{array, longtable, makecell}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}

\begin{document}
    \begin{longtable}{| C{1cm} | C{1cm}  | L{3cm} | L{3cm} |}
\hline
\multicolumn{2}{|c|}{\makecell[tc]{
    Alpha\\
    Beta\\
    Gamma\\
    Delta}}     &
\multicolumn{2}{l|}{\makecell[tl]{
    One\\
    Two}}       \\
    \hline
\multicolumn{2}{|c|}{\makecell[tc]{
    Austria\\
    Belgium}}   &
 \multicolumn{2}{l|}{\makecell[tl]{
    1\\
    2\\
    3}}         \\
\hline
1 & 2 & 3 & 4   \\
\hline
    \end{longtable}
\end{document}

这使:

在此处输入图片描述

单元格内容的虚假垂直对齐被删除的方式与斯基尔蒙在他的回答中这样做。

相关内容