如何制作一个长度和宽度固定的表格,其中不同长度的文字可以自动换行

如何制作一个长度和宽度固定的表格,其中不同长度的文字可以自动换行

我想创建一个长度和宽度固定的表格,其中不同长度的文本可以自动换行,并且文本应该垂直和水平居中。我尝试了很多方法,但都没有成功,有人知道怎么做吗如果我只填写短线,表格看起来就像这样如果我填充长文本,表格长度会比以前更长,并且文本不会垂直居中这是我的代码

答案1

2020 年 4 月 21 日更新添加了示例 3 和 4

示例 1 -calstable

如果你可以忍受没有颜色规则,你可以轻松地使用设置这样的表卡路里

如果您想要一个更窄的表格,而不是填满整个行宽,只需在公式中输入数字 <1,即

{\dimexpr(0.9\columnwidth)/34*4\relax}

如果您想要不同的列宽,只需更改其他数字,并确保数字相加。例如,如果您将 34 更改为 30,则必须更改列宽,以便所有列的总和也为 30。否则,表格将比线宽更宽。例如:

\colwidths{{\dimexpr(\columnwidth)/30*4\relax}
            {\dimexpr(\columnwidth)/30*10\relax}
            {\dimexpr(\columnwidth)/30*5\relax}
            {\dimexpr(\columnwidth)/30*5\relax}
            {\dimexpr(\columnwidth)/30*6\relax}
    }

这里,4+1+5+5+6=30

calstables是多页的,但随后您必须删除表格环境:

在此处输入图片描述

\documentclass{article}
\usepackage{cals, caption}
\usepackage[svgnames]{xcolor}

\let\nc=\nullcell                          % Shortcuts
\let\sc=\spancontent

\begin{document}

\begin{table}                   % If table is multipage, remove the table environment
\caption{A table\label{tabelTable}}

\begin{calstable}[c]

% Defining columns relative to each other and relative to the margins
\colwidths{{\dimexpr(\columnwidth)/34*4\relax}
            {\dimexpr(\columnwidth)/34*12\relax}
            {\dimexpr(\columnwidth)/34*6\relax}
            {\dimexpr(\columnwidth)/34*6\relax}
            {\dimexpr(\columnwidth)/34*6\relax}
    }
% The tabular fills the text area if sum of all columns is 34

% Set up the tabular
\makeatletter
\def\cals@framers@width{0.2pt}   % Outside frame rules, reduce if the rule is too heavy
\def\cals@framecs@width{0.2pt}
\def\cals@bgcolor{}
\def\cals@AtBeginCell{\vfil}             % Ensure that all cells is vertically centred
\setlength{\cals@paddingL}{3pt}
\setlength{\cals@paddingR}{3pt}


\def\lblue{\ifx\cals@bgcolor\empty     % "Switch" to turn on and off colour
    \def\cals@bgcolor{LightSteelBlue}
\else \def\cals@bgcolor{} \fi}


% R1H1
\thead{\footnotesize\bfseries
\brow
    \lblue\nc{lrt}
    \nc{ltb}
    \nc{tb}
    \nc{rtb}\alignC\sc{Heading spanning three columns}
    \nc{lrt}
\erow
%R2H2
\brow
    \nc{lrb}\alignC\sc{Text}
    \cell{Subheading is long and that wraps}
    \cell{Short}
    \cell{Subheading that wraps}
    \nc{lrb}\alignC\sc{Text}\lblue
\erow
\mdseries}
\tfoot{\lastrule\strut}
%R3B1
\brow
    \alignC\cell{Wrapping text}
    \cell{Horiz. and vertic. centred}
    \cell{2}
    \cell{3}
    \cell{1}
\erow
%R3B1
\brow
    \alignC\cell{1}
    \cell{2}
    \cell{2}
    \cell{3}
    \cell{1}
\erow
\makeatletter
\end{calstable}
\end{table}

\end{document}

示例 2 -长桌

您还可以使用以下方法实现结果长桌(或表格),但你必须加载其他包,例如多行大批线。由于您使用颜色和规则,您可能会遇到“消失规则”综合症和单元格中的白线。我通过使用而不是multirow部分避免了这种情况,但要获得正确的颜色很复杂。\hhline\cline

我使用了固定宽度的列,但你可以像我一样使用以下方法计算列卡路里. 情况更为复杂长桌,因为你必须考虑到\tabcolsep\arrayrulewidth在计算中。

当然,您不必像我一样定义新的列类型。要有五列不同的宽度,将序言设置为:

