是否可以在节点声明中的三个参数中考虑一个可选参数?

是否可以在节点声明中的三个参数中考虑一个可选参数?

请考虑以下虚拟 MWE:

\documentclass[border=3mm,tikz,preview]{standalone}
    \usetikzlibrary{arrows,positioning,shadows,shapes}

   \tikzset{test/.style = {%
             > = angle 90,
YY/.style args = {##1/##2/##3}{
    % changed in each use of shape
        name=n##1,
    % different in each picture
        fill=##2,% color
        text width=##3,
    % common in each picture
    shape=rectangle, draw, inner sep=1mm, minimum height=9mm,
    align=flush center, drop shadow},       }
            }
\begin{document}
     \begin{tikzpicture}[test,
     node distance = 12mm,
                        ]
\node[YY=1/white/12mm]                {node A};
\node[YY=2/white/12mm,right=of n1]    {node B};
    \draw[->] (n1) -- (n2);
    \end{tikzpicture}
\end{document}

是否可以在某些图片中设置可选参数#2并将#3其设置为默认值,然后#1按以下方式仅更改参数:

\node[YY=1]                {node A};
\node[YY=2,right=of n1]    {node B};
    \draw[->] (n1) -- (n2);

我知道 `YY/.default = 1/white/12mm 的可能性,但只有当所有节点具有相同的名称时才有意义(在考虑的虚拟情况下)。然后可以写:

\node[YY]                {node A};
\node[YY,right=of n1]    {node B};

在这种情况下,可以在节点声明之后输入名称(...),但是在这种情况下,该节点已经定义node contents是不可能的......

编辑: 我的主要目的是使每个 TikZ 图片中的节点描述(确定参数)以及预设尽可能简短,并且对于了解已定义预设的人来说,使其直观。在这方面,我想知道是否可以以类似于\newcommand在 LaTeX 中定义的方式定义可选参数:

\newcommand{maycomand}[2][optional parameter] {command definition};

就我的(虚拟)示例而言,该节点使用预设参数,节点声明是

\node[YY=1] {node content};

在这种情况下,当我想更改默认可选值时,我可以简单地写:

\node[YY=1/red!20/22mm] {node content};

到目前为止(对于给定 MWE 的简化情况),我可以执行以下操作:

  • 正如@cfr 在他的评论中所说的那样(我之前并不知道)在节点预设中仅确定选项#2#3节点名称在括号中写入: \node (name) [YY] {node contents};当我对可选参数使用默认值时,以及\node (name) [YY=red!20/22mm] {node contents};当我更改默认值时。

  • 不要在节点预设中使用可选参数,并且在每个图片中添加其序言YY/.append style = {fill=white, text width=12mm},如果我喜欢不同的颜色和宽度,则在本地覆盖为\node[YY=name,fill=red!20,text width=22mm] {node content};

答案1

正如我所说,我并不完全确定我理解了你试图做什么。特别是,我不确定为什么在这个特定情况下你要将一个样式定义嵌套在另一个样式定义中。

但也许这会有所帮助:

\documentclass[border=3mm,tikz,multi]{standalone}
\usetikzlibrary{arrows,positioning,shadows,shapes}

\tikzset{
  YY fill/.store in=\yyfill,
  YY width/.store in=\yywidth,
  YY fill=blue!10,
  YY width=10mm,
  test/.style = {> = angle 90},
  YY/.style = {
    % changed in each use of shape
    name=n#1,
    % different in each picture
    fill=\yyfill,% color
    text width=\yywidth,
    % common in each picture
    shape=rectangle,
    draw,
    inner sep=1mm,
    minimum height=9mm,
    align=flush center,
    drop shadow
  },
  test 2/.style 2 args= {
    > = angle 90,
    XX/.style = {
      % changed in each use of shape
      name=n##1,
      % different in each picture
      fill=#1,% color
      text width=#2,
      % common in each picture
      shape=rectangle,
      draw,
      inner sep=1mm,
      minimum height=9mm,
      align=flush center,
      drop shadow
    },
  }
}
\begin{document}
  \begin{tikzpicture}
    [
      test,
      node distance = 12mm,
    ]
    \node[YY=1]                 {node A};
    \node[YY=2, right=of n1]    {node B};
    \draw[->] (n1) -- (n2);
  \end{tikzpicture}
  \begin{tikzpicture}
    [
      test,
      node distance = 12mm,
      YY fill=white,
      YY width=12mm,
    ]
    \node[YY=1]                 {node A};
    \node[YY=2, right=of n1]    {node B};
    \node (C) [right=of n2, node contents={node C}];
    \draw[->] (n1) -- (n2) -- (C);
  \end{tikzpicture}
  \begin{tikzpicture}
    [
      test,
      node distance = 12mm,
      YY fill=yellow!20,
      YY width=20mm,
    ]
    \node[YY=1]                 {node A};
    \node[YY=2, YY fill=red, right=of n1]    {node B};
    \draw[->] (n1) -- (n2);
  \end{tikzpicture}
  \begin{tikzpicture}
    [
      test 2={green}{25mm},
      node distance = 12mm,
    ]
    \node[XX=1]                 {node A};
    \node[XX=2, right=of n1]    {node B};
    \draw[->] (n1) -- (n2);
  \end{tikzpicture}
\end{document}

主题的变奏?

相关内容