我想要绘制内部具有固定宽度阴影或边框的多边形。这是用 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}