如何在没有垂直间距的表格中换行?

如何在没有垂直间距的表格中换行?

我正在构建一个表格,需要在一列的每个单元格中设置换行符。我发现了以下示例:如何在表格单元格内添加强制换行符

以下是代码:

\documentclass{article}
\newcommand{\head}[1]{\textnormal{\textbf{#1}}}
\usepackage[english]{babel}
\usepackage{blindtext}
\newcommand{\specialcell}[2][c]{%
  \begin{tabular}[#1]{@{}c@{}}#2\end{tabular}}

\begin{document}
\begin{tabular}{ccp{8cm}}
  \hline
  \head{Command} & \head{Declaration} & \head{Output}\\
  \hline
  \verb|\textrm| & \specialcell[t]{First one\\foobar\\again} & small test example\\ \hline
  \verb|\textrm| & \specialcell[t]{First one\\foobar\\again} & small test example\\ \hline
  \verb|\textrm| & \specialcell[t]{First one\\foobar\\again} & small test example\\
  \hline
\end{tabular}
\end{document}

问题是第二列中的元素没有左对齐。我该如何将它们左对齐?

代码输出

编辑:我已按照 Bernhard 的建议进行了更正,见下文。现在的最后一个问题是,如果列仅包含一个条目,则该条目与第二个表中的其他条目不对齐。这也可以解决吗?

\documentclass{article}

\usepackage[english]{babel}

\usepackage{makecell, booktabs, stackengine}
\renewcommand\theadfont{\bfseries}
\renewcommand\theadalign{lc}
\renewcommand\cellalign{tl}

\usepackage{stackengine}
\setstackEOL{\\}

\begin{document}

\begin{tabular}{ccp{8cm}}
  \toprule
  \thead{Command} & \thead{Declaration} & \thead{Output}\\
  \midrule
  \verb|\textrm| & \makecell{First one\\foobar\\again} & small test example\\
  \midrule
  \verb|\textrm| & \makecell[tl]{Fi} & small test example\\
  \midrule
  \verb|\textrm| & \makecell[tl]{First one\\foobar\\again} & small test example\\
  \bottomrule
\end{tabular}
\vskip 1cm

\begin{tabular}{ccp{8cm}}
  \toprule
  \thead{Command} & \thead{Declaration} & \thead{Output}\\
  \midrule
  \verb|\textrm| & \Shortunderstack[l]{First one\\foobar\\again} & small test example\\
  \midrule
  \verb|\textrm| & \Shortunderstack[l]{Fi} & small test example\\
  \midrule
  \verb|\textrm| & \Shortunderstack[l]{First one\\foobar\\again} & small test example\\
  \bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

编辑 2:在某些情况下,\eqparbox 的解决方案仍然存在问题。请参阅下面的代码和屏幕截图。正如您所看到的,它没有正确水平对齐。

\documentclass{article}

\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{lipsum}

\usepackage{makecell, booktabs}
\renewcommand\theadfont{\bfseries}
\renewcommand\theadalign{lc}
\renewcommand\cellalign{tl}

\usepackage{eqparbox}

\begin{document}

\begin{tabular}{ccp{6cm}}
  \toprule
  \thead{Command} & \thead{Declaration} & \thead{Output}\\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{First one\\foobar\\again} & \blindtext \\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{Fi}% 
  & \blindtext \\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{First one\\foobar\\again} & \blindtext \\
  \bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

答案1

不要重新发明轮子:这个makecell包就是为此而做的,并且具有此类单元格的通用格式,以及它的 \thead\makecell(以及一些其他的)。

\eqparbox另一种解决方案是使用同名包中的命令,以使第二列中的多行单元格居中(而每个单元格中的行左对齐) 。它使用一个标签系统,确保所有\parbox具有相同标签的 es 都具有最宽内容的宽度。请注意,可能需要两次编译才能测量最宽的框。

此外,我建议使用来自的规则命令booktabs,它将在水平规则上方和下方设置一些垂直填充:

\documentclass{article}

\usepackage[english]{babel}

\usepackage{makecell, booktabs}
\renewcommand\theadfont{\bfseries}
\renewcommand\theadalign{lc}
\renewcommand\cellalign{tl}

\usepackage{eqparbox}

\begin{document}

\begin{tabular}{ccp{8cm}}
  \toprule
  \thead{Command} & \thead{Declaration} & \thead{Output}\\
  \midrule
  \verb|\textrm| & \makecell{First one\\foobar\\again} & small test example\\
  \midrule
  \verb|\textrm| & \makecell[tl]{First one\\foobar\\again} & small test example\\
  \midrule
  \verb|\textrm| & \makecell[tl]{First one\\foobar\\again} & small test example\\
  \bottomrule
\end{tabular}
\vskip 1cm

\begin{tabular}{ccp{8cm}}
  \toprule
  \thead{Command} & \thead{Declaration} & \thead{Output}\\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{First one\\foobar\\again} & small test example\\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{First}% 
  & small test example\\
  \midrule
  \verb|\textrm| & \eqparbox{Col}{First one\\foobar\\again} & small test example\\
  \bottomrule
\end{tabular}

\end{document} 

在此处输入图片描述

相关内容