表格环境中的 Arraystretch 产生错位

表格环境中的 Arraystretch 产生错位

下面的代码

\documentclass[12pt,a4paper]{article}
\usepackage{array}
\usepackage{calc}
\begin{document}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{\textwidth * \real{0.8}}} 
\hline
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
\hline
Chats & bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla  \\
\hline
Programming & C, Java, OCaml, Bash, Fortran. Currently learning Python and R. \\
\hline
\end{tabular*}
\end{document}

产生这个:

在此处输入图片描述

如果我添加

\renewcommand{\arraystretch}{4}

在表格代码之前,输出如下:

在此处输入图片描述

L另外,如果我将使用该列的定义更改p为如下方式

\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}

然后我得到这个:

在此处输入图片描述

这些都不是我想要的输出。我想每一个细胞垂直居中。为什么会发生这种情况?我该如何解决?我尝试使用不同的解决方案(例如\setlength{\extrarowheight}{4pt}),但它们都受到同一问题的影响。

答案1

您使用的工具错误:

\documentclass[12pt,a4paper]{article}
\usepackage{tabularx,booktabs}

\setlength{\heavyrulewidth}{\lightrulewidth}
\setlength{\aboverulesep}{12pt}% choose
\setlength{\belowrulesep}{12pt}% choose

\begin{document}

\noindent
\begin{tabularx}{\textwidth}{@{} r X @{}}
\toprule
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
\midrule
Chats & bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla  \\
\midrule
Programming & C, Java, OCaml, Bash, Fortran. Currently learning Python and R. \\
\bottomrule
\end{tabularx}

\end{document}

在此处输入图片描述

如果您希望标签相对于主体垂直居中(但我不会这么做),您可以将列的类型设置Xm

\documentclass[12pt,a4paper]{article}
\usepackage{tabularx,booktabs,array}

\setlength{\heavyrulewidth}{\lightrulewidth}
\setlength{\aboverulesep}{12pt}% choose
\setlength{\belowrulesep}{12pt}% choose
\renewcommand{\tabularxcolumn}[1]{m{#1}}

\begin{document}

\noindent
\begin{tabularx}{\textwidth}{@{} r X @{}}
\toprule
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
\midrule
Chats & bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
        bla bla bla bla bla bla bla bla bla bla bla bla bla bla  \\
\midrule
Programming & C, Java, OCaml, Bash, Fortran. Currently learning Python and R. \\
\bottomrule
\end{tabularx}

\end{document}

在此处输入图片描述

答案2

在此处输入图片描述

mDavid Carlisle 的回答解释了列类型的问题。不幸的是,使用\arraystreatch和列类型p不会在hlines 和单元格内容之间提供相等的垂直空间。解决方案似乎是不使用 \arraystreatch和以不同的方式获得所需的垂直空间,例如使用包提供的规则booktabs

Eddit:对于第一列文本的垂直居中,您应该添加

\renewcommand\tabularxcolumn[1]{m{#1}}

确定垂直空间埃格尔在他的回答中,MWE 是:

\documentclass{article}
\usepackage{booktabs,tabularx}
\renewcommand\tabularxcolumn[1]{m{#1}}
\newcolumntype{L}{>{\raggedright\let\newline\\\arraybackslash}X}
\setlength{\aboverulesep}{2ex}% choose
\setlength{\belowrulesep}{2ex}% choose

\usepackage[active,floats,tightpage]{preview}
\setlength\PreviewBorder{2ex}

\begin{document}
\begin{table}[htb]% <-- added for preview
\begin{tabularx}{\textwidth}{rX}
    \midrule
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
    \midrule
Chats & bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla  \\
    \midrule
\end{tabularx}
\end{table}
\end{document}

在上述 MWE 中,使用的是tabular环境tabularx。它给出的列宽与你(错误地)使用的列间距确定值相等。

答案3

m类型将参考点置于其内容的垂直中心,而不考虑内部基线。因此,列中文本m与周围列中文本的任何对齐本质上都是偶然的。(如果您稍微缩小列,使文本跨越两行,那么在这种情况下它将重新对齐)

pb将参考点设置为内部基线(分别是顶线或底线),然后p再次进行对齐,如下所示。

在此处输入图片描述

\documentclass[a4paper]{article}
\addtolength\textwidth{2cm}
\usepackage{array}
\renewcommand{\arraystretch}{4}
\begin{document}

\newcolumntype{L}[1]{%
>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}

\centering
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{0.8\textwidth}}
\hline
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
\hline
Programming & C, Java, OCaml, Bash, Fortran. Currently learning Python and R. \\
\end{tabular*}

\newcolumntype{L}[1]{%
>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}

\centering
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{0.8\textwidth}}
\hline
Languages & Italian (native tongue), English (very fluent), German (beginner). \\
\hline
Programming & C, Java, OCaml, Bash, Fortran. Currently learning Python and R. \\
\end{tabular*}

\end{document}

相关内容