长表同一行单元格垂直居中的问题

长表同一行单元格垂直居中的问题

这个问题是跟进上一个问题的:在主长表的单元格中垂直居中子表

我正在使用以下代码:

\documentclass{article}
\usepackage{longtable}
\usepackage{array}
\usepackage{xparse}
\usepackage{lipsum}

\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}

\NewDocumentCommand{\TB}{O{c} m O{c}}{%
    \begin{tabular}[#1]{@{}#3@{}}#2\end{tabular}
}

\renewcommand*{\arraystretch}{1.15}

\begin{document}
    \begin{longtable}{|L{6cm}|C{2cm}|C{2cm}|}
        \caption{Your table caption} \label{tab:my_label} \\
        \hline
        header 1  & header 2    & header 3 \\
        \hline
        \endhead
        \lipsum[1]      & \TB{a1\\a2} & \TB{b1\\b2\\b3} \\
        \hline
        row2      & a3          & \TB[t]{b4\\b5} \\
        \hline
        row3      & a4          & \TB[b]{b6\\b7} \\
        \hline
    \end{longtable}
\end{document}

不幸的是,第一行的单元格没有垂直居中:

在此处输入图片描述

你能帮帮我吗?谢谢!

答案1

L我建议您将、CR列类型的底层列类型从 切换pm。 (m我想是“中间”的助记符。)

在此处输入图片描述

\documentclass{article}
\usepackage{longtable,array,xparse,lipsum}

\newcolumntype{L}[1]{>{\raggedright\arraybackslash}m{#1}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}m{#1}}

\NewDocumentCommand{\TB}{O{c} m O{c}}{%
    \begin{tabular}[#1]{@{}#3@{}}#2\end{tabular}
}

\renewcommand*{\arraystretch}{1.15}

\begin{document}
    \begin{longtable}{|L{6cm}|C{2cm}|C{2cm}|}
        \caption{Your table caption} \label{tab:my_label} \\
        \hline
        header 1  & header 2    & header 3 \\
        \hline
        \endhead
        
        \lipsum[1][1-8] & \TB{a1\\a2} & \TB{b1\\b2\\b3} \\
        \hline
    \end{longtable}
\end{document}

答案2

像这样?

在此处输入图片描述

(红线表示页面布局)

通过使用longtblrtabularray,MWE 的代码简单而简洁:

\documentclass{article}
%--------------- show page layout. don't use in a real document!
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}
%
\usepackage{lipsum}                             % for dummy text
%---------------------------------------------------------------%
\usepackage{ragged2e}
\usepackage{tabularray}
\SetTblrStyle{contfoot}{font=\small\itshape}

\begin{document}
    \begin{longtblr}[
caption = {Your table caption},
  label = {tab:my_label}
                    ]{hlines, vlines,
                      colspec = {X[m, cmd={\RaggedRight\hspace{0pt}}] *{2}{Q[c, m]}},
                      rowhead = 1
                      }
header 1    &    header 2   &   header 3        \\
% table body
\lipsum[1]  &   {a1\\a2}    &   {b1\\b2\\b3}    \\
row2        &   a3          &   {b4\\b5}        \\
row3        &   a4          &   {b6\\b7}        \\
    \end{longtblr}
\end{document}

编辑:

  • 正如您所看到的,我擅自对您的表格进行了一点重新设计,根据我的意见,这使得表格更漂亮:
    • 最后两列有自然宽度,
    • 第一列的宽度占据了其余的宽度\textwidth
  • 通过使用和列规范m中的选项,单元格中的内容垂直居中。XQ
  • 有关tabularray软件包的更多详细信息,请参阅软件包文档,其中包含简明的解释和大量示例。您的问题可能对以下内容感兴趣:
  • 除了标准tabular对齐c(水平居中)之外l,还r引入了f(在单元格底部)、h(在单元格顶部)和m(在中间,垂直居中),它们也可以用作和Q单元格中的选项X(稍后从包中了解tabularx
  • 对于手动拆分单元格的内容,引入了简单的语法{<first line>\\<second line>\\ ... }
  • 对于多列和多行单元格的定义SetCell[c=<number od columns>]{<aligning of contents} cell contentSetCell[r=<number od columns>]{<aligning of contents} cell content
  • 其他有用的功能包括:
  • 自动添加继续下一页的长表格标题和“表格脚注继续下页
  • rowhead = <number>包含列标题的行的重复由表格序言中的指令决定。

相关内容