我希望表格中某些列具有最小的列宽,即使内容较小也应始终保持该列宽,但当内容较宽时该列宽会增加。
赏金相关更新:@Sandy G 的答案产生了所需的行为,但我希望它是一种列类型,以便我可以像这样指定它:
\documentclass{article}
\begin{document}
\begin{tabular}{m{2cm}m{2cm}m{1cm}m{1cm}}
Longer entry here&2&3&4\\
5&6&Longer entry here&8
\end{tabular}
\end{document}
答案1
看附录和奖金
第一、原始做法。
这里有一个\newcolumntype
解决方案,但由于我应该知道但我不知道的原因,它在最后一列不起作用tabular
。我相信 David C. 可以即兴地告诉我原因。
因此,我提供了C{}
、L{}
和R{}
列类型来指定最小宽度,以及Q
用于幻影的列类型,以解决我最初提到的缺陷。
\documentclass{article}
\usepackage{tabularx,stackengine}
\newcolumntype{L}[1]{>{\minwd l{#1}}l<{\endminwd}}
\newcolumntype{C}[1]{>{\minwd c{#1}}c<{\endminwd}}
\newcolumntype{R}[1]{>{\minwd r{#1}}r<{\endminwd}}
\def\minwd#1#2#3\endminwd{\stackengine{0pt}{#3}{\rule{#2}{0pt}}{O}{#1}{F}{F}{L}}
\newcolumntype{Q}{@{}c@{}}
\begin{document}
\begin{tabular}{|C{1.2cm}|C{1.2cm}|R{2cm}|l|}
a & a& b& c\\
aaaaaaaaaaaaaaaaa& aa& bb& cc\\
\end{tabular}
\bigskip
\begin{tabular}{|C{1.2cm}|C{1.2cm}|R{2cm}|L{1.5cm}|Q}
a & a& b& c&\\
aaaaaaaaaaaaaaaaa& aa& bb& cc&\\
\end{tabular}
\end{document}
附录
显然,克服我在原始解决方案中指出的缺陷的方法是使用\collectcell
:
\documentclass{article}
\usepackage{tabularx,stackengine,collcell}
\let\endminwd\relax
\newcolumntype{L}[1]{>{\collectcell\xminwd l{#1}}l<{\endminwd\endcollectcell}}
\newcolumntype{C}[1]{>{\collectcell\xminwd c{#1}}c<{\endminwd\endcollectcell}}
\newcolumntype{R}[1]{>{\collectcell\xminwd r{#1}}r<{\endminwd\endcollectcell}}
\def\minwd#1#2#3\endminwd{\stackengine{0pt}{#3}{\rule{#2}{0pt}}{O}{#1}{F}{F}{L}}
\newcommand\xminwd[1]{\minwd#1}
\begin{document}
\begin{tabular}{|C{1.2cm}|C{1.2cm}|R{2cm}|L{1.5cm}|}
a & a& b& c\\
aaaaaaaaaaaaaaaaa& aa& bb& cc\\
\end{tabular}
\end{document}
只是为了好玩,如果你将的垂直测量值设置\rule
为非零值,比如说1pt
,你就可以看到规则是如何发挥作用的:
奖金
我意识到该技术可用于创建D
用于对齐指定数量的尾随小数位的列。已编辑以处理无小数输入。
\documentclass{article}
\usepackage{tabularx,stackengine,collcell}
\let\endecm\relax
\newcolumntype{D}[1]{>{\collectcell\Decm l{#1}}r<{..\endDecm\endcollectcell}}
\def\decm#1#2#3.#4.#5\endDecm{#3.\stackengine{0pt}{#4}{\rule{#2\wd0}{0pt}}{O}{#1}{F}{F}{L}}
\newcommand\Decm[1]{\setbox0=\hbox{0}\decm#1}
\begin{document}
\begin{tabular}{|D{3}|D{2}|D{4}|}
10.345 & 410.34 & 1310.34\\
10 & 11 & 12.\\
210.34 & 1210.3 & 310.3456\\
\end{tabular}
\end{document}
答案2
0pt
\rule
这可以通过放置一排带有负行分隔符的 s 来实现(为了正确的垂直对齐)。
在示例中,第 1 列和第 2 列的最小宽度为2cm
,而第 3 列和第 4 列的最小宽度为 1cm。
\documentclass{article}
\begin{document}
\[
\begin{tabular}{cccc}
\rule{2cm}{0pt}&\rule{2cm}{0pt}&\rule{1cm}{0pt}&\rule{1cm}{0pt}\\[-\arraystretch\normalbaselineskip]]
Longer entry here&2&3&4\\
5&6&Longer entry here&8
\end{tabular}
\]
\end{document}
更新:通过将 放置\rule
在宏中,您可以像列类型一样调整文档主体中的固定最小值。
以下是代码:
\documentclass{article}
\newcommand{\fixedmin}[1]{\rule{#1}{0pt}&\rule{#1}{0pt}&\rule{#1}{0pt}&\rule{#1}{0pt}\\[-\arraystretch\normalbaselineskip]}
\begin{document}
\noindent Here is a table with fixed minimum width 2 cm.
\[
\begin{tabular}{cccc}\fixedmin{2cm}
Longer entry here&2&3&4\\
5&6&Longer entry here&8
\end{tabular}
\]
\noindent Here is a table with fixed minimum width 1 cm.
\[
\begin{tabular}{cccc}\fixedmin{1cm}
Longer entry here&2&3&4\\
5&6&Longer entry here&8
\end{tabular}
\]
\noindent Here is a table with no fixed minimum width.
\[
\begin{tabular}{cccc}
Longer entry here&2&3&4\\
5&6&Longer entry here&8
\end{tabular}
\]
\end{document}
答案3
这是使用包来实现此目的的方法collcell
。其想法是测量单元格的内容,然后在适当的位置添加规则以弥补不足。我为c
、r
和l
列制作了版本。垂直线只是为了显示固定宽度的列。
\documentclass{article}
\usepackage{array,calc,collcell}
\newlength{\fwlen}
\newcolumntype{C}[1]{>{\setlength{\fwlen}{#1}\collectcell\fixedCwidth}c<{\endcollectcell}}
\newcolumntype{R}[1]{>{\setlength{\fwlen}{#1}\collectcell\fixedRwidth}r<{\endcollectcell}}
\newcolumntype{L}[1]{>{\setlength{\fwlen}{#1}\collectcell\fixedLwidth}l<{\endcollectcell}}
\makeatletter
\newcommand{\fixedCwidth}[1]{\setlength{\@tempdima}{\widthof{#1}}\ifdim\@tempdima>\fwlen #1\else\setlength{\@tempdimb}{(\fwlen-\@tempdima)/2}\rule{\@tempdimb}{0pt}#1\rule{\@tempdimb}{0pt}\fi}
\newcommand{\fixedLwidth}[1]{\setlength{\@tempdima}{\widthof{#1}}\ifdim\@tempdima>\fwlen #1\else\setlength{\@tempdimb}{\fwlen-\@tempdima}#1\rule{\@tempdimb}{0pt}\fi}
\newcommand{\fixedRwidth}[1]{\setlength{\@tempdima}{\widthof{#1}}\ifdim\@tempdima>\fwlen #1\else\setlength{\@tempdimb}{\fwlen-\@tempdima}\rule{\@tempdimb}{0pt}#1\fi}
\makeatother
\begin{document}
\begin{tabular}{|C{1cm}|L{1cm}|R{1cm}|C{1cm}|C{1cm}|}
123 & 123 & 123 & 123 & This is a wider column\\
5 & 6 & 6 & 8 & 8
\end{tabular}
\end{document}
答案4
为了正确执行此操作,您需要每列的最小宽度和最大宽度。您的问题要求最小宽度。我想说,最好有一个最大宽度,否则您的表格可能会超出边距。
\documentclass{article}
\usepackage{array}
\usepackage{varwidth}% varwidth defines a new column type V.
\begin{document}
\begin{tabular}{*{4}{V{4cm}}}
\hspace*{2cm} & \hspace*{2cm} & \hspace*{1cm} & \hspace*{1cm}\\[-1em]
Longer entry here&2&3&4\\
5&6&Longer entry here, which gets wrapped finaly&8\\
\end{tabular}
\end{document}
有两个小技巧。
首先,varwidth 包定义了一种新的列类型,但手册中没有记录这一点,我在这里找到了它:https://texfaq.org/FAQ-varwidcol
V{4cm}
设置列的最大宽度。
第二:我们需要一个最小宽度。我们只需取表格的空行,并用所需最小宽度的空白填充它即可。为了隐藏此行,我插入了\\[-1em]
,您需要根据自己的使用情况进行调整。我建议将其作为表格的第一行,然后是表格的头部,而不是相反。
希望它能在您的使用案例中发挥作用!