答案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 减少O
0.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}