\begin{longtable}[c]{|@{\extracolsep{\fill}}
         >{\color{red}\centering\arraybackslash\hspace{0pt}}m{1.5cm}}
         >{\color{red}\centering\arraybackslash\hspace{0pt}}m{3.5cm}}
         >{\color{red}\centering\arraybackslash\hspace{0pt}}m{2.5cm}}
         >{\color{red}\centering\arraybackslash\hspace{0pt}}m{2cm}}
         >{\color{red}\centering\arraybackslash\hspace{0pt}}m{1.75cm}}

只需确保表格的宽度不超过行宽即可。使用上面的序言,表格的宽度为 (10.75 cm + 10 \tabcolsep+ 6 \arrayrulewidth)。命令

@{\extracolsep{\fill}}

确保longtable将拉伸至整个线宽。

下面的例子假设一些列具有相同的宽度:

在此处输入图片描述

\documentclass{article}
\usepackage{array, caption, multirow, longtable, hhline}
\usepackage[svgnames, table]{xcolor}

\newcolumntype{M}{>{\color{red}\centering\arraybackslash\hspace{0pt}}m{3.5cm}}
\newcolumntype{N}{>{\color{red}\centering\arraybackslash\hspace{0pt}}m{2.5cm}}
\newcolumntype{O}{>{\color{red}\centering\arraybackslash\hspace{0pt}}m{2cm}}

\setlength{\tabcolsep}{0pt}
\arrayrulecolor{LightSteelBlue}
\setlength{\extrarowheight}{2pt}

\renewcommand{\arraystretch}{1.1}

