考虑以下代码:
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usepackage{xcolor}
\makeatletter
\tikzset { myVSplitPlainVrtxStyle/.style args={#1,#2}{%
circle,
minimum size= 5mm,
draw= #1!55!black!90,
fill = #1,
alias=tmp@name,
postaction={%
insert path={
\pgfextra{%
\pgfpointdiff{\pgfpointanchor{\pgf@node@name}{center}}%
{\pgfpointanchor{\pgf@node@name}{east}}%
\pgfmathsetmacro\insiderad{\pgf@x}
% } %The alternative bracket closing
\fill[#2] (\pgf@[email protected]) ([yshift=\pgflinewidth]\pgf@[email protected]) arc (-90:90:\insiderad-\pgflinewidth)--cycle;
\draw[#2!55!black!90] (\pgf@[email protected]) ([yshift=\pgflinewidth/2]\pgf@[email protected]) arc (-90:90:\insiderad-\pgflinewidth/2);
}
}
}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node[ myVSplitPlainVrtxStyle = {blue, lime} ] {};
\end{tikzpicture}
\end{document}
我已复制粘贴此代码并根据自己的需要进行了修改;但是,有些部分我不明白。如果您能帮助我了解发生了什么,我将不胜感激。此外,欢迎提出任何改进或单独的想法。
alias = tmp@name
- 我不知道为什么需要这样做。我认为这与样式有两个输入参数有关。它有什么作用?为什么需要这样做?
postaction
- 我认为不需要后期操作。没有必要说“稍后再做”,但是,当我删除它时,代码不再起作用。发生了什么?
insert path
- 手册上说它用于向当前路径添加一些内容。我相信它存在的唯一原因是允许使用
\pgfextra
。但是,在这种情况下当前路径是什么?还有其他方法可以做到这一点吗?
- 手册上说它用于向当前路径添加一些内容。我相信它存在的唯一原因是允许使用
\pgfextra
- 为什么要使用此选项?手册上说此命令用于路径构建,并暂时暂停该命令以先执行一些 TeX 代码。更重要的是,我对右括号的位置感到困惑
}
。我已经标记了对我来说更自然的位置,但这会产生错误。为什么我对位置的直觉}
是错误的?
- 为什么要使用此选项?手册上说此命令用于路径构建,并暂时暂停该命令以先执行一些 TeX 代码。更重要的是,我对右括号的位置感到困惑
(\pgf@[email protected])
- 原作者已将其放入代码中。我不明白这样做的必要性。没有它也可以正常工作。为什么要这样做?
答案1
@Ignasi 命令更简单、更清晰。下面,我尝试回答@Aria 提出的问题。
alias=tmp@name
来自手册:此选项允许您为节点提供另一个名称。 它稍后通过命令用于坐标计算postaction
。postaction=
是节点存在所必需的,即主路径操作要完成(因此要执行坐标计算)。请注意,预操作不会完成这项工作,因为绘图(半实心圆)将出现在节点下方。insert path
您的解释是正确的。添加的路径是空的,但允许\pgfextra
,正如您所说。您可能会在下面更简单的示例中看到,使用 引入的非空路径insert path
没有图形效果;可能是因为insert path
是用作路径而不是节点的选项。来自手册:该选项应谨慎使用,例如,不应将其用作节点的参数。
蓝色节点有一个非空的添加路径,一个半径为1的圆......其实还是有效果的,因为fill
和opacity
选项的原因!
评论。因为代码很简单,里面介绍的围绕节点的圆圈\pgfextra
都是以节点的标签为中心。
- ()我同意@Symbol 1;它没有说服力。您可以在没有它的情况下编写代码,但效果相同。
\pgf@[email protected]
第一张图片的代码
\documentclass[border=.5cm]{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{%
tmpEmpty/.style={
rectangle, draw, fill=red, fill opacity=.3,
text=black, text opacity=1,
postaction={
insert path={%
\pgfextra{%
\draw[fill=yellow, fill opacity=.7] (0, 0) circle (.5);
}
}
}
},
tmpNEmpty/.style={
rectangle, draw, fill=red, fill opacity=.3,
text=black, text opacity=1,
postaction={
insert path={%
[fill=green, opacity=1]
\pgfextra{%
\draw[fill=blue, fill opacity=.5] (0, 0) circle (.5);
}
circle[radius=1 cm]
}
}
}
}
\begin{tikzpicture}
\draw (-1, -1) grid (2, 1);
\filldraw[red] (0, 0) circle (3pt);
\path (0, 1) node[tmpEmpty] {center at $(0, 1)$};
\path (2, 1) node[tmpEmpty] {};
\draw (0, -1) node[tmpNEmpty] {};
\end{tikzpicture}
\end{document}
第二张图片的代码
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\makeatletter
\tikzset{%
vsplit/.style args={#1, #2}{%
circle,
minimum size=5mm,
draw=#1!70!black!90,
fill=#1,
alias=tmp@name,
postaction={%
insert path={
\pgfextra{%
\pgfpointdiff{\pgfpointanchor{\pgf@node@name}{center}}%
{\pgfpointanchor{\pgf@node@name}{east}}%
\pgfmathsetmacro{\insiderad}{\pgf@x}
\fill[#2] ([yshift=\pgflinewidth]\pgf@[email protected])
arc (-90:90:\insiderad pt-\pgflinewidth) -- cycle;
\draw[#2!70!black!90] ([yshift=\pgflinewidth/2]\pgf@[email protected])
arc (-90:90:\insiderad-\pgflinewidth/2);
}
}
}
}
}
\makeatother
\begin{tikzpicture}
\draw (-1, -1) grid (2, 1);
\path (0, 0) node[vsplit={red, blue}] {};
\path (1, 0) node[vsplit={yellow, blue}] {abc};
\end{tikzpicture}
\end{document}
答案2
另一种构建类似形状的方法,我认为它更容易理解
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
bicolor circle/.style 2 args={circle, fill=#1, path picture={\fill[#2] (path picture bounding box.north) rectangle (path picture bounding box.south east);}},
bicolor circle/.default={red}{green}
]
\node[bicolor circle, draw, minimum size=3cm] {};
\node[bicolor circle={blue}{cyan}, draw=red, line width=1mm, minimum size=2cm] at (4,0) {};
\end{tikzpicture}
\end{document}