tabularx 列的重新定义不适用于所有列

tabularx 列的重新定义不适用于所有列

当我尝试让文本在tabularx单元格中垂直居中时,我观察到一种奇怪的行为。根据建议,我尝试了\renewcommand{\tabularxcolumn}[1]{m{#1}}这种方法,目前为止效果不错。但我有三列,其中只有两列似乎受到影响。这是我的 MWE

\documentclass{article}
\usepackage{tabularx,colortbl,xcolor}
\usepackage[utf8]{inputenc}
\begin{document}
\renewcommand{\tabularxcolumn}[1]{m{#1}}
   \begin{center}
      \begin{tabularx}{\textwidth}{|c|X|X|}
         \hline
         Chomsky-Typ & Name der Sprachfamilie & Automaten \\
         \hline\hline\hline
         0 & \cellcolor{lightgray!20}rekursiv aufzählbar & \cellcolor{lightgray!20}(N)DTM \\[1em]
         \hline
         \cellcolor{lightgray!20}1 & \cellcolor{lightgray!20}kontext-sensitiv & NLBA \\[1em]
         \hline
         \cellcolor{lightgray!20}3 & regulär & \cellcolor{lightgray!20}(N)DEA \\[1em]
         \hline
         hu & ha & he \\[1em]
         \hline
      \end{tabularx}
   \end{center}
\end{document}

以下是输出。如您所见,右X列未受影响。

我很困惑。我到底错过了什么?

答案1

这是因为额外的空间\\[1em]被有效地添加到行中最后一个单元格内的文本中,从而阻止该单元格居中 - 参见这里

因此,为了使您的内容居中并且能够指定行高,您需要在表中添加另一个空列,如下所示:

\documentclass{article}
\usepackage{tabularx,colortbl,xcolor}
\usepackage[utf8]{inputenc}
\begin{document}
\newlength\origtabcolsep
\origtabcolsep=\tabcolsep
\tabcolsep=0pt
\renewcommand{\tabularxcolumn}[1]{m{#1}}
\newcolumntype{e}{>{\hsize=0pt}X}
\newcolumntype{x}{>{\hskip\origtabcolsep}X<{\hskip\origtabcolsep}}
\newcolumntype{C}{>{\hskip\origtabcolsep}c<{\hskip\origtabcolsep}}
   \begin{center}
      \begin{tabularx}{\textwidth}{|C|x|xe|}
         \hline
         Chomsky-Typ & Name der Sprachfamilie & Automaten &\\
         \hline\hline\hline
         0 & \cellcolor{lightgray!20}rekursiv aufzählbar & \cellcolor{lightgray!20}(N)DTM &\\[1em]
         \hline
         \cellcolor{lightgray!20}1 & \cellcolor{lightgray!20}kontext-sensitiv & NLBA &\\[1em]
         \hline
         \cellcolor{lightgray!20}3 & regulär & \cellcolor{lightgray!20}(N)DEA & \\[1em]
         \hline
         hu & ha & he &\\[1em]
         \hline
      \end{tabularx}
   \end{center}
\tabcolsep=\origtabcolsep
\end{document}

输出表

空柱的规范灵感来自于编辑:我通过引入允许临时\tabcolsep设置的新列类型来修复表格右侧的空白。0pt

答案2

我建议另一种方法:使用cellspace包,定义单元格顶部和上方单元格之间的最小垂直间距,同样定义单元格底部和下方单元格顶部之间的最小间距。 剩下的就是在列说明符前加上前缀。 默认S情况下,它与l, r, c说明符一起使用,如果您在序言中声明了类型,它也可以与类型一起X使用。 以下是一个示例(值可以根据您的喜好进行调整):

\documentclass{article}
\usepackage{tabularx,colortbl,xcolor}
\usepackage[utf8]{inputenc}
\renewcommand{\tabularxcolumn}[1]{m{#1}}

\usepackage{cellspace}
\setlength\cellspacetoplimit{10pt}
\setlength\cellspacebottomlimit{10pt}
\addparagraphcolumntypes{{X}}


\begin{document}

   \begin{center}
      \begin{tabularx}{\textwidth}{|c|X|S{X}|}
         \hline
         Chomsky-Typ & Name der Sprachfamilie & Automaten    \\
         \hline\hline\hline
         0 & \cellcolor{lightgray!20}rekursiv aufzählbar & \cellcolor{lightgray!20}(N)DTM  \\
         \hline
         \cellcolor{lightgray!20}1 & \cellcolor{lightgray!20}kontext-sensitiv & NLBA \\
         \hline
         \cellcolor{lightgray!20}3 & regulär & \cellcolor{lightgray!20}(N)DEA \\
         \hline
         hu & ha & he \\
         \hline
      \end{tabularx}
   \end{center}

\end{document} 

在此处输入图片描述

相关内容