我正在尝试排版一个具有固定宽度的表格,其中单元格内容在垂直和水平方向上均居中,即使一个单元格包含强制换行符。
我已经设法完成了,但现在我想使用命令添加跨越两列的两行文本\multicolumn
,并使其仍然水平居中。
这就是我苦苦挣扎的地方:
\documentclass{article}
\usepackage{array, tabularx}
\usepackage[textwidth=6in]{geometry}
\renewcommand{\tabcolsep}{0pt}
\setlength{\extrarowheight}{10pt}
\begin{document}
%
\centering%
%
\begin{tabularx}{\textwidth}{%
>{\centering\arraybackslash}m{0.5\textwidth}|
>{\centering\arraybackslash}m{0.25\textwidth}
>{\centering\arraybackslash}m{0.25\textwidth}
}%
test & test & test\break test\\
test & \multicolumn{2}{X}{test\break test}
\end{tabularx}
%
%
\end{document}
如您所见,第二行的第一列没有垂直居中,第二列没有水平居中,这是因为我使用了 X 参数\multicolumn
,但我不知道还应该用什么来代替。
这个问题该如何解决?
答案1
为了确保单元格填充一致,我删除了\extrarowheight
规范并添加了cellspace
包,此外还重新定义了X
列类型并使用来 >{\hsize=xx\hsize}
获取比率中的 X 列宽度2:1
。
无关:加载了就无需array
加载tabularx
。
\documentclass{article}
\usepackage[textwidth=6in]{geometry}
\usepackage{cellspace, tabularx}
\setlength{\cellspacetoplimit}{8pt}
\setlength{\cellspacebottomlimit}{8pt}
\addparagraphcolumntypes{X}
\renewcommand{\tabularxcolumn}[1]{>{\centering\arraybackslash}m{#1}}
\renewcommand{\tabcolsep}{0pt}
\begin{document}
\centering%
\begin{tabularx}{\textwidth}{%
| >{\hsize=1.5\hsize}S{X}|
>{\hsize=0.75\hsize}S{X}
| >{\hsize=0.75\hsize}S{X}|
}%
\hline
test & test & test\break test \\
\hline
test & \multicolumn{2}{>{\hsize=1.5\hsize}S{X}|}{test\break test} \\
\hline
\end{tabularx}
\end{document}
答案2
请尝试以下操作:
\documentclass{article}
\usepackage[textwidth=6in]{geometry}
\usepackage{array, tabularx}
\renewcommand{\tabcolsep}{0pt}
%%--------------------------------------------------------------%
%% patch of Ulrike Fisher (on my request) %
%% (http://tex.stackexchange.com/questions/319768/ %
%%--------------------------------------------------------------%
\makeatletter
\renewcommand\mcell@classz{\@classx
\@tempcnta \count@
\prepnext@tok
\@addtopreamble{%\mcell@mstyle
\ifcase\@chnum
\hfil
\mcell@agape{\d@llarbegin\insert@column\d@llarend}\hfil \or
\hskip1sp
\mcell@agape{\d@llarbegin\insert@column\d@llarend}\hfil \or
\hfil\hskip1sp
\mcell@agape{\d@llarbegin \insert@column\d@llarend}\or
\mcell@agape{$\vcenter
\@startpbox{\@nextchar}\insert@column\@endpbox$}\or
\mcell@agape{\vtop
\@startpbox{\@nextchar}\insert@column\@endpbox}\or
\mcell@agape{\vbox
\@startpbox{\@nextchar}\insert@column\@endpbox}%
\fi
\global\let\mcell@left\relax\global\let\mcell@right\relax
}\prepnext@tok}
\makeatother
\begin{document}
\begin{table}
\renewcommand\tabularxcolumn[1]{m{#1}}
\setcellgapes{10pt}
\makegapedcells
\centering
\begin{tabularx}{\textwidth}{|%
>{\centering\arraybackslash}X|
>{\centering\arraybackslash\hsize=0.5\hsize}X|
>{\centering\arraybackslash\hsize=0.5\hsize}X|
}%
\hline
test & test & test\break test\\
\hline
test & \multicolumn{2}{>{\centering\arraybackslash}X|}{test\break test}\\
\hline
\end{tabularx}
\end{table}
\end{document}
我添加了垂直和水平规则,您可以轻松看到,单元格的内容按照您希望的方式居中。
编辑:
现在通过使用makecell
包 AND PATCH 来添加更多的垂直空间,以解决其与m
列类型不兼容的问题。