对多页表的每一页进行操作

对多页表的每一页进行操作

因此,设计师完成了他们的工作,并为所有表格指定了彩色背景和圆角。如下所示:

在此处输入图片描述

如此处所述,这需要做一些麻烦的事情,比如把整个桌子放进一个保存箱,测量它的大小,然后设置剪切路径,以及然后粉刷桌子。

现在的问题是:如果这是一张多页表格,上面打印有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......:-) 可以帮助完成它。

或者,可能有更好的方法来实现这一点。如果是这样的话,请随意窃取我的 TiZ 位,一旦出现更好的答案,我就会删除该帖子。

我最初的想法是破解 的定义\LT@end@hd@ft,它用于处理 的各种“特殊块” longtable,例如\endhead\endfirsthead等。一旦块被处理并放入适当的框中(\setbox##1\box\z@在下面的代码中),我们可以使用\ifx测试来检查我们正在处理哪个部分,然后相应地修改框内容。

我的代码只会弄乱\LT@firsthead\firsthead内容),但这些条件可以嵌套,以根据需要对任何特殊块执行特殊操作。

状态:这个想法可行,但有一些我不明白的问题。可能是我犯了一些愚蠢的错误。问题如下:

  1. 第一个标题行(我弄乱的那行)占据了文本块的整个宽度,而不是表格的自然宽度。我认为这可能与longtable的审判过程有关,因此它可能可以通过在与我不同的时间修改框来解决。
  2. 最后一行,我们需要裁剪底角。如果用户添加\endlastfoot,我们可以使用与类似的方法\endfirsthead。但是(就像这里的情况一样),并非所有表格在表脚处都有特殊行。
  3. 在中间部分周围添加边框。如果需要,这里还包括在每个连续页面的顶部和底部进行圆角处理。这可以通过连续页面的页眉和页脚来实现,但同样,并非所有表格都有这些。

我认为所有这些问题都可以由longtable比我更了解的人来解决。所以,正如我所说,请随意使用我的 TiZ 代码来扩展/修复解决方案。我所有的 TiZ 命令只有一个参数,即要操作的框。我认为这个东西更适合放在输出部分,但我在那里的尝试失败了。

我还稍微调整了一下代码,以便在短表和长表之间共享样式,这样可以更容易地全局更改样式。

这是现在的代码。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}

在此处输入图片描述

相关内容