因此,设计师完成了他们的工作,并为所有表格指定了彩色背景和圆角。如下所示:
如此处所述,这需要做一些麻烦的事情,比如把整个桌子放进一个保存箱,测量它的大小,然后设置剪切路径,以及然后粉刷桌子。
现在的问题是:如果这是一张多页表格,上面打印有longtable
或,会怎么样supertabular
?能否截取每页上书写的部分,对其进行同样的恶意操作?
当然,最好的情况下,确切的恶意程度取决于这是第一个还是最后一个,或者是表格的中间块之一。
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{array}
\usepackage{environ}
\usepackage{tikz}
\newsavebox{\tablebox}
\definecolor{tablecolor}{named}{ForestGreen}
\NewEnviron{rndtable}[1]{%
\addtolength{\extrarowheight}{1ex}%
\rowcolors{2}{tablecolor!20}{tablecolor!40}%
\sffamily%
\newcommand{\header}[1]{%
\multicolumn{1}{c}{%
\cellcolor{tablecolor}\color{white}\bfseries##1}}
\savebox{\tablebox}{%
\begin{tabular}{#1}%
\BODY%
\end{tabular}}%
\begin{tikzpicture}
\clip[rounded corners=1ex] (0,-\dp\tablebox) -- (\wd\tablebox,-\dp\tablebox) -- (\wd\tablebox,\ht\tablebox) -- (0,\ht\tablebox) -- cycle;
\node at (0,-\dp\tablebox) [anchor=south west,inner sep=0pt]{\usebox{\tablebox}};
\draw[tablecolor,very thick,rounded corners=1ex] (0,-\dp\tablebox) -- (\wd\tablebox,-\dp\tablebox) -- (\wd\tablebox,\ht\tablebox) -- (0,\ht\tablebox) -- cycle;
\end{tikzpicture}
}
\begin{document}
\noindent
\begin{rndtable}{cccp{5cm}l}
\header{vote} &
\header{answer} &
\header{views} &
\header{question} &
\header{user} \\
1 & 1 & 20 & How can I improve this table (using tabularx)? & Jubobs 21.3k\\
0 & 0 & 3 & References alignment problem in IEEtrans & Prateek Jain 1\\
1 & 1 & 29 & Problem with cases environment when used in a stack & Steven B. Segletes 32.2k\\
1 & 0 & 85 & TikZ error for externalized graphics but output is correct & henry 1,033\\
0 & 0 & 12 & Working with leaflets & Claudio Fiandrino 33.1k\\
\end{rndtable}
\end{document}
答案1
这是部分答案;我已将其标记为 CW,并希望其他人(看着你 dpc......:-) 可以帮助完成它。
或者,可能有更好的方法来实现这一点。如果是这样的话,请随意窃取我的 Ti钾Z 位,一旦出现更好的答案,我就会删除该帖子。
我最初的想法是破解 的定义\LT@end@hd@ft
,它用于处理 的各种“特殊块” longtable
,例如\endhead
、\endfirsthead
等。一旦块被处理并放入适当的框中(\setbox##1\box\z@
在下面的代码中),我们可以使用\ifx
测试来检查我们正在处理哪个部分,然后相应地修改框内容。
我的代码只会弄乱\LT@firsthead
(\firsthead
内容),但这些条件可以嵌套,以根据需要对任何特殊块执行特殊操作。
状态:这个想法可行,但有一些我不明白的问题。可能是我犯了一些愚蠢的错误。问题如下:
- 第一个标题行(我弄乱的那行)占据了文本块的整个宽度,而不是表格的自然宽度。我认为这可能与
longtable
的审判过程有关,因此它可能可以通过在与我不同的时间修改框来解决。 - 最后一行,我们需要裁剪底角。如果用户添加
\endlastfoot
,我们可以使用与类似的方法\endfirsthead
。但是(就像这里的情况一样),并非所有表格在表脚处都有特殊行。 - 在中间部分周围添加边框。如果需要,这里还包括在每个连续页面的顶部和底部进行圆角处理。这可以通过连续页面的页眉和页脚来实现,但同样,并非所有表格都有这些。
我认为所有这些问题都可以由longtable
比我更了解的人来解决。所以,正如我所说,请随意使用我的 Ti钾Z 代码来扩展/修复解决方案。我所有的 Ti钾Z 命令只有一个参数,即要操作的框。我认为这个东西更适合放在输出部分,但我在那里的尝试失败了。
我还稍微调整了一下代码,以便在短表和长表之间共享样式,这样可以更容易地全局更改样式。
这是现在的代码。longtable
示例有足够的行来覆盖开头的部分页面、中间的整页和结尾的部分页面,以测试各种场景。
\documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{environ}
\usepackage{tikz}
\usepackage{longtable}
\usepackage{showframe} % just for testing...
% test commands
\def\Z{ 0 & 0 & 12 & Working with leaflets & Claudio Fiandrino\\}
\def\ZZ{\Z\Z\Z\Z}\def\ZZZ{\ZZ\ZZ\ZZ\ZZ}\def\ZZZZ{\ZZZ\ZZZ\ZZZ\ZZZ}
% some stuff common to short and long tables
\definecolor{tablecolor}{named}{ForestGreen}
\newcommand{\header}[1]{%
\multicolumn{1}{c}{%
\cellcolor{tablecolor}\color{white}\bfseries#1}}
\newcommand{\rndtablesetup}{%
\addtolength{\extrarowheight}{1ex}%
\rowcolors{2}{tablecolor!20}{tablecolor!40}%
\sffamily}
% styles for the clipping/internal nodes
\tikzset{
myclip/.style={rounded corners=1ex},
mynode/.style={anchor=south west,inner sep=0pt,outer sep=0pt},
mybord/.style={myclip,very thick,tablecolor},
}
% the short table (provided)
\newsavebox{\tablebox}
\NewEnviron{rndtable}[1]{%
\rndtablesetup%
\savebox{\tablebox}{%
\begin{tabular}{#1}%
\BODY%
\end{tabular}}%
\begin{tikzpicture}
\clip[myclip] (0,-\dp\tablebox) -- (\wd\tablebox,-\dp\tablebox) --
(\wd\tablebox,\ht\tablebox) -- (0,\ht\tablebox) -- cycle;
\node[mynode] at (0,-\dp\tablebox) {\usebox{\tablebox}};
\draw[mybord] (0,-\dp\tablebox) -- (\wd\tablebox,-\dp\tablebox) --
(\wd\tablebox,\ht\tablebox) -- (0,\ht\tablebox) -- cycle;
\end{tikzpicture}}
% round top
\newcommand{\roundtop}[1]{%
\begin{tikzpicture}
\clip[myclip] (0,0) |- (\wd#1,\ht#1+\dp#1) -- (\wd#1,0);
\draw[mybord] (0,0) |- (\wd#1,\ht#1+\dp#1) -- (\wd#1,0);
\node[mynode] at (0,0) {\box#1};
\end{tikzpicture}}
% round bottom
\newcommand{\roundbot}[1]{%
\begin{tikzpicture}
\clip[myclip] (0,0) |- (\wd#1,-\ht#1+\dp#1) -- (\wd#1,0);
\draw[mybord] (0,0) |- (\wd#1,-\ht#1+\dp#1) -- (\wd#1,0);
\node[mynode] at (0,0) {\box#1};
\end{tikzpicture}}
% frame midsections
\newcommand{\framemid}[1]{%
\begin{tikzpicture}
\draw[mybord] (0,0) -- (0,\ht#1+\dp#1) (\wd#1,0) -- (\wd#1,\ht#1+\dp#1);
\node[mynode] at (0,0) {\box#1};
\end{tikzpicture}}
% the long table (work in progress)
\makeatletter
\NewEnviron{longrndtable}[1]{%
\rndtablesetup%
\def\LT@end@hd@ft##1{%
\LT@echunk
\ifx\LT@start\endgraf
\LT@err
{Longtable head or foot not at start of table}%
{Increase LTchunksize}%
\fi
\setbox##1\box\z@
\ifx\LT@firsthead##1
\setbox##1=\hbox{\roundtop{##1}}
\fi
\LT@get@widths
\LT@bchunk}
\begin{longtable}{#1}%
\BODY%
\end{longtable}%
}
\makeatother
\begin{document}
\noindent
\begin{rndtable}{cccp{4cm}p{3cm}}
\header{vote} &
\header{answer} &
\header{views} &
\header{question} &
\header{user} \\
\ZZ
\end{rndtable}
\begin{longrndtable}{cccp{4cm}p{3cm}}
\header{vote} &
\header{answer} &
\header{views} &
\header{question} &
\header{user} \\
\endfirsthead
\header{vt} &
\header{ans} &
\header{vws} &
\header{q} &
\header{u} \\
\endhead
\ZZZZ \ZZZ
\end{longrndtable}
\end{document}