我正在尝试制作如下所示的基本颜色表
\documentclass{article}
\usepackage{booktabs}
\usepackage[dvipsnames*,svgnames]{xcolor}
\usepackage{colortbl}
\usepackage{array}
\begin{document}
\begin{table}
\centering
\setlength{\aboverulesep}{0pt}
\setlength{\belowrulesep}{0pt}
\setlength{\extrarowheight}{.75ex}
\begin{tabular}{|>{\columncolor{LightSteelBlue}}c| c | c | c|}
\toprule
\rowcolor{LightSteelBlue} & {Mann} & {Kvinne} & {Totalt} \\
\rowcolor{LightSteelBlue} & & & \\ \midrule
\O nsker & & & \\
Ballbinge & & & \\ \midrule
\O nsker ikke & & & \\
Ballbinge & & & \\ \midrule
Totalt & & & \\
& & & \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
现在我想将文本放在第一行和第一列的框内居中。我的第一个想法是使用\multirow
s,但结果却很糟糕。文本隐藏在颜色后面。
创建上述带有居中文本的表格的正确方法是什么?
(关于如何改善表格外观的任何其他评论也欢迎)
答案1
该软件包的用户指南第 3 页multirow
解释了如何处理由colortbl
和multirow
软件包之间的某些交互引起的问题。我相信您的 MWE 的以下修改形式(结合了用户指南中描述的解决方法)可以满足您对四个单元格内容进行居中的需求,到目前为止,这四个单元格的内容尚未正确居中。
\documentclass{article}
\usepackage{booktabs,multirow}
\usepackage[dvipsnames,svgnames,table]{xcolor}
\begin{document}
\begin{table}
\centering
\setlength{\aboverulesep}{0pt}
\setlength{\belowrulesep}{0pt}
\setlength{\extrarowheight}{.75ex}
\begin{tabular}{|>{\columncolor{LightSteelBlue}}c| c | c | c|}
\toprule
\rowcolor{LightSteelBlue} & & & \\
\rowcolor{LightSteelBlue}
& \multirow{-2}{*}{Mann} & \multirow{-2}{*}{Kvinne} & \multirow{-2}{*}{Totalt} \\
\midrule
\O nsker & & & \\
Ballbinge & & & \\
\midrule
\O nsker ikke & & & \\
Ballbinge & & & \\
\midrule
& & & \\
\multirow{-2}*{Totalt}& & & \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
LaTeX 逐行编写表格。此外,颜色也会在任何单元格内容之前打印出来,以便使其显示在背景中。因此,您需要“等待”到第二行并重新定位单元格内容 - 在这种情况下,将其向上移动到两行之间的大约一半。为此,很有\raisebox{<len>}{<stuff>}
用。
我采用了您的 MWE,并将相应单元格的内容上移0.5\normalbaselineskip+\extrarowheight
,使其位于两行之间的大约中间位置:
\documentclass{article}
\usepackage{booktabs}
\usepackage[dvipsnames*,svgnames]{xcolor}
\usepackage{colortbl}
\usepackage{array}
\begin{document}
\begin{table}
\centering
\setlength{\aboverulesep}{0pt}
\setlength{\belowrulesep}{0pt}
\setlength{\extrarowheight}{.75ex}
\begin{tabular}{|>{\columncolor{LightSteelBlue}}c| c | c | c|}
\toprule
\rowcolor{LightSteelBlue} & & & \\
\rowcolor{LightSteelBlue} & %
\raisebox{\dimexpr0.5\normalbaselineskip+\extrarowheight}{Mann} &
\raisebox{\dimexpr0.5\normalbaselineskip+\extrarowheight}{Kvinne} &
\raisebox{\dimexpr0.5\normalbaselineskip+\extrarowheight}{Totalt} \\ \midrule
\O nsker & & & \\
Ballbinge & & & \\ \midrule
\O nsker ikke & & & \\
Ballbinge & & & \\ \midrule
& & & \\
\raisebox{\dimexpr0.5\normalbaselineskip+\extrarowheight}{Totalt} & & & \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案3
除了使用 之外,multirow
您还可以使用零宽度的最后一列,在其中放置一个“不可见”规则,其高度为单元格所需的高度 ( \rule{0pt}{<height>}
)。由于这种类型的表格中方形单元格看起来效果最好,因此高度应与宽度相同(第一列除外)。如果您使用m
-columns,文本将居中显示。然后,您可以删除multirow
。
我用过线编写规则,但\hline
在本例中这似乎与普通的没什么区别。所有示例都存在某些 PDF 查看器中“消失”规则的问题。在 Adobe Reader 中,我必须将缩放比例增加到 200% 才能看到所有规则:
\documentclass[a4paper, 10pt]{article}
\usepackage{calc, hhline}
\usepackage[dvipsnames,svgnames,table]{xcolor}
\setlength\extrarowheight{1pt} % Move cell content down
\newcolumntype{C}{>{\centering\arraybackslash}m{7.5ex}}
\newcolumntype{F}{>{\centering\arraybackslash\columncolor{LightSteelBlue}}m{13ex}}
\newcolumntype{L}{@{}>{\rule{0pt}{7.5ex+1\tabcolsep}}m{0pt}@{}} % To ensure equal row height
% Shortcuts
\newcommand*{\blue}{\cellcolor{LightSteelBlue}}
\arrayrulecolor{gray!75} % Dark gray table rules
\begin{document}
\small
\begin{tabular}{|F|*{3}{C|}L}
\hhline{|-|-|-|-}%
& \blue Mann
& \blue Kvinne
& \blue Total
& \\
\hhline{|-|-|-|-}%
Ønsker ballbinge
&
&
&
&\\
\hhline{|-|-|-|-}%
\mbox{Ønsker ikke} ballbinge
&
&
&
&\\
\hhline{|-|-|-|-}%
Total
&
&
&
&\\
\hhline{|-|-|-|-}%
\end{tabular}
\end{document}