如何在节点周围添加多个不同颜色的边框?

如何在节点周围添加多个不同颜色的边框?

我想绘制一个节点,用包含数据的表格填充,并且它周围应该有(三个)不同颜色的相邻边框。在 PGF 手册、网络上以及这个论坛上都找不到任何东西,所以我想出了这个 MWE...

嵌套三个 tikzpicture 环境对我来说感觉像是一个很大的业余大杂烩,如果不是,我该如何摆脱边框之间的空白?

\documentclass[pdftex,dutch]{article}
\usepackage{babel}
\usepackage{tikz}

\begin{document}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0}
\definecolor{DE.geel}{RGB}{255,207,0}

\begin{tikzpicture}
\node[rectangle,line width=0.5mm,draw=black] at (0,0)
{\begin{tikzpicture}
 \node[rectangle,line width=0.5mm,draw=DE.rood] at (0,0)
 {\begin{tikzpicture}
  \node[rectangle,line width=0.5mm,draw=DE.geel,fill=lichtgrijs] at (0,0) {Vliegtuig};
  \end{tikzpicture}};
 \end{tikzpicture}};
\end{tikzpicture}

\end{document}

我的临时解决方案

答案1

像这样?

在此处输入图片描述

\documentclass[dutch]{article}
\usepackage{babel}
\usepackage{tikz}
\usetikzlibrary{fit}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0} % Rood in Duitse vlag
\definecolor{DE.geel}{RGB}{255,207,0} % Geel in Duitse vlag

\begin{document}
    \begin{tikzpicture}[
box/.style = {draw=#1, line width=0.5mm,inner sep=0.25mm}
                        ]
\node (n1) [box=DE.geel,
            fill=lichtgrijs, inner sep=2mm] at (0,0) {Vliegtuig};
\node (n2) [box=DE.rood, fit=(n1)] {};
\node (n3) [box=black,   fit=(n2)] {};
    \end{tikzpicture}
\end{document}

一些注意事项:

  • 切勿嵌套tikzpicturetikzpicture因为这可能会引发意想不到的副作用;
  • fit的库用于tikz获取您想要的东西;
  • 您可以定义节点样式,将所有节点合并为一个,但我首先想知道所示的结果是否是您想要的:-)

附录: 这是三色节点变体。具体来说,append after command=节点样式中的选项用于中间和外部颜色:

\documentclass[dutch]{article}
\usepackage{babel}
\usepackage{tikz}
\usetikzlibrary{fit}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0} % Rood in Duitse vlag
\definecolor{DE.geel}{RGB}{255,207,0} % Geel in Duitse vlag

\begin{document}

    \begin{tikzpicture}[
tcb/.style = {% three color border
              draw=DE.geel, fill=lichtgrijs,
              line width=0.5mm,inner sep=2mm,
              append after command={\pgfextra{\let\LN\tikzlastnode
                    \node [draw=DE.rood, line width=0.5mm,
                           inner sep=0.25mm,fit=(\LN)] {};
                    \node [draw, line width=0.5mm,
                           inner sep=0.75mm,fit=(\LN)] {};
              }}}
                        ]
\node (n1) [tcb] {Vliegtuig};
    \end{tikzpicture}
\end{document}

结果和以前一样。

答案2

只是为了好玩:

\documentclass{standalone}% to avoid cropping
\usepackage{babel}% not needed for MWE
\usepackage{tikz}
\usetikzlibrary{calc}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0}
\definecolor{DE.geel}{RGB}{255,207,0}

\begin{document}
\begin{tikzpicture}
\begin{scope}[line width=0.5mm]
  \node[draw=black,inner sep = 1.5mm] (n1) at (0,0) {Vliegtuig};
  \draw[DE.rood] ($(n1.south west)+(0.75mm,0.75mm)$) rectangle ($(n1.north east)+(-0.75mm,-0.75mm)$);
  \draw[DE.geel] ($(n1.south west)+(1.25mm,1.25mm)$) rectangle ($(n1.north east)+(-1.25mm,-1.25mm)$);
