如何定义一个键,在封闭路径内添加彩色边框,但可以与 \fill 很好地配合使用?

如何定义一个键,在封闭路径内添加彩色边框,但可以与 \fill 很好地配合使用?

我想要绘制内部具有固定宽度阴影或边框的多边形。这是用 mspaint 制作的图像,展示了我想要绘制的东西:

示例图像

这个问题解决了这个问题,并使用 Mark Wibrow 建议的代码给出了答案。但是 Wibrow 的代码包含一个填充命令,该命令指定白色作为填充颜色。如果我想要选择填充颜色怎么办?我可以将其作为键的第二个参数,但从概念上讲,这是错误的组织方式。填充颜色和内部边框是单独的问题,内部边框绘制键不应该被告知填充颜色。换句话说,我们应该能够选择是否将我们的新键与“填充”键组合,它应该就这样工作。

这可能是由看起来像这样的代码(基本上是 Wibrow 的)产生的,但它不能完全工作:

\documentclass{standalone}

\usepackage{tikz}

\newlength{\internalborderwidth}
\setlength{\internalborderwidth}{1mm}

\tikzset{internal border/.style = {
    preaction = {clip, postaction = {draw = #1, line width = \internalborderwidth}}
}}

\definecolor{lightpeach}  {rgb}{0.9765, 0.9608, 0.8588}
\definecolor{mylightgreen}{rgb}{0.7098, 0.9020, 0.1137}
\definecolor{mylightblue} {rgb}{0.6000, 0.8510, 0.9176}
\definecolor{mypink}      {rgb}{1.0000, 0.6824, 0.7882}

\begin{document}
    \begin{tikzpicture}
        \draw [fill = lightpeach, internal border = mylightgreen]
              (0, 0) -- (2, 5) -- (6, 3) -- cycle;
        \draw [fill = lightpeach, internal border = mylightblue]
              (0, 0) -- (6, 3) -- (7, 1) -- cycle;
        \draw [fill = lightpeach, internal border = mypink]
              (0, 0) -- (7, 1) -- (3.5, -1.5) -- cycle;
    \end{tikzpicture}
\end{document}

它不起作用的原因是“填充”操作发生在预操作之后。因此彩色边框被填满。但 Wibrow 的操作也不能用作后操作;那么它会在绘制普通边框(细黑线)之后发生,因此它会将其抹去。也许您可以在那里添加“绘制”以再次绘制它,但您会丢失与键一起应用的任何样式internal border,就像我为其指定颜色一样。

我真正需要的是能够指定在填充和绘制之间发生的操作(当填充和绘制结合在一起时,填充会先发生,如 TikZ/PGF 版本 3 手册第 171 页所述)。当然,我可以指定两次路径,第一次填充,然后绘制,但我不想这样重复。

答案1

我不太清楚你为什么不想使用后续操作。重新绘制黑色边框似乎很容易:

编辑:

您可以在后操作中将选项传递给第二个绘制命令,但从我得到的评论来看,您不想要它。但您应该设置内部边框(例如实线)的所有选项以避免副作用。该示例现在还显示了红色虚线外部边框。

\documentclass{standalone}

\usepackage{tikz}

\newlength{\internalborderwidth}
\setlength{\internalborderwidth}{1mm}

\tikzset{
internal border/.style = {
    postaction = {clip, postaction = {draw = #1, solid, line width = \internalborderwidth},
                        postaction = {draw}}
}}

\definecolor{lightpeach}  {rgb}{0.9765, 0.9608, 0.8588}
\definecolor{mylightgreen}{rgb}{0.7098, 0.9020, 0.1137}
\definecolor{mylightblue} {rgb}{0.6000, 0.8510, 0.9176}
\definecolor{mypink}      {rgb}{1.0000, 0.6824, 0.7882}

\begin{document}
    \begin{tikzpicture}\tracingmacros=1
        \draw [fill = lightpeach, internal border = mylightgreen]
              (0, 0) -- (2, 5) -- (6, 3) -- cycle;
        \draw [fill = mylightblue!50!white, internal border =mylightblue]
              (0, 0) -- (6, 3) -- (7, 1) -- cycle;
        \draw [dashed,red, fill = mypink!50!white, internal border = mypink]
              (0, 0) -- (7, 1) -- (3.5, -1.5) -- cycle;
    \end{tikzpicture}
\end{document}

在此处输入图片描述

编辑2

您当然也可以将填充放在预操作中(而不是单独的键,也可以将其添加到边框键中):

\documentclass{standalone}

\usepackage{tikz}

\newlength{\internalborderwidth}
\setlength{\internalborderwidth}{1mm}

\tikzset{
pre fill/.style = {preaction={fill=#1}},
internal border/.style = {
    preaction ={clip, postaction = {draw = #1, solid, line width = \internalborderwidth},
                        }
}}

\definecolor{lightpeach}  {rgb}{0.9765, 0.9608, 0.8588}
\definecolor{mylightgreen}{rgb}{0.7098, 0.9020, 0.1137}
\definecolor{mylightblue} {rgb}{0.6000, 0.8510, 0.9176}
\definecolor{mypink}      {rgb}{1.0000, 0.6824, 0.7882}

\begin{document}
    \begin{tikzpicture}\tracingmacros=1
        \draw [pre fill=mylightgreen!50!white,internal border = mylightgreen]
              (0, 0) -- (2, 5) -- (6, 3) -- cycle;
        \draw [pre fill = mylightblue!50!white, internal border =mylightblue]
              (0, 0) -- (6, 3) -- (7, 1) -- cycle;
        \draw [dashed,red, pre fill = mypink!50!white, internal border = mypink]
              (0, 0) -- (7, 1) -- (3.5, -1.5) -- cycle;
    \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容