我想创建一个有四列的表,其中第一列包含行跨度和单元格\verb
。
以下是代码:
\newcolumntype{Y}{>{\centering\arraybackslash}l}
.
.
.
\begin{tabularx}{\textwidth}{|*{4}{Y|}}
\hline
Category & Interface & Signature & Method \\
\hline
\multirow{2}{*}{Predicate} & \verb|Predicate<T>| & \verb|T -> boolean| & \verb|.test(T t)| \\ \cline{2-4}
& \verb|BiPredicate<T, U>| & \verb|T, U -> boolean| & \verb|.test(T t, U u)|\\ \hline
\multirow{2}{*}{Consumer} & \verb|Consumer<T>| & \verb|T -> void| & \verb|.accept(T t)|\\ \cline{2-4}
& \verb|BiConsumer<T, U>| & \verb|T, U -> void| & \verb|.accept(T t, U u)|\\ \hline
\end{tabularx}
结果添加了第五列:
一开始,\newcolumntype{Y}{>{\centering\arraybackslash}l}
用 X 代替 al,这样可以,但我需要左对齐,因为否则第一列太大,其他单元格会开始溢出:
为什么 LaTeX 要添加这第五列?
答案1
定义中有两个独立的问题
\newcolumntype{Y}{>{\centering\arraybackslash}l}
第一的,这个定义实际上没有任何用处。事实上,原帖作者还不如写成
\newcolumntype{Y}{l}
l
因为 LaTeX 无法灵活调整(或c
或) 列的宽度r
。定义不当是导致 OP 所称的表格中出现“第五列”的直接原因。这个“第五列”是 (a) 占据\hline
文本块整个宽度而产生的水平线和 (b) 四个单元格的总宽度不足 的产物\textwidth
。
楼主可能为了写是
\newcolumntype{Y}{>{\centering\arraybackslash}X}
因为这样会使“第五列”自行消失。然而,这存在一个问题第二个问题,因为——基于 OP 提供的评论——OP 确实不是实际上想要将单元格内容居中。我只能假设原帖作者真正想要的是将单元格内容排版为右对齐模式;基本X
列类型将单元格内容完全对齐。
如果这个假设正确,那么应该这样写
\newcolumntype{L}{>{\raggedright\arraybackslash}X}
这修复了幻影第五列问题和将单元格内容左对齐。
然而,表格的“外观”还存在一个完全独立的问题:其大量的垂直线和间距不佳的水平线使表格看起来像一个阴沉的监狱窗户。为了修复这个美观问题,我建议省略所有垂直线,并使用包中的宏booktabs
-- \toprule
、\midrule
、\cmidrule
和\bottomrule
-- 而不是\hline
和\cline
。
下面的屏幕截图显示了这三种结果。
\documentclass{article} % or some other suitable document class
\usepackage{tabularx,multirow}
\newcolumntype{Y}{>{\centering\arraybackslash}l} % <-- inappropriate
\newcolumntype{L}{>{\raggedright\arraybackslash}X} % what the OP (probably?) wants
\usepackage{booktabs} % new, for well-spaced horizontal rules
\setlength\textwidth{13cm} % just for this example
\setlength\parindent{0pt} % just for this example
\begin{document}
OP's setup: improper column type, and unattractive ``prison window look.''
\smallskip
\begin{tabularx}{\textwidth}{|*{4}{Y|}}
\hline
Category & Interface & Signature & Method \\
\hline
\multirow{2}{*}{Predicate} & \verb|Predicate<T>| & \verb|T -> boolean| & \verb|.test(T t)| \\ \cline{2-4}
& \verb|BiPredicate<T, U>| & \verb|T, U -> boolean| & \verb|.test(T t, U u)|\\ \hline
\multirow{2}{*}{Consumer} & \verb|Consumer<T>| & \verb|T -> void| & \verb|.accept(T t)|\\ \cline{2-4}
& \verb|BiConsumer<T, U>| & \verb|T, U -> void| & \verb|.accept(T t, U u)|\\ \hline
\end{tabularx}
\bigskip
Preliminary fix: use the correct column type. However, ``prison window look'' persists.
\smallskip
\begin{tabularx}{\textwidth}{|l| *{3}{L|}}
\hline
Category & Interface & Signature & Method \\
\hline
\multirow{2}{*}{Predicate}
& \verb|Predicate<T>| & \verb|T -> boolean| & \verb|.test(T t)| \\
\cline{2-4}
& \verb|BiPredicate<T, U>| & \verb|T, U -> boolean| & \verb|.test(T t, U u)| \\
\hline
\multirow{2}{*}{Consumer}
& \verb|Consumer<T>| & \verb|T -> void| & \verb|.accept(T t)| \\
\cline{2-4}
& \verb|BiConsumer<T, U>| & \verb|T, U -> void| & \verb|.accept(T t, U u)| \\
\hline
\end{tabularx}
\bigskip
Full fix: Employ a much more open ``look'' by omitting all vertical lines and using only well-spaced horizontal lines.
\smallskip
\begin{tabularx}{\textwidth}{@{} l LLL @{}}
\toprule
Category & Interface & Signature & Method \\
\midrule
\multirow{2.3}{*}{Predicate}
& \verb|Predicate<T>| & \verb|T -> boolean| & \verb|.test(T t)| \\
\cmidrule(l){2-4}
& \verb|BiPredicate<T, U>| & \verb|T, U -> boolean| & \verb|.test(T t, U u)| \\
\midrule
\multirow{2.3}{*}{Consumer}
& \verb|Consumer<T>| & \verb|T -> void| & \verb|.accept(T t)| \\
\cmidrule(l){2-4}
& \verb|BiConsumer<T, U>| & \verb|T, U -> void| & \verb|.accept(T t, U u)| \\
\bottomrule
\end{tabularx}
\end{document}
答案2
- 不幸的是,您没有提供 MWE(最小工作示例),我们使用的文档类别以及您的文档页面布局都是未知的。
- 表中
tabularx
至少有一列必须是X
类型。 - 看看以下解决方案(使用`article文档类)是否给出了您想要的结果:
\documentclass{article}
\usepackage{multirow, tabularx}
\begin{document}
\begin{table}
\centering
\setlength\tabcolsep{5pt}
\begin{tabularx}{\textwidth}{|X |l|l| l|}
\hline
Category & Interface & Signature & Method \\
\hline
\multirow{2}{*}{Predicate}
& \verb|Predicate<T>| & \verb|T -> boolean| & \verb|.test(T t)| \\
\cline{2-4}
& \verb|BiPredicate<T, U>| & \verb|T, U -> boolean| & \verb|.test(T t, U u)|\\
\hline
\multirow{2}{*}{Consumer}
& \verb|Consumer<T>| & \verb|T -> void| & \verb|.accept(T t)|\\
\cline{2-4}
& \verb|BiConsumer<T, U>| & \verb|T, U -> void| & \verb|.accept(T t, U u)|\\
\hline
\end{tabularx}
\end{table}
\end{document}
附註:
您可以使用以下包获得更简单、更简短的表格代码以及更漂亮的表格外观tabularray
:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{table}
\centering
\begin{tblr}{hlines, vlines,
colspec = {X[l] *{3}{Q[l, font=\ttfamily]}},
colsep = 5pt,
row{1} = {font=\normalfont}
}
Category & Interface & Signature & Method \\
\SetCell[r=2]{l} Predicate
& Predicate<T> & T -> boolean & .test(T t) \\
& BiPredicate<T, U> & T, U -> boolean & test(T t, U u) \\
\SetCell[r=2]{l} Consumer
& Consumer<T> & T -> void & .accept(T t) \\
& BiConsumer<T, U> & T, U -> void & .accept(T t, U u) \\
\end{tblr}
\end{table}
\end{document}