我想让文本在所有表格单元格中垂直居中。但是,我不希望指定固定的列宽,而是让它tabulary
平衡列宽。在这种情况下,如何正确使用列说明符?
方便日常使用的解决方案将受到欢迎。还有其他 LaTeX 软件包可以同时实现列宽平衡和更好的垂直对齐吗?
我不知道该类IEEEtran
(v1.8b)的使用对我的问题是否有意义。
\documentclass[conference]{IEEEtran}
\usepackage{tabulary}
\usepackage{booktabs}
\begin{document}
\begin{table}[!h]
\renewcommand{\arraystretch}{1.3}
\caption{Comparison of Algorithm Results}
\centering
\begin{tabulary}{\columnwidth}{@{\hspace{.2em}}L*{4}{C}@{}}
\toprule
\textbf{Optimization Algorithm} & \textbf{Swarm Size} & \textbf{No. of Iterations} & \textbf{Final Wirelength} & \textbf{Best Value Cost Fn.}\\ \midrule
Short Text & 10 & 1000 & 100 & -- \\
Slightly Longer Text that Wraps & 20 & 2000 & 200 & 10.5 \\
Slightly Longer Text that Wraps & 30 & 3000 & 300 & 20.55 \\
Short & 40 & 4000 & 400 & 30.5 \\
\bottomrule
\end{tabulary}
\end{table}
\end{document}
答案1
tabularx
作为和包的作者tabulary
,我不会将它们用于这样的数据表。它们用于单元格内的换行,并且在这里,除了标题之外,您不希望换行。
我会使用tabular*
强制整体宽度(如果必须,或者居中tabular
通常效果很好)将m
列用作第一列,以便其参考点垂直居中。对于数字列,我使用dcolumn
小数对齐(siunitx
这也很好)。
最后我改成[h!]
了[htp]
(h
单独使用会增加表格被强制到文档末尾的机会,并且通常会从乳胶中生成一个警告,表明它正在被更改为ht
)
\documentclass[conference]{IEEEtran}
\usepackage{dcolumn}
\usepackage{booktabs}
\newcommand\hd[1]{\multicolumn{1}{c}{%
\textbf{\begin{tabular}{@{}c@{}}#1\end{tabular}}}}
\begin{document}
\begin{table}[htp]
\renewcommand{\arraystretch}{1.3}
\caption{Comparison of Algorithm Results}
\centering
\begin{tabular*}{\columnwidth}{
@{\extracolsep{\fill}}
m{3cm}
D.{}{2.0}
D.{}{4.0}
D.{}{3.0}
D..{2.2}
@{}}
\toprule
\hd{Optimization Algorithm} & \hd{Swarm\\Size} &
\hd{No. of\\ Iterations} & \hd{Final\\ Wire-\\length} &
\hd{Best Value\\ Cost Fn.}\\ \midrule
Short Text & 10 & 1000 & 100 & \multicolumn{1}{c}{--} \\
Slightly Longer Text that Wraps & 20 & 2000 & 200 & 10.5 \\
Slightly Longer Text that Wraps & 30 & 3000 & 300 & 20.55 \\
Short & 40 & 4000 & 400 & 30.5 \\
\bottomrule
\end{tabular*}
\end{table}
\end{document}
答案2
您可以“破解”tabulary
定义以垂直对齐所有LRCJ
列。
\makeatletter
\def\TY@box@v#1{%
$\vcenter \@startpbox{\csname TY@F\the\TY@count\endcsname}%
#1\arraybackslash\tyformat
\insert@column\@endpbox$}
\makeatother
答案3
解决方案是tabularx
,定义新列L
并C
更改\tabularxcolumn
更改从中获取回答获得X列类型垂直对齐
\documentclass[conference]{IEEEtran}
\usepackage{tabularx}
\usepackage{booktabs}
\renewcommand{\tabularxcolumn}[1]{m{#1}}
\newcolumntype{L}{>{\raggedright}X}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\begin{document}
\begin{table}[!h]
\renewcommand{\arraystretch}{1.3}
\caption{Comparison of Algorithm Results}
\centering
\begin{tabularx}{\columnwidth}{@{\hspace{.2em}}L*{4}{C}@{}}
\toprule
\textbf{Optimization Algorithm} & \textbf{Swarm Size} & \textbf{No. of Iterations} & \textbf{Final Wirelength} & \textbf{Best Value Cost Fn.}\\ \midrule
Short Text & 10 & 1000 & 100 & -- \\
Slightly Longer Text that Wraps & 20 & 2000 & 200 & 10.5 \\
Slightly Longer Text that Wraps & 30 & 3000 & 300 & 20.55 \\
Short & 40 & 4000 & 400 & 30.5 \\
\bottomrule
\end{tabularx}
\end{table}
\end{document}
答案4
嗯,它不是自动化的,因此可能不可接受。但是,从 OP 的 MWE 开始,一旦看到自动断点,只需将该文本换行\mycol
并手动插入断点即可。
\documentclass[conference]{IEEEtran}
\usepackage{tabulary}
\usepackage{booktabs}
\usepackage[usestackEOL]{stackengine}
\def\mycol#1{\addstackgap[1pt]{\Centerstack[l]{#1}}}
\begin{document}
\begin{table}[!h]
\renewcommand{\arraystretch}{1.3}
\caption{Comparison of Algorithm Results}
\centering
\begin{tabulary}{\columnwidth}{@{\hspace{.2em}}L*{4}{C}@{}}
\toprule
\textbf{Optimization Algorithm} & \textbf{Swarm Size} & \textbf{No. of Iterations} & \textbf{Final Wirelength} & \textbf{Best Value Cost Fn.}\\ \midrule
Short Text & 10 & 1000 & 100 & -- \\
\mycol{Slightly Longer\\ Text that Wraps} & 20 & 2000 & 200 & 10.5 \\
\mycol{Slightly Longer\\ Text that Wraps} & 30 & 3000 & 300 & 20.55 \\
Short & 40 & 4000 & 400 & 30.5 \\
\bottomrule
\end{tabulary}
\end{table}
\end{document}