![如何使特定列中的文本(水平和垂直)居中对齐?](https://linux22.com/image/405619/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD%E7%9A%84%E6%96%87%E6%9C%AC%EF%BC%88%E6%B0%B4%E5%B9%B3%E5%92%8C%E5%9E%82%E7%9B%B4%EF%BC%89%E5%B1%85%E4%B8%AD%E5%AF%B9%E9%BD%90%EF%BC%9F.png)
如何使前三列垂直居中,使得这些列中的所有值都位于中心?
\begin{center}
\begin{tabular}{|c| c |c| p{5cm}|}
\hline
\rowcolor[gray]{.8}Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\ \hline
Monday & 11C & 22C & A clear day with lots of sunshine.
However, the strong breeze will bring down the temperatures \\ \hline
Tuesday & 9C & 19C & Cloudy with rain, across many northern regions.
Clear spells across most of Scotland and Northern Ireland, but rain
reaching the far northwest \\ \hline
Wednesday & 10C & 21C & Rain will still linger for the morning.
Conditions will improve by early afternoon and continue throughout the evening. \\ \hline
\end{tabular}
\end{center}
它看起来应该是这样的:
编辑:
以下是我根据评论中粘贴的问题尝试的方法:
\begin{center}
\renewcommand{\tabularxcolumn}[1]{m{#1}}
\begin{tabularx}{|m{1in}|c|c| p{5cm}|}
\hline
\rowcolor[gray]{.8}Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\ \hline
Monday & 11C & 22C & A clear day with lots of sunshine. However, the strong breeze will bring down the temperatures \\ \hline
Tuesday & 9C & 19C & Cloudy with rain, across many northern regions. Clear spells across most of Scotland and Northern Ireland, but rain reaching the far northwest \\ \hline
Wednesday & 10C & 21C & Rain will still linger for the morning. Conditions will improve by early afternoon and continue throughout the evening. \\ \hline
\end{tabularx}
\end{center}
它仍然不起作用。
答案1
欢迎来到 TeX.SE!
请考虑下次发布完整的 MWE。我在答案中添加了一些缺失的部分,但忽略了标题行中的灰色背景颜色。将此视为你的家庭作业 ;-)
LaTeX 基本上可以识别两种类型的列。一种是 LaTeX 自己计算列的宽度。字母l
、c
和r
代表这种类型的列。每当作者向列中添加文本时,列的宽度就会“增加”。
另一方面,我们确实有列类型,其中作者定义了宽度。此列类型的标识符例如为p{<width>}
。您已将其用于最后一列并p{5cm}
在 MWE 中定义。此列应为 5 厘米宽。如果作者(即您!)添加更多文本,宽度超过 5 厘米,LaTeX 会中断文本并开始新行。结果列将格式化为两端对齐的文本,如您在示例中所见。
为了获得你想要的结果,你所要做的就是
- 加载
array
包 - 使用
m{<width>}
列类型代替c
或p{<width>}
列
当然,这只是事实的一半。
该array
包为您提供m
和b
列类型。它们的作用类似于p
列,因为用户必须定义其宽度。然后 LaTeX 将换行并生成对齐的文本。这些列类型之间的区别在于垂直对齐。经验法则是:
p
对齐于磷,m
对齐于米中间和b
对齐于乙奥托姆。
(请阅读数组手册,以了解确切的行为!)
因此,按照您的要求,使用m
表中的某种类型的列将使所有行垂直居中对齐。
但我们还必须解决水平对齐问题。m
列的行为与我们刚刚替换的列相同p
。在最后一列中,这种行为是可以的。但在前几列中,我们希望文本也水平居中。
这是该包提供的下一个技巧array
。您可以使用>{cmd}
。将 可视>
化为一个箭头,它将花括号内的 推cmd
到旁边的列。如果您在表格中定义类似
\begin{tabular}{ l >{\raggedright}p{5cm} l }
您将p
在两个常见l
列之间获得一个宽度为 5 厘米的列,作为该表的第一列和最后一列。
但是每次您进入第二列时,都会>{\raggedright}
将命令推\raggedright
送到该m
列。此命令将更改第二列的对齐方式,使其左侧齐平,右侧参差不齐。
除了上述定义,您还可以输入
\begin{tabular}{l p{5cm} l}
first cell & \raggedright lots of text in the second cell, which is flush left & third cell \\
next line, first cell & \raggedright again lots of text ... & third cell \\
new line first cell & \raggedright ... & ... \\
once again & \raggedright ... & end \\
\end{tabular}
\raggedright
但在这种情况下,每次进入第二列时,您都必须输入命令,这可能会很快变得烦人。您不必每次进入该列时都输入命令,>{\raggedright}
前一个定义中的技巧将自动为您执行此操作。这听起来很有希望。
为了获得真正干净的 LaTeX 代码,您应该添加\arraybackslash\hspace{0pt}
上述示例。但是这个可怕的字符串会使您的输入代码无法读取。因此,我介绍下一个技巧。
该array
软件包还提供了\newcolumntype
命令。您应该在文档的序言中(即之前\begin{document}
)使用它。只需选择一个字母作为新的列类型即可。您要求的是居中的列类型。因此我建议使用字母“C”,它之前没有定义过。
所以最简单的解决方案是
\newcolumntype{C}{>{\raggedright\arraybackslash\hspace{0pt}}m{5cm}}
并用这种全新的、闪亮的列类型替换所有列定义(c
和) 。p{5cm}
C
\begin{tabular}{|C|C|C|C|}
有时,这样一个简单的解决方案会有一些重大缺陷。在您的特定情况下,表格中的每一列现在都是 5 厘米宽。我想,这不是您想要的,对吧?前三列不需要 5 厘米宽。我们如何解决这个问题?
这是我的下一个增强功能。在第一行中,最宽的条目似乎是单词“wednesday”。因此,让 LaTeX 确定其宽度并将其用作第一列的宽度。为此,您可以使用命令\settowidth
来测量单词的宽度。但我们还必须更改新的列定义C
。我们必须以更灵活的方式定义它。通过仔细检查,应该意识到,C
列应该具有可变的宽度,就像p{<width>}
has 一样。p
列有一对括号。所以让我们将它添加到我们的C
列中。
\newcolumntype{C}[1]{>{\raggedright\arraybackslash\hspace{0pt}}m{#1}}
发现区别了吗?我[1]
在定义的开头添加了。这意味着,该C
列必须有一对括号。该对括号中给出的值在#1
我的定义末尾用 表示。这为我们提供了所需的灵活性。
完整的 MWE 现在如下所示:
\documentclass{article}
\usepackage{array} % better control for tabular
%% Define the length of the longest day name
\newlength{\daylength}
\settowidth{\daylength}{Wednesday}
%% Create a new columntype, where the text is vertically and
%% horizontally centered. The new identifier should be "C".
\newcolumntype{C}[1]{%
>{\centering\arraybackslash\hspace{0pt}}m{#1}}
\begin{document}
\begin{center}
\begin{tabular}{|C{\daylength}| C{2cm} | C{2cm} | m{5cm} |}
\hline
Day & Min Temp & Max Temp & \multicolumn{1}{c|}{ Summary} \\
\hline
Monday & 11C & 22C & A clear day with lots of sunshine.
However, the strong breeze will bring down the temperatures \\
\hline
Tuesday & 9C & 19C & Cloudy with rain, across many northern regions.
Clear spells across most of Scotland and Northern Ireland, but rain
reaching the far northwest \\
\hline
Wednesday & 10C & 21C & Rain will still linger for the morning.
Conditions will improve by early afternoon and continue throughout the evening. \\
\hline
\end{tabular}
\end{center}
\end{document}
并产生以下输出
就我个人而言,我还会定义一种新R
类型的列,以便于实现左对齐列,因为这些小列在对齐时看起来不太好看。我会把它添加到你的作业堆里。:-)
编辑
\arraybackslash
再次使您能够使用 来\\
结束表格线并开始新行。 \hspace{0pt}
使 LaTeX 能够从第一个单词开始断行,这在非常小的列中很重要。