可以将形状合并到一幅图中吗?例如,将绿色矩形显示为红色图形,这样它们之间就不会出现线条,并将它们作为一个单元进行填充?并将圆合并到一系列线条中,形成一幅图形,彼此垂直居中?可以将文本添加到不同部分吗?
\documentclass{article}
\usepackage{tikz}
\begin{document}
% begin incorporate shapes centred vertically
\begin{tikzpicture}[rounded corners=8pt,ultra thick]
\draw[blue, outer color=green, ,inner color=green!35] (0,0)rectangle+(2.,.7);
\draw[blue, outer color=green, ,inner color=green!35,rotate=90] (0,-.6)rectangle+(4,.7);
\draw[blue, outer color=green, ,inner color=green!35] (-.1,3.3)rectangle+(2.,.9);
\draw[blue, outer color=green, ,inner color=green!35] (-.1,1.5)rectangle+(7.5,.8);
\draw[blue, outer color=green, ,inner color=green!35,rotate=90] (2,-4)rectangle+(1.5,.7);
\end{tikzpicture}
\vskip 2cm
\begin{tikzpicture}[rounded corners=8pt,ultra thick]
\draw[red, top color=red, bottom color=red, middle color=red!25]
(0,0)--(0,-1)--(3.5,-1)--(3.5,-1.45)--(-3.5,-1.45)--(-3.5,-2.5)--(-2.5,-2.5)--(-2.5,-3)--(-4,-3)--(-4.,2)--(-2.,2)--(-2.,1)--(-3.5,1)--(-3.5,-1)--(-.5,-1)--(-.5,0)--cycle;
\end{tikzpicture}
% end incorporate shapes
\vskip 2cm
% begin Nerve Cell2
\begin{minipage}[c]{1\textwidth}
\hskip 4cm
{
\begin{tikzpicture}[blue, rounded corners=8pt,ultra thick]
\draw[inner color=yellow, outer color=red] (0,0)circle(.5cm);
\end{tikzpicture}
\vskip -.18cm
\hskip .88cm
\begin{tikzpicture}[blue, rounded corners=8pt,ultra thick]
\draw[top color=red, bottom color=red, middle color=red!25]
(0,0)--(0,-1)--(3.5,-1)--(4.2,-.8)--(3.4,-1.12)--(4.2,-1.1)--(3.4,-1.22)--(4.2,-1.4)--(3.4,-1.34)--(4.2,-1.65)--(3.5,-1.45)--(-3.5,-1.45)--(-4.,-2)--(-3.54,-1.25)--(-4.,-.5)--(-3.5,-1)--(-.5,-1)--(-.5,0)--cycle;
\end{tikzpicture}
}
\end{minipage}
% end Nerve Cell2
\end{document}
答案1
您可以组合汤姆·邦巴迪尔\unionclip
和Zarko 的绘画如下所述。这显然只是一个例子:您可以自行开发所需的具体组合。
通常,如果可能的话,从一开始就使用相对坐标比绝对坐标更容易。在这种情况下,pic
您可能会认为这并不重要,因为从某种意义上说,它们始终是相对的。但即便如此,使用相对坐标也有助于实现各种灵活性,例如更容易以不同的方式组合代码(例如创建另一个代码pic
或像这里一样指定两个相关的\clip
代码)。因此,我几乎将 Zarko 的所有坐标都设为相对坐标,而不是绝对坐标。绝对坐标仅用作剪切路径的锚点。
\documentclass[tikz,multi,border=5pt]{standalone}
% from Tom Bombadil's answer: https://tex.stackexchange.com/a/58950/
\usepackage{arrayjobx}
\newcommand{\unionclip}[3]{% number of clippings, clipping commands (connect with &), draw commands
\newarray\temp%
\readarray{temp}{#2}%
\foreach \x in {1,...,#1}%
{ \begin{scope}%
\pgfmathtruncatemacro{\xt}{\x}%
\temp(\xt)%
#3%
\end{scope}%
}%
\delarray\temp%
}
\begin{document}
\begin{tikzpicture}[rounded corners=1.2mm, thick]
\unionclip{2}{%
% based on Zarko's answer: https://tex.stackexchange.com/a/283877/
\clip
(0,1.2) coordinate (a-north)-| ++(0.2,-1) -| ++(2.8,-.2) coordinate (a-east) |- ++(-6,-.2) |- ++(1,-1) |- ++(-1.4,-.4) -- ++(0,1.6) coordinate (a-west) |- ++(1.4,2.4) |- ++(-1,-.8) |- ++(2.8,-1.4) |- ++(.2,1);&
\clip
([xshift=35mm]a-east) ++(0,1.2) coordinate (b-north) -| ++(.2,-1) -- ++(3.3,0) -- ++(.7,.4) coordinate (b-east above) to [out=225, in=175,looseness=4] ++(0,-.45) to [out=195, in=165,looseness=6] ++(0,-.3) to [out=195, in=135,looseness=4] ++(0,-.45) coordinate (b-east below) -- ++(-.7,.4) -- ++(-3.5,0) coordinate (b-south) -- ++(-3.5,0) -- ++(-.5,-0.4) coordinate (b-west below) to [out=45, in=-45,looseness=1.3] ++(0,1.2) coordinate (b-west above) -- ++(.5,-.4) -| ++(3.3,1) -- cycle;
}{%
\fill [top color=red, bottom color=red, middle color=red!25]
(-4,-2) rectangle (15,2.5);
}
\end{tikzpicture}
\end{document}
但是,您不能pic
直接在\clip
s 中使用 s,这就是为什么我刚刚将相关路径复制到\clip
这里的命令中。\clip
仅限于比诸如\path
和\draw
等构造更简单的事情,因此它并不像直接将 a\pic
变成 a 那么简单\clip
。
[并且,正如我之前提到的,pic
在 PGF/TikZ 的最新版本中,部分问题已经得到解决,尤其是在命名方面。由于这个问题在一段时间前就出现了,并且一直存在,因此我认为问题是由于其他更改导致的,并且这不是一个简单的修复。如果是这样,那么在可预见的未来,这个问题可能会一直存在。但是,这纯粹是我的猜测。我只是不指望它很快就会得到修复。]
请注意,即使这些是node
s 而不是pic
s,您也不能直接使用它们进行剪辑。剪辑需要封闭的路径。您也不能以任何直接的方式连接它们。同样,除非您使用统一的填充等 - 但pic
当然,您也可以使用 s 来做到这一点。只需对每个使用相同的颜色填充,不要绘制边框,以便它们连续连接。
使用的主要原因\unionclip
是,您可以在整个组合形状上应用阴影,以便颜色平滑变化。至少,这是我能想到的唯一原因。透明度或褪色等可能是另一个原因。
答案2
我明白,你喜欢为复杂图像形成一组构建块。对于这项工作来说,在 `\tikzset 中定义并在复杂图像中使用的小图片似乎很方便\pic
。就像这样:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning,shapes}
%---------------------------------------------------------------%
\tikzset{mynevro/.style = {
nerve1/.pic = {\path[draw=red, rounded corners=1.2mm, thick,
top color=red, bottom color=red, middle color=red!25]
( 0.0,1.2) coordinate (-north)-| (0.2,0.2) -|
( 3.0,0.0) coordinate (-east) |- (-3,-0.2) |- (-2,-1.2) |-
(-3.4,-1.6) --
(-3.4,0.0) coordinate (-west) |- (-2,2.4)
|- (-3,1.6) |- (-0.2,0.2) |- (0,1.2);
},
nerve2/.pic = {\path[draw=blue, rounded corners=1.2mm, thick,
top color=orange, bottom color=orange, middle color=orange!25]
( 0.0, 1.2) coordinate (-north) -| ( 0.2,0.2) -- (3.5, 0.2) --
( 4.2, 0.6) coordinate (-east above) to [out=225, in=175,looseness=4]
( 4.2, 0.15) to [out=195, in=165,looseness=6]
( 4.2,-0.15) to [out=195, in=135,looseness=4]
( 4.2,-0.6) coordinate (-east below) -- ( 3.5,-0.2) --
( 0.0,-0.2) coordinate (-south) -- (-3.5,-0.2) --
(-4.0,-0.6) coordinate (-west below) to [out=45, in=-45,looseness=1.3]
(-4.0, 0.6) coordinate (-west above) -- (-3.5, 0.2) -| (-0.2, 1.2) --
cycle;%
\coordinate (-west) at (-3.8,0);
\coordinate (-east) at ( 3.8,0);
},
nerve3/.style = {circle,minimum size=7mm, draw=black,
inner color=yellow, outer color=red,
node contents={~}
},
}
}% end of tikzset
%---------------------------------------------------------------%
\begin{document}
\begin{tikzpicture}[mynevro]
\pic (A) {nerve1};
\node[above] at (A-north) {north};
\node[right] at (A-east) {east};
\node[left] at (A-west) {west};
\end{tikzpicture}
\bigskip
\begin{tikzpicture}[mynevro,
node distance = 0mm,
points/.style = {circle, inner sep=1pt, fill=red},
pin edge = black
]
\pic (A) {nerve2};
\node[points,pin=45:north, above=of A-north] {};
%
\node[points,pin=45:east above, above right=of A-east above] {};
\node[points,pin= 0:east, right=of A-east] {};
\node[points,pin=315:east below, below right=of A-east below] {};
%
\node[points,pin=315:south, below=of A-south] {};
%
\node[points,pin=240:west below, below left=of A-west below] {};
\node[points,pin=180:west, right=of A-west] {};
\node[points,pin=135:west above, below right=of A-west above] {};
%
\end{tikzpicture}
\bigskip
\begin{tikzpicture}[mynevro,
node distance = 0mm,
]
\pic (A) {nerve1};
\pic (B) [right=42mm of A-east] {nerve2};
\node[nerve3,above=of A-north];
%
\end{tikzpicture}
\end{document}
使用设计的小图片,您几乎可以无限地组合复杂的图片。在图片中定位它们时,您需要注意图片的宽度。正如上面的 MWE 中定义的那样,其锚点位于内部坐标 (0,0)。
您pic
可以添加带有文本等的节点,这些节点相对于为每个节点定义的坐标\pic
。前两幅图演示了这一点,其中通过具有锚点名称的节点(第一幅图)和带有锚点名称的引脚的节点来指定 pic 的锚点。
附录:小图片的定位比较棘手。在此,绘制者必须记住,上面的\pic
原点位于内部坐标(0,0)
,即锚点下方 12 毫米north
,锚点右侧 37 毫米west
(参见 的定义nerve2
)。因此,为了nerve2
使nerve1
它们之间没有间隙,它们的位置应(相对)定义为:
\begin{tikzpicture}[mynevro,
node distance = 0mm,
]
\pic (A) {nerve1};
\pic (B) [right=37mm of A-east] {nerve2};% <--
\end{tikzpicture}
在这种情况下,图片是:
第一张图片中的前两张图像有助于将神经组成复杂的图像。
还有另一个问题pic
。正如 cfr 在她的评论中提到的那样:“... 图片命名有问题,而且已经有一段时间了。也就是说,一些语法曾经有效并且应该有效,并且包含在手册中,但目前不起作用,而且已经有一段时间不起作用了。...“