我想创建一个表格,其中指定了一些列的宽度,而这些列中的文本应该水平和垂直居中。我发现
\usepackage{array}
\begin{tabular}{| c | c | m{5cm} |}
将文本垂直居中于最后一列,但水平对齐(如同普通段落中的文本)。
更新:使用 Jake 的方法,似乎\\
会\hline
导致错误。如何修复?
答案1
全面的解决方案(基于这个答案)是定义新的列类型(例如,L,C 和 R),以其宽度作为参数并执行以下操作:
发出
\raggedright
、\centering
或\raggedleft
以实现所需的水平对齐,声明
\let\newline\\
允许\newline
在单元格内使用手动换行符(请注意,\centering
& 朋友改变了含义\\
- 这是 Jake 的解决方案的问题),发出
\arraybackslash
(即\let\\\tabularnewline
)以允许(再次)用于\\
结束行,\hspace{0pt}
允许单元格中的第一个单词用连字符连接的问题。
在下面的例子中,新的列类型基于(垂直居中)m 列,但也可以使用(顶部或底部对齐)p 列或 b 列。
\documentclass{article}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\begin{document}
\begin{tabular}{| c | L{3cm} | C{3cm} | R{3cm} |}
foo &
A cell with text that wraps around, is raggedright and allows \newline
manual line breaks &
A cell with text that wraps around, is centered and allows \newline
manual line breaks &
A cell with text that wraps around, is raggedleft and allows \newline
manual line breaks \\
\end{tabular}
\end{document}
答案2
'm' 列类型仅使文本垂直居中;要使其水平居中,可以使用以下语法>{cmd}
,该语法在指定列中的每个单元格前添加一个命令:
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{| c | c | >{\centering}m{5cm} |}
Abc & Bcd & A long cell with text that wraps around and is centered
\end{tabular}
\end{document}
正如 Stefan Kottwitz 在他的评论中指出的那样,这也可以包装在一个新的列类型中,你可以使用它来定义
\newcolumntype{C}[1]{>{\centering}m{#1}}
然后你可以使用以下方式定义上表
begin{tabular}{| c | c | C{5cm} |}
答案3
tblr
在新的 LaTeX3 包环境下,可以很容易地同时指定表格单元格的水平和垂直对齐方式tabularray
:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{|Q[l,t,3cm]|Q[c,m,3cm]|Q[r,b,3cm]|}
\hline
{Top Baseline \\ Left Left} & Middle Center & {Right Right \\ Bottom Baseline} \\
\hline
\end{tblr}
\end{document}
您甚至可以删除列的宽度设置以使用自然宽度。
答案4
我发现了一种非常不同但同样有效的技术:
使用该包,您可以在环境之外ragged2e
发出命令,并在表格环境的 p 或 m 列内进行操作。\RaggedRight
tabular
以下是一个示例文档:
\documentclass{article}
\usepackage{array}
\usepackage{ragged2e}
\begin{document}
{\RaggedRight
\begin{tabular}{| c | m{3cm}}
foo &
A cell with text that wraps around, is raggedright and allows \newline
manual line breaks \\
\end{tabular}
}% end of \RaggedRight
\end{document}