\end{scope}
\end{tikzpicture}
\end{document}

演示

答案3

没有 TikZ,只有\colorboxes。

我已添加\usepackage{picture}使用未以倍数指定的宽度/长度\unitlength

为了方便起见,我添加了\usepackage{calc}进行计算\setlength(如果使用,则可以避免它\addtolength)。

我曾经\makebox(\myxxxwidth, \myxxxheight){...}指定过盒子的宽度和总高度。

我已经用这种方式计算了盒子的宽度:

width of the border + width of the content + width of the border

那是

width of the content + double of the width of the border

您可以根据需要设置边框宽度。

高度也一样。

为了方便起见,我创建了一个新的命令\mybox,如果您愿意,您甚至可以修改它以将边框宽度设置为参数/参数。

\documentclass[pdftex,dutch]{article}
\usepackage{babel}

\usepackage{xcolor}
\usepackage{picture}% see here: https://tex.stackexchange.com/a/48238/101651
\usepackage{calc}
\newlength{\mygraywidth}
\newlength{\mygrayheight}
\newlength{\myyellowwidth}
\newlength{\myyellowheight}
\newlength{\myredwidth}
\newlength{\myredheight}
\newlength{\myblackwidth}
\newlength{\myblackheight}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0}
\definecolor{DE.geel}{RGB}{255,207,0}

\newcommand{\mybox}[1]{%
    \setlength{\mygraywidth}{\widthof{#1}+4mm}
    \setlength{\mygrayheight}{\totalheightof{#1}+4mm}
    \setlength{\myyellowwidth}{\mygraywidth+1mm}
    \setlength{\myyellowheight}{\mygrayheight+1mm}
    \setlength{\myredwidth}{\myyellowwidth+1mm}
    \setlength{\myredheight}{\myyellowheight+1mm}
    \setlength{\myblackwidth}{\myredwidth+1mm}
    \setlength{\myblackheight}{\myredheight+1mm}
    \colorbox{black}{\makebox(\myblackwidth,\myblackheight){%
        \colorbox{DE.rood}{\makebox(\myredwidth,\myredheight){%
            \colorbox{DE.geel}{\makebox(\myyellowwidth,\myyellowheight){% 
                \colorbox{lichtgrijs}{\makebox(\mygraywidth, \mygrayheight){%
                #1}}%
            }}%
        }}%
    }}%
    }

\begin{document}

\mybox{Vliegtuig}

\vspace{4ex}

\mybox{Do you like it?}

\end{document}

在此处输入图片描述

答案4

你不需要为此建立一个库,只需提供颜色列表就可以让事情变得更加自动化。然后归结为说

\node[inner sep=8pt,line width=2pt,multicolor rectangle={DE.rood,DE.geel}] {Vliegtuig};

如果需要,此策略也可以应用于其他节点形状。

这是代码。

\documentclass[pdftex,dutch]{article}
\usepackage{babel}
\usepackage{tikz}

\begin{document}

\definecolor{lichtgrijs}{RGB}{232,232,232}
\definecolor{DE.rood}{RGB}{222,0,0}
\definecolor{DE.geel}{RGB}{255,207,0}

\begin{tikzpicture}[multicolor rectangle/.style={draw,path picture={
\foreach \CPP [count=\YPP] in {#1}
{\draw[\CPP] ([xshift=\YPP*\pgflinewidth,yshift=\YPP*\pgflinewidth]path picture bounding box.south west)
rectangle ([xshift=-\YPP*\pgflinewidth,yshift=-\YPP*\pgflinewidth]path picture bounding box.north east); }}}]
\node[inner sep=8pt,line width=2pt,multicolor rectangle={DE.rood,DE.geel}] {Vliegtuig};
\end{tikzpicture}

\end{document}

在此处输入图片描述

如果您觉得手动设置很麻烦inner sep,可以通过稍长的代码来解决这个问题。

相关内容