我说服我的女朋友用 Latex 写论文,所以现在每当她遇到困难时,我都是她的首选。遗憾的是,她向我提出了一些我也不知道的要求。她需要一张表格,其中的一些单元格是彩色的,如下图所示。
我使用画图创建了此图,但显然我更愿意使用正确的方法。我找到了如何将对角线放入单元格以及如何获得彩色单元格的示例,但我无法将两者结合起来。
有人知道这个问题的解决办法吗?我想到另一种方法是使用 latex 创建表格,转换为 pdf,将其加载到 inkscape 中,添加线条和颜色,然后再次将其作为图形包含。但这意味着每次表格更改时我都需要重做。我希望可以以更优雅的方式完成!
答案1
这是一个使用的解决matrix of nodes
方案TikZ:
代码
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\tikzset{limon/.style={fill=lime}}
\begin{tikzpicture}
\matrix (magic) [matrix of nodes,nodes={minimum width=3cm,minimum height=1cm,draw,very thin},draw,inner sep=0]
{ 8 & 1 & 6 \\
3 & |[limon]| 5 & |[limon]| 7 \\
4 & 9 & 2 \\
};
\begin{pgfonlayer}{background}
\fill[lime,draw=black] (magic-2-1.north east) -- (magic-2-1.west) -- (magic-2-1.south east) -- cycle;
\end{pgfonlayer}
\end{tikzpicture}
\end{document}
输出
答案2
以下是提到的过度 TikZ 解决方案之一彼得·格里尔。我使用了修改版this solution
到表格中某个单元格的渐变颜色。
\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,shadings}
% Andrew Stacey's code from
% https://tex.stackexchange.com/a/50054/3954
\makeatletter
\tikzset{%
remember picture with id/.style={%
remember picture,
overlay,
save picture id=#1,
},
save picture id/.code={%
\edef\pgf@temp{#1}%
\immediate\write\pgfutil@auxout{%
\noexpand\savepointas{\pgf@temp}{\pgfpictureid}}%
},
if picture id/.code args={#1#2#3}{%
\@ifundefined{save@pt@#1}{%
\pgfkeysalso{#3}%
}{
\pgfkeysalso{#2}%
}
}
}
\def\savepointas#1#2{%
\expandafter\gdef\csname save@pt@#1\endcsname{#2}%
}
\def\tmk@labeldef#1,#2\@nil{%
\def\tmk@label{#1}%
\def\tmk@def{#2}%
}
\tikzdeclarecoordinatesystem{pic}{%
\pgfutil@in@,{#1}%
\ifpgfutil@in@%
\tmk@labeldef#1\@nil
\else
\tmk@labeldef#1,(0pt,0pt)\@nil
\fi
\@ifundefined{save@pt@\tmk@label}{%
\tikz@scan@one@point\pgfutil@firstofone\tmk@def
}{%
\pgfsys@getposition{\csname save@pt@\tmk@label\endcsname}\save@orig@pic%
\pgfsys@getposition{\pgfpictureid}\save@this@pic%
\pgf@process{\pgfpointorigin\save@this@pic}%
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgf@process{\pgfpointorigin\save@orig@pic}%
\advance\pgf@x by -\pgf@xa
\advance\pgf@y by -\pgf@ya
}%
}
\colorlet{mycolor}{green!60!orange}
\newcommand\tikzmark[2][]{%
\tikz[remember picture with id=#2] {#1;}}
\newcommand\TriCell[2]{%
\begin{tikzpicture}[overlay,remember picture]%
\fill[mycolor] ( $ (pic cs:#1) + (0pt,0.5ex) $ ) -- ( $ (pic cs:#2) + (0pt,1.9ex) $ ) -- ( $ (pic cs:#2) + (0pt,-0.8ex) $ ) --cycle ;
\end{tikzpicture}%
}%
\begin{document}
\TriCell{start1}{end1}
\begin{tabular}{|c|c|c|c|}
\hline
some text & some text & some text & some text \\
\hline
\multicolumn{1}{!{\vrule\tikzmark{start1}} c !{\vrule\tikzmark{end1}}}{some text} & \cellcolor{mycolor}some text & \cellcolor{mycolor}some text & \cellcolor{mycolor}some text \\
\hline
some text & some text & some text & some text \\
\hline
\end{tabular}
\end{document}
答案3
这是一个{NiceTabular}
使用 的解决方案nicematrix
。
{tabular}
该环境与类似,但会在数组的单元格、行和列下创建 PGF/Tikz 节点。在构造数组之前,array
可以使用 中的这些节点使用Tikz 绘制任何您想要的内容。\CodeBefore
\documentclass{article}
\usepackage{xcolor}
\usepackage{nicematrix,tikz}
\begin{document}
\begin{NiceTabular}[hvlines,columns-width=3cm]
{>{\rule[-6mm]{0mm}{15mm}}ccc}
\CodeBefore
\begin{tikzpicture}
\fill [lime] (2.5-|1) -- (3-|2) -- (3-|last) -- (2-|last) -- (2-|2) -- cycle ;
\draw [line join = bevel] (2-|2) -- (2.5-|1) -- (3-|2) ;
\end{tikzpicture}
\Body
8 & 1 & 6 \\
3 & 5 & 7 \\
4 & 9 & 2
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
使用 PGF/Tikz 节点)。