我有一个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 那里拿了代码,我不知道如何获取行高。绘制在节点上以显示它创建的框,以便您可以看到与实际高度的差异。示例如下所示:
编辑:显然,单行列的差异是由于我在水印文本中使用了大写字母,这些大写字母比行尺寸高。只要您不使用不适合行的水印,就没问题。
更新:旋转文本并非完全是小事。我不知道有什么方法可以只旋转文本而不旋转伴随的框。如果你关闭该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的观点,在边缘它可能看起来更好,尤其是带有向右箭头或小图形。
如果背景文本稍微旋转一下,效果会更好。为此,您可以使用rotatebox
graphicx 包中的
只需包含包并按如下方式更改代码:
\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}
可以改成更合理的颜色,比如灰色。