我基本上以同样的方式制作所有的表格:
是否可以让表格自动化\toprule
、\midrule
和\bottomrule
s \hdashline
?
\documentclass{article}
\usepackage{booktabs,array,arydshln}
\setlength\dashlinedash{0.2pt}
\setlength\dashlinegap{1.5pt}
\setlength\arrayrulewidth{0.3pt}
\begin{document}
\begin{table}[htp]
\begin{center}
\makebox[\textwidth][c]{
\begin{tabular}{ccc}
\toprule
First & Second & Third \\
\midrule
AAAAA & BBBBB & CCCCC \\ \hdashline
DDDDD & EEEEE & FFFFF \\ \hdashline
GGGGG & HHHHH & IIIII \\ \hdashline
JJJJJ & KKKKK & LLLLL \\ %hdashline
\bottomrule
\end{tabular}}
%makebox
\end{center}
\end{table}
\end{document}
答案1
这更像是一个评论。你可以用 Ti 来实现这种效果钾Z 矩阵,使用未记录的execute at end matrix
密钥。这是因为 Ti钾Z 矩阵“知道”它有多少行和列。下面是一个非常基本的版本,说明了这一点。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{tjt263 tabular/.style={matrix of nodes,nodes in empty cells,
execute at end matrix={
\draw[very thick] (\tikzmatrixname.north west) -- (\tikzmatrixname.north east)
(\tikzmatrixname.south west) -- (\tikzmatrixname.south east);
\foreach \YY in {2,...,\the\pgfmatrixcurrentrow}
{\path (\tikzmatrixname-\the\numexpr\YY-1\relax-1) -- (\tikzmatrixname-\YY-1)
coordinate[midway] (aux-\YY);
\ifnum\YY=2
\draw (\tikzmatrixname.west|-aux-\YY) -- (\tikzmatrixname.east|-aux-\YY);
\else
\draw[dotted] (\tikzmatrixname.west|-aux-\YY) -- (\tikzmatrixname.east|-aux-\YY);
\fi}
}}}
\begin{document}
\begin{tikzpicture}
\matrix[tjt263 tabular]{
First & Second & Third \\
AAAAA & BBBBB & CCCCC \\
DDDDD & EEEEE & FFFFF \\
GGGGG & HHHHH & IIIII \\
JJJJJ & KKKKK & LLLLL \\
};
\end{tikzpicture}
\end{document}
这适用于您的 MWE 示例,但可能不适用于更复杂的示例。有些东西可以非常轻松地添加,例如扩展到单元格内容具有不同高度的矩阵。更难实现(据我所知尚未实现)的是支持l
或r
类型列。这可能可以通过一些eqparbox
-type 技巧来实现,但据我所知,这还没有被阐明。
答案2
您可以使用 的强大方法来做到这一点expl3
。
主体在 处被分割\\
,然后标题行被分离出来;我们只需要关心尾随的\\
,它会产生一个空行,因此我们检查它(参见代码中的注释)。
环境tjttabular
有一个可选参数,默认为 3;如果您输入\begin{tjttabular}[4]
,您将得到一个四列表。
\documentclass{article}
\usepackage{booktabs,array,arydshln,xparse}
\ExplSyntaxOn
\NewDocumentEnvironment{tjttabular}{O{3} +b}
{
\tjt_tabular:nn { #1 } { #2 }
}
{}
\seq_new:N \l__tjt_tabular_body_seq
\tl_new:N \l__tjt_tabular_first_tl
\tl_new:N \l__tjt_tabular_last_tl
\cs_new_protected:Nn \tjt_tabular:nn
{
% split the body at \\
\seq_set_split:Nnn \l__tjt_tabular_body_seq { \\ } { #2 }
% pop the first item (the headers)
\seq_pop_left:NN \l__tjt_tabular_body_seq \l__tjt_tabular_first_tl
% pop the last item (possibly empty, if \\ is used in the last line)
\seq_pop_right:NN \l__tjt_tabular_body_seq \l__tjt_tabular_last_tl
% if the last item is not empty, put it back
\tl_if_empty:NF \l__tjt_tabular_last_tl
{
\seq_put_right:NV \l__tjt_tabular_body_seq \l__tjt_tabular_last_tl
}
% now typeset the table, separate items by \\\hdashline
\begin{tabular}{*{#1}{c}}
\toprule
\l__tjt_tabular_first_tl \\
\midrule
\seq_use:Nn \l__tjt_tabular_body_seq { \\ \hdashline } \\
\bottomrule
\end{tabular}
}
\ExplSyntaxOff
\setlength\dashlinedash{0.2pt}
\setlength\dashlinegap{1.5pt}
\begin{document}
\begin{table}[htp]
\centering
\begin{tjttabular}
First & Second & Third \\
AAAAA & BBBBB & CCCCC \\
DDDDD & EEEEE & FFFFF \\
GGGGG & HHHHH & IIIII \\
JJJJJ & KKKKK & LLLLL \\
\end{tjttabular}
\end{table}
\end{document}
请注意,\begin{center}
不应在里面使用table
,因为它会增加不必要的空间;\centering
是正确的命令。
也不\makebox[\textwidth][c]{...}
做任何事,因为\centering
已经处理了定心业务。