纹理或图像作为单个表格单元格的背景

纹理或图像作为单个表格单元格的背景

我想添加一个图像作为表格中单个单元格的背景,这样背景图像就会缩放到单元格的实际大小。但是,我不知道该怎么做。我尝试使用 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 节点)。

上述代码的输出

相关内容