\renewcommand{\multirowsetup}{\centering}
\newcommand{\cw}[1]{\textcolor{white}{\bfseries #1}}
\newcommand{\tr}[1]{\textcolor{red}{#1}}

\begin{document}

\begin{longtable}[c]{|@{\extracolsep{\fill}}O|M|N|N|O|}
\hline
\rowcolor{SteelBlue}&\multicolumn{3}{c|}{\cw{Long heading spanning three columns}} & \\
\hhline{|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}---|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}|}
\rowcolor{SteelBlue}\multirow{-2}{=}{\cw{Text}} & \cw{Subheading is long and that wraps} & \cw{Short} & \cw{Subheading that wraps} &\multirow{-2}{=}{\cw{Text}} \\
\hline
Wrapping text &Horiz. and vert. centred & 3 & 4 & 5 \\ \hline
1&2&3&4&5\\
\hline

\end{longtable}

\end{document}

示例 3 -板状的

板状的长桌表格型,并将帮助您计算多页表中的列宽。请阅读手册表格型板状的长桌

在示例中,我将X-columns 从p- 重新定义为m-columns,请参阅 tabularx 手册了解相关说明。我还设置了彼此之间的列宽,手册中也对此进行了描述。确保所有 -columns 的宽度总和X保持不变。在示例中,新宽度仍为五个标准 X 列之和,即 1.8 + (2 x 0.9) + (2 x 0.7)。

例如,如果将M-column 的宽度增加到 1.9,则必须将 -column 减少O0.5,或者将N- 和O-column 减少 0.25。

如果需要更宽的表格,则必须减少文档的左右边距。例如使用几何学

在此处输入图片描述

\documentclass{article}
\usepackage{array, caption, multirow, xltabular, hhline}
\usepackage[svgnames, table]{xcolor}

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

\newcolumntype{M}{>{\color{red}\centering\arraybackslash\hspace{0pt}\hsize=1.8\hsize\linewidth=\hsize}X}
\newcolumntype{N}{>{\color{red}\centering\arraybackslash\hspace{0pt}\hsize=0.9\hsize\linewidth=\hsize}X}
\newcolumntype{O}{>{\color{red}\centering\arraybackslash\hspace{0pt}\hsize=0.7\hsize\linewidth=\hsize}X}

\setlength{\tabcolsep}{4pt}
\arrayrulecolor{LightSteelBlue}
\setlength{\extrarowheight}{2pt}

\renewcommand{\arraystretch}{1.1}

\renewcommand{\multirowsetup}{\centering}
\newcommand{\cw}[1]{\textcolor{white}{\bfseries #1}}
\newcommand{\tr}[1]{\textcolor{red}{#1}}

\begin{document}

\begin{xltabular}[c]{\linewidth}{|O|M|N|N|O|}

\caption{A caption}\\

\hline
\rowcolor{SteelBlue}&\multicolumn{3}{c|}{\cw{Long heading spanning three columns}} & \\
\hhline{|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}---|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}|}
\rowcolor{SteelBlue}\multirow{-2}{=}{\cw{Text}} & \cw{Subheading is long and that wraps} & \cw{Short} & \cw{Subheading that wraps} &\multirow{-2}{=}{\cw{Text}} \\
\endhead
\hline
Wrapping text &Horiz. and vert. centred & 3 & 4 & 5 \\ \hline
1&2&3&4&5\\
\hline

\end{xltabular}

\end{document}

示例 4 -板状的和单独的列宽

如果你需要不同宽度的列,你仍然可以使用板状的计算相对宽度,以便表格填充线宽(或其一小部分)。

在此示例中,您将 -column 的相对宽度X作为参数提供给定义的M-column。请记住,分数的总和必须与M-column 的数量相同。如果您使用四个M-column,则分数的总和也必须是四个。

我还定义了一个M采用固定宽度的列。您可以组合这两种列类型,请参见以下示例:

在此处输入图片描述

\documentclass{article}
\usepackage{array, caption, multirow, xltabular, hhline}
\usepackage[svgnames, table]{xcolor}

\renewcommand{\tabularxcolumn}[1]{>{\color{red}\centering\arraybackslash\hspace{0pt}}m{#1}}

\newcolumntype{M}[1]{>{\hsize=#1\hsize\linewidth=\hsize}X}
\newcolumntype{N}[1]{>{\color{red}\centering\arraybackslash\hspace{0pt}}m{#1}}

\setlength{\tabcolsep}{4pt}
\arrayrulecolor{LightSteelBlue}
\setlength{\extrarowheight}{2pt}

\renewcommand{\arraystretch}{1.1}

\renewcommand{\multirowsetup}{\centering}
\newcommand{\cw}[1]{\textcolor{white}{\bfseries #1}}
\newcommand{\tr}[1]{\textcolor{red}{#1}}

\begin{document}

\begin{xltabular}{\linewidth}{|M{0.5}|M{1.5}|M{0.75}|M{1.25}|N{2.5cm}|}

\caption{A caption}\\

\hline
\rowcolor{SteelBlue}&\multicolumn{3}{|c|}{\cw{Long heading spanning three columns}} & \\
\hhline{|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}---|>{\arrayrulecolor{SteelBlue}}->{\arrayrulecolor{LightSteelBlue}}|}
\rowcolor{SteelBlue}\multirow{-2}{=}{\cw{Text}} & \cw{Subheading is long and wraps} & \cw{Short} & \cw{Subheading that wraps} &\multirow{-2}{=}{\cw{Text}} \\
\endhead
\hline
Wrapping text &Horiz. and vert. centred & 3 & 4 & 5 \\ \hline
1&2&3&4&5\\
\hline

\end{xltabular}

\end{document}

答案2

例如这样的事情:

\def\tableline#1#2#3{%
   \hbox{\onecolumn{5cm}{#1}\onecolumn{7cm}{#2}\onecolumn{4cm}{#3}}
}
\def\onecolumn#1#2{$\vcenter{
   \leftskip=.3em plus1fill \rightskip=\leftskip \parindent=0pt
   \hsize=#1\relax \strut#2\strut}$%
}

\vbox{
   \tableline{gd hd jvdhj gsd hksd fd cfg s5 esa dds s}
             {dusids ksb}
             {fhusd sb hjs suvsjf fudf vdu vdv}
   \tableline{gf dssiw yisd yds d}
             {dkd dsks hd dsgs gcg csgc lv jlcv f dhjs ksd dn hjd j hj}
             {dghd}
}

\bye

这是表格有三列的示例,第一列宽 5cm,第二列宽 7cm,第三列宽 4cm。您可以简单地修改此宏以配置其他列。

宏的核心是使用\vcenter数学模式中的原始函数进行垂直对齐。\hsize原始寄存器设置为段落的所需宽度。\leftskip和的righrskip设置是为了使段落居中。

答案3

诀窍是将宽度参数作为宏传递,并使用 collcell 作为内容。

\documentclass{standalone}
\usepackage{array}
\usepackage{collcell}
\usepackage{blindtext}% MWE nly

\newcommand{\mycolumn}[1]{\parbox[c]{\myarg}{\centering #1}}
\newcolumntype{M}[1]{>{\def\myarg{#1}\collectcell\mycolumn}{l}<{\endcollectcell}}

\begin{document}
\begin{tabular}{r|M{4in}|}
center-- & \protect\blindtext
\end{tabular}%
\end{document}

演示

相关内容