![纹理或图像作为单个表格单元格的背景](https://linux22.com/image/359525/%E7%BA%B9%E7%90%86%E6%88%96%E5%9B%BE%E5%83%8F%E4%BD%9C%E4%B8%BA%E5%8D%95%E4%B8%AA%E8%A1%A8%E6%A0%BC%E5%8D%95%E5%85%83%E6%A0%BC%E7%9A%84%E8%83%8C%E6%99%AF.png)
我想添加一个图像作为表格中单个单元格的背景,这样背景图像就会缩放到单元格的实际大小。但是,我不知道该怎么做。我尝试使用 tcolorbox 和 minipages,但都没有成功。
像下面这个例子那样的东西就很完美了。
\documentclass{article}
\begin{document}
Some text before.
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|}
\hline
1 & 2 & 3 \\\hline
4 & \AddCellBackground{image} 5 & 6 \\\hline
7 & 8 & 9 \\\hline
\end{tabular}
Some more text after the table.
\end{document}
答案1
在您的情况下,表格单元格的宽度由列的静态宽度给出,p
您可以使用类似如下的方法:
\documentclass{article}
\usepackage{mwe}
\usepackage{picture}
\newcommand*\AddCellBackground[4][\tabcolsep]{%
\unskip\begin{picture}(0,0)
\put(-#1,-\dp\strutbox){\includegraphics[width=\dimexpr
#2+\dimexpr #1*2\relax\relax,height=#3]{#4}}%
\end{picture}\ignorespaces
}
\begin{document}
Some text before.
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|}
\hline
1 & 2 & 3 \\\hline
4 & \AddCellBackground{2cm}{\baselineskip}{example-image} 5 & 6 \\\hline
7 & 8 & 9 \\\hline
\end{tabular}
Some more text after the table.
\end{document}
如果单元格的内容也将成为\AddCellBackground
多个参数,则可以进行其他格式化,例如,将单元格内容居中。但在这种情况下,您还可以使用新的列类型B
(例如背景):
\documentclass{article}
\usepackage{mwe}
\usepackage{picture}
\usepackage{array}
\usepackage{ragged2e}
\newcolumntype{B}[4]{%
>{%
\RaggedRight
\begin{picture}(0,0)
\put(0,\dimexpr\ht\strutbox-#2\relax){\hskip-\tabcolsep\includegraphics[width=\dimexpr
#1+2\tabcolsep\relax,height=#2]{#3}}%
\end{picture}%
\begin{minipage}[t]{#1}#4\strut\ignorespaces
}%
p{#1}%
<{\unskip\strut\end{minipage}}
}
\begin{document}
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|}
\hline
1 & 2 & 3 \\\hline
4 &
\multicolumn{1}{B{2cm}{3\baselineskip}{example-image}{\RaggedRight}|}{some
more than one word} & 6 \\\hline
4 & \multicolumn{1}{B{2cm}{3\baselineskip}{example-image}{\Centering}|}{some
more than one word} & 6 \\\hline
4 &
\multicolumn{1}{B{2cm}{3\baselineskip}{example-image}{\RaggedLeft}|}{some
more than one word} & 6 \\\hline
7 & 8 & 9 \\\hline
\end{tabular}
\end{document}
但是如果单元格宽度不是由静态值给出,则必须测量出列的最宽单元格(例如使用\settowidth
)。
答案2
这是一个可以处理多行单元格内容的版本。我过去tikz
overlay
把图片放在背景中。剩下的就是缩放。我假设单元格的宽度是固定的,例如p{2cm}
。如果它是可变的,有一些方法可以找到宽度测量表格的列宽,但情况变得更加复杂。
\documentclass{article}
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{calc}
\newcommand\AddCellBackground[3]{% {width}{image}{contents}
\sbox0{%
\begin{tabular}[b]{p{#1}}\hline
#3
\end{tabular}}
\tikz[overlay]{\node at (-\tabcolsep+0.5\wd0,-0.5\dp0+0.5\ht0-0.5\fboxrule){%
\includegraphics[width=\wd0,height=\ht0+\dp0-0.5\fboxrule]{#2}};}%
#3}
\begin{document}
Some text before.
\begin{tabular}{|p{2cm}|p{2cm}|p{3cm}|}
\hline
1 & 2 & 3 \\\hline
4 & 5 & \AddCellBackground{3cm}{example-image}{A longer cell contents that needs more space} \\\hline
4 & \AddCellBackground{2cm}{example-image}{5} & 6 \\\hline
7 & 8 & 9 \\\hline
\end{tabular}
Some more text after the table.
\end{document}
编辑
如果单元格内容应该居中,最好使用包定义一个新的列类型。然后可以完成array
居中版本:\addCellBackground
\usepackage{array}
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\newcommand\AddCellBackgroundCenter[3]{% {width}{image}{contents}
\sbox0{%
\begin{tabular}[b]{C{#1}}\hline
#3
\end{tabular}}
\sbox1{#3}
\tikz[overlay]{\node at (0.5\wd1,-0.5\dp0+0.5\ht0-0.5\fboxrule){%
\includegraphics[width=\wd0,height=\ht0+\dp0-0.5\fboxrule]{#2}};}%
#3}
这里,图像插入在文本之前,因此实际文本的宽度也会发挥作用。这意味着此版本不适用于多行单元格内容。带有居中单元格的表格变为(其中前两列居中,最后一列左对齐):
\begin{tabular}{|C{2cm}|C{2cm}|p{3cm}|}
\hline
1 & 2 & 3 \\\hline
4 & 5 & \AddCellBackground{3cm}{example-image}{6} \\\hline
4 & \AddCellBackgroundCenter{2cm}{example-image}{5} & 6 \\\hline
\end{tabular}
答案3
下面使用节点矩阵来创建表而不是表格环境。
这是使用 tikz 的另一种方法。
\documentclass{article}
\usepackage{tikz}
\usepackage[skins]{tcolorbox}
\usetikzlibrary{matrix}
\begin{document}
Some text before.
\tikzset{
table/.style={
matrix of nodes,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={
rectangle,
draw=black,
align=center
},
nodes in empty cells,
%%
column 2/.style = {
nodes={minimum width = 5em},
},
}
}
\begin{tikzpicture}
\matrix (m) [table]{
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\};
\node[minimum width=5em, fill overzoom image=redblock] at (m-2-2){5};
\end{tikzpicture}
Some more text after the table.
\end{document}
答案4
使用,您可以轻松地{NiceTabular}
用Tikz 提供的图案之一nicematrix
填充合并单元格的任何区域(即任何)。\Block
您还可以\Block
用图像填充。在下面的示例中,图像由包提供,mwe
但可以使用更“像图案”的图像。
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usepackage{mwe} % for the image "example-image"
\tikzset
{
image/.style =
{
path picture =
{ \node at (path picture bounding box.center) { \includegraphics{#1} } ; }
}
}
\begin{document}
\begin{NiceTabular}{cccc}[hvlines]
one & two & three & four \\
five & \Block[tikz={pattern=fivepointed stars}]{2-2}{} & & six \\
seven & & & nine
\end{NiceTabular}
\vspace{1cm}
\begin{NiceTabular}{cccc}[hvlines]
one & two & three & four \\
five & \Block[tikz={image=example-image}]{2-2}{} & & six \\
seven & & & nine
\end{NiceTabular}
\end{document}
您需要多次编译(因为 PGF/Tikz 节点)。