我正在构建一个表格,需要在一列的每个单元格中设置换行符。我发现了以下示例:如何在表格单元格内添加强制换行符
以下是代码:
\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}