表格行的水印

表格行的水印

我有一个longtable包含一些列的表格,所有列都固定为(例如p{3cm}),因此所有行的已知宽度都相同。我想在后面添加一个文本水印(如“New”)一些行。当然,行可以有不同的高度;水印应该水平和垂直居中。我该如何实现这一点?

答案1

使用蒂克兹,你可以定义\NEWROW命令如下:

\newcommand{\NEWROW}{%
  \noalign{%
    \dimen0=\dimexpr\prevdepth+\ht\strutbox\relax%
    \begin{tikzpicture}[remember picture, overlay]%
      \pgfsetfillopacity{0.5}
      \node[draw,minimum height=\the\dimen0, minimum width=3cm+2\tabcolsep, rectangle, anchor=south west, color=red] at (-2.5\tabcolsep,0) {NEW};
    \end{tikzpicture}%
  }%
}

下行的高度似乎有点偏离。我刚刚从@egreg 那里拿了代码,我不知道如何获取行高。绘制在节点上以显示它创建的框,以便您可以看到与实际高度的差异。示例如下所示:

Tikz 水印

编辑:显然,单行列的差异是由于我在水印文本中使用了大写字母,这些大写字母比行尺寸高。只要您不使用不适合行的水印,就没问题。

更新:旋转文本并非完全是小事。我不知道有什么方法可以只旋转文本而不旋转伴随的框。如果你关闭该draw选项,它将不再显示框(你可能无论如何都不想这样),所以你会说这不是问题,我们可以通过添加rotate=x选项来旋转。这但是,由于这种旋转使用锚点进行旋转,因此存在一个问题。在我们的例子中,这意味着框围绕左下角旋转,这意味着文本将远离中心。为此,TikZ有一个rotate around选项,它接受一个参数,例如{angle:(x,y)}并围绕旋转节点angle度数(x,y)。不幸的是,这意味着我们必须计算中心并使用它,但这并不难。

或者,我们可以绘制两个节点,一个节点包含空文本,另一个节点仅包含文本,但大小不同(当然,我们必须计算位置,这也不是非常困难)。这样做的唯一真正好处是它允许您保留框!同样,您可能不关心框:)(如果您不关心框,请使用第一个选项,节点越少越好!)。以下\NEWROW命令演示了这两种方法,请自行选择:

\newcommand{\NEWROW}{%
  \noalign{%
    \dimen0=\dimexpr\prevdepth+\ht\strutbox\relax%
    \begin{tikzpicture}[remember picture, overlay]%      
      \pgfsetfillopacity{0.5}
      \pgfmathsetlengthmacro{\mydim}{(3cm+2\tabcolsep)/2}
      \pgfmathsetlengthmacro{\myht}{height("NEW")/2}      
      \node[minimum height=\the\dimen0, minimum width=3cm+2\tabcolsep, rectangle, anchor=south west, color=blue, rotate around={10:(\mydim-2.5\tabcolsep,.5*\the\dimen0+\myht)}] (a) at (-2.5\tabcolsep,0) {NEW};
      \node[minimum height=\the\dimen0, rectangle, anchor=center, color=red, rotate=10] at (\mydim-2.5\tabcolsep,.5*\the\dimen0+\myht) {NEW};
    \end{tikzpicture}%
  }%
}

文本的位置不是完全地等效,我怀疑某处存在inner sep连续犯规,或者我只是在计算中犯了一个错误......无论如何,它很接近,因为没有什么区别。

答案2

您可以使用旧的受信任图片环境将文本定位在行后面。

\documentclass{article}
\usepackage{xcolor}
\newcommand{\NEWROW}{%
  \noalign{\dimen0=\dimexpr\prevdepth+\ht\strutbox\relax
    \vbox to 0pt{\vskip-.5\dimen0
      \llap{\smash{$\vcenter{\hbox{\Huge NEW}}$}}\vss}}}
\def\watermark#1{%
\setlength{\unitlength}{1pt} 
\begin{picture}(0,0) 
\put(50,-35){\textcolor{red!50!white}{\Huge #1}}    
\end{picture} }
\begin{document}
\begin{tabular}{p{3cm}p{3cm}l}
\watermark{Revised}
abc def abc def abc def abc def abc def abc def abc def
abc def abc  def abc def abc def  abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
abc def abc def abc def abc def abc def abc def abc def
& x\\
\hline
abc def abc def abc def abc def abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
& x\\
\hline
abc def abc def 
&
abc def abc def
& x\\
\hline
abc def abc def abc def abc def abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
& x
\end{tabular}
\end{document}

如何将文本精确地定位在行的中间和中心可以自动化,但我不确定这是否值得。我也不确定它是否看起来正确;我倾向于同意@egreg的观点,在边缘它可能看起来更好,尤其是带有向右箭头或小图形。

在此处输入图片描述

如果背景文本稍微旋转一下,效果会更好。为此,您可以使用rotateboxgraphicx 包中的

在此处输入图片描述

只需包含包并按如下方式更改代码:

 \rotatebox[origin=c]{15}{\watermark{Revised}}

答案3

TeX 在处理完表格之前不知道表格的宽度。可以在表格行的左边距放置水印:

\newcommand{\NEWROW}{%
  \noalign{\dimen0=\dimexpr\prevdepth+\ht\strutbox\relax
    \vbox to 0pt{\vskip-.5\dimen0
      \llap{\smash{$\vcenter{\hbox{\Huge NEW}}$}}\vss}}}

\begin{document}
\begin{tabular}{p{3cm}p{3cm}l}
abc def abc def abc def abc def abc def abc def abc def
abc def abc def abc def abc def abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
abc def abc def abc def abc def abc def abc def abc def
& x\\
\NEWROW
\hline
abc def abc def abc def abc def abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
& x\\
\NEWROW

\hline
abc def abc def 
&
abc def abc def
& x\\
\NEWROW
\hline
abc def abc def abc def abc def abc def abc def abc def
&
abc def abc def abc def abc def abc def abc def abc def
& x
\end{tabular}

通过更改\llap{\hbox to 4cm{\hss单词“NEW”将会打印在行上,但水平居中很难实现。

注意\NEWROW必须去终止\\该行。

在此处输入图片描述

如果宽度是预先知道的,例如表格是

\begin{tabular}{*{4}{p{3cm}}}

然后你可以定义

\newcommand{\NEWROW}{%
  \noalign{\dimen0=\dimexpr\prevdepth+\ht\strutbox\relax
    \vbox to 0pt{\vskip-.5\dimen0
      \hbox to\dimexpr 12cm+8\tabcolsep{%
        \hss\smash{$\vcenter{\hbox{\Huge NEW}}$}\hss}\vss}}}

因为12cm+8\tabcolsep是表格宽度。当然\hbox{\Huge NEW}可以改成更合理的颜色,比如灰色。

相关内容