当我尝试在tabularx
环境中使用多列时,出现了这种奇怪的行为;其中列没有填满整个宽度。
有人知道为什么会发生这种情况,以及如何解决它吗?
\documentclass[12pt]{article}
\usepackage{tabularx,lipsum}
\begin{document}
\begin{tabularx}{\textwidth}{|X|X|}
\hline
\multicolumn{2}{|X|}{\sffamily Lorem ipsum dolor sit amet,}\\\hline
\multicolumn{2}{|X|}{\lipsum[2]}\\\hline
\sffamily Lorem av:&\sffamily Ipsum:\\
foo&bar\\\hline
\end{tabularx}
\end{document}
答案1
您必须指定\hsize
像|>{\hsize=2\hsize}X|
。如果它是三列3\hsize
等等。准确地说,将\tabcolsep
和 中的一个\arrayrulewidth
考虑在内,就像
>{\hsize=\dimexpr2\hsize+2\tabcolsep+\arrayrulewidth\relax}
代码:
\documentclass[12pt]{article}
\usepackage{tabularx,lipsum}
\usepackage[table]{xcolor}
\begin{document}
\noindent
\begin{tabularx}{\textwidth}{|X|X|}
\hline
\multicolumn{2}{|>{\hsize=\dimexpr2\hsize+2\tabcolsep+\arrayrulewidth\relax}X|}{\sffamily Lorem ipsum dolor sit amet, }\\\hline
\rowcolor{blue!40}
\multicolumn{2}{|>{\hsize=\dimexpr2\hsize+2\tabcolsep+\arrayrulewidth\relax}X|}{\lipsum*[2]}\\\hline
\sffamily Lorem av:&\sffamily Ipsum:\\
foo&bar \\\hline
\end{tabularx}
\end{document}
例如,对于三列,您必须使用
>{\hsize=\dimexpr3\hsize+4\tabcolsep+2\arrayrulewidth\relax}
如同
\documentclass[12pt]{article}
\usepackage{tabularx,lipsum}
\usepackage[table]{xcolor}
\begin{document}
\noindent
\begin{tabularx}{\textwidth}{|X|X|X|}
\hline
\multicolumn{3}{|>{\hsize=\dimexpr3\hsize+4\tabcolsep+2\arrayrulewidth\relax}X|}{\sffamily Lorem ipsum dolor sit amet, }\\\hline
\rowcolor{blue!40}
\multicolumn{3}{|>{\hsize=\dimexpr3\hsize+4\tabcolsep+2\arrayrulewidth\relax}X|}{\lipsum*[2]}\\\hline
\sffamily Lorem av:&\sffamily Ipsum:&\sffamily Ipsum:\\
foo&bar &bar\\\hline
\end{tabularx}
\end{document}
这里有三列,6\tabcolsep
列和 4\arrayrulewidth
列。其中 2 个外\tabcolsep
列和 2 个外列被保留(多列内部),而 4列和 2列\arrayrulewidth
的空间必须使用。\tabcolsep
\arrayrulewidth
答案2
我建立在已接受的答案之上,并\newcommand
为自己做了一个简单的多列恢复
\newcommand{\tabularxmulticolumncentered}[3]
{\multicolumn{#1}
{>{\centering\hsize=\dimexpr#1\hsize+#1\tabcolsep+\arrayrulewidth\relax}#2}
{#3}}
用于
\tabularxmulticolumncentered{2}{X}{My text spanning two columns}
答案3
Harish Kumar 已经对具体问题给出了答案。这里我想展示一种不同的方法来输入看似某种表格的内容。
\documentclass[12pt]{article}
\usepackage{expl3,environ}
\usepackage{lipsum}
\ExplSyntaxOn
\NewEnviron{Form}[1]
{
\keys_set:nn { david/form } { #1 }
\noindent
\begin{tabular}
{
|
p{ \dim_eval:n { .5\textwidth - 2\tabcolsep } }
|
p{ \dim_eval:n { .5\textwidth - 2\tabcolsep } }
|
}
\hline
\multicolumn{2}
{ | p{ \dim_eval:n { \textwidth - 2\tabcolsep } } | }
{ \sffamily \l_david_form_title_tl }
\\
\hline
\multicolumn{2}
{ | p{ \dim_eval:n { \textwidth - 2\tabcolsep } } | }
{ \BODY }
\\
\hline
\sffamily Lorem av: & \sffamily Ipsum \\ % <--------- CHANGE HERE
\l_david_form_bottomleft_tl & \l_david_form_bottomright_tl
\\
\hline
\end{tabular}
}
\keys_define:nn { david/form }
{% CHANGE THE KEY NAMES!
title .tl_set:N = \l_david_form_title_tl,
loremav .tl_set:N = \l_david_form_bottomleft_tl,
ipsum .tl_set:N = \l_david_form_bottomright_tl,
}
\ExplSyntaxOff
\begin{document}
\begin{Form}{
title = {Lorem ipsum dolor sit amet, eu vel enim virtute, modo rebum},
loremav = foo,
ipsum = bar
}
Here goes the body of the form, \lipsum*[2]
\end{Form}
\end{document}
我用expl3
它来定义按键和environ
收集主体。定义比较长,但输入表格要容易得多,因为各个部分都有明确的位置,而且没有隐藏在代码中。
答案4
您可以hspan=minimal
使用tabularray
包裹:
\documentclass[12pt]{article}
\usepackage{tabularray,lipsum}
\begin{document}
\begin{tblr}{
colspec = {|X|X|},
row{1,3} = {font=\sffamily},
cell{1,2}{1} = {c=2}{l}, % multicolumn
hspan = minimal,
}
\hline
Lorem ipsum dolor sit amet & \\
\hline
\lipsum[2] & \\
\hline
Lorem: & Ipsum: \\
Foo & Bar\\
\hline
\end{tblr}
\end{document}