请帮我理解这个代码

请帮我理解这个代码

考虑以下代码:

\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}

在此处输入图片描述

我已复制粘贴此代码并根据自己的需要进行了修改;但是,有些部分我不明白。如果您能帮助我了解发生了什么,我将不胜感激。此外,欢迎提出任何改进或单独的想法。

  1. alias = tmp@name

    • 我不知道为什么需要这样做。我认为这与样式有两个输入参数有关。它有什么作用?为什么需要这样做?
  2. postaction

    • 我认为不需要后期操作。没有必要说“稍后再做”,但是,当我删除它时,代码不再起作用。发生了什么?
  3. insert path

    • 手册上说它用于向当前路径添加一些内容。我相信它存在的唯一原因是允许使用\pgfextra。但是,在这种情况下当前路径是什么?还有其他方法可以做到这一点吗?
  4. \pgfextra

    • 为什么要使用此选项?手册上说此命令用于路径构建,并暂时暂停该命令以先执行一些 TeX 代码。更重要的是,我对右括号的位置感到困惑}。我已经标记了对我来说更自然的位置,但这会产生错误。为什么我对位置的直觉}是错误的?
  5. (\pgf@[email protected])

    • 原作者已将其放入代码中。我不明白这样做的必要性。没有它也可以正常工作。为什么要这样做?

答案1

@Ignasi 命令更简单、更清晰。下面,我尝试回答@Aria 提出的问题。

  1. alias=tmp@name 来自手册:此选项允许您为节点提供另一个名称。 它稍后通过命令用于坐标计算postaction

  2. postaction=是节点存在所必需的,即主路径操作要完成(因此要执行坐标计算)。请注意,预操作不会完成这项工作,因为绘图(半实心圆)将出现在节点下方。

  3. insert path您的解释是正确的。添加的路径是空的,但允许\pgfextra,正如您所说。您可能会在下面更简单的示例中看到,使用 引入的非空路径 insert path没有图形效果;可能是因为insert path是用作路径而不是节点的选项。来自手册:该选项应谨慎使用,例如,不应将其用作节点的参数。

在此处输入图片描述

蓝色节点有一个非空的添加路径,一个半径为1的圆......其实还是有效果的,因为fillopacity选项的原因!

评论。因为代码很简单,里面介绍的围绕节点的圆圈\pgfextra都是以节点的标签为中心。

  1. ()我同意@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}

在此处输入图片描述

相关内容