![如何简单地垂直和水平对齐表格内容](https://linux22.com/image/439621/%E5%A6%82%E4%BD%95%E7%AE%80%E5%8D%95%E5%9C%B0%E5%9E%82%E7%9B%B4%E5%92%8C%E6%B0%B4%E5%B9%B3%E5%AF%B9%E9%BD%90%E8%A1%A8%E6%A0%BC%E5%86%85%E5%AE%B9.png)
我的表格需要垂直和水平对齐其内容。
以下是代码:
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{booktabs, array}
\usepackage{lipsum}
\begin{document}
\begin{table*}
\centering
\begin{tabular}{>{\centering\arraybackslash}m{1cm}>{\centering\arraybackslash}m{1cm}}
\toprule 1 & 2 \\ \midrule 3 & 4 \\ \bottomrule
\end{tabular}
\caption{table 1}
\end{table*}
\lipsum[1-15] % filler text
\end{document}
据我所知,m
内容应该垂直对齐,这些>{\centering\arraybackslash}
部分应该水平对齐。但是,如果你测量数字上方的空间和数字下方的空间,你会发现数字下方有更多的空间。
简单的任务是:
- 水平和垂直对齐单元格内容,以及
- 使列宽自动缩放(及其内容)。
我在这里发现了很多类似的问题,但没有一个真正解决基本层面的问题。
答案1
经典的工具是包:默认情况下,cellspace
您使用字母作为列说明符的前缀(或者,如果您加载,或者使用加载选项,使用任何您想要的字母):S
C
siunitx
[columntype=some letter]
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{booktabs, array}
\usepackage{lipsum}
\usepackage{cellspace}
\setlength{\cellspacetoplimit}{4pt}
\setlength{\cellspacebottomlimit}{4pt}
\begin{document}
\begin{table*}
\centering
\begin{tabular}{>{\centering\arraybackslash}S{m{1cm}}>{\centering\arraybackslash}S{m{1cm}}}
\toprule 1 & 2 \\ \midrule 3 & 4 \\ \bottomrule
\end{tabular}
\caption{table 1}
\end{table*}
\lipsum[1-15] % filler text
\end{document}
答案2
如果你很着急
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{tabularray} % <<----- added
\UseTblrLibrary{booktabs} % <<----- added
\usepackage{booktabs, array}
\usepackage{lipsum}
\begin{document}
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m]Q[c,m]},rows={rowsep=4pt},stretch=0}
\toprule
11 & 2 \\
\midrule
3 & 4444444 \\
\bottomrule
\end{tblr}
\caption{tblr with numbers}
\end{table*}
\lipsum[1-15] % filler text
\end{document}
长答案
注1:我使用了不同的包:tabularray
笔记2:我建议你读一下Mico 的回答在我之前。
关于“水平和垂直对齐单元格内容”:
这tabularray
包有一个很好的方法来集中一切。但据我所知,它认为该行有一个全高(和上升者和下行者)进行对齐。(米科谈论得更好)
您可以从以下从包文档中摘取的两个示例中看到这一点:
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{tabularray} % <<----- added
\UseTblrLibrary{booktabs} % <<----- added
\usepackage{booktabs, array}
\usepackage{lipsum}
\begin{document}
\begin{table*}
\centering
\begin{tblr}{lccr}
\hline
Alpha & Beta & Gamma & Delta \\
\hline
Epsilon & Zeta & Eta & Theta \\
\hline
Iota & Kappa & Lambda & Mu \\
\hline
\end{tblr}
\caption{tblr with text}
\end{table*}
\begin{table*}
\centering
\begin{tabular}{lccr}
\hline
Alpha & Beta & Gamma & Delta \\
\hline
Epsilon & Zeta & Eta & Theta \\
\hline
Iota & Kappa & Lambda & Mu \\
\hline
\end{tabular}
\caption{tabular with text}
\end{table*}
\lipsum[1-15] % filler text
\end{document}
然而,当你只使用数字时(如米科说,数字有上升者但不是下行者)你会得到这个,其tblr
效果甚至比以下更糟糕tabular
:
\begin{table*}
\centering
\begin{tblr}{Q[c,m,1cm]Q[c,m,1cm]}
\toprule
1 & 2 \\
\midrule
3 & 4 \\
\bottomrule
\end{tblr}
\caption{tblr with numbers}
\end{table*}
\begin{table*}
\centering
\begin{tabular}{>{\centering\arraybackslash}m{1cm}>{\centering\arraybackslash}m{1cm}}
\toprule 1 & 2 \\ \midrule 3 & 4 \\ \bottomrule
\end{tabular}
\caption{tabular with numbers}
\end{table*}
选项 1(这个更好)
谢谢LJR 的建议我们可以使用stretch=0
。我还用它rowsep=4pt
来让桌子看起来不那么拥挤。
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m,1cm]Q[c,m,1cm]},stretch=0}
\toprule
1 & 2 \\
\midrule
3 & 4 \\
\bottomrule
\end{tblr}
\caption{tblr without rowsep=4pt}
\end{table*}
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m,1cm]Q[c,m,1cm]},stretch=0,rows={rowsep=4pt}}
\toprule
1 & 2 \\
\midrule
3 & 4 \\
\bottomrule
\end{tblr}
\caption{tblr with rowsep=4pt}
\end{table*}
选项 2(旧解决方案)
您可以通过在文本上方添加空间来轻松手动修复此问题,abovesep+
如下所示:
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m,1cm]Q[c,m,1cm]},rows={abovesep+=2pt}}
\toprule
1 & 2 \\
\midrule
3 & 4 \\
\bottomrule
\end{tblr}
\caption{tblr with numbers}
\end{table*}
\begin{table*}
\centering
\begin{tabular}{>{\centering\arraybackslash}m{1cm}>{\centering\arraybackslash}m{1cm}}
\toprule 1 & 2 \\ \midrule 3 & 4 \\ \bottomrule
\end{tabular}
\caption{tabular with numbers}
\end{table*}
关于“使列宽自动缩放(及其内容)”:
不设置列的宽度Q
可以解决这个问题,不是吗?
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{tabularray} % <<----- added
\UseTblrLibrary{booktabs} % <<----- added
\usepackage{booktabs, array}
\usepackage{lipsum}
\begin{document}
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m]|Q[c,m]},stretch=0,rows={rowsep=4pt}}
\toprule
1 & 2 \\
\midrule
3 & 4 \\
\bottomrule
\end{tblr}
\caption{tblr with numbers}
\end{table*}
\begin{table*}
\centering
\begin{tblr}{colspec={Q[c,m]|Q[c,m]},stretch=0,rows={rowsep=4pt}}
\toprule
11 & 2 \\
\midrule
3 & 4444 \\
\bottomrule
\end{tblr}
\caption{tblr with numbers}
\end{table*}
\lipsum[1-15] % filler text
\end{document}
混合数字和字母时出现的问题
当您混合使用字母和数字时,问题会再次出现(见下表 1)。需要注意的是,对齐是按照同一行中的每个字符具有相同的总高度作为一个由它们全部组成的框。因此 a3
和 ap
将像 一样对齐3p
,从而导致视觉错位。
请注意,3
没有深度并且p
更少高度比3
。这是关于这个话题的一个很好的讨论高度和深度。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tabularray} % <<----- added
\UseTblrLibrary{booktabs} % <<----- added
\usepackage{xcolor} % <<----- added
\usepackage{booktabs,array}
\newlength\height
\newlength\depth
\newlength\totalheight
\newcommand{\RULE}[1]{%
\settoheight{\height}{#1}%
\settodepth{\depth}{#1}%
\setlength\totalheight{\dimexpr\height+\depth\relax}%
\rule[-\depth]{0.1pt}{\totalheight}#1\rule[-\depth]{0.1pt}{\totalheight}%
}
\newcommand{\STH}[1]{%
\settoheight{\height}{#1}%
\settodepth{\depth}{#1}%
\setlength\totalheight{\dimexpr\height+\depth\relax}%
height of \textcolor{red}{#1}: \textcolor{blue!70!gray}{\the\height}\par
depth of \textcolor{red}{#1}: \textcolor{blue!70!gray}{\the\depth}\par
total height of \textcolor{red}{#1}: \textcolor{blue!70!gray}{\the\totalheight}\par
\vspace{8pt}
}
\begin{document}
\STH{3}
\STH{p}
\STH{3p}
\begin{table*}[t]
\centering
\begin{tblr}{colspec={Q[c,m]Q[c,m]},stretch=0}
\toprule
1 & 2 \\
\midrule
AAAA & 6 \\
\midrule
g & pppp \\
\midrule
33 & pppp \\
\midrule
\RULE{3} & \RULE{p} \\
\midrule
\RULE{\vphantom{3p}3} & \RULE{\vphantom{3p}p}\\
\midrule
\RULE{3p} & \RULE{3p}\\
\bottomrule
\end{tblr}
\caption{tblr with numbers and letters}
\end{table*}
\end{document}
答案3
我想质疑您关于m
列类型没有垂直居中其内容的说法。
您的主张似乎部分基于对测试表中单元格内容的非常具体的选择:您选择的字符只有上升部(高于 x 线的线),但没有下降部(低于基线的线)。一旦您放宽这个极端选择,您会发现上升部顶端\midrule
和上升部顶端之间的垂直空白is very close to the amount of vertical whitespace between the bottoms of the descenders and the lower
\midrule`。
您还写道:
如果您测量数字上方的空间和数字下方的空间,您会发现数字下方有更多的空间。
再次强调,只有当你只使用具有上升部分的字符时,这才是真的,并且没有下降部分。当然,如果您使用既没有上升部也没有下降部的字符 —— acemnorsuvwxz —— 您的发现就必须被逆转。
简而言之:学会信任 LaTeX 以获得正确的垂直对齐。:-)
\documentclass[twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage{booktabs, array}
\begin{document}
\begin{table}
\centering
\begin{tabular}{*{2}{>{\centering\arraybackslash}m{3cm}}}
\midrule
pqyhbkpqy & acemnorsuvwxz \\
\midrule
acemnorsuvwxz & pqyhbkpqy \\
\midrule
\end{tabular}
\end{table}
\end{document}