我在创建复杂(对我来说)的表格时遇到了一些麻烦。
成为:
我写了这段代码:
\begin{tabularx}{\linewidth}{|X|X|X|X|X|X|X|X|}
\hline
\multirow{2}{*}{Short text} & \multicolumn{4}{|>{\hsize=\dimexpr4\hsize+4\tabcolsep+\arrayrulewidth\relax}X|}{Some long multi column text that can be multi line} & \multirow{2}{*}{Some long one column text that can be multi line} & \multirow{2}{*}{Some long one column text that can be multi line} & \multirow{2}{*}{Some long one column text that can be multi line}\\
\hline
& long_word & long_word & long_word & long_word & & & \\
\hline
\end{tabularx}
但第二行的单词没有连字符。而且多行不起作用。我做错了什么?
答案1
表格宽度的计算比平常要复杂一些,因为你要指定全部的列宽,而不是可用的列宽。LaTeX 需要提供有关可用列宽的信息。必须从总列宽中减去任何空白填充和垂直规则的宽度才能获得可用的列宽。
让我们标记可用的列宽\xlen
、\ylen
和\zlen
分别以及全部的列宽分别为\xtotlen
、\ytotlen
和\ztotlen
。总列宽必须满足
5\xtotlen+\ytotlen+2\ztotlen=\textwidth
\ytotlen=3\xtotlen
\ztotlen=2\totxlen
(旁白:请注意\textwidth=12\xtotlen
。)
接下来回想一下
\xtotlen=\xlen+2\tabcolsep+1\arrayrulewidth
\ytotlen=\ylen+2\tabcolsep+1\arrayrulewidth
\ztotlen=\zlen+2\tabcolsep+1\arrayrulewidth
经过一些重新排列后,我们可以表达可用的列宽如下:
\xlen = (\textwidth-24\tabcolsep-12\arrayrulewidth)/12
\ylen = 3\xlen+4\tabcolsep+2\arrayrulewidth
\zlen = 2\xlen+2\tabcolsep+1\arrayrulewidth
眼尖的读者可能已经注意到,这些计算没有考虑到位于第一列左侧的第一个垂直线的宽度;它的宽度等于\arrayrulewidth
。为了使宽度计算真正正确,必须将其更改\xlen = (\textwidth-24\tabcolsep-12\arrayrulewidth)/12
为。(鉴于默认\xlen = (\textwidth-24\tabcolsep-13\arrayrulewidth)/12
值为,我怀疑任何人都不会注意到差异。)\tabcolsep
0.4pt
好了,说得够多了!让我们看看这一切是如何进行的。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[letterpaper,margin=1in]{geometry} % set page parameters suitably
\usepackage{multirow}
\usepackage{array} % for \newcolumntype macro
\usepackage{ragged2e} % for \RaggedRight macro
\newcolumntype{P}[1]{>{\RaggedRight\hspace{0pt}}p{#1}}
%% Compute the three column widths:
\newlength\xlen
\setlength\xlen{\dimexpr\textwidth-24\tabcolsep-13\arrayrulewidth\relax}
\setlength\xlen{\dimexpr0.08333333\xlen\relax} % 1/12 \approx 0.08333333
\newlength\ylen
\setlength\ylen{\dimexpr3\xlen+4\tabcolsep+2\arrayrulewidth\relax}
\newlength\zlen
\setlength\zlen{\dimexpr2\xlen+2\tabcolsep+1\arrayrulewidth\relax}
\newcommand\longword{long\_\discretionary{}{}{}word}
\begin{document}
\noindent % <-- this is important
\begin{tabular}{ | *{5}{P{\xlen}|} P{\ylen}| *{2}{P{\zlen}|} }
\hline
\multirow{4}{=}{Short text}
& \multicolumn{4}{>{\RaggedRight}P{\dimexpr4\xlen+6\tabcolsep+3\arrayrulewidth}|}{%
Some long multi-column text which can be multi-line}
& \multirow{4}{=}{Some long one-column text which can be multi-line}
& \multirow{4}{=}{Some long one-column text which can be multi-line}
& \multirow{4}{=}{Some long one-column text which can be multi-line} \\
\cline{2-5} % not "\hline"
& \longword & \longword & \longword & \longword & & & \\
\hline
\end{tabular}
\end{document}
答案2
对于固定宽度列,在 中\multirow
,您应该使用{=}
宽度参数,而不是{*}
。此外,对于多行单元格,第一个参数 应该是包含的行总数,而不是行数。此外,为了微调多行内容的垂直位置,您可以使用非整数行数。最后,由于 tabularx 似乎在 的参数中对固定宽度列类型存在问题\multicolumn}
,我使用了multicolumn{4}{c}{\makecell{...\\...}}
,其中换行是手动完成的。
\documentclass{article}
\usepackage{geometry}
\usepackage{calc}
\usepackage{tabularx, multirow, makecell}
\begin{document}
\centering\small
\setlength{\extrarowheight}{3pt}
\begin{tabularx}{\linewidth}{|*{5}{>{\hsize=0.66\hsize}X|}>{\hsize=2\hsize}X|*{2}{>{\hsize=1.35\hsize}X|}}
\hline
\multirow{3}{=}{Short text} &
\multicolumn{4}{c|}{\makecell{Some long multi column text\\ that can be multi line}}
& \multirow{3}{=}{Some long one column text that can be multi line} & \multirow{2}{=}{Some long one column text that can be multi line} & \multirow{2}{=}{Some long one column text that can be multi line}\\
\cline{2-5}
& long\_ word & long\_ word & long\_ word & long\_ word & & & \\
\hline
\end{tabularx}
\end{document}
答案3
只是出于好奇,因为作者说
Proportionally columns should be so: 1-1-1-1-1-3-2-2
将文本宽度分为 12 列——
前 5 列是文本宽度的 0.08 倍——
下一个是 3 乘以 0.08 --
最后两个是 2 乘以 0.08
\documentclass{article}
%\usepackage[showframe]{geometry}
\usepackage{graphicx}
\usepackage{ragged2e}
\usepackage{tabularx}
\begin{document}
\begin{table}[!ht]
\centering
\renewcommand{\arraystretch}{1.5} %
\setlength{\tabcolsep}{4pt}
\begin{tabularx}{\textwidth}
{
|*{5}{>{\centering\arraybackslash\hsize=0.08\hsize}X|}
*{1}{>{\centering\arraybackslash\hsize=0.24\hsize}X|}
*{2}{>{\centering\arraybackslash\hsize=0.16\hsize}X|}
}
\hline%
G & G & G & G & G & G & G & G \\
\hline%
\end{tabularx}
\end{table}
\end